diff --git a/frontend/.qwen/settings.json b/frontend/.qwen/settings.json
index 627a679..e06f6ef 100644
--- a/frontend/.qwen/settings.json
+++ b/frontend/.qwen/settings.json
@@ -7,7 +7,9 @@
"Bash(type *)",
"Bash(dir)",
"Bash(move *)",
- "Bash(findstr *)"
+ "Bash(findstr *)",
+ "Bash(del *)",
+ "Bash(mkdir *)"
]
},
"$version": 3
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
new file mode 100644
index 0000000..72816fb
--- /dev/null
+++ b/frontend/package-lock.json
@@ -0,0 +1,7152 @@
+{
+ "name": "HellreigN",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "HellreigN",
+ "version": "0.0.0",
+ "dependencies": {
+ "@codemirror/lang-sql": "^6.10.0",
+ "@tailwindcss/vite": "^4.2.2",
+ "@uiw/react-codemirror": "^4.25.8",
+ "axios": "^1.13.6",
+ "framer-motion": "^12.38.0",
+ "primeicons": "^7.0.0",
+ "primereact": "^10.9.7",
+ "react": "^19.2.4",
+ "react-dom": "^19.2.4",
+ "react-icons": "^5.6.0",
+ "react-router-dom": "^7.13.1",
+ "recharts": "^3.8.0",
+ "tailwind": "^4.0.0",
+ "tailwindcss": "^4.2.2",
+ "zustand": "^5.0.12"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.4",
+ "@types/node": "^24.12.0",
+ "@types/react": "^19.2.14",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^6.0.1",
+ "eslint": "^9.39.4",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.5.2",
+ "globals": "^17.4.0",
+ "typescript": "~5.9.3",
+ "typescript-eslint": "^8.57.0",
+ "vite": "^8.0.1"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "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.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz",
+ "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz",
+ "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@codemirror/autocomplete": {
+ "version": "6.20.1",
+ "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz",
+ "integrity": "sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.17.0",
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/commands": {
+ "version": "6.10.3",
+ "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz",
+ "integrity": "sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.6.0",
+ "@codemirror/view": "^6.27.0",
+ "@lezer/common": "^1.1.0"
+ }
+ },
+ "node_modules/@codemirror/lang-sql": {
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.10.0.tgz",
+ "integrity": "sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/autocomplete": "^6.0.0",
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@lezer/common": "^1.2.0",
+ "@lezer/highlight": "^1.0.0",
+ "@lezer/lr": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/language": {
+ "version": "6.12.3",
+ "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz",
+ "integrity": "sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.23.0",
+ "@lezer/common": "^1.5.0",
+ "@lezer/highlight": "^1.0.0",
+ "@lezer/lr": "^1.0.0",
+ "style-mod": "^4.0.0"
+ }
+ },
+ "node_modules/@codemirror/lint": {
+ "version": "6.9.5",
+ "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.5.tgz",
+ "integrity": "sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.35.0",
+ "crelt": "^1.0.5"
+ }
+ },
+ "node_modules/@codemirror/search": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz",
+ "integrity": "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.37.0",
+ "crelt": "^1.0.5"
+ }
+ },
+ "node_modules/@codemirror/state": {
+ "version": "6.6.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz",
+ "integrity": "sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@marijn/find-cluster-break": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/theme-one-dark": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz",
+ "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/highlight": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/view": {
+ "version": "6.41.0",
+ "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.41.0.tgz",
+ "integrity": "sha512-6H/qadXsVuDY219Yljhohglve8xf4B8xJkVOEWfA5uiYKiTFppjqsvsfR5iPA0RbvRBoOyTZpbLIxe9+0UR8xA==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@codemirror/state": "^6.6.0",
+ "crelt": "^1.0.6",
+ "style-mod": "^4.1.0",
+ "w3c-keyname": "^2.2.4"
+ }
+ },
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz",
+ "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "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/eslint-utils/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-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.5"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "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.5",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.14.0",
+ "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.1",
+ "minimatch": "^3.1.5",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "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/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@lezer/common": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz",
+ "integrity": "sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==",
+ "license": "MIT"
+ },
+ "node_modules/@lezer/highlight": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz",
+ "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@lezer/common": "^1.3.0"
+ }
+ },
+ "node_modules/@lezer/lr": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.8.tgz",
+ "integrity": "sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==",
+ "license": "MIT",
+ "dependencies": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@marijn/find-cluster-break": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz",
+ "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==",
+ "license": "MIT"
+ },
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz",
+ "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tybys/wasm-util": "^0.10.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "peerDependencies": {
+ "@emnapi/core": "^1.7.1",
+ "@emnapi/runtime": "^1.7.1"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.122.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz",
+ "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@reduxjs/toolkit": {
+ "version": "2.11.2",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz",
+ "integrity": "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@standard-schema/spec": "^1.0.0",
+ "@standard-schema/utils": "^0.3.0",
+ "immer": "^11.0.0",
+ "redux": "^5.0.1",
+ "redux-thunk": "^3.1.0",
+ "reselect": "^5.1.0"
+ },
+ "peerDependencies": {
+ "react": "^16.9.0 || ^17.0.0 || ^18 || ^19",
+ "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-redux": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@reduxjs/toolkit/node_modules/immer": {
+ "version": "11.1.4",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz",
+ "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz",
+ "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz",
+ "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz",
+ "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz",
+ "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz",
+ "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz",
+ "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz",
+ "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz",
+ "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz",
+ "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz",
+ "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz",
+ "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz",
+ "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-wasm32-wasi": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz",
+ "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz",
+ "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz",
+ "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-rc.7",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz",
+ "integrity": "sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "license": "MIT"
+ },
+ "node_modules/@standard-schema/utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz",
+ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
+ "license": "MIT"
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz",
+ "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "enhanced-resolve": "^5.19.0",
+ "jiti": "^2.6.1",
+ "lightningcss": "1.32.0",
+ "magic-string": "^0.30.21",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.2.2"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz",
+ "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.2.2",
+ "@tailwindcss/oxide-darwin-arm64": "4.2.2",
+ "@tailwindcss/oxide-darwin-x64": "4.2.2",
+ "@tailwindcss/oxide-freebsd-x64": "4.2.2",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.2.2",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.2.2",
+ "@tailwindcss/oxide-linux-x64-musl": "4.2.2",
+ "@tailwindcss/oxide-wasm32-wasi": "4.2.2",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.2.2"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz",
+ "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz",
+ "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz",
+ "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz",
+ "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz",
+ "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz",
+ "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz",
+ "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz",
+ "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz",
+ "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz",
+ "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==",
+ "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.8.1",
+ "@emnapi/runtime": "^1.8.1",
+ "@emnapi/wasi-threads": "^1.1.0",
+ "@napi-rs/wasm-runtime": "^1.1.1",
+ "@tybys/wasm-util": "^0.10.1",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz",
+ "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz",
+ "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/vite": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz",
+ "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==",
+ "license": "MIT",
+ "dependencies": {
+ "@tailwindcss/node": "4.2.2",
+ "@tailwindcss/oxide": "4.2.2",
+ "tailwindcss": "4.2.2"
+ },
+ "peerDependencies": {
+ "vite": "^5.2.0 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@types/d3-array": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz",
+ "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-color": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-ease": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-interpolate": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-color": "*"
+ }
+ },
+ "node_modules/@types/d3-path": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz",
+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-scale": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz",
+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-time": "*"
+ }
+ },
+ "node_modules/@types/d3-shape": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz",
+ "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-path": "*"
+ }
+ },
+ "node_modules/@types/d3-time": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz",
+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-timer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "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/node": {
+ "version": "24.12.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz",
+ "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~7.16.0"
+ }
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.14",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
+ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
+ },
+ "node_modules/@types/react-transition-group": {
+ "version": "4.4.12",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz",
+ "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/use-sync-external-store": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
+ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz",
+ "integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.58.0",
+ "@typescript-eslint/type-utils": "8.58.0",
+ "@typescript-eslint/utils": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.0",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.58.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.0.tgz",
+ "integrity": "sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.58.0",
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.0",
+ "debug": "^4.4.3"
+ },
+ "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 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.0.tgz",
+ "integrity": "sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.58.0",
+ "@typescript-eslint/types": "^8.58.0",
+ "debug": "^4.4.3"
+ },
+ "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 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz",
+ "integrity": "sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.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/tsconfig-utils": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz",
+ "integrity": "sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==",
+ "dev": true,
+ "license": "MIT",
+ "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 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz",
+ "integrity": "sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0",
+ "@typescript-eslint/utils": "8.58.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz",
+ "integrity": "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==",
+ "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.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz",
+ "integrity": "sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.58.0",
+ "@typescript-eslint/tsconfig-utils": "8.58.0",
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/visitor-keys": "8.58.0",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "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 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.0.tgz",
+ "integrity": "sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.58.0",
+ "@typescript-eslint/types": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz",
+ "integrity": "sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.58.0",
+ "eslint-visitor-keys": "^5.0.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": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@uiw/codemirror-extensions-basic-setup": {
+ "version": "4.25.9",
+ "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.9.tgz",
+ "integrity": "sha512-QFAqr+pu6lDmNpAlecODcF49TlsrZ0bj15zPzfhiqSDl+Um3EsDLFLppixC7kFLn+rdDM2LTvVjn5CPvefpRgw==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/autocomplete": "^6.0.0",
+ "@codemirror/commands": "^6.0.0",
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/lint": "^6.0.0",
+ "@codemirror/search": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://jaywcjlove.github.io/#/sponsor"
+ },
+ "peerDependencies": {
+ "@codemirror/autocomplete": ">=6.0.0",
+ "@codemirror/commands": ">=6.0.0",
+ "@codemirror/language": ">=6.0.0",
+ "@codemirror/lint": ">=6.0.0",
+ "@codemirror/search": ">=6.0.0",
+ "@codemirror/state": ">=6.0.0",
+ "@codemirror/view": ">=6.0.0"
+ }
+ },
+ "node_modules/@uiw/react-codemirror": {
+ "version": "4.25.9",
+ "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.9.tgz",
+ "integrity": "sha512-HftqCBUYShAOH0pGi1CHP8vfm5L8fQ3+0j0VI6lQD6QpK+UBu3J7nxfEN5O/BXMilMNf9ZyFJRvRcuMMOLHMng==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.18.6",
+ "@codemirror/commands": "^6.1.0",
+ "@codemirror/state": "^6.1.1",
+ "@codemirror/theme-one-dark": "^6.0.0",
+ "@uiw/codemirror-extensions-basic-setup": "4.25.9",
+ "codemirror": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://jaywcjlove.github.io/#/sponsor"
+ },
+ "peerDependencies": {
+ "@babel/runtime": ">=7.11.0",
+ "@codemirror/state": ">=6.0.0",
+ "@codemirror/theme-one-dark": ">=6.0.0",
+ "@codemirror/view": ">=6.0.0",
+ "codemirror": ">=6.0.0",
+ "react": ">=17.0.0",
+ "react-dom": ">=17.0.0"
+ }
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz",
+ "integrity": "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rolldown/pluginutils": "1.0.0-rc.7"
+ },
+ "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
+ }
+ }
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "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/ajv": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
+ "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
+ "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/amqplib": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz",
+ "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==",
+ "license": "MIT",
+ "dependencies": {
+ "bitsyntax": "~0.0.4",
+ "bluebird": "^3.4.6",
+ "buffer-more-ints": "0.0.2",
+ "readable-stream": "1.x >=1.1.9",
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=0.8 <=9"
+ }
+ },
+ "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/app-root-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz",
+ "integrity": "sha512-z5BqVjscbjmJBybKlICogJR2jCr2q/Ixu7Pvui5D4y97i7FLsJlvEG9XOR/KJRlkxxZz7UaaS2TMwQh1dRJ2dA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "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/array-buffer-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "license": "MIT"
+ },
+ "node_modules/array.prototype.reduce": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz",
+ "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-array-method-boxes-properly": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "is-string": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==",
+ "license": "MIT"
+ },
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/async-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+ "license": "MIT"
+ },
+ "node_modules/async-retry": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz",
+ "integrity": "sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "retry": "0.12.0"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz",
+ "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.11",
+ "form-data": "^4.0.5",
+ "proxy-from-env": "^2.1.0"
+ }
+ },
+ "node_modules/babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
+ "license": "MIT",
+ "dependencies": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "node_modules/babel-runtime/node_modules/regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "license": "MIT"
+ },
+ "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/baseline-browser-mapping": {
+ "version": "2.10.14",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz",
+ "integrity": "sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/basic-auth": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
+ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/basic-auth/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/bitsyntax": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz",
+ "integrity": "sha512-Pav3HSZXD2NLQOWfJldY3bpJLt8+HS2nUo5Z1bLLmHg2vCE/cM1qfEvNjlYo7GgYQPneNr715Bh42i01ZHZPvw==",
+ "dependencies": {
+ "buffer-more-ints": "0.0.2"
+ },
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "1.18.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
+ "integrity": "sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.0.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "~1.6.3",
+ "iconv-lite": "0.4.23",
+ "on-finished": "~2.3.0",
+ "qs": "6.5.2",
+ "raw-body": "2.3.3",
+ "type-is": "~1.6.16"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
+ "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
+ "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==",
+ "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",
+ "peer": true,
+ "dependencies": {
+ "baseline-browser-mapping": "^2.10.12",
+ "caniuse-lite": "^1.0.30001782",
+ "electron-to-chromium": "^1.5.328",
+ "node-releases": "^2.0.36",
+ "update-browserslist-db": "^1.2.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/buffer-more-ints": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz",
+ "integrity": "sha512-PDgX2QJgUc5+Jb2xAoBFP5MxhtVUmZHR33ak+m/SDxRdCrbnX1BggRIaxiW7ImwfmO4iJeCQKN18ToSXWGjYkA=="
+ },
+ "node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "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/caniuse-lite": {
+ "version": "1.0.30001784",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz",
+ "integrity": "sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==",
+ "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/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/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/codemirror": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz",
+ "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/autocomplete": "^6.0.0",
+ "@codemirror/commands": "^6.0.0",
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/lint": "^6.0.0",
+ "@codemirror/search": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commands-events": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/commands-events/-/commands-events-1.0.4.tgz",
+ "integrity": "sha512-HdP/+1Anoc7z+6L2h7nd4Imz54+LW+BjMGt30riBZrZ3ZeP/8el93wD8Jj8ltAaqVslqNgjX6qlhSBJwuDSmpg==",
+ "license": "AGPL-3.0",
+ "dependencies": {
+ "@babel/runtime": "7.2.0",
+ "formats": "1.0.0",
+ "uuidv4": "2.0.0"
+ }
+ },
+ "node_modules/commands-events/node_modules/@babel/runtime": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz",
+ "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.12.0"
+ }
+ },
+ "node_modules/commands-events/node_modules/uuidv4": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-2.0.0.tgz",
+ "integrity": "sha512-sAUlwUVepcVk6bwnaW/oi6LCwMdueako5QQzRr90ioAVVcms6p1mV0PaSxK8gyAC4CRvKddsk217uUpZUbKd2Q==",
+ "license": "MIT",
+ "dependencies": {
+ "sha-1": "0.1.1",
+ "uuid": "3.3.2"
+ }
+ },
+ "node_modules/comparejs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/comparejs/-/comparejs-1.0.0.tgz",
+ "integrity": "sha512-Ue/Zd9aOucHzHXwaCe4yeHR7jypp7TKrIBZ5yls35nPNiVXlW14npmNVKM1ZaLlQTKZ6/4ewA//gYKHHIwCpOw==",
+ "license": "MIT"
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compressible/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz",
+ "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.14",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.1",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "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/content-disposition": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
+ "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+ "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "license": "MIT"
+ },
+ "node_modules/core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "hasInstallScript": true,
+ "license": "MIT"
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "license": "MIT"
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/crelt": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz",
+ "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==",
+ "license": "MIT"
+ },
+ "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/crypto2": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto2/-/crypto2-2.0.0.tgz",
+ "integrity": "sha512-jdXdAgdILldLOF53md25FiQ6ybj2kUFTiRjs7msKTUoZrzgT/M1FPX5dYGJjbbwFls+RJIiZxNTC02DE/8y0ZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "6.26.0",
+ "node-rsa": "0.4.2",
+ "util.promisify": "1.0.0"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/d3-array": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+ "license": "ISC",
+ "dependencies": {
+ "internmap": "1 - 2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-ease": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-format": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
+ "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-path": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-scale": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2.10.0 - 3",
+ "d3-format": "1 - 3",
+ "d3-interpolate": "1.2.0 - 3",
+ "d3-time": "2.1.1 - 3",
+ "d3-time-format": "2 - 4"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-shape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-path": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time-format": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-time": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-timer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/inspect-js"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/datasette": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/datasette/-/datasette-1.0.1.tgz",
+ "integrity": "sha512-aJdlCBToEJUP4M57r67r4V6tltwGKa3qetnjpBtXYIlqbX9tM9jsoDMxb4xd9AGjpp3282oHRmqI5Z8TVAU0Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "comparejs": "1.0.0",
+ "eventemitter2": "5.0.1",
+ "lodash": "4.17.5"
+ }
+ },
+ "node_modules/datasette/node_modules/lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/debug/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/decimal.js-light": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz",
+ "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==",
+ "license": "MIT"
+ },
+ "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/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==",
+ "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==",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==",
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/draht": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/draht/-/draht-1.0.1.tgz",
+ "integrity": "sha512-yNNHL864dniNmIE9ZKD++mKypiAUAvVZtyV0QrbXH/ak3ebzFqo5xsmRBRqV8pZVhImOSBiyq500Wcmrf44zAg==",
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter2": "5.0.1"
+ }
+ },
+ "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==",
+ "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/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.331",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz",
+ "integrity": "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.20.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz",
+ "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.24.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz",
+ "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==",
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-array-method-boxes-properly": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
+ "license": "MIT"
+ },
+ "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==",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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==",
+ "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==",
+ "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/es-to-primitive": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-toolkit": {
+ "version": "1.45.1",
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.45.1.tgz",
+ "integrity": "sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==",
+ "license": "MIT",
+ "workspaces": [
+ "docs",
+ "benchmarks"
+ ]
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.2",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.5",
+ "@eslint/js": "9.39.4",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.5",
+ "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-plugin-react-hooks": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz",
+ "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.24.4",
+ "@babel/parser": "^7.24.4",
+ "hermes-parser": "^0.25.1",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
+ },
+ "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"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz",
+ "integrity": "sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": "^9 || ^10"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "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/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter2": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz",
+ "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==",
+ "license": "MIT"
+ },
+ "node_modules/eventemitter3": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
+ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
+ "license": "MIT"
+ },
+ "node_modules/express": {
+ "version": "4.16.4",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz",
+ "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.5",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.18.3",
+ "content-disposition": "0.5.2",
+ "content-type": "~1.0.4",
+ "cookie": "0.3.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.1.1",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.4",
+ "qs": "6.5.2",
+ "range-parser": "~1.2.0",
+ "safe-buffer": "5.1.2",
+ "send": "0.16.2",
+ "serve-static": "1.13.2",
+ "setprototypeof": "1.1.0",
+ "statuses": "~1.4.0",
+ "type-is": "~1.6.16",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "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-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==",
+ "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/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "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/finalhandler": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
+ "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.2",
+ "statuses": "~1.4.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==",
+ "license": "MIT"
+ },
+ "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/flaschenpost": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/flaschenpost/-/flaschenpost-1.1.3.tgz",
+ "integrity": "sha512-1VAYPvDsVBGFJyUrOa/6clnJwZYC3qVq9nJLcypy6lvaaNbo1wOQiH8HQ+4Fw/k51pVG7JHzSf5epb8lmIW86g==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "7.2.0",
+ "app-root-path": "2.1.0",
+ "babel-runtime": "6.26.0",
+ "chalk": "2.4.1",
+ "find-root": "1.1.0",
+ "lodash": "4.17.11",
+ "moment": "2.22.2",
+ "processenv": "1.1.0",
+ "split2": "3.0.0",
+ "stack-trace": "0.0.10",
+ "stringify-object": "3.3.0",
+ "untildify": "3.0.3",
+ "util.promisify": "1.0.0",
+ "varname": "2.0.3"
+ },
+ "bin": {
+ "flaschenpost-normalize": "dist/bin/flaschenpost-normalize.js",
+ "flaschenpost-uncork": "dist/bin/flaschenpost-uncork.js"
+ }
+ },
+ "node_modules/flaschenpost/node_modules/@babel/runtime": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz",
+ "integrity": "sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.12.0"
+ }
+ },
+ "node_modules/flaschenpost/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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/flaschenpost/node_modules/chalk": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/flaschenpost/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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/flaschenpost/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==",
+ "license": "MIT"
+ },
+ "node_modules/flaschenpost/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/flaschenpost/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/flaschenpost/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==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.11",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+ "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/formats": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/formats/-/formats-1.0.0.tgz",
+ "integrity": "sha512-For0Y8egwEK96JgJo4NONErPhtl7H2QzeB2NYGmzeGeJ8a1JZqPgLYOtM3oJRCYhmgsdDFd6KGRYyfe37XY4Yg==",
+ "license": "MIT"
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/framer-motion": {
+ "version": "12.38.0",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz",
+ "integrity": "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-dom": "^12.38.0",
+ "motion-utils": "^12.36.0",
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0 || ^19.0.0",
+ "react-dom": "^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
+ },
+ "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==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "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-own-enumerable-property-symbols": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+ "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+ "license": "ISC"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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": "17.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz",
+ "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "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/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "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",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
+ },
+ "node_modules/has-bigints": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hase": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hase/-/hase-2.0.0.tgz",
+ "integrity": "sha512-L83pBR/oZvQQNjv4kw9aUpTqBxERPiY7B42jsmkt1VDeUaRVhYkEIKzkCqrppjtxHe2EZqzZJzuhMXsWsxYIsw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "7.1.2",
+ "amqplib": "0.5.2"
+ }
+ },
+ "node_modules/hase/node_modules/@babel/runtime": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz",
+ "integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.12.0"
+ }
+ },
+ "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/hermes-estree": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/hermes-parser": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hermes-estree": "0.25.1"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-errors/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "license": "ISC"
+ },
+ "node_modules/http-errors/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "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/immer": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz",
+ "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "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/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-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==",
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
+ "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "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==",
+ "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/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "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.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "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-lines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-lines/-/json-lines-1.0.0.tgz",
+ "integrity": "sha512-ytuLZb4RBQb3bTRsG/QBenyIo5oHLpjeCVph3s2NnoAsZE9K6h+uR+OWpEOWV1UeHdX63tYctGppBpGAc+JNMA==",
+ "license": "MIT",
+ "dependencies": {
+ "timer2": "1.0.0"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "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/jsonwebtoken": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz",
+ "integrity": "sha512-IqEycp0znWHNA11TpYi77bVgyBO/pGESDh7Ajhas+u0ttkGkKYIIAjniL4Bw5+oVejVF+SYkaI7XKfwCCyeTuA==",
+ "license": "MIT",
+ "dependencies": {
+ "jws": "^3.2.1",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=4",
+ "npm": ">=1.4.28"
+ }
+ },
+ "node_modules/jsonwebtoken/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==",
+ "license": "MIT"
+ },
+ "node_modules/jsonwebtoken/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz",
+ "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer-equal-constant-time": "^1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz",
+ "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==",
+ "license": "MIT",
+ "dependencies": {
+ "jwa": "^1.4.2",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "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.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "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-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"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "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.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "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.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "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.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "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.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "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.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "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.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "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.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "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.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "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.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "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/limes": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/limes/-/limes-2.0.0.tgz",
+ "integrity": "sha512-evWD0pnTgPX7QueaSoJl5JBUL30T1ZVzo34ke97tIKmeagqhBTYK/JkKL0vtG3MpNApw8ZY9TlbybfwEz9knBA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "7.3.4",
+ "jsonwebtoken": "8.5.0"
+ }
+ },
+ "node_modules/limes/node_modules/@babel/runtime": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz",
+ "integrity": "sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.12.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "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/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/lusca": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/lusca/-/lusca-1.6.1.tgz",
+ "integrity": "sha512-+JzvUMH/rsE/4XfHdDOl70bip0beRcHSviYATQM0vtls59uVtdn1JMu4iD7ZShBpAmFG8EnaA+PrYG9sECMIOQ==",
+ "dependencies": {
+ "tsscmp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
+ "license": "MIT"
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
+ "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ }
+ },
+ "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==",
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.22.2",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz",
+ "integrity": "sha512-LRvkBHaJGnrcWvqsElsOhHCzj8mU39wLx5pQ0pc6s153GynCTsPdGdqsVNKAQD9sKnWj11iF7TZx9fpLwdD3fw==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/morgan": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
+ "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
+ "license": "MIT",
+ "dependencies": {
+ "basic-auth": "~2.0.0",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "on-headers": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/morgan/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/motion-dom": {
+ "version": "12.38.0",
+ "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz",
+ "integrity": "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==",
+ "license": "MIT",
+ "dependencies": {
+ "motion-utils": "^12.36.0"
+ }
+ },
+ "node_modules/motion-utils": {
+ "version": "12.36.0",
+ "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz",
+ "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==",
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "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/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/nocache": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz",
+ "integrity": "sha512-YdKcy2x0dDwOh+8BEuHvA+mnOKAhmMQDgKBOCUGaLpewdmsRYguYZSom3yA+/OrE61O/q+NMQANnun65xpI1Hw==",
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.37",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz",
+ "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-rsa": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.4.2.tgz",
+ "integrity": "sha512-Bvso6Zi9LY4otIZefYrscsUpo2mUpiAVIEmSZV2q41sP8tHZoert3Yu6zv4f/RXJqMNZQKCtnhDugIuCma23YA==",
+ "license": "MIT",
+ "dependencies": {
+ "asn1": "0.2.3"
+ }
+ },
+ "node_modules/node-statsd": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/node-statsd/-/node-statsd-0.1.1.tgz",
+ "integrity": "sha512-QDf6R8VXF56QVe1boek8an/Rb3rSNaxoFWb7Elpsv2m1+Noua1yy0F1FpKpK5VluF8oymWM4w764A4KsYL4pDg==",
+ "engines": {
+ "node": ">=0.1.97"
+ }
+ },
+ "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/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.getownpropertydescriptors": {
+ "version": "2.1.9",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz",
+ "integrity": "sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==",
+ "license": "MIT",
+ "dependencies": {
+ "array.prototype.reduce": "^1.0.8",
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "gopd": "^1.2.0",
+ "safe-array-concat": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/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/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/partof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/partof/-/partof-1.0.0.tgz",
+ "integrity": "sha512-+TXdhKCySpJDynCxgAPoGVyAkiK3QPusQ63/BdU5t68QcYzyU6zkP/T7F3gkMQBVUYqdWEADKa6Kx5zg8QIKrg==",
+ "license": "MIT"
+ },
+ "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-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
+ "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": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
+ "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/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/primeicons": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-7.0.0.tgz",
+ "integrity": "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==",
+ "license": "MIT"
+ },
+ "node_modules/primereact": {
+ "version": "10.9.7",
+ "resolved": "https://registry.npmjs.org/primereact/-/primereact-10.9.7.tgz",
+ "integrity": "sha512-Ap/lg9GGaS8Pq7IIlzguuG3qlaU6PYF6E0cCRo0rnWauRw/SQGvfreSVIIxqEhtR6xqlf7OV759lyvVOvBzmsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/react-transition-group": "^4.4.1",
+ "react-transition-group": "^4.4.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/processenv": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/processenv/-/processenv-1.1.0.tgz",
+ "integrity": "sha512-SymqIsn8GjEUy8nG7HiyEjgbfk1xFosRIakUX1NHLpriq3vVpKniGrr9RdMWCaGYWByIovbRt2f/WvmP/IOApQ==",
+ "license": "MIT",
+ "dependencies": {
+ "babel-runtime": "6.26.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==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
+ "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
+ "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.3",
+ "iconv-lite": "0.4.23",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
+ "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.4",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
+ "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.4"
+ }
+ },
+ "node_modules/react-icons": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz",
+ "integrity": "sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
+ "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",
+ "peer": true
+ },
+ "node_modules/react-redux": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
+ "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@types/use-sync-external-store": "^0.0.6",
+ "use-sync-external-store": "^1.4.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^18.2.25 || ^19",
+ "react": "^18.0 || ^19",
+ "redux": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "redux": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-router": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.0.tgz",
+ "integrity": "sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie": "^1.0.1",
+ "set-cookie-parser": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.0.tgz",
+ "integrity": "sha512-2G3ajSVSZMEtmTjIklRWlNvo8wICEpLihfD/0YMDxbWK2UyP5EGfnoIn9AIQGnF3G/FX0MRbHXdFcD+rL1ZreQ==",
+ "license": "MIT",
+ "dependencies": {
+ "react-router": "7.14.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "node_modules/react-router/node_modules/cookie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/readable-stream/node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "license": "MIT"
+ },
+ "node_modules/readable-stream/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
+ "license": "MIT"
+ },
+ "node_modules/recharts": {
+ "version": "3.8.1",
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.8.1.tgz",
+ "integrity": "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==",
+ "license": "MIT",
+ "workspaces": [
+ "www"
+ ],
+ "dependencies": {
+ "@reduxjs/toolkit": "^1.9.0 || 2.x.x",
+ "clsx": "^2.1.1",
+ "decimal.js-light": "^2.5.1",
+ "es-toolkit": "^1.39.3",
+ "eventemitter3": "^5.0.1",
+ "immer": "^10.1.1",
+ "react-redux": "8.x.x || 9.x.x",
+ "reselect": "5.1.1",
+ "tiny-invariant": "^1.3.3",
+ "use-sync-external-store": "^1.2.2",
+ "victory-vendor": "^37.0.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/redux": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
+ "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/redux-thunk": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
+ "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "redux": "^5.0.0"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.12.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz",
+ "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==",
+ "license": "MIT"
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/reselect": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
+ "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
+ "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/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz",
+ "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==",
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.122.0",
+ "@rolldown/pluginutils": "1.0.0-rc.12"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.0.0-rc.12",
+ "@rolldown/binding-darwin-arm64": "1.0.0-rc.12",
+ "@rolldown/binding-darwin-x64": "1.0.0-rc.12",
+ "@rolldown/binding-freebsd-x64": "1.0.0-rc.12",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12",
+ "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12",
+ "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12",
+ "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12",
+ "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12",
+ "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12",
+ "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12",
+ "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12",
+ "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12",
+ "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12",
+ "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12"
+ }
+ },
+ "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz",
+ "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==",
+ "license": "MIT"
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "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==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
+ "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.6.2",
+ "mime": "1.4.1",
+ "ms": "2.0.0",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.0",
+ "statuses": "~1.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
+ "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.2",
+ "send": "0.16.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
+ "license": "MIT"
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "license": "ISC"
+ },
+ "node_modules/sha-1": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/sha-1/-/sha-1-0.1.1.tgz",
+ "integrity": "sha512-dexizf3hB7d4Jq6Cd0d/NYQiqgEqIfZIpuMfwPfvSb6h06DZKmHyUe55jYwpHC12R42wpqXO6ouhiBpRzIcD/g==",
+ "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/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/split2": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-3.0.0.tgz",
+ "integrity": "sha512-Cp7G+nUfKJyHCrAI8kze3Q00PFGEG1pMgrAlTFlDbn+GW24evSZHJuMl+iUJx1w/NTRDeBiTgvwnf6YOt94FMw==",
+ "license": "ISC",
+ "dependencies": {
+ "readable-stream": "^3.0.0"
+ }
+ },
+ "node_modules/split2/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==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+ "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/stethoskop": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stethoskop/-/stethoskop-1.0.0.tgz",
+ "integrity": "sha512-4JnZ+UmTs9SFfDjSHFlD/EoXcb1bfwntkt4h1ipNGrpxtRzmHTxOmdquCJvIrVu608Um7a09cGX0ZSOSllWJNQ==",
+ "license": "MIT",
+ "dependencies": {
+ "node-statsd": "0.1.1"
+ }
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "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==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/stringify-object": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+ "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "get-own-enumerable-property-symbols": "^3.0.0",
+ "is-obj": "^1.0.1",
+ "is-regexp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-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/style-mod": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz",
+ "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==",
+ "license": "MIT"
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tailwind": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/tailwind/-/tailwind-4.0.0.tgz",
+ "integrity": "sha512-LlUNoD/5maFG1h5kQ6/hXfFPdcnYw+1Z7z+kUD/W/E71CUMwcnrskxiBM8c3G8wmPsD1VvCuqGYMHviI8+yrmg==",
+ "license": "AGPL-3.0",
+ "dependencies": {
+ "@babel/runtime": "7.3.4",
+ "ajv": "6.10.0",
+ "app-root-path": "2.1.0",
+ "async-retry": "1.2.3",
+ "body-parser": "1.18.3",
+ "commands-events": "1.0.4",
+ "compression": "1.7.3",
+ "content-type": "1.0.4",
+ "cors": "2.8.5",
+ "crypto2": "2.0.0",
+ "datasette": "1.0.1",
+ "draht": "1.0.1",
+ "express": "4.16.4 ",
+ "flaschenpost": "1.1.3",
+ "hase": "2.0.0",
+ "json-lines": "1.0.0",
+ "limes": "2.0.0",
+ "lodash": "4.17.11",
+ "lusca": "1.6.1",
+ "morgan": "1.9.1",
+ "nocache": "2.0.0",
+ "partof": "1.0.0",
+ "processenv": "1.1.0",
+ "stethoskop": "1.0.0",
+ "timer2": "1.0.0",
+ "uuidv4": "3.0.1",
+ "ws": "6.2.0"
+ }
+ },
+ "node_modules/tailwind/node_modules/@babel/runtime": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz",
+ "integrity": "sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.12.0"
+ }
+ },
+ "node_modules/tailwind/node_modules/ajv": {
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
+ "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/tailwind/node_modules/content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/tailwind/node_modules/fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==",
+ "license": "MIT"
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz",
+ "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==",
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/tapable": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz",
+ "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/timer2": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/timer2/-/timer2-1.0.0.tgz",
+ "integrity": "sha512-UOZql+P2ET0da+B7V3/RImN3IhC5ghb+9cpecfUhmYGIm0z73dDr3A781nBLnFYmRzeT1AmoT4w9Lgr8n7n7xg==",
+ "license": "MIT"
+ },
+ "node_modules/tiny-invariant": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz",
+ "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
+ "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/tsscmp": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
+ "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.x"
+ }
+ },
+ "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-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "for-each": "^0.3.3",
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.58.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.0.tgz",
+ "integrity": "sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.58.0",
+ "@typescript-eslint/parser": "8.58.0",
+ "@typescript-eslint/typescript-estree": "8.58.0",
+ "@typescript-eslint/utils": "8.58.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/untildify": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz",
+ "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "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==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.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/util.promisify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.2",
+ "object.getownpropertydescriptors": "^2.0.3"
+ }
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
+ "node_modules/uuidv4": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/uuidv4/-/uuidv4-3.0.1.tgz",
+ "integrity": "sha512-PPzksdWRl2a5C9hrs3OOYrArTeyoR0ftJ3jtOy+BnVHkT2UlrrzPNt9nTdiGuxmQItHM/AcTXahwZZC57Njojg==",
+ "license": "MIT",
+ "dependencies": {
+ "uuid": "3.3.2"
+ }
+ },
+ "node_modules/varname": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/varname/-/varname-2.0.3.tgz",
+ "integrity": "sha512-+DofT9mJAUALhnr9ipZ5Z2icwaEZ7DAajOZT4ffXy3MQqnXtG3b7atItLQEJCkfcJTOf9WcsywneOEibD4eqJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/victory-vendor": {
+ "version": "37.3.6",
+ "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz",
+ "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==",
+ "license": "MIT AND ISC",
+ "dependencies": {
+ "@types/d3-array": "^3.0.3",
+ "@types/d3-ease": "^3.0.0",
+ "@types/d3-interpolate": "^3.0.1",
+ "@types/d3-scale": "^4.0.2",
+ "@types/d3-shape": "^3.1.0",
+ "@types/d3-time": "^3.0.0",
+ "@types/d3-timer": "^3.0.0",
+ "d3-array": "^3.1.6",
+ "d3-ease": "^3.0.1",
+ "d3-interpolate": "^3.0.1",
+ "d3-scale": "^4.0.2",
+ "d3-shape": "^3.1.0",
+ "d3-time": "^3.0.0",
+ "d3-timer": "^3.0.1"
+ }
+ },
+ "node_modules/vite": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz",
+ "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==",
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "lightningcss": "^1.32.0",
+ "picomatch": "^4.0.4",
+ "postcss": "^8.5.8",
+ "rolldown": "1.0.0-rc.12",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.1.0",
+ "esbuild": "^0.27.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
+ }
+ }
+ },
+ "node_modules/w3c-keyname": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
+ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
+ "license": "MIT"
+ },
+ "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/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "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==",
+ "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.20",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
+ "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/ws": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.0.tgz",
+ "integrity": "sha512-deZYUNlt2O4buFCa3t5bKLf8A7FPP/TVjwOeVNpw818Ma5nk4MLXls2eoEGS39o8119QIYxTrTDoPQ5B/gTD6w==",
+ "license": "MIT",
+ "dependencies": {
+ "async-limiter": "~1.0.0"
+ }
+ },
+ "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/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/zod": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
+ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
+ }
+ },
+ "node_modules/zustand": {
+ "version": "5.0.12",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz",
+ "integrity": "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ },
+ "peerDependencies": {
+ "@types/react": ">=18.0.0",
+ "immer": ">=9.0.6",
+ "react": ">=18.0.0",
+ "use-sync-external-store": ">=1.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "immer": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "use-sync-external-store": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/frontend/package.json b/frontend/package.json
index 4aecc80..74ee85f 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -11,19 +11,24 @@
},
"dependencies": {
"@codemirror/lang-sql": "^6.10.0",
+ "@monaco-editor/react": "^4.7.0",
"@tailwindcss/vite": "^4.2.2",
"@uiw/react-codemirror": "^4.25.8",
"axios": "^1.13.6",
+ "file-surf": "^1.0.3",
"framer-motion": "^12.38.0",
+ "monaco-languageclient": "^10.7.0",
"primeicons": "^7.0.0",
"primereact": "^10.9.7",
"react": "^19.2.4",
"react-dom": "^19.2.4",
+ "react-force-graph-2d": "^1.29.1",
"react-icons": "^5.6.0",
"react-router-dom": "^7.13.1",
"recharts": "^3.8.0",
"tailwind": "^4.0.0",
"tailwindcss": "^4.2.2",
+ "vscode-ws-jsonrpc": "^3.5.0",
"zustand": "^5.0.12"
},
"devDependencies": {
diff --git a/frontend/src/app/App.tsx b/frontend/src/app/App.tsx
index 625d6a5..39cb784 100644
--- a/frontend/src/app/App.tsx
+++ b/frontend/src/app/App.tsx
@@ -1,11 +1,24 @@
+import { useState, useEffect } from "react";
import "@/shared/styles/index.css";
import "primereact/resources/themes/lara-light-cyan/theme.css";
import "primereact/resources/primereact.min.css";
import "primeicons/primeicons.css";
import { PrimeReactProvider } from "primereact/api";
import { Routing } from "./providers/routing/routing";
+import { AppLoader } from "./components/AppLoader";
function App() {
+ const [loading, setLoading] = useState(true);
+
+ useEffect(() => {
+ const timer = setTimeout(() => setLoading(false), 1800);
+ return () => clearTimeout(timer);
+ }, []);
+
+ if (loading) {
+ return ;
+ }
+
return (
diff --git a/frontend/src/app/components/AppLoader.tsx b/frontend/src/app/components/AppLoader.tsx
new file mode 100644
index 0000000..fa8a6d0
--- /dev/null
+++ b/frontend/src/app/components/AppLoader.tsx
@@ -0,0 +1,247 @@
+import { useEffect, useState } from "react";
+import { FaMicrochip, FaCode, FaNetworkWired, FaAtom } from "react-icons/fa";
+
+export const AppLoader = () => {
+ const [progress, setProgress] = useState(0);
+ const [phase, setPhase] = useState(0);
+
+ useEffect(() => {
+ const phases = [
+ { progress: 25, delay: 400 },
+ { progress: 50, delay: 300 },
+ { progress: 75, delay: 400 },
+ { progress: 100, delay: 300 },
+ ];
+
+ let timeouts: NodeJS.Timeout[] = [];
+ let currentDelay = 0;
+
+ phases.forEach((p, i) => {
+ currentDelay += p.delay;
+ timeouts.push(
+ setTimeout(() => {
+ setProgress(p.progress);
+ setPhase(i);
+ }, currentDelay),
+ );
+ });
+
+ return () => timeouts.forEach(clearTimeout);
+ }, []);
+
+ return (
+
+ {/* Background grid effect */}
+
+
+ {/* Glowing orbs */}
+
+
+
+ {/* Main content */}
+
+ {/* Logo with animation */}
+
+
+ {/* Loading icons animation */}
+
+ {[
+ { icon: FaMicrochip, delay: "0s" },
+ { icon: FaNetworkWired, delay: "0.2s" },
+ { icon: FaCode, delay: "0.4s" },
+ ].map(({ icon: Icon, delay }, i) => (
+
= i
+ ? "rgba(59, 130, 246, 0.6)"
+ : "rgba(255,255,255,0.1)"
+ }`,
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ backgroundColor:
+ phase >= i ? "rgba(59, 130, 246, 0.1)" : "transparent",
+ animation: `iconPop 0.5s ease-out ${delay} both`,
+ transition: "all 0.3s ease",
+ }}
+ >
+ = i ? "#3b82f6" : "#555",
+ transition: "color 0.3s ease",
+ }}
+ />
+
+ ))}
+
+
+ {/* Progress bar */}
+
+
+ {/* Status text */}
+
+ {phase === 0 && "INITIALIZING CORE..."}
+ {phase === 1 && "LOADING AGENTS..."}
+ {phase === 2 && "ESTABLISHING CONNECTIONS..."}
+ {phase === 3 && "READY"}
+
+
+
+ {/* CSS Animations */}
+
+
+ );
+};
diff --git a/frontend/src/app/providers/layout/layout.tsx b/frontend/src/app/providers/layout/layout.tsx
new file mode 100644
index 0000000..e24408e
--- /dev/null
+++ b/frontend/src/app/providers/layout/layout.tsx
@@ -0,0 +1,75 @@
+import { useState, useEffect, type ReactNode } from "react";
+import { Sidebar } from "@/app/providers/layout/sidebar/sidebar";
+import {
+ Navigation,
+ BottomNav,
+} from "@/app/providers/layout/navigation/navigation";
+import { useAgentStore } from "@/app/providers/layout/store/agent.store";
+
+export const Layout = ({ children }: { children: ReactNode }) => {
+ const [mobileOpen, setMobileOpen] = useState(false);
+ const [isMobile, setIsMobile] = useState(() =>
+ typeof window !== "undefined" ? window.innerWidth < 856 : false,
+ );
+ const [isVerySmall, setIsVerySmall] = useState(() =>
+ typeof window !== "undefined" ? window.innerWidth < 600 : false,
+ );
+ const { fetchAgents } = useAgentStore();
+
+ const sidebarOpen = isMobile ? mobileOpen : true;
+
+ useEffect(() => {
+ const handleResize = () => {
+ const mobile = window.innerWidth < 856;
+ setIsMobile(mobile);
+ if (!mobile) {
+ setMobileOpen(false);
+ }
+ setIsVerySmall(window.innerWidth < 600);
+ };
+
+ window.addEventListener("resize", handleResize);
+ handleResize();
+ return () => window.removeEventListener("resize", handleResize);
+ }, []);
+
+ const toggleSidebar = () => {
+ if (isMobile) {
+ setMobileOpen((prev) => !prev);
+ }
+ };
+
+ useEffect(() => {
+ fetchAgents();
+ }, [fetchAgents]);
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ fetchAgents();
+ }, 30000);
+
+ return () => clearInterval(interval);
+ }, [fetchAgents]);
+
+ return (
+
+
+
+
+
{children}
+ {isVerySmall &&
}
+
+
+ );
+};
diff --git a/frontend/src/app/providers/layout/navigation/navigation.tsx b/frontend/src/app/providers/layout/navigation/navigation.tsx
new file mode 100644
index 0000000..37f7223
--- /dev/null
+++ b/frontend/src/app/providers/layout/navigation/navigation.tsx
@@ -0,0 +1,445 @@
+import { useState, useRef, useEffect } from "react";
+import { useNavigate, useLocation } from "react-router-dom";
+import { FaBars, FaCode, FaChevronDown } from "react-icons/fa";
+import {
+ FaHome,
+ FaServer,
+ FaUser,
+ FaUsers,
+ FaRocket,
+ FaKey,
+ FaFileAlt,
+ FaPalette,
+ FaSignOutAlt,
+ FaShieldAlt,
+} from "react-icons/fa";
+import { useAuthStore } from "@/modules/auth/store/useAuthStore";
+import { useThemeStore } from "@/modules/theme-bw/stores/theme.store";
+import { themes } from "@/modules/theme-changer/config/theme.config";
+import {
+ applyTheme,
+ getCurrentTheme,
+} from "@/modules/theme-changer/utils/apply.theme";
+
+interface NavigationProps {
+ onToggleSidebar?: () => void;
+ isMobile?: boolean;
+ isVerySmall?: boolean;
+}
+
+export const Navigation: React.FC = ({
+ onToggleSidebar,
+ isMobile,
+ isVerySmall = false,
+}) => {
+ const navigate = useNavigate();
+ const location = useLocation();
+ const { user, logout } = useAuthStore();
+ const { setTheme } = useThemeStore();
+ const [dropdownOpen, setDropdownOpen] = useState(false);
+ const [themePickerOpen, setThemePickerOpen] = useState(false);
+ const dropdownRef = useRef(null);
+ const currentTheme = getCurrentTheme();
+
+ const navItems = [
+ { path: "/templates", label: "Шаблоны", icon: FaCode, requireView: true },
+ {
+ path: "/add-agents",
+ label: "Деплой",
+ icon: FaRocket,
+ requireManageAgent: true,
+ },
+ {
+ path: "/registration",
+ label: "Регистрация",
+ icon: FaKey,
+ requireManageAgent: true,
+ },
+ { path: "/logs", label: "Логи", icon: FaFileAlt, requireView: true },
+ ];
+
+ const isActive = (path: string) => location.pathname === path;
+
+ // Filter nav items based on user permissions
+ const filteredNavItems = navItems.filter((item) => {
+ if (item.requireView && !user?.permission_view) return false;
+ if (item.requireManageAgent && !user?.permission_manage_agent) return false;
+ return true;
+ });
+
+ useEffect(() => {
+ const handleClickOutside = (e: MouseEvent) => {
+ if (
+ dropdownRef.current &&
+ !dropdownRef.current.contains(e.target as Node)
+ ) {
+ setDropdownOpen(false);
+ setThemePickerOpen(false);
+ }
+ };
+ document.addEventListener("mousedown", handleClickOutside);
+ return () => document.removeEventListener("mousedown", handleClickOutside);
+ }, []);
+
+ const handleLogout = () => {
+ logout();
+ navigate("/auth");
+ };
+
+ const handleThemeChange = (themeId: string) => {
+ applyTheme(themeId);
+ setTheme(themeId as any);
+ setThemePickerOpen(false);
+ };
+
+ const renderNavItems = (showLabels: boolean, iconSize: number) => (
+
+ {filteredNavItems.map((item) => {
+ const Icon = item.icon;
+ const active = isActive(item.path);
+ return (
+ navigate(item.path)}
+ className="flex items-center gap-1.5 px-3 py-2 rounded-lg font-medium transition-all flex-shrink-0"
+ style={{
+ backgroundColor: active ? "var(--accent)" : "transparent",
+ color: active ? "var(--accent-text)" : "var(--text-secondary)",
+ }}
+ onMouseEnter={(e) => {
+ if (!active) {
+ e.currentTarget.style.backgroundColor = "var(--bg-secondary)";
+ e.currentTarget.style.color = "var(--text-primary)";
+ }
+ }}
+ onMouseLeave={(e) => {
+ if (!active) {
+ e.currentTarget.style.backgroundColor = "transparent";
+ e.currentTarget.style.color = "var(--text-secondary)";
+ }
+ }}
+ title={item.label}
+ >
+
+ {showLabels && {item.label} }
+
+ );
+ })}
+
+ );
+
+ return (
+ <>
+ {/* Верхний бар */}
+
+
+ {/* Бургер — только на мобильных */}
+ {isMobile && (
+
+
+
+ )}
+
+ {/* Название по центру — только на очень маленьких экранах */}
+ {isVerySmall && (
+
+
+ HellreigN
+
+
+ )}
+
+ {/* Навигация — только если НЕ очень маленький экран */}
+ {!isVerySmall && (
+
+ {renderNavItems(true, 12)}
+
+ )}
+
+ {/* Профиль пользователя — дропдаун */}
+
+
setDropdownOpen(!dropdownOpen)}
+ className="flex items-center gap-2 px-3 py-1.5 rounded-lg transition-all"
+ style={{
+ backgroundColor: dropdownOpen
+ ? "var(--bg-secondary)"
+ : "transparent",
+ border: "1px solid var(--border)",
+ }}
+ >
+
+
+
+
+ {user?.name || user?.login || "Пользователь"}
+
+
+
+
+ {dropdownOpen && (
+
+
+
+
+
+
+
+
+ {user?.name || user?.login}
+
+
+ {user?.login}
+
+
+
+
+
+
+
setThemePickerOpen(!themePickerOpen)}
+ className="w-full flex items-center gap-3 px-4 py-2.5 text-xs transition-colors"
+ style={{ color: "var(--text-primary)" }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor =
+ "var(--bg-secondary)";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+
+
+ Тема: {themes.find((t) => t.id === currentTheme)?.name}
+
+
+
+
+ {themePickerOpen && (
+
+ {themes.map((t) => (
+
handleThemeChange(t.id)}
+ className="w-full flex items-center gap-3 px-4 py-2 text-xs transition-colors first:rounded-t-lg last:rounded-b-lg"
+ style={{
+ color:
+ currentTheme === t.id
+ ? "var(--accent)"
+ : "var(--text-primary)",
+ backgroundColor:
+ currentTheme === t.id
+ ? "var(--bg-secondary)"
+ : "transparent",
+ }}
+ onMouseEnter={(e) => {
+ if (currentTheme !== t.id) {
+ e.currentTarget.style.backgroundColor =
+ "var(--bg-secondary)";
+ }
+ }}
+ onMouseLeave={(e) => {
+ if (currentTheme !== t.id) {
+ e.currentTarget.style.backgroundColor =
+ "transparent";
+ }
+ }}
+ >
+
+ {t.name}
+
+ ))}
+
+ )}
+
+
+ {user?.permission_admin && (
+
{
+ setDropdownOpen(false);
+ navigate("/admin");
+ }}
+ className="w-full flex items-center gap-3 px-4 py-2.5 text-xs transition-colors"
+ style={{ color: "var(--text-primary)" }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor =
+ "var(--bg-secondary)";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+
+ Админка
+
+ )}
+
+
+
+
{
+ e.currentTarget.style.backgroundColor =
+ "rgba(239, 68, 68, 0.1)";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+
+ Выйти
+
+
+ )}
+
+
+
+ >
+ );
+};
+
+export const BottomNav: React.FC = () => {
+ const navigate = useNavigate();
+ const location = useLocation();
+ const { user } = useAuthStore();
+
+ const navItems = [
+ { path: "/templates", label: "Шаблоны", icon: FaCode, requireView: true },
+ {
+ path: "/add-agents",
+ label: "Деплой",
+ icon: FaRocket,
+ requireManageAgent: true,
+ },
+ {
+ path: "/registration",
+ label: "Регистрация",
+ icon: FaKey,
+ requireManageAgent: true,
+ },
+ { path: "/logs", label: "Логи", icon: FaFileAlt, requireView: true },
+ ];
+
+ const isActive = (path: string) => location.pathname === path;
+
+ // Filter nav items based on user permissions
+ const filteredNavItems = navItems.filter((item) => {
+ if (item.requireView && !user?.permission_view) return false;
+ if (item.requireManageAgent && !user?.permission_manage_agent) return false;
+ return true;
+ });
+
+ return (
+
+
+ {filteredNavItems.map((item) => {
+ const Icon = item.icon;
+ const active = isActive(item.path);
+ return (
+ navigate(item.path)}
+ className="flex items-center justify-center p-3 rounded-lg transition-all"
+ style={{
+ backgroundColor: active ? "var(--accent)" : "transparent",
+ color: active ? "var(--accent-text)" : "var(--text-secondary)",
+ }}
+ title={item.label}
+ >
+
+
+ );
+ })}
+
+
+ );
+};
diff --git a/frontend/src/app/providers/layout/sidebar/sidebar.tsx b/frontend/src/app/providers/layout/sidebar/sidebar.tsx
new file mode 100644
index 0000000..e945d28
--- /dev/null
+++ b/frontend/src/app/providers/layout/sidebar/sidebar.tsx
@@ -0,0 +1,717 @@
+import React, { useMemo, useState, useRef, useEffect } from "react";
+import {
+ FaBars,
+ FaMicrochip,
+ FaTimes,
+ FaSpinner,
+ FaCopy,
+ FaCheck,
+ FaChevronRight,
+ FaChevronDown,
+ FaProjectDiagram,
+ FaTrash,
+ FaArrowLeft,
+} from "react-icons/fa";
+import { useNavigate } from "react-router-dom";
+import { useAgentStore } from "@/app/providers/layout/store/agent.store";
+import { useAuthStore } from "@/modules/auth/store/useAuthStore";
+import { Graph, type GraphData } from "@/modules/graph";
+import { agentApiService } from "@/modules/agent/api/agent.api.service";
+import { adminApi } from "@/modules/admin/api/admin.api";
+
+interface SidebarProps {
+ isOpen?: boolean;
+ onToggle?: () => void;
+ isMobile?: boolean;
+}
+
+export const Sidebar: React.FC = ({
+ isOpen = true,
+ onToggle,
+ isMobile = false,
+}) => {
+ const navigate = useNavigate();
+ const { agents, isLoading, error, fetchAgents, removeAgent } =
+ useAgentStore();
+ const { token } = useAuthStore();
+ const [searchQuery, setSearchQuery] = useState("");
+ const [copied, setCopied] = useState(false);
+ const [showTokenModal, setShowTokenModal] = useState(false);
+ const [showGraphs, setShowGraphs] = useState(false);
+ const [sidebarWidth, setSidebarWidth] = useState(288);
+ const sidebarRef = useRef(null);
+ const [expandedAgents, setExpandedAgents] = useState>(
+ new Set(agents.map((a) => a.label)),
+ );
+
+ // Рассчитываем максимальную ширину при переключении на графы
+ useEffect(() => {
+ const updateWidth = () => {
+ const targetWidth = showGraphs ? 500 : 288;
+ const maxWidth = window.innerWidth - 200;
+ const finalWidth = Math.min(targetWidth, maxWidth);
+ setSidebarWidth(Math.max(finalWidth, 250));
+ };
+
+ updateWidth();
+ window.addEventListener("resize", updateWidth);
+ return () => window.removeEventListener("resize", updateWidth);
+ }, [showGraphs]);
+
+ // Token generation state
+ const [tokenLabel, setTokenLabel] = useState("");
+ const [generatedToken, setGeneratedToken] = useState(null);
+ const [tokenGenerating, setTokenGenerating] = useState(false);
+ const [tokenError, setTokenError] = useState(null);
+
+ const toggleAgent = (label: string) => {
+ setExpandedAgents((prev) => {
+ const next = new Set(prev);
+ if (next.has(label)) next.delete(label);
+ else next.add(label);
+ return next;
+ });
+ };
+
+ const filteredAgents = useMemo(() => {
+ if (!searchQuery) return agents;
+ const query = searchQuery.toLowerCase();
+ return agents.filter(
+ (agent) =>
+ agent.label.toLowerCase().includes(query) ||
+ agent.services.some((s) => s.toLowerCase().includes(query)),
+ );
+ }, [agents, searchQuery]);
+
+ const [graphData, setGraphData] = useState({
+ nodes: [],
+ links: [],
+ });
+
+ useEffect(() => {
+ const fetchGraph = () => {
+ agentApiService
+ .getGraph()
+ .then((apiData) => {
+ const nodes: any[] = [];
+ const links: any[] = [];
+
+ // Build a map of service statuses from agents
+ const serviceStatusMap = new Map();
+ agents.forEach((agent) => {
+ const services = agent.services || [];
+ services.forEach((svc: string) => {
+ const parts = svc.split(":");
+ const svcName = parts[0];
+ const status = parts[1] === "down" ? "down" : "up";
+ serviceStatusMap.set(`${agent.label}-${svcName}`, status);
+ });
+ });
+
+ Object.entries(apiData.nodes || {}).forEach(
+ ([agentLabel, agentNode]: [string, any]) => {
+ nodes.push({
+ id: agentLabel,
+ name: agentLabel,
+ type: "agent" as const,
+ val: 8,
+ description: `Агент: ${agentLabel}`,
+ });
+
+ const services = agentNode?.services || {};
+ Object.entries(services).forEach(
+ ([serviceName, serviceNode]: [string, any]) => {
+ const serviceId = `${agentLabel}-${serviceName}`;
+ const status = serviceStatusMap.get(serviceId) || "up";
+
+ nodes.push({
+ id: serviceId,
+ name: serviceName,
+ type: "service" as const,
+ val: 12,
+ description: `Сервис: ${serviceName}`,
+ status,
+ });
+
+ links.push({
+ source: agentLabel,
+ target: serviceId,
+ type: "hosts",
+ });
+
+ const dependencies = serviceNode?.dependencies || [];
+ dependencies.forEach((dep: any) => {
+ const targetName = dep?.target?.name;
+ if (targetName) {
+ links.push({
+ source: serviceId,
+ target: `${agentLabel}-${targetName}`,
+ type: dep.condition || "dependency",
+ });
+ }
+ });
+ },
+ );
+ },
+ );
+
+ setGraphData({ nodes, links });
+ })
+ .catch((e) => {
+ console.error("Failed to fetch graph:", e);
+ });
+ };
+
+ fetchGraph();
+ const interval = setInterval(fetchGraph, 30000);
+ return () => clearInterval(interval);
+ }, [agents]);
+
+ const handleCopyToken = () => {
+ const tokenToCopy = generatedToken || token;
+ if (tokenToCopy) {
+ navigator.clipboard.writeText(tokenToCopy);
+ setCopied(true);
+ setTimeout(() => setCopied(false), 2000);
+ }
+ };
+
+ const handleGenerateToken = async () => {
+ if (!tokenLabel.trim()) return;
+ setTokenGenerating(true);
+ setTokenError(null);
+ try {
+ const newToken = await adminApi.generateToken(tokenLabel.trim());
+ setGeneratedToken(newToken);
+ } catch (e) {
+ setTokenError(
+ e instanceof Error ? e.message : "Failed to generate token",
+ );
+ } finally {
+ setTokenGenerating(false);
+ }
+ };
+
+ const handleCloseTokenModal = () => {
+ setShowTokenModal(false);
+ setTokenLabel("");
+ setGeneratedToken(null);
+ setTokenError(null);
+ setCopied(false);
+ };
+
+ if (!isOpen) {
+ return null;
+ }
+
+ return (
+ <>
+ {/* Overlay — только на мобильных (< 856px) */}
+ {isMobile && (
+
+ )}
+
+
+ {/* Header */}
+
+
+
+
+ Агенты
+
+
+ {agents.length}
+
+
+
+
+
+
+
+ {/* Контент — либо список агентов, либо графы */}
+ {showGraphs ? (
+
+
+
+ ) : (
+ <>
+ {/* Поиск */}
+
+ setSearchQuery(e.target.value)}
+ placeholder="Поиск агентов..."
+ className="w-full px-3 py-2 rounded-lg border text-sm focus:outline-none transition-all"
+ style={{
+ backgroundColor: "var(--input-bg)",
+ borderColor: "var(--border)",
+ color: "var(--text-primary)",
+ }}
+ onFocus={(e) => {
+ e.currentTarget.style.borderColor = "var(--border-focus)";
+ e.currentTarget.style.boxShadow = `0 0 0 3px var(--border-focus)30`;
+ }}
+ onBlur={(e) => {
+ e.currentTarget.style.borderColor = "var(--border)";
+ e.currentTarget.style.boxShadow = "none";
+ }}
+ />
+
+
+ {/* Список агентов */}
+
+ {isLoading && agents.length === 0 ? (
+
+
+
+ Загрузка агентов...
+
+
+ ) : error ? (
+
+
+ {error}
+
+
+ Попробовать снова
+
+
+ ) : filteredAgents.length === 0 ? (
+
+
+
+ {searchQuery ? "Ничего не найдено" : "Нет агентов"}
+
+
+ ) : (
+
+ {filteredAgents.map((agent) => {
+ const isExpanded = expandedAgents.has(agent.label);
+ return (
+
+ {/* Agent header — кликабельный для сворачивания */}
+
toggleAgent(agent.label)}
+ >
+
+ {isExpanded ? (
+
+ ) : (
+
+ )}
+
+
+
{
+ e.stopPropagation();
+ navigate(`/dashboard/${agent.label}`);
+ }}
+ title="Открыть дашборд агента"
+ >
+ {agent.label}
+
+ {/* Статус-индикатор агента (количество сервисов) */}
+
+ {agent.services.length > 0 && (
+
+ )}
+
+ {agent.services.length}
+
+
+ {/* Кнопка удаления — появляется при наведении */}
+
{
+ e.stopPropagation();
+ if (
+ window.confirm(
+ `Удалить агента "${agent.label}"?`,
+ )
+ ) {
+ removeAgent(agent.label);
+ }
+ }}
+ className="opacity-0 group-hover:opacity-100 p-1 rounded transition-all flex-shrink-0"
+ style={{
+ color: "var(--text-muted)",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.color = "#f87171";
+ e.currentTarget.style.backgroundColor =
+ "rgba(248, 113, 113, 0.15)";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = "var(--text-muted)";
+ e.currentTarget.style.backgroundColor =
+ "transparent";
+ }}
+ title="Удалить агента"
+ >
+
+
+
+
+ {/* Services list — сворачивается */}
+ {isExpanded && (
+
+
+ {agent.services.map((service) => {
+ // Parse "serviceName:up" or "serviceName:down"
+ const parts = service.split(":");
+ const serviceName = parts[0];
+ const isDown = parts[1] === "down";
+
+ return (
+
+
+ {serviceName}
+
+ {/* Status indicator */}
+
+
+
+ {isDown ? "down" : "run"}
+
+
+
+ );
+ })}
+
+
+ )}
+
+ );
+ })}
+
+ )}
+
+ >
+ )}
+
+ {/* Footer с кнопками */}
+
+ {showGraphs ? (
+ /* Кнопка назад к агентам */
+ setShowGraphs(false)}
+ className="flex-1 flex items-center justify-center gap-1.5 px-3 py-1.5 text-xs rounded transition-colors"
+ style={{
+ backgroundColor: "var(--bg-secondary)",
+ color: "var(--text-secondary)",
+ border: "1px solid var(--border)",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "var(--border)";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "var(--bg-secondary)";
+ }}
+ >
+ К агентам
+
+ ) : (
+ /* Кнопка Графы */
+ setShowGraphs(true)}
+ className="flex items-center justify-center gap-1.5 px-3 py-1.5 text-xs rounded transition-colors"
+ style={{
+ backgroundColor: "var(--bg-secondary)",
+ color: "var(--text-secondary)",
+ border: "1px solid var(--border)",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "var(--border)";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "var(--bg-secondary)";
+ }}
+ >
+
+ Графы
+
+ )}
+ setShowTokenModal(true)}
+ className="flex-1 flex items-center justify-center gap-1.5 px-2 py-1.5 text-xs rounded transition-colors"
+ style={{
+ backgroundColor: "var(--accent)",
+ color: "var(--accent-text)",
+ }}
+ >
+
+ Токен
+
+
+
+
+ {/* Modal токена */}
+ {showTokenModal && (
+
+
e.stopPropagation()}
+ >
+
+
+
+
+ Генерация токена
+
+
+
+
+
+
+
+
+ {/* Error */}
+ {tokenError && (
+
+ {tokenError}
+
+ )}
+
+ {/* Label input */}
+ {!generatedToken && (
+
+
+ Имя токена
+
+ setTokenLabel(e.target.value)}
+ onKeyDown={(e) => {
+ if (e.key === "Enter" && tokenLabel.trim()) {
+ handleGenerateToken();
+ }
+ }}
+ placeholder="Введите имя..."
+ autoFocus
+ className="w-full px-3 py-2 rounded-lg border text-sm focus:outline-none transition-all"
+ style={{
+ backgroundColor: "var(--input-bg)",
+ borderColor: "var(--border)",
+ color: "var(--text-primary)",
+ }}
+ />
+
+ )}
+
+ {/* Generated token */}
+ {generatedToken && (
+
+
+ Токен
+
+
+
+ {generatedToken}
+
+
+ {copied ? (
+
+ ) : (
+
+ )}
+
+
+
+ )}
+
+ {/* Buttons */}
+
+ {generatedToken && (
+ {
+ setGeneratedToken(null);
+ setTokenLabel("");
+ }}
+ className="flex-1 py-2 rounded-lg text-xs font-medium transition-colors"
+ style={{
+ backgroundColor: "var(--bg-secondary)",
+ color: "var(--text-primary)",
+ border: "1px solid var(--border)",
+ }}
+ >
+ Новый токен
+
+ )}
+
+ {tokenGenerating
+ ? "Генерация..."
+ : generatedToken
+ ? "Готово"
+ : "Создать"}
+
+
+
+
+
+ )}
+ >
+ );
+};
diff --git a/frontend/src/app/providers/layout/store/agent.store.ts b/frontend/src/app/providers/layout/store/agent.store.ts
new file mode 100644
index 0000000..2cb8ebf
--- /dev/null
+++ b/frontend/src/app/providers/layout/store/agent.store.ts
@@ -0,0 +1,35 @@
+import { create } from "zustand";
+import { agentApiService } from "@/modules/agent/api/agent.api.service";
+import type { AgentInfo } from "@/modules/agent/types/agent.types";
+
+interface AgentState {
+ agents: AgentInfo[];
+ isLoading: boolean;
+ error: string | null;
+ fetchAgents: () => Promise;
+ removeAgent: (name: string) => void;
+}
+
+export const useAgentStore = create()((set, get) => ({
+ agents: [],
+ isLoading: false,
+ error: null,
+
+ fetchAgents: async () => {
+ set({ isLoading: true, error: null });
+ try {
+ const agents = await agentApiService.getAgents();
+ set({ agents, isLoading: false });
+ } catch (error) {
+ set({
+ error:
+ error instanceof Error ? error.message : "Failed to fetch agents",
+ isLoading: false,
+ });
+ }
+ },
+
+ removeAgent: (name: string) => {
+ set({ agents: get().agents.filter((a) => a.label !== name) });
+ },
+}));
diff --git a/frontend/src/app/providers/layout/store/metrics.store.ts b/frontend/src/app/providers/layout/store/metrics.store.ts
new file mode 100644
index 0000000..a5f7b80
--- /dev/null
+++ b/frontend/src/app/providers/layout/store/metrics.store.ts
@@ -0,0 +1,50 @@
+import { create } from "zustand";
+import { agentApiService } from "@/modules/agent/api/agent.api.service";
+import type { SystemMetrics } from "@/modules/agent/types/agent.types";
+
+interface MetricsState {
+ metrics: SystemMetrics[];
+ isLoading: boolean;
+ error: string | null;
+ lastUpdated: number | null;
+}
+
+const POLLING_INTERVAL = 30_000;
+
+let _pollingTimer: ReturnType | null = null;
+
+export const useMetricsStore = create(() => ({
+ metrics: [],
+ isLoading: false,
+ error: null,
+ lastUpdated: null,
+}));
+
+export const startMetricsPolling = async () => {
+ if (_pollingTimer) return;
+ const fetchMetrics = async () => {
+ try {
+ const data = await agentApiService.getSystemMetrics();
+ useMetricsStore.setState({
+ metrics: data,
+ isLoading: false,
+ error: null,
+ lastUpdated: Date.now(),
+ });
+ } catch (e) {
+ useMetricsStore.setState({
+ error: e instanceof Error ? e.message : "Failed to fetch metrics",
+ isLoading: false,
+ });
+ }
+ };
+ await fetchMetrics();
+ _pollingTimer = setInterval(fetchMetrics, POLLING_INTERVAL);
+};
+
+export const stopMetricsPolling = () => {
+ if (_pollingTimer) {
+ clearInterval(_pollingTimer);
+ _pollingTimer = null;
+ }
+};
diff --git a/frontend/src/app/providers/routing/helper/protected.route.tsx b/frontend/src/app/providers/routing/helper/protected.route.tsx
index 8ce4d9c..02cdd63 100644
--- a/frontend/src/app/providers/routing/helper/protected.route.tsx
+++ b/frontend/src/app/providers/routing/helper/protected.route.tsx
@@ -1,12 +1,42 @@
-import { useAuthStore } from "@/store/auth/auth.store";
import { Navigate } from "react-router-dom";
+import { useAuthStore } from "@/modules/auth/store/useAuthStore";
-export const ProtectedRoute = ({ children }: { children: React.ReactNode }) => {
- const { isAuthenticated } = useAuthStore();
+interface ProtectedRouteProps {
+ children: React.ReactNode;
+ requireView?: boolean;
+ requireManageAgent?: boolean;
+ requireAdmin?: boolean;
+ fallbackPath?: string;
+}
- if (!isAuthenticated) {
+export const ProtectedRoute: React.FC = ({
+ children,
+ requireView = false,
+ requireManageAgent = false,
+ requireAdmin = false,
+ fallbackPath = "/",
+}) => {
+ const { user, isAuthenticated } = useAuthStore();
+
+ if (!isAuthenticated && user?.token) {
+ // User is authenticated based on token
+ }
+
+ if (!user) {
return ;
}
+ if (requireView && !user.permission_view) {
+ return ;
+ }
+
+ if (requireManageAgent && !user.permission_manage_agent) {
+ return ;
+ }
+
+ if (requireAdmin && !user.permission_admin) {
+ return ;
+ }
+
return <>{children}>;
};
diff --git a/frontend/src/app/providers/routing/routing.tsx b/frontend/src/app/providers/routing/routing.tsx
index af4b471..2e8d07c 100644
--- a/frontend/src/app/providers/routing/routing.tsx
+++ b/frontend/src/app/providers/routing/routing.tsx
@@ -1,11 +1,113 @@
import { Suspense } from "react";
import { Routes as ReactRoutes, Route, Navigate } from "react-router-dom";
import { HomePage } from "@/pages/home.page";
-import { ThemesPage } from "@/pages/themes.page";
+import { TestPage } from "@/pages/test.page";
+import { Graph, type GraphData } from "@/modules/graph";
import { AuthPage } from "@/pages/auth.page";
import { RegisterPage } from "@/pages/register.page";
-import { AddAgentsPage } from "@/pages/add-agents.page";
import { DefaultLayout } from "@/shared/layouts/DefaultLayout";
+import { AddAgentsPage } from "@/pages/add-agents.page";
+import { IDEPage } from "@/pages/ide.page";
+import { TemplatesPage } from "@/pages/templates.page";
+import { AdminPage } from "@/pages/admin.page";
+import { RegistrationTokenPage } from "@/pages/registration.page";
+import { LogsPage } from "@/pages/logs.page";
+import { GraphsPage } from "@/pages/graphs.page";
+import { DashboardPage } from "@/pages/dashboard.page";
+import { AgentDashboardPage } from "@/pages/agent-dashboard.page";
+import { ProtectedRoute } from "./helper/protected.route";
+
+export const mockGraphData: GraphData = {
+ nodes: [
+ {
+ id: "api-gateway",
+ name: "API Gateway",
+ type: "service",
+ val: 12,
+ description: "Входная точка API",
+ },
+ {
+ id: "auth-service",
+ name: "Auth Service",
+ type: "service",
+ val: 12,
+ description: "Аутентификация",
+ },
+ {
+ id: "db-service",
+ name: "Database",
+ type: "service",
+ val: 12,
+ description: "Хранилище данных",
+ },
+ {
+ id: "redis-service",
+ name: "Redis",
+ type: "service",
+ val: 12,
+ description: "Кэширование",
+ },
+ {
+ id: "queue-service",
+ name: "Message Queue",
+ type: "service",
+ val: 12,
+ description: "Очередь сообщений",
+ },
+ {
+ id: "user-agent",
+ name: "User Agent",
+ type: "agent",
+ val: 8,
+ description: "Обработка пользователей",
+ },
+ {
+ id: "payment-agent",
+ name: "Payment Agent",
+ type: "agent",
+ val: 8,
+ description: "Платежи",
+ },
+ {
+ id: "notification-agent",
+ name: "Notification Agent",
+ type: "agent",
+ val: 8,
+ description: "Уведомления",
+ },
+ {
+ id: "analytics-agent",
+ name: "Analytics Agent",
+ type: "agent",
+ val: 8,
+ description: "Аналитика",
+ },
+ {
+ id: "report-agent",
+ name: "Report Agent",
+ type: "agent",
+ val: 8,
+ description: "Отчеты",
+ },
+ ],
+ links: [
+ { source: "user-agent", target: "api-gateway", type: "uses" },
+ { source: "user-agent", target: "auth-service", type: "uses" },
+ { source: "user-agent", target: "db-service", type: "uses" },
+ { source: "payment-agent", target: "api-gateway", type: "uses" },
+ { source: "payment-agent", target: "auth-service", type: "uses" },
+ { source: "payment-agent", target: "queue-service", type: "uses" },
+ { source: "notification-agent", target: "redis-service", type: "uses" },
+ { source: "notification-agent", target: "queue-service", type: "uses" },
+ { source: "analytics-agent", target: "db-service", type: "uses" },
+ { source: "report-agent", target: "db-service", type: "uses" },
+ { source: "report-agent", target: "redis-service", type: "uses" },
+ { source: "api-gateway", target: "auth-service", type: "depends_on" },
+ { source: "auth-service", target: "db-service", type: "depends_on" },
+ { source: "api-gateway", target: "queue-service", type: "depends_on" },
+ { source: "queue-service", target: "redis-service", type: "depends_on" },
+ ],
+};
export const Routing = () => {
return (
@@ -17,15 +119,94 @@ export const Routing = () => {
}
>
- }>
- } />
- } />
- } />
- } />
- } />
+ } />
+ } />
- } />
+ }>
+ {/* Routes requiring 'view' permission */}
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+ {/* Routes requiring 'manage_agent' permission */}
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+
+
+ }
+ />
+
+ {/* Admin route requiring 'admin' permission */}
+
+
+
+ }
+ />
+
+ } />
+
+ } />
+
+ } />
);
diff --git a/frontend/src/modules/admin/AdminPanel.tsx b/frontend/src/modules/admin/AdminPanel.tsx
new file mode 100644
index 0000000..0fd035a
--- /dev/null
+++ b/frontend/src/modules/admin/AdminPanel.tsx
@@ -0,0 +1,166 @@
+import React, { useEffect, useState } from "react";
+import {
+ FaUsers,
+ FaShieldAlt,
+ FaSpinner,
+ FaExclamationCircle,
+ FaPlus,
+} from "react-icons/fa";
+import { useAdminStore } from "./store/useAdminStore";
+import { UserCard } from "./components/UserCard";
+import { CreateUserModal } from "./components/CreateUserModal";
+
+export const AdminPanel: React.FC = () => {
+ const users = useAdminStore((s) => s.users);
+ const loading = useAdminStore((s) => s.loading);
+ const error = useAdminStore((s) => s.error);
+ const fetchUsers = useAdminStore((s) => s.fetchUsers);
+
+ const [showCreateModal, setShowCreateModal] = useState(false);
+
+ useEffect(() => {
+ fetchUsers();
+ }, []);
+
+ const activeCount = users.filter((u) => u.is_active).length;
+
+ return (
+
+ {/* Header */}
+
+
+
+
+
+
+
+ Управление пользователями
+
+
+ {loading
+ ? "Загрузка..."
+ : `${activeCount} / ${users.length} активных`}
+
+
+
+
+
setShowCreateModal(true)}
+ style={{
+ display: "flex",
+ alignItems: "center",
+ gap: "6px",
+ padding: "8px 16px",
+ backgroundColor: "var(--accent)",
+ color: "var(--accent-text)",
+ border: "none",
+ borderRadius: "6px",
+ cursor: "pointer",
+ fontSize: "13px",
+ fontWeight: 500,
+ }}
+ >
+
+ Добавить
+
+
+
+ {/* Error */}
+ {error && (
+
+
+ {error}
+
+ )}
+
+ {/* Loading */}
+ {loading && users.length === 0 && (
+
+
+
+ )}
+
+ {/* Users list */}
+ {!loading && (
+
+ {users.map((user) => (
+
+ ))}
+
+ )}
+
+ {/* Empty state */}
+ {!loading && users.length === 0 && (
+
+
+ Нет зарегистрированных пользователей
+
+
+ )}
+
+ {/* Create user modal */}
+
setShowCreateModal(false)}
+ />
+
+ );
+};
diff --git a/frontend/src/modules/admin/api/admin.api.ts b/frontend/src/modules/admin/api/admin.api.ts
new file mode 100644
index 0000000..3419ec9
--- /dev/null
+++ b/frontend/src/modules/admin/api/admin.api.ts
@@ -0,0 +1,97 @@
+import { apiClient } from "@/shared/api/axios.instance";
+
+const getAuthHeader = () => {
+ const raw = localStorage.getItem("auth-storage");
+ if (raw) {
+ try {
+ const parsed = JSON.parse(raw);
+ if (parsed?.state?.token) return `bearer ${parsed.state.token}`;
+ } catch {}
+ }
+ return "";
+};
+
+export interface AdminUserDto {
+ id: number;
+ login: string;
+ name: string;
+ last_name: string;
+ is_active: boolean;
+ permission_admin: boolean;
+ permission_manage_agent: boolean;
+ permission_view: boolean;
+ token: string;
+}
+
+export interface CreateUserPayload {
+ login: string;
+ name: string;
+ last_name: string;
+ password: string;
+ is_active: boolean;
+ permission_admin: boolean;
+ permission_manage_agent: boolean;
+ permission_view: boolean;
+}
+
+export interface PermissionsPayload {
+ is_active: boolean;
+ permission_admin: boolean;
+ permission_manage_agent: boolean;
+ permission_view: boolean;
+}
+
+export const adminApi = {
+ getUsers: async (): Promise => {
+ const res = await apiClient.get("/auth/tokens", {
+ headers: { Authorization: getAuthHeader() },
+ });
+ return res.data;
+ },
+
+ createUser: async (payload: CreateUserPayload): Promise => {
+ await apiClient.post("/auth/token", payload, {
+ headers: { Authorization: getAuthHeader() },
+ });
+ },
+
+ deleteUser: async (login: string): Promise => {
+ await apiClient.delete(`/auth/tokens/${login}`, {
+ headers: { Authorization: getAuthHeader() },
+ });
+ },
+
+ activateUser: async (login: string): Promise => {
+ await apiClient.post(
+ `/auth/users/${login}/activate`,
+ {},
+ { headers: { Authorization: getAuthHeader() } },
+ );
+ },
+
+ deactivateUser: async (login: string): Promise => {
+ await apiClient.post(
+ `/auth/users/${login}/deactivate`,
+ {},
+ { headers: { Authorization: getAuthHeader() } },
+ );
+ },
+
+ updatePermissions: async (
+ login: string,
+ payload: PermissionsPayload,
+ ): Promise => {
+ await apiClient.put(`/auth/users/${login}/permissions`, payload, {
+ headers: { Authorization: getAuthHeader() },
+ });
+ },
+
+ generateToken: async (label: string): Promise => {
+ const res = await apiClient.post<{ token: string }>(
+ "/agents/register-token",
+ { label },
+ { headers: { Authorization: getAuthHeader() } },
+ );
+ return res.data.token;
+ },
+};
diff --git a/frontend/src/modules/admin/components/CreateUserModal.tsx b/frontend/src/modules/admin/components/CreateUserModal.tsx
new file mode 100644
index 0000000..58eaca4
--- /dev/null
+++ b/frontend/src/modules/admin/components/CreateUserModal.tsx
@@ -0,0 +1,310 @@
+import React, { useState } from "react";
+import { FaTimes, FaPlus } from "react-icons/fa";
+import { useAdminStore } from "../store/useAdminStore";
+
+interface CreateUserModalProps {
+ isOpen: boolean;
+ onClose: () => void;
+}
+
+export const CreateUserModal: React.FC = ({
+ isOpen,
+ onClose,
+}) => {
+ const createUser = useAdminStore((s) => s.createUser);
+
+ const [form, setForm] = useState({
+ login: "",
+ name: "",
+ last_name: "",
+ password: "",
+ is_active: true,
+ permission_admin: false,
+ permission_manage_agent: false,
+ permission_view: true,
+ });
+
+ const [loading, setLoading] = useState(false);
+
+ if (!isOpen) return null;
+
+ const handleSubmit = async () => {
+ if (!form.login || !form.password) return;
+ setLoading(true);
+ await createUser(form);
+ setLoading(false);
+ setForm({
+ login: "",
+ name: "",
+ last_name: "",
+ password: "",
+ is_active: true,
+ permission_admin: false,
+ permission_manage_agent: false,
+ permission_view: true,
+ });
+ onClose();
+ };
+
+ return (
+
+
e.stopPropagation()}
+ >
+
+
+ Создать пользователя
+
+
+
+
+
+
+
+ {/* Login */}
+
+
+ Логин
+
+ setForm({ ...form, login: e.target.value })}
+ style={{
+ width: "100%",
+ padding: "8px",
+ backgroundColor: "var(--input-bg)",
+ border: "1px solid var(--border)",
+ borderRadius: "6px",
+ color: "var(--text-primary)",
+ fontSize: "13px",
+ outline: "none",
+ }}
+ />
+
+
+ {/* Password */}
+
+
+ Пароль
+
+ setForm({ ...form, password: e.target.value })}
+ style={{
+ width: "100%",
+ padding: "8px",
+ backgroundColor: "var(--input-bg)",
+ border: "1px solid var(--border)",
+ borderRadius: "6px",
+ color: "var(--text-primary)",
+ fontSize: "13px",
+ outline: "none",
+ }}
+ />
+
+
+ {/* Name + Last name */}
+
+
+
+ Имя
+
+ setForm({ ...form, name: e.target.value })}
+ style={{
+ width: "100%",
+ padding: "8px",
+ backgroundColor: "var(--input-bg)",
+ border: "1px solid var(--border)",
+ borderRadius: "6px",
+ color: "var(--text-primary)",
+ fontSize: "13px",
+ outline: "none",
+ }}
+ />
+
+
+
+ Фамилия
+
+
+ setForm({ ...form, last_name: e.target.value })
+ }
+ style={{
+ width: "100%",
+ padding: "8px",
+ backgroundColor: "var(--input-bg)",
+ border: "1px solid var(--border)",
+ borderRadius: "6px",
+ color: "var(--text-primary)",
+ fontSize: "13px",
+ outline: "none",
+ }}
+ />
+
+
+
+ {/* Permissions */}
+
+
+ Разрешения
+
+
+ {[
+ { key: "is_active", label: "Active" },
+ { key: "permission_view", label: "View" },
+ { key: "permission_manage_agent", label: "Manage Agent" },
+ { key: "permission_admin", label: "Admin" },
+ ].map(({ key, label }) => (
+
+
+ setForm({ ...form, [key]: e.target.checked })
+ }
+ style={{ accentColor: "var(--accent)" }}
+ />
+ {label}
+
+ ))}
+
+
+
+ {/* Submit */}
+
+
+ {loading ? "Создание..." : "Создать"}
+
+
+
+
+ );
+};
diff --git a/frontend/src/modules/admin/components/UserCard.tsx b/frontend/src/modules/admin/components/UserCard.tsx
new file mode 100644
index 0000000..8ffe552
--- /dev/null
+++ b/frontend/src/modules/admin/components/UserCard.tsx
@@ -0,0 +1,207 @@
+import React from "react";
+import { FaUser, FaCheck, FaTrash } from "react-icons/fa";
+import type { AdminUser, PermissionKey } from "../types";
+import { useAdminStore } from "../store/useAdminStore";
+
+interface UserCardProps {
+ user: AdminUser;
+}
+
+const permissions: { key: PermissionKey; label: string }[] = [
+ { key: "permission_view", label: "View" },
+ { key: "permission_manage_agent", label: "Manage Agent" },
+ { key: "permission_admin", label: "Admin" },
+];
+
+export const UserCard: React.FC = ({ user }) => {
+ const users = useAdminStore((s) => s.users);
+ const toggleActive = useAdminStore((s) => s.toggleActive);
+ const togglePermission = useAdminStore((s) => s.togglePermission);
+ const deleteUser = useAdminStore((s) => s.deleteUser);
+
+ return (
+
+ {/* Header: User info + Active toggle + Delete */}
+
+
+
+
+
+
+
+ {user.name} {user.last_name}
+
+
+ {user.login}
+
+
+
+
+
+ {/* Active toggle */}
+
+
+ {user.is_active ? "Active" : "Inactive"}
+
+
toggleActive(user.id, user.login, user.is_active)}
+ style={{
+ width: "40px",
+ height: "22px",
+ borderRadius: "11px",
+ border: "none",
+ backgroundColor: user.is_active ? "#22c55e" : "#6b7280",
+ cursor: "pointer",
+ position: "relative",
+ transition: "background-color 0.2s",
+ }}
+ >
+
+
+
+
+ {/* Delete button */}
+
{
+ if (window.confirm(`Удалить пользователя "${user.login}"?`)) {
+ deleteUser(user.id, user.login);
+ }
+ }}
+ title="Удалить"
+ style={{
+ background: "transparent",
+ border: "1px solid transparent",
+ color: "var(--text-muted)",
+ cursor: "pointer",
+ padding: "6px",
+ borderRadius: "6px",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ transition: "all 0.15s",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.color = "var(--error-text, #ef4444)";
+ e.currentTarget.style.backgroundColor = "rgba(239,68,68,0.1)";
+ e.currentTarget.style.borderColor = "rgba(239,68,68,0.3)";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = "var(--text-muted)";
+ e.currentTarget.style.backgroundColor = "transparent";
+ e.currentTarget.style.borderColor = "transparent";
+ }}
+ >
+
+
+
+
+
+ {/* Permissions */}
+
+ {permissions.map(({ key, label }) => (
+
+ togglePermission(user.id, user.login, key, users)}
+ style={{
+ width: "18px",
+ height: "18px",
+ borderRadius: "4px",
+ border: "1px solid",
+ borderColor: user[key] ? "var(--accent)" : "var(--border)",
+ backgroundColor: user[key] ? "var(--accent)" : "transparent",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ transition: "all 0.15s",
+ cursor: "pointer",
+ }}
+ >
+ {user[key] && (
+
+ )}
+
+ {label}
+
+ ))}
+
+
+ );
+};
diff --git a/frontend/src/modules/admin/index.ts b/frontend/src/modules/admin/index.ts
new file mode 100644
index 0000000..5a039a3
--- /dev/null
+++ b/frontend/src/modules/admin/index.ts
@@ -0,0 +1,4 @@
+export { AdminPanel } from "./AdminPanel";
+export { useAdminStore } from "./store/useAdminStore";
+export { adminApi } from "./api/admin.api";
+export type { AdminUser } from "./types";
diff --git a/frontend/src/modules/admin/store/useAdminStore.ts b/frontend/src/modules/admin/store/useAdminStore.ts
new file mode 100644
index 0000000..34dcb21
--- /dev/null
+++ b/frontend/src/modules/admin/store/useAdminStore.ts
@@ -0,0 +1,129 @@
+import { create } from "zustand";
+import type { AdminUser, PermissionKey } from "../types";
+import { adminApi } from "../api/admin.api";
+import type { CreateUserPayload } from "../api/admin.api";
+
+interface AdminState {
+ users: AdminUser[];
+ loading: boolean;
+ error: string | null;
+ fetchUsers: () => Promise;
+ createUser: (payload: CreateUserPayload) => Promise;
+ deleteUser: (id: string, login: string) => Promise;
+ toggleActive: (id: string, login: string, current: boolean) => Promise;
+ togglePermission: (
+ id: string,
+ login: string,
+ permission: PermissionKey,
+ users: AdminUser[],
+ ) => Promise;
+}
+
+export const useAdminStore = create((set, get) => ({
+ users: [],
+ loading: false,
+ error: null,
+
+ fetchUsers: async () => {
+ set({ loading: true, error: null });
+ try {
+ const data = await adminApi.getUsers();
+ set({
+ users: data.map((u) => ({
+ id: String(u.id),
+ login: u.login,
+ name: u.name,
+ last_name: u.last_name,
+ is_active: u.is_active,
+ permission_admin: u.permission_admin,
+ permission_manage_agent: u.permission_manage_agent,
+ permission_view: u.permission_view,
+ })),
+ loading: false,
+ });
+ } catch (e) {
+ set({
+ error: e instanceof Error ? e.message : "Failed to fetch users",
+ loading: false,
+ });
+ }
+ },
+
+ createUser: async (payload) => {
+ try {
+ await adminApi.createUser(payload);
+ await get().fetchUsers();
+ } catch (e) {
+ set({ error: e instanceof Error ? e.message : "Failed to create user" });
+ }
+ },
+
+ deleteUser: async (id, login) => {
+ try {
+ await adminApi.deleteUser(login);
+ set((state) => ({
+ users: state.users.filter((u) => u.id !== id),
+ }));
+ } catch (e) {
+ set({ error: e instanceof Error ? e.message : "Failed to delete user" });
+ }
+ },
+
+ toggleActive: async (id, login, current) => {
+ try {
+ if (current) {
+ await adminApi.deactivateUser(login);
+ } else {
+ await adminApi.activateUser(login);
+ }
+ set((state) => ({
+ users: state.users.map((u) =>
+ u.id === id ? { ...u, is_active: !current } : u,
+ ),
+ }));
+ } catch (e) {
+ set({
+ error: e instanceof Error ? e.message : "Failed to toggle active",
+ });
+ }
+ },
+
+ togglePermission: async (id, login, permission, users) => {
+ const user = users.find((u) => u.id === id);
+ if (!user) return;
+
+ const newPermissions = {
+ is_active: user.is_active,
+ permission_admin:
+ permission === "permission_admin"
+ ? !user.permission_admin
+ : user.permission_admin,
+ permission_manage_agent:
+ permission === "permission_manage_agent"
+ ? !user.permission_manage_agent
+ : user.permission_manage_agent,
+ permission_view:
+ permission === "permission_view"
+ ? !user.permission_view
+ : user.permission_view,
+ };
+
+ try {
+ await adminApi.updatePermissions(login, newPermissions);
+ set((state) => ({
+ users: state.users.map((u) =>
+ u.id === id
+ ? {
+ ...u,
+ [permission]: !u[permission],
+ }
+ : u,
+ ),
+ }));
+ } catch (e) {
+ set({
+ error: e instanceof Error ? e.message : "Failed to update permissions",
+ });
+ }
+ },
+}));
diff --git a/frontend/src/modules/admin/types.ts b/frontend/src/modules/admin/types.ts
new file mode 100644
index 0000000..28686a5
--- /dev/null
+++ b/frontend/src/modules/admin/types.ts
@@ -0,0 +1,15 @@
+export interface AdminUser {
+ id: string;
+ login: string;
+ name: string;
+ last_name: string;
+ is_active: boolean;
+ permission_admin: boolean;
+ permission_manage_agent: boolean;
+ permission_view: boolean;
+}
+
+export type PermissionKey =
+ | "permission_admin"
+ | "permission_manage_agent"
+ | "permission_view";
diff --git a/frontend/src/modules/agent/api/agent.api.service.ts b/frontend/src/modules/agent/api/agent.api.service.ts
new file mode 100644
index 0000000..296d95a
--- /dev/null
+++ b/frontend/src/modules/agent/api/agent.api.service.ts
@@ -0,0 +1,181 @@
+import { apiClient } from "@/shared/api/axios.instance";
+import type {
+ AgentInfo,
+ TokenCreate,
+ TokenUser,
+ LogEntry,
+ LogFilters,
+ InsertLogRequest,
+ InsertLogsRequest,
+ TokenUpdate,
+ TokenUpdatePermissions,
+ TokenPasswordReset,
+ RegistrationRequest,
+ DeployAgentsRequest,
+ DeployResponse,
+ SystemMetrics,
+} from "../types/agent.types";
+import type { GraphApiResponse } from "@/modules/graph/types";
+
+class AgentApiService {
+ private readonly basePath = "/agents";
+ private readonly authBasePath = "/auth";
+ private readonly logsBasePath = "/logs";
+
+ async getAgents(): Promise {
+ const response = await apiClient.get(this.basePath);
+ return Array.isArray(response.data) ? response.data : [];
+ }
+
+ async getUsers(): Promise {
+ const response = await apiClient.get(
+ `${this.authBasePath}/tokens`,
+ );
+ return Array.isArray(response.data) ? response.data : [];
+ }
+
+ async createUser(data: TokenCreate): Promise {
+ await apiClient.post(`${this.authBasePath}/token`, data);
+ }
+
+ async deleteUser(login: string): Promise {
+ await apiClient.delete(`${this.authBasePath}/tokens/${login}`);
+ }
+
+ async deleteMyAccount(): Promise {
+ await apiClient.delete(`${this.authBasePath}/token`);
+ }
+
+ async searchLogs(filters?: LogFilters): Promise {
+ const response = await apiClient.get(this.logsBasePath, {
+ params: {
+ level: filters?.level || undefined,
+ service: filters?.service || undefined,
+ agent: filters?.agent || undefined,
+ date_from: filters?.date_from || undefined,
+ date_to: filters?.date_to || undefined,
+ limit: filters?.limit ?? 100,
+ offset: filters?.offset ?? 0,
+ },
+ });
+
+ if (!Array.isArray(response.data)) {
+ console.error(
+ "[Logs] Unexpected response format:",
+ typeof response.data,
+ response.data,
+ );
+ return [];
+ }
+
+ return response.data;
+ }
+
+ async insertLog(entry: InsertLogRequest): Promise {
+ await apiClient.post(this.logsBasePath, entry);
+ }
+
+ async insertLogsBatch(data: InsertLogsRequest): Promise {
+ await apiClient.post(`${this.logsBasePath}/batch`, data);
+ }
+
+ async getDistinctAgents(): Promise {
+ const response = await apiClient.get(
+ `${this.logsBasePath}/agents`,
+ );
+ return Array.isArray(response.data) ? response.data : [];
+ }
+
+ async getDistinctLevels(): Promise {
+ const response = await apiClient.get(
+ `${this.logsBasePath}/levels`,
+ );
+ return Array.isArray(response.data) ? response.data : [];
+ }
+
+ async getDistinctServices(): Promise {
+ const response = await apiClient.get(
+ `${this.logsBasePath}/services`,
+ );
+ return Array.isArray(response.data) ? response.data : [];
+ }
+
+ // User management methods
+ async getUserByLogin(login: string): Promise {
+ const response = await apiClient.get(
+ `${this.authBasePath}/users/${login}`,
+ );
+ if (!response.data || typeof response.data !== "object") {
+ throw new Error(`User not found: ${login}`);
+ }
+ return response.data;
+ }
+
+ async getInactiveUsers(): Promise {
+ const response = await apiClient.get(
+ `${this.authBasePath}/users/inactive`,
+ );
+ return Array.isArray(response.data) ? response.data : [];
+ }
+
+ async updateUser(login: string, data: TokenUpdate): Promise {
+ await apiClient.put(`${this.authBasePath}/users/${login}`, data);
+ }
+
+ async updateUserPermissions(
+ login: string,
+ data: TokenUpdatePermissions,
+ ): Promise {
+ await apiClient.put(
+ `${this.authBasePath}/users/${login}/permissions`,
+ data,
+ );
+ }
+
+ async resetUserPassword(
+ login: string,
+ data: TokenPasswordReset,
+ ): Promise {
+ await apiClient.put(`${this.authBasePath}/users/${login}/password`, data);
+ }
+
+ async activateUser(login: string): Promise {
+ await apiClient.post(`${this.authBasePath}/users/${login}/activate`);
+ }
+
+ async deactivateUser(login: string): Promise {
+ await apiClient.post(`${this.authBasePath}/users/${login}/deactivate`);
+ }
+
+ async createRegistrationToken(
+ data: RegistrationRequest,
+ ): Promise> {
+ const response = await apiClient.post>(
+ `${this.basePath}/register-token`,
+ data,
+ );
+ return response.data;
+ }
+
+ async deployAgents(data: DeployAgentsRequest): Promise {
+ const response = await apiClient.post(
+ `${this.basePath}/deploy`,
+ data,
+ );
+ return response.data;
+ }
+
+ async getSystemMetrics(): Promise {
+ const response = await apiClient.get(
+ `${this.basePath}/system-metrics`,
+ );
+ return Array.isArray(response.data) ? response.data : [];
+ }
+
+ async getGraph(): Promise {
+ const response = await apiClient.get("/graph");
+ return response.data;
+ }
+}
+
+export const agentApiService = new AgentApiService();
diff --git a/frontend/src/modules/agent/hooks/useAgents.hook.ts b/frontend/src/modules/agent/hooks/useAgents.hook.ts
new file mode 100644
index 0000000..7aef8ae
--- /dev/null
+++ b/frontend/src/modules/agent/hooks/useAgents.hook.ts
@@ -0,0 +1,36 @@
+import { useState, useEffect, useCallback } from "react";
+import { agentApiService } from "../api/agent.api.service";
+import type { AgentInfo } from "../types/agent.types";
+
+interface UseAgentsResult {
+ agents: AgentInfo[];
+ isLoading: boolean;
+ error: string | null;
+ refetch: () => Promise;
+}
+
+export function useAgents(): UseAgentsResult {
+ const [agents, setAgents] = useState([]);
+ const [isLoading, setIsLoading] = useState(false);
+ const [error, setError] = useState(null);
+
+ const fetchAgents = useCallback(async () => {
+ setIsLoading(true);
+ setError(null);
+ try {
+ const data = await agentApiService.getAgents();
+ setAgents(data);
+ } catch (err) {
+ const message = err instanceof Error ? err.message : "Failed to fetch agents";
+ setError(message);
+ } finally {
+ setIsLoading(false);
+ }
+ }, []);
+
+ useEffect(() => {
+ fetchAgents();
+ }, [fetchAgents]);
+
+ return { agents, isLoading, error, refetch: fetchAgents };
+}
diff --git a/frontend/src/modules/agent/index.ts b/frontend/src/modules/agent/index.ts
new file mode 100644
index 0000000..3b4cdad
--- /dev/null
+++ b/frontend/src/modules/agent/index.ts
@@ -0,0 +1,26 @@
+export { SSHAgentForm } from "./ui/SSHAgentForm";
+export type { SSHAgentConfig, ExtraField } from "./ui/SSHAgentForm";
+
+export { useAgents } from "./hooks/useAgents.hook";
+
+export { agentApiService } from "./api/agent.api.service";
+
+export type {
+ AgentInfo,
+ LoginRequest,
+ LoginResponse,
+ TokenCreate,
+ TokenUser,
+ LogEntry,
+ InsertLogRequest,
+ InsertLogsRequest,
+ LogFilters,
+ TokenUpdate,
+ TokenUpdatePermissions,
+ TokenPasswordReset,
+ RegistrationRequest,
+ DeployResult,
+ DeployAgentsRequest,
+ AgentDeployConfig,
+ DeployResponse,
+} from "./types/agent.types";
diff --git a/frontend/src/modules/agent/store/logFilter.store.ts b/frontend/src/modules/agent/store/logFilter.store.ts
new file mode 100644
index 0000000..60be5e5
--- /dev/null
+++ b/frontend/src/modules/agent/store/logFilter.store.ts
@@ -0,0 +1,87 @@
+import { create } from "zustand";
+
+export type LogLevel = "info" | "warning" | "error" | "fatal";
+
+interface LogFilterState {
+ searchQuery: string;
+ startDate: Date | null;
+ endDate: Date | null;
+ selectedLogLevel: LogLevel | null;
+ selectedService: string;
+ selectedAgent: string;
+ limit: number;
+ offset: number;
+
+ setSearchQuery: (query: string) => void;
+ setStartDate: (date: Date | null) => void;
+ setEndDate: (date: Date | null) => void;
+ setSelectedLogLevel: (level: LogLevel | null) => void;
+ setSelectedService: (service: string) => void;
+ setSelectedAgent: (agent: string) => void;
+ setLimit: (limit: number) => void;
+ setOffset: (offset: number) => void;
+ resetFilters: () => void;
+ getFilters: () => {
+ level?: string;
+ service?: string;
+ agent?: string;
+ date_from?: string;
+ date_to?: string;
+ limit: number;
+ offset: number;
+ };
+}
+
+export const useLogFilterStore = create((set, get) => ({
+ searchQuery: "",
+ startDate: null,
+ endDate: null,
+ selectedLogLevel: null,
+ selectedService: "",
+ selectedAgent: "",
+ limit: 100,
+ offset: 0,
+
+ setSearchQuery: (query) => set({ searchQuery: query }),
+ setStartDate: (date) => set({ startDate: date }),
+ setEndDate: (date) => set({ endDate: date }),
+ setSelectedLogLevel: (level) => set({ selectedLogLevel: level }),
+ setSelectedService: (service) => set({ selectedService: service }),
+ setSelectedAgent: (agent) => set({ selectedAgent: agent }),
+ setLimit: (limit) => set({ limit }),
+ setOffset: (offset) => set({ offset }),
+
+ resetFilters: () => {
+ set({
+ searchQuery: "",
+ startDate: null,
+ endDate: null,
+ selectedLogLevel: null,
+ selectedService: "",
+ selectedAgent: "",
+ limit: 100,
+ offset: 0,
+ });
+ },
+
+ getFilters: () => {
+ const {
+ selectedLogLevel,
+ selectedService,
+ selectedAgent,
+ startDate,
+ endDate,
+ limit,
+ offset,
+ } = get();
+ return {
+ level: selectedLogLevel || undefined,
+ service: selectedService || undefined,
+ agent: selectedAgent || undefined,
+ date_from: startDate ? startDate.toISOString() : undefined,
+ date_to: endDate ? endDate.toISOString() : undefined,
+ limit,
+ offset,
+ };
+ },
+}));
diff --git a/frontend/src/modules/agent/types/agent.types.ts b/frontend/src/modules/agent/types/agent.types.ts
new file mode 100644
index 0000000..6d41005
--- /dev/null
+++ b/frontend/src/modules/agent/types/agent.types.ts
@@ -0,0 +1,131 @@
+export interface AgentInfo {
+ token: string;
+ label: string;
+ services: string[];
+ connected_at: string;
+}
+
+export interface LoginRequest {
+ login: string;
+ password: string;
+}
+
+export interface LoginResponse {
+ last_name: string;
+ login: string;
+ name: string;
+ permission_admin: boolean;
+ permission_manage_agent: boolean;
+ permission_view: boolean;
+ token: string;
+}
+
+export interface TokenCreate {
+ login: string;
+ name: string;
+ last_name: string;
+ password: string;
+ permission_admin?: boolean;
+ permission_manage_agent?: boolean;
+ permission_view?: boolean;
+}
+
+export interface TokenUser {
+ id: number;
+ login: string;
+ name: string;
+ last_name: string;
+ permission_admin: boolean;
+ permission_manage_agent: boolean;
+ permission_view: boolean;
+ token: string;
+}
+
+export interface LogEntry {
+ Agent: string;
+ Level: string;
+ Message: string;
+ Service: string;
+ Timestamp: string;
+}
+
+export interface InsertLogRequest {
+ agent: string;
+ level: string;
+ message: string;
+ service: string;
+ timestamp?: string;
+}
+
+export interface InsertLogsRequest {
+ logs: InsertLogRequest[];
+}
+
+export interface LogFilters {
+ level?: string | string[];
+ service?: string;
+ agent?: string;
+ date_from?: string;
+ date_to?: string;
+ limit?: number;
+ offset?: number;
+}
+
+export interface TokenUpdate {
+ name?: string;
+ last_name?: string;
+}
+
+export interface TokenUpdatePermissions {
+ is_active?: boolean;
+ permission_admin?: boolean;
+ permission_manage_agent?: boolean;
+ permission_view?: boolean;
+}
+
+export interface TokenPasswordReset {
+ new_password: string;
+}
+
+export interface RegistrationRequest {
+ label: string;
+}
+
+export interface DeployResult {
+ agent_label: string;
+ error?: string;
+ ip: string;
+ success: boolean;
+ token?: string;
+}
+
+export interface DeployAgentsRequest {
+ servers: AgentDeployConfig[];
+}
+
+export interface AgentDeployConfig {
+ agentLabel: string;
+ authMethod: "key" | "password";
+ deployType: "docker" | "binary";
+ ip: string;
+ password?: string;
+ port?: number;
+ sshKey?: string;
+ user: string;
+}
+
+export interface DeployResponse {
+ message?: string;
+ results: DeployResult[];
+}
+
+export interface SystemMetrics {
+ connected_at: string;
+ cpu_percent: number;
+ disk_percent: number;
+ id: string;
+ label: string;
+ memory_percent: number;
+ network_rx_bytes: number;
+ network_tx_bytes: number;
+}
diff --git a/frontend/src/modules/agent/ui/LogFilters.tsx b/frontend/src/modules/agent/ui/LogFilters.tsx
new file mode 100644
index 0000000..7490251
--- /dev/null
+++ b/frontend/src/modules/agent/ui/LogFilters.tsx
@@ -0,0 +1,556 @@
+import React, { useState, useEffect, useCallback } from "react";
+import {
+ FiSearch,
+ FiX,
+ FiFilter,
+ FiCalendar,
+ FiTag,
+ FiCheck,
+} from "react-icons/fi";
+import { useLogFilterStore, type LogLevel } from "../store/logFilter.store";
+
+const logLevelColors: Record<
+ LogLevel,
+ { bg: string; text: string; border: string }
+> = {
+ info: {
+ bg: "rgba(59, 130, 246, 0.1)",
+ text: "#3b82f6",
+ border: "rgba(59, 130, 246, 0.3)",
+ },
+ warning: {
+ bg: "rgba(245, 158, 11, 0.1)",
+ text: "#f59e0b",
+ border: "rgba(245, 158, 11, 0.3)",
+ },
+ error: {
+ bg: "var(--error-bg)",
+ text: "var(--error-text)",
+ border: "var(--error-border)",
+ },
+ fatal: {
+ bg: "rgba(168, 85, 247, 0.1)",
+ text: "#a855f7",
+ border: "rgba(168, 85, 247, 0.3)",
+ },
+};
+
+interface LogFiltersProps {
+ onApply: () => void;
+ availableServices: string[];
+ availableAgents: string[];
+}
+
+export const LogFilters: React.FC = ({
+ onApply,
+ availableServices,
+ availableAgents,
+}) => {
+ const {
+ searchQuery,
+ startDate,
+ endDate,
+ selectedLogLevel,
+ selectedService,
+ selectedAgent,
+ setSearchQuery,
+ setStartDate,
+ setEndDate,
+ setSelectedLogLevel,
+ setSelectedService,
+ setSelectedAgent,
+ resetFilters,
+ } = useLogFilterStore();
+
+ const [localSearchQuery, setLocalSearchQuery] = useState(searchQuery);
+ const [localStartDate, setLocalStartDate] = useState(startDate);
+ const [localEndDate, setLocalEndDate] = useState(endDate);
+ const [localService, setLocalService] = useState(selectedService);
+ const [localAgent, setLocalAgent] = useState(selectedAgent);
+ const [localLevel, setLocalLevel] = useState(
+ selectedLogLevel,
+ );
+
+ useEffect(() => {
+ setLocalSearchQuery(searchQuery);
+ }, [searchQuery]);
+
+ useEffect(() => {
+ setLocalStartDate(startDate);
+ }, [startDate]);
+
+ useEffect(() => {
+ setLocalEndDate(endDate);
+ }, [endDate]);
+
+ useEffect(() => {
+ setLocalService(selectedService);
+ }, [selectedService]);
+
+ useEffect(() => {
+ setLocalAgent(selectedAgent);
+ }, [selectedAgent]);
+
+ useEffect(() => {
+ setLocalLevel(selectedLogLevel);
+ }, [selectedLogLevel]);
+
+ const handleApply = useCallback(() => {
+ setSearchQuery(localSearchQuery);
+ setStartDate(localStartDate);
+ setEndDate(localEndDate);
+ setSelectedLogLevel(localLevel);
+ setSelectedService(localService);
+ setSelectedAgent(localAgent);
+ onApply();
+ }, [
+ localSearchQuery,
+ localStartDate,
+ localEndDate,
+ localLevel,
+ localService,
+ localAgent,
+ onApply,
+ ]);
+
+ const handleReset = useCallback(() => {
+ setLocalSearchQuery("");
+ setLocalStartDate(null);
+ setLocalEndDate(null);
+ setLocalLevel(null);
+ setLocalService("");
+ setLocalAgent("");
+ resetFilters();
+ onApply();
+ }, [resetFilters, onApply]);
+
+ const getActiveFiltersCount = () => {
+ let count = 0;
+ if (searchQuery) count++;
+ if (startDate) count++;
+ if (endDate) count++;
+ if (selectedService) count++;
+ if (selectedAgent) count++;
+ if (selectedLogLevel) count++;
+ return count;
+ };
+
+ const formatDate = (date: Date | null) => {
+ if (!date) return null;
+ return date.toLocaleDateString("ru-RU");
+ };
+
+ const activeFiltersCount = getActiveFiltersCount();
+
+ const inputStyle: React.CSSProperties = {
+ width: "100%",
+ padding: "8px 12px",
+ border: "1px solid var(--border)",
+ borderRadius: "6px",
+ backgroundColor: "var(--input-bg)",
+ color: "var(--text-primary)",
+ fontSize: "13px",
+ };
+
+ const selectStyle: React.CSSProperties = {
+ ...inputStyle,
+ cursor: "pointer",
+ };
+
+ return (
+
+
+ {/* Header */}
+
+
+
+
+ Фильтры логов
+
+
+
+ Активно: {activeFiltersCount}
+
+
+
+ {/* Filters Grid */}
+
+
+ {/* Log Levels */}
+
+
+
+
+ Уровень логов
+
+
+
+ {(["info", "warning", "error", "fatal"] as LogLevel[]).map(
+ (level) => {
+ const isSelected = localLevel === level;
+ const colors = logLevelColors[level];
+ return (
+ setLocalLevel(isSelected ? null : level)}
+ className="px-3 py-2 rounded-lg text-xs font-medium transition-all border flex-shrink-0"
+ style={{
+ backgroundColor: isSelected ? colors.bg : "transparent",
+ color: isSelected ? colors.text : "var(--text-secondary)",
+ borderColor: isSelected ? colors.border : "var(--border)",
+ minHeight: "36px",
+ }}
+ onMouseEnter={(e) => {
+ if (isSelected) {
+ e.currentTarget.style.backgroundColor = colors.text;
+ e.currentTarget.style.color = "#fff";
+ } else {
+ e.currentTarget.style.backgroundColor =
+ "rgba(128, 128, 128, 0.08)";
+ e.currentTarget.style.color = "var(--text-primary)";
+ }
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = isSelected
+ ? colors.bg
+ : "transparent";
+ e.currentTarget.style.color = isSelected
+ ? colors.text
+ : "var(--text-secondary)";
+ }}
+ >
+ {isSelected && (
+
+ )}
+ {level.toUpperCase()}
+
+ );
+ },
+ )}
+
+
+
+ {/* Action Buttons */}
+
+
+
+ Применить
+
+
+
+ Сбросить
+
+
+
+ {/* Active Filters Display */}
+ {activeFiltersCount > 0 && (
+
+
+
+
+ Активные фильтры:
+
+
+
+ {searchQuery && (
+
+
+
+ Поиск: {searchQuery}
+
+ {
+ setLocalSearchQuery("");
+ setSearchQuery("");
+ onApply();
+ }}
+ style={{
+ background: "none",
+ border: "none",
+ cursor: "pointer",
+ color: "var(--text-muted)",
+ }}
+ >
+
+
+
+ )}
+ {selectedService && (
+
+
+
+ Сервис: {selectedService}
+
+ {
+ setLocalService("");
+ setSelectedService("");
+ onApply();
+ }}
+ style={{
+ background: "none",
+ border: "none",
+ cursor: "pointer",
+ color: "var(--text-muted)",
+ }}
+ >
+
+
+
+ )}
+ {selectedLogLevel &&
+ (() => {
+ const colors = logLevelColors[selectedLogLevel];
+ return (
+
+
+
+ Уровень: {selectedLogLevel.toUpperCase()}
+
+ {
+ setLocalLevel(null);
+ setSelectedLogLevel(null);
+ onApply();
+ }}
+ style={{
+ background: "none",
+ border: "none",
+ cursor: "pointer",
+ color: colors.text,
+ }}
+ >
+
+
+
+ );
+ })()}
+ {selectedAgent && (
+
+
+
+ Агент: {selectedAgent}
+
+ {
+ setLocalAgent("");
+ setSelectedAgent("");
+ onApply();
+ }}
+ style={{
+ background: "none",
+ border: "none",
+ cursor: "pointer",
+ color: "var(--text-muted)",
+ }}
+ >
+
+
+
+ )}
+ {startDate && (
+
+
+
+ С: {formatDate(startDate)}
+
+ {
+ setLocalStartDate(null);
+ setStartDate(null);
+ onApply();
+ }}
+ style={{
+ background: "none",
+ border: "none",
+ cursor: "pointer",
+ color: "var(--text-muted)",
+ }}
+ >
+
+
+
+ )}
+ {endDate && (
+
+
+
+ По: {formatDate(endDate)}
+
+ {
+ setLocalEndDate(null);
+ setEndDate(null);
+ onApply();
+ }}
+ style={{
+ background: "none",
+ border: "none",
+ cursor: "pointer",
+ color: "var(--text-muted)",
+ }}
+ >
+
+
+
+ )}
+
+
+ )}
+
+
+ );
+};
diff --git a/frontend/src/modules/agent/ui/SSHAgentForm.tsx b/frontend/src/modules/agent/ui/SSHAgentForm.tsx
index d53b187..032dce4 100644
--- a/frontend/src/modules/agent/ui/SSHAgentForm.tsx
+++ b/frontend/src/modules/agent/ui/SSHAgentForm.tsx
@@ -7,6 +7,7 @@ import {
FiPlus,
FiTrash2,
FiSettings,
+ FiLink,
} from "react-icons/fi";
import { SiDocker } from "react-icons/si";
import { FiPackage, FiUploadCloud } from "react-icons/fi";
@@ -20,8 +21,10 @@ interface ExtraField {
}
export interface SSHAgentConfig {
+ agentLabel: string;
user: string;
ip: string;
+ port: number;
authMethod: AuthMethod;
sshKey?: string;
password?: string;
@@ -189,11 +192,31 @@ export const SSHAgentForm: React.FC = ({
- {/* User и IP */}
+ {/* Agent Label */}
+
+
+
+
+ Метка агента *
+
+
+ handleChange("agentLabel", e.target.value)}
+ required
+ style={inputBaseStyle}
+ onFocus={handleFocus}
+ onBlur={handleBlur}
+ placeholder="production-server-1"
+ />
+
+
+ {/* User, IP и Port */}
@@ -238,6 +261,31 @@ export const SSHAgentForm: React.FC = ({
placeholder="192.168.1.1"
/>
+
+
+
+
+
+ Порт *
+
+
+
+ handleChange("port", parseInt(e.target.value) || 22)
+ }
+ required
+ min={1}
+ max={65535}
+ style={inputBaseStyle}
+ onFocus={handleFocus}
+ onBlur={handleBlur}
+ placeholder="22"
+ />
+
{/* Метод аутентификации */}
@@ -457,7 +505,7 @@ export const SSHAgentForm: React.FC = ({
diff --git a/frontend/src/modules/auth/store/useAuthStore.ts b/frontend/src/modules/auth/store/useAuthStore.ts
index 523cea3..a961c5d 100644
--- a/frontend/src/modules/auth/store/useAuthStore.ts
+++ b/frontend/src/modules/auth/store/useAuthStore.ts
@@ -17,13 +17,18 @@ const login = async (credentials: LoginCredentials): Promise
=> {
return response.data;
};
-const register = async (data: RegisterData): Promise => {
- const response = await apiClient.post("/auth/register", {
- login: data.login,
- password: data.password,
- name: data.firstName,
- last_name: data.lastName,
- });
+const register = async (
+ data: RegisterData,
+): Promise> => {
+ const response = await apiClient.post>(
+ "/auth/register",
+ {
+ login: data.login,
+ password: data.password,
+ name: data.firstName,
+ last_name: data.lastName,
+ },
+ );
return response.data;
};
@@ -62,9 +67,10 @@ export const useAuthStore = create()(
register: async (data: RegisterData) => {
set({ isLoading: true, error: null });
try {
- const response = await register(data);
- const user = mapResponseToUser(response);
- set({ user, token: response.token, isLoading: false });
+ await register(data);
+ // После регистрации пользователь не авторизуется автоматически
+ // Нужно войти через /auth/login
+ set({ isLoading: false });
} catch (error) {
set({
error:
diff --git a/frontend/src/modules/dashboard/components/add.widget.button.tsx b/frontend/src/modules/dashboard/components/add.widget.button.tsx
new file mode 100644
index 0000000..0ca90a9
--- /dev/null
+++ b/frontend/src/modules/dashboard/components/add.widget.button.tsx
@@ -0,0 +1,20 @@
+import React from "react";
+import { FaPlus } from "react-icons/fa";
+
+interface AddWidgetButtonProps {
+ onClick: () => void;
+}
+
+export const AddWidgetButton: React.FC = ({
+ onClick,
+}) => {
+ return (
+
+
+ Добавить график
+
+ );
+};
diff --git a/frontend/src/modules/dashboard/components/add.widget.modal.tsx b/frontend/src/modules/dashboard/components/add.widget.modal.tsx
new file mode 100644
index 0000000..30e46e4
--- /dev/null
+++ b/frontend/src/modules/dashboard/components/add.widget.modal.tsx
@@ -0,0 +1,108 @@
+import React, { useState } from "react";
+import { motion, AnimatePresence } from "framer-motion";
+import type { ChartType } from "../types";
+
+interface AddWidgetModalProps {
+ isOpen: boolean;
+ onAdd: (data: { type: ChartType; title: string; dataKey: string }) => void;
+ onClose: () => void;
+}
+
+export const AddWidgetModal: React.FC = ({
+ isOpen,
+ onAdd,
+ onClose,
+}) => {
+ const [type, setType] = useState("line");
+ const [title, setTitle] = useState("");
+ const [dataKey, setDataKey] = useState("requests");
+
+ const handleAdd = () => {
+ if (!title.trim()) return;
+ onAdd({ type, title: title.trim(), dataKey });
+ setTitle("");
+ setType("line");
+ setDataKey("requests");
+ onClose();
+ };
+
+ return (
+
+ {isOpen && (
+
+ e.stopPropagation()}
+ >
+
+ Добавить график
+
+
+
+
+
+ Тип
+
+
+ {(["line", "bar", "area", "pie"] as ChartType[]).map((t) => (
+ setType(t)}
+ className={`px-2 py-0.5 rounded text-[10px] transition-colors cursor-pointer ${
+ type === t
+ ? "bg-accent-primary text-white"
+ : "bg-tertiary text-secondary hover:bg-tertiary/70"
+ }`}
+ >
+ {t === "line" && "📈"}
+ {t === "bar" && "📊"}
+ {t === "area" && "📉"}
+ {t === "pie" && "🥧"}
+
+ ))}
+
+
+
+
+
+ Название
+
+ setTitle(e.target.value)}
+ placeholder="Название"
+ className="w-full px-2 py-1 text-[11px] bg-tertiary border border-primary rounded text-primary focus:outline-none focus:border-accent-primary"
+ />
+
+
+
+
+ Добавить
+
+
+ Отмена
+
+
+
+
+
+ )}
+
+ );
+};
diff --git a/frontend/src/modules/dashboard/components/chart,widget.tsx b/frontend/src/modules/dashboard/components/chart,widget.tsx
new file mode 100644
index 0000000..709d150
--- /dev/null
+++ b/frontend/src/modules/dashboard/components/chart,widget.tsx
@@ -0,0 +1,299 @@
+// modules/dashboard/components/ChartWidget.tsx
+import React from "react";
+import {
+ LineChart,
+ Line,
+ BarChart,
+ Bar,
+ AreaChart,
+ Area,
+ PieChart,
+ Pie,
+ Cell,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ ResponsiveContainer,
+ Legend,
+} from "recharts";
+import {
+ FaChartLine,
+ FaChartBar,
+ FaChartArea,
+ FaChartPie,
+ FaCog,
+ FaEye,
+ FaEyeSlash,
+} from "react-icons/fa";
+import { motion } from "framer-motion";
+import type { ChartWidget as ChartWidgetType, MetricData } from "../types";
+
+interface ChartWidgetProps {
+ widget: ChartWidgetType;
+ data: MetricData[];
+ onEdit: () => void;
+ onToggleVisibility: () => void;
+}
+
+// Все возможные уровни логов (метрики)
+const METRICS = ["INFO", "WARN", "ERROR", "DEBUG"];
+
+// Цвета для каждой метрики
+const METRIC_COLORS: Record = {
+ INFO: "#10b981", // зеленый
+ WARN: "#f59e0b", // оранжевый
+ ERROR: "#ef4444", // красный
+ DEBUG: "#3b82f6", // синий
+};
+
+export const ChartWidget: React.FC = ({
+ widget,
+ data,
+ onEdit,
+ onToggleVisibility,
+}) => {
+ const renderChart = () => {
+ if (!data || !Array.isArray(data) || data.length === 0) {
+ return (
+
+ Нет данных
+
+ );
+ }
+
+ const normalizedData = data.map((point) => {
+ const normalized: MetricData = { timestamp: point.timestamp };
+ METRICS.forEach((metric) => {
+ normalized[metric] = point[metric] || 0;
+ });
+ return normalized;
+ });
+
+ const commonProps = {
+ data: normalizedData,
+ margin: { top: 5, right: 10, left: 0, bottom: 5 },
+ };
+
+ switch (widget.type) {
+ case "line":
+ return (
+
+
+
+
+
+
+ {METRICS.map((metric) => (
+
+ ))}
+
+ );
+
+ case "bar":
+ return (
+
+
+
+
+
+
+ {METRICS.map((metric) => (
+
+ ))}
+
+ );
+
+ case "area":
+ return (
+
+
+
+
+
+
+ {METRICS.map((metric) => (
+
+ ))}
+
+ );
+
+ case "pie":
+ // Для круговой диаграммы берем последнюю точку
+ const lastPoint = normalizedData[normalizedData.length - 1];
+ const pieData = METRICS.map((metric) => ({
+ name: metric,
+ value: lastPoint[metric] || 0,
+ })).filter((item) => Number(item.value) > 0);
+
+ return (
+
+
+ {pieData.map((entry, index) => (
+ |
+ ))}
+
+
+
+
+ );
+
+ default:
+ return null;
+ }
+ };
+
+ const getIcon = () => {
+ switch (widget.type) {
+ case "line":
+ return ;
+ case "bar":
+ return ;
+ case "area":
+ return ;
+ case "pie":
+ return ;
+ default:
+ return null;
+ }
+ };
+
+ return (
+
+
+
+ {getIcon()}
+
+ {widget.title}
+
+
+
+
+ {widget.visible ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+
+
+ {renderChart()}
+
+
+
+ );
+};
diff --git a/frontend/src/modules/dashboard/components/chart.settings.tsx b/frontend/src/modules/dashboard/components/chart.settings.tsx
new file mode 100644
index 0000000..cc4f78d
--- /dev/null
+++ b/frontend/src/modules/dashboard/components/chart.settings.tsx
@@ -0,0 +1,105 @@
+// modules/dashboard/components/WidgetSettings.tsx
+import React, { useState } from "react";
+import { motion } from "framer-motion";
+import type { ChartType, ChartWidget } from "../types";
+
+interface WidgetSettingsProps {
+ widget: ChartWidget;
+ onUpdate: (widget: ChartWidget) => void;
+ onRemove: () => void;
+ onClose: () => void;
+}
+
+export const WidgetSettings: React.FC = ({
+ widget,
+ onUpdate,
+ onRemove,
+ onClose,
+}) => {
+ const [type, setType] = useState(widget.type);
+ const [title, setTitle] = useState(widget.title);
+
+ const handleSave = () => {
+ onUpdate({ ...widget, type, title });
+ onClose();
+ };
+
+ return (
+
+ e.stopPropagation()}
+ >
+
+ Настройки графика
+
+
+
+
+
Тип
+
+ {(["line", "bar", "area", "pie"] as ChartType[]).map((t) => (
+ setType(t)}
+ className={`px-2 py-0.5 rounded text-[10px] transition-colors cursor-pointer ${
+ type === t
+ ? "bg-accent-primary text-white"
+ : "bg-tertiary text-secondary hover:bg-tertiary/70"
+ }`}
+ >
+ {t === "line" && "📈"}
+ {t === "bar" && "📊"}
+ {t === "area" && "📉"}
+ {t === "pie" && "🥧"}
+
+ ))}
+
+
+
+
+
+ Название
+
+ setTitle(e.target.value)}
+ className="w-full px-2 py-1 text-[11px] bg-tertiary border border-primary rounded text-primary focus:outline-none focus:border-accent-primary"
+ />
+
+
+
+
+ Сохранить
+
+
+ Удалить
+
+
+ Отмена
+
+
+
+
+
+ );
+};
diff --git a/frontend/src/modules/dashboard/components/dashboard.chart.tsx b/frontend/src/modules/dashboard/components/dashboard.chart.tsx
new file mode 100644
index 0000000..e68b996
--- /dev/null
+++ b/frontend/src/modules/dashboard/components/dashboard.chart.tsx
@@ -0,0 +1,171 @@
+import React from "react";
+import {
+ LineChart,
+ Line,
+ AreaChart,
+ Area,
+ BarChart,
+ Bar,
+ PieChart,
+ Pie,
+ Cell,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+ ResponsiveContainer,
+ Legend,
+} from "recharts";
+import { motion } from "framer-motion";
+import type { ChartType, MetricData } from "../types";
+
+interface DashboardChartProps {
+ title: string;
+ type: ChartType;
+ data: MetricData[];
+ dataKeys: string[];
+ colors?: string[];
+}
+
+const COLORS = ["#3b82f6", "#10b981", "#f59e0b", "#ef4444", "#8b5cf6"];
+
+export const DashboardChart: React.FC = ({
+ title,
+ type,
+ data,
+ dataKeys,
+ colors = COLORS,
+}) => {
+ const renderChart = () => {
+ if (!data || data.length === 0) {
+ return (
+
+
+ Нет данных
+
+
+ );
+ }
+
+ const commonProps = {
+ data,
+ margin: { top: 5, right: 10, left: 0, bottom: 5 },
+ };
+
+ const axisStyle = {
+ stroke: "var(--text-secondary)",
+ tick: { fontSize: 10 },
+ };
+
+ const tooltipStyle = {
+ contentStyle: {
+ backgroundColor: "var(--card-bg)",
+ border: "1px solid var(--border)",
+ borderRadius: "6px",
+ fontSize: "11px",
+ },
+ labelStyle: { color: "var(--text-primary)" },
+ };
+
+ if (type === "pie") {
+ // Если данные уже в формате { name, value } — используем напрямую
+ const isPieFormat =
+ data.length > 0 && "name" in data[0] && "value" in data[0];
+
+ const pieData = isPieFormat
+ ? data
+ : data.map((point, i) => ({
+ name: dataKeys[i % dataKeys.length],
+ value: point[dataKeys[i % dataKeys.length]] || 0,
+ }));
+
+ return (
+
+
+ {pieData.map((entry, index) => (
+ |
+ ))}
+
+
+
+
+ );
+ }
+
+ const ChartComponent =
+ type === "line" ? LineChart : type === "area" ? AreaChart : BarChart;
+ const DataComponent = type === "line" ? Line : type === "area" ? Area : Bar;
+
+ return (
+
+
+
+
+
+
+ {dataKeys.map((key, i) => (
+
+ ))}
+
+ );
+ };
+
+ return (
+
+
+ {title}
+
+
+
+ {renderChart()}
+
+
+
+ );
+};
diff --git a/frontend/src/modules/dashboard/dashboard.tsx b/frontend/src/modules/dashboard/dashboard.tsx
new file mode 100644
index 0000000..6b1999c
--- /dev/null
+++ b/frontend/src/modules/dashboard/dashboard.tsx
@@ -0,0 +1,96 @@
+// modules/dashboard/Dashboard.tsx
+import { useAgentStore } from "@/app/providers/layout/store/agent.store";
+import { useEffect, useRef, useState } from "react";
+import { useDashboardStore } from "./store/dashboard.store";
+import { useAuthStore } from "../auth/store/useAuthStore";
+import { ChartWidget } from "./components/chart,widget";
+import { AddWidgetButton } from "./components/add.widget.button";
+import { AddWidgetModal } from "./components/add.widget.modal";
+import { WidgetSettings } from "./components/chart.settings";
+import { useWidgets } from "./hooks/use.widget";
+
+export const Dashboard: React.FC = () => {
+ const { chartData, loading, error, fetchMetrics, clearData } =
+ useDashboardStore();
+ // const { servicesQueryParams } = useAgentStore();
+ const intervalRef = useRef(null);
+
+ const { token } = useAuthStore();
+
+ // Первичная загрузка (не latest)
+ // const fetchPrimaryData = () => {
+ // fetchMetrics(false, token || "", servicesQueryParams, { since: "10m" });
+ // };
+
+ // Периодическое обновление (latest)
+ // const fetchLatestData = () => {
+ // fetchMetrics(true, token || "", servicesQueryParams);
+ // };
+
+ // useEffect(() => {
+ // fetchPrimaryData();
+ // }, []);
+
+ // useEffect(() => {
+ // intervalRef.current = window.setInterval(() => {
+ // fetchLatestData();
+ // }, 30000);
+
+ // return () => {
+ // if (intervalRef.current) {
+ // window.clearInterval(intervalRef.current);
+ // }
+ // clearData();
+ // };
+ // }, [servicesQueryParams]);
+
+ const { widgets, addWidget, updateWidget, removeWidget, toggleVisibility } =
+ useWidgets();
+ const [editingWidget, setEditingWidget] = useState(null);
+ const [isAdding, setIsAdding] = useState(false);
+
+ const visibleWidgets = widgets.filter((w) => w.visible);
+
+ return (
+
+ {loading && chartData.length === 0 ? (
+
+ ) : error ? (
+
+ {error}
+
+ ) : (
+
+ {visibleWidgets.map((widget) => (
+ setEditingWidget(widget)}
+ onToggleVisibility={() => toggleVisibility(widget.id)}
+ />
+ ))}
+
+ )}
+
+
setIsAdding(true)} />
+
+ setIsAdding(false)}
+ />
+
+ {editingWidget && (
+ removeWidget(editingWidget.id)}
+ onClose={() => setEditingWidget(null)}
+ />
+ )}
+
+ );
+};
diff --git a/frontend/src/modules/dashboard/hooks/use.widget.ts b/frontend/src/modules/dashboard/hooks/use.widget.ts
new file mode 100644
index 0000000..7d701a7
--- /dev/null
+++ b/frontend/src/modules/dashboard/hooks/use.widget.ts
@@ -0,0 +1,72 @@
+import { useState } from "react";
+import type { ChartType, ChartWidget } from "../types";
+
+const initialWidgets: ChartWidget[] = [
+ {
+ id: "1",
+ type: "line",
+ title: "Линии",
+ dataKey: "chart-line",
+ visible: true,
+ },
+ {
+ id: "2",
+ type: "bar",
+ title: "Столбцы",
+ dataKey: "chart-bar",
+ visible: true,
+ },
+ {
+ id: "3",
+ type: "area",
+ title: "Закрашенные линии",
+ dataKey: "chart-area",
+ visible: true,
+ },
+ {
+ id: "4",
+ type: "pie",
+ title: "Круговая диаграмма",
+ dataKey: "chart-pie",
+ visible: true,
+ },
+];
+
+export const useWidgets = () => {
+ const [widgets, setWidgets] = useState(initialWidgets);
+
+ const addWidget = (data: {
+ type: ChartType;
+ title: string;
+ dataKey: string;
+ }) => {
+ const newWidget: ChartWidget = {
+ id: Date.now().toString(),
+ ...data,
+ visible: true,
+ };
+ setWidgets([...widgets, newWidget]);
+ };
+
+ const updateWidget = (updated: ChartWidget) => {
+ setWidgets(widgets.map((w) => (w.id === updated.id ? updated : w)));
+ };
+
+ const removeWidget = (id: string) => {
+ setWidgets(widgets.filter((w) => w.id !== id));
+ };
+
+ const toggleVisibility = (id: string) => {
+ setWidgets(
+ widgets.map((w) => (w.id === id ? { ...w, visible: !w.visible } : w)),
+ );
+ };
+
+ return {
+ widgets,
+ addWidget,
+ updateWidget,
+ removeWidget,
+ toggleVisibility,
+ };
+};
diff --git a/frontend/src/modules/dashboard/store/dashboard.store.ts b/frontend/src/modules/dashboard/store/dashboard.store.ts
new file mode 100644
index 0000000..ae0a368
--- /dev/null
+++ b/frontend/src/modules/dashboard/store/dashboard.store.ts
@@ -0,0 +1,129 @@
+import { create } from "zustand";
+import { apiService } from "@/shared/api/api.service";
+import type { MetricData } from "../types";
+
+interface DashboardState {
+ chartData: MetricData[];
+ loading: boolean;
+ error: string | null;
+ fetchMetrics: (
+ isLatest: boolean,
+ token: string,
+ queryParams?: string,
+ extraParams?: Record,
+ ) => Promise;
+ clearData: () => void;
+}
+
+export const useDashboardStore = create((set, get) => {
+ const convertPrimaryData = (response: any) => {
+ set((state) => {
+ if (!response.intervals || !Array.isArray(response.intervals))
+ return { chartData: state.chartData };
+
+ const newData = [...state.chartData];
+
+ response.intervals.forEach((interval: any) => {
+ const newPoint: MetricData = {
+ timestamp: new Date(interval.timestamp).toLocaleTimeString(),
+ };
+
+ if (interval.group_by && Array.isArray(interval.group_by)) {
+ interval.group_by.forEach((item: any) => {
+ newPoint[item.value] = item.count;
+ });
+ }
+
+ newData.push(newPoint);
+ });
+
+ return { chartData: newData.slice(-20) };
+ });
+ };
+
+ const convertSingleData = (response: any) => {
+ set((state) => {
+ const newPoint: MetricData = {
+ timestamp: new Date().toLocaleTimeString(),
+ };
+
+ if (Array.isArray(response)) {
+ response.forEach((item: any) => {
+ newPoint[item.value] = item.count;
+ });
+ } else if (response.groupBy && Array.isArray(response.groupBy)) {
+ response.groupBy.forEach((item: any) => {
+ newPoint[item.value] = item.count;
+ });
+ }
+
+ const updatedData = [...state.chartData, newPoint].slice(-20);
+ return { chartData: updatedData };
+ });
+ };
+
+ const fetchMetrics = async (
+ isLatest: boolean,
+ token: string,
+ queryParams?: string,
+ extraParams?: Record,
+ ) => {
+ set({ loading: true, error: null });
+
+ try {
+ let endpoint = isLatest
+ ? "logs/aggregations/latest"
+ : "logs/aggregations";
+
+ // Если есть queryParams, добавляем его к эндпоинту
+ if (queryParams && queryParams.trim() !== "") {
+ endpoint = `${endpoint}?${queryParams}`;
+ }
+
+ const params: Record = {
+ agg: "count",
+ groupby: "level",
+ ...extraParams,
+ };
+
+ const result = await apiService.get(endpoint, {
+ params,
+ headers: {
+ Authorization: `bearer ${token}`,
+ },
+ });
+
+ if (result) {
+ if (isLatest) {
+ convertSingleData(result);
+ } else {
+ convertPrimaryData(result);
+ }
+ }
+ } catch (error) {
+ console.error(
+ `Failed to fetch ${isLatest ? "latest" : "primary"} metrics:`,
+ error,
+ );
+ set({
+ error: error instanceof Error ? error.message : "Ошибка запроса",
+ });
+ } finally {
+ set({ loading: false });
+ }
+ };
+
+ const clearData = () => {
+ set({ chartData: [], error: null });
+ };
+
+ return {
+ chartData: [],
+ loading: false,
+ error: null,
+ fetchMetrics,
+ clearData,
+ setChartData: (data: MetricData[]) =>
+ set({ chartData: data, loading: false }),
+ };
+});
diff --git a/frontend/src/modules/dashboard/types.ts b/frontend/src/modules/dashboard/types.ts
new file mode 100644
index 0000000..7dc1fac
--- /dev/null
+++ b/frontend/src/modules/dashboard/types.ts
@@ -0,0 +1,22 @@
+export type ChartType = "line" | "bar" | "area" | "pie";
+
+export interface ChartWidget {
+ id: string;
+ type: ChartType;
+ title: string;
+ dataKey: string;
+ visible: boolean;
+}
+
+export interface MetricData {
+ timestamp: string;
+ [key: string]: number | string;
+}
+
+export interface StatsItem {
+ label: string;
+ key: string;
+ icon: string;
+ color: string;
+ suffix?: string;
+}
diff --git a/frontend/src/modules/graph/Graph.tsx b/frontend/src/modules/graph/Graph.tsx
new file mode 100644
index 0000000..40ffbe0
--- /dev/null
+++ b/frontend/src/modules/graph/Graph.tsx
@@ -0,0 +1,104 @@
+import React, { useRef, useEffect, useState } from "react";
+import type {
+ GraphData,
+ GraphNode,
+ GraphLink,
+ ContextMenuState,
+} from "./types";
+import { useGraphStore } from "./store/useGraphStore";
+import {
+ ForceGraph,
+ GraphControls,
+ GraphContextMenu,
+ GraphStatusBar,
+ GraphStats,
+} from "./components";
+
+interface GraphProps {
+ initialData?: GraphData;
+ onExport?: () => void;
+ onDataChange?: (data: GraphData) => void;
+}
+
+export const Graph: React.FC = ({
+ initialData,
+ onExport,
+ onDataChange,
+}) => {
+ const fgRef = useRef(null);
+ const [contextMenu, setContextMenu] = useState(null);
+
+ const data = useGraphStore((s) => s.data);
+ const isLinkMode = useGraphStore((s) => s.isLinkMode);
+ const selectedNode = useGraphStore((s) => s.selectedNode);
+ const setData = useGraphStore((s) => s.setData);
+
+ // Инициализация данных
+ useEffect(() => {
+ if (initialData) setData(initialData);
+ }, [initialData, setData]);
+
+ // Закрыть контекстное меню по клику вне
+ useEffect(() => {
+ const handleClickOutside = () => setContextMenu(null);
+ document.addEventListener("click", handleClickOutside);
+ return () => document.removeEventListener("click", handleClickOutside);
+ }, []);
+
+ const handleNodeRightClick = (node: GraphNode, event: MouseEvent) => {
+ event.preventDefault();
+ event.stopPropagation();
+ setContextMenu({ x: event.clientX, y: event.clientY, node, link: null });
+ };
+
+ if (!data || data.nodes.length === 0) {
+ return (
+
+
+
+
Нет данных для отображения
+
+
+
+ );
+ }
+
+ return (
+
+ {/* Статистика сверху */}
+
+
+ {/* Граф */}
+
+
+
+ setContextMenu(null)}
+ />
+
+
+
+
+ {/* Кнопки снизу */}
+
+
+ );
+};
+
+export default Graph;
diff --git a/frontend/src/modules/graph/components/ForceGraph.tsx b/frontend/src/modules/graph/components/ForceGraph.tsx
new file mode 100644
index 0000000..d33dfdd
--- /dev/null
+++ b/frontend/src/modules/graph/components/ForceGraph.tsx
@@ -0,0 +1,229 @@
+import React, {
+ useRef,
+ useEffect,
+ useCallback,
+ useState,
+ forwardRef,
+} from "react";
+import ForceGraph2D from "react-force-graph-2d";
+import type { GraphData, GraphNode, GraphLink } from "../types";
+import { useGraphStore } from "../store/useGraphStore";
+import { useThemeStore } from "@/modules/theme-bw/stores/theme.store";
+
+interface ForceGraphProps {
+ data: GraphData;
+ onNodeRightClick: (node: GraphNode, event: MouseEvent) => void;
+}
+
+export const ForceGraph = forwardRef(
+ ({ data, onNodeRightClick }, ref) => {
+ const containerRef = useRef(null);
+ const [dimensions, setDimensions] = useState({ width: 480, height: 600 });
+
+ const highlightNodes = useGraphStore((s) => s.highlightNodes);
+ const highlightLinks = useGraphStore((s) => s.highlightLinks);
+ const selectedNode = useGraphStore((s) => s.selectedNode);
+ const isLinkMode = useGraphStore((s) => s.isLinkMode);
+ const theme = useThemeStore((s) => s.theme);
+ const isDark = theme === "dark";
+
+ // Определяем цвета текста в зависимости от темы
+ const nodeTextColor = isDark ? "#e5e7eb" : "#1f2937";
+ const nodeTextLetterColor = isDark ? "#ffffff" : "#000000";
+
+ // ResizeObserver для корректного отслеживания размеров
+ useEffect(() => {
+ const container = containerRef.current;
+ if (!container) return;
+
+ const updateDimensions = () => {
+ setDimensions({
+ width: container.clientWidth,
+ height: container.clientHeight,
+ });
+ };
+
+ updateDimensions();
+
+ const observer = new ResizeObserver(updateDimensions);
+ observer.observe(container);
+ return () => observer.disconnect();
+ }, []);
+
+ const handleNodeClick = useCallback((node: GraphNode) => {
+ const store = useGraphStore.getState();
+ if (store.isLinkMode) {
+ if (store.selectedNode === null) {
+ store.setSelectedNode(node);
+ } else if (store.selectedNode.id !== node.id) {
+ store.createLink(store.selectedNode.id, node.id);
+ store.setSelectedNode(null);
+ store.toggleLinkMode();
+ } else {
+ store.setSelectedNode(null);
+ }
+ }
+ }, []);
+
+ const handleNodeHover = (node: GraphNode | null) => {
+ const newHighlightNodes = new Set();
+ const newHighlightLinks = new Set();
+
+ if (node) {
+ newHighlightNodes.add(node.id);
+ data.links.forEach((link) => {
+ if (link.source === node.id || link.target === node.id) {
+ newHighlightLinks.add(link);
+ newHighlightNodes.add(link.source as string);
+ newHighlightNodes.add(link.target as string);
+ }
+ });
+ }
+
+ useGraphStore
+ .getState()
+ .setHighlight(newHighlightNodes, newHighlightLinks);
+ };
+
+ const getNodeColor = (node: GraphNode) => {
+ if (selectedNode?.id === node.id && isLinkMode) return "#f97316";
+
+ if (node.type === "service" && node.status === "down") {
+ // Проверяем, есть ли зависимости этого сервиса, которые тоже упали
+ const hasDownDependency = data.links.some((link) => {
+ const sourceId =
+ typeof link.source === "object"
+ ? (link.source as any).id
+ : link.source;
+ const targetId =
+ typeof link.target === "object"
+ ? (link.target as any).id
+ : link.target;
+
+ if (sourceId !== node.id) return false;
+
+ const isDependency =
+ link.type === "dependency" || link.type === "started";
+ const targetIsDown = data.nodes.some(
+ (n) => n.id === targetId && n.status === "down",
+ );
+
+ return isDependency && targetIsDown;
+ });
+
+ // Если есть упавшая зависимость — не подсвечиваем красным
+ if (hasDownDependency) return "#3b82f6";
+ return "#ef4444";
+ }
+
+ if (node.type === "agent") {
+ // Проверяем, есть ли у агента хотя бы один упавший сервис
+ const hasDownService = data.nodes.some(
+ (n) =>
+ n.type === "service" &&
+ n.status === "down" &&
+ n.id.startsWith(`${node.id}-`),
+ );
+ if (hasDownService) return "#ef4444";
+ }
+
+ switch (node.type) {
+ case "service":
+ return "#3b82f6";
+ case "agent":
+ return "#8b5cf6";
+ default:
+ return "#6b7280";
+ }
+ };
+
+ const getNodeSize = (node: GraphNode) => {
+ switch (node.type) {
+ case "service":
+ return 3;
+ case "agent":
+ return 3;
+ default:
+ return 5;
+ }
+ };
+
+ const renderNode = (
+ node: GraphNode,
+ ctx: CanvasRenderingContext2D,
+ globalScale: number,
+ ) => {
+ const size = getNodeSize(node);
+ const color = getNodeColor(node);
+
+ if (!node.x || !node.y) return;
+
+ ctx.beginPath();
+ ctx.arc(node.x, node.y, size, 0, 2 * Math.PI);
+ ctx.fillStyle = color;
+ ctx.fill();
+
+ ctx.fillStyle = nodeTextLetterColor;
+ ctx.font = `${size}px "Segoe UI Emoji", "Apple Color Emoji", sans-serif`;
+ ctx.textAlign = "center";
+ ctx.textBaseline = "middle";
+
+ if (node.type === "service") {
+ ctx.fillText("S", node.x, node.y);
+ } else if (node.type === "agent") {
+ ctx.fillText("A", node.x, node.y);
+ }
+
+ if (globalScale > 0.5) {
+ ctx.fillStyle = nodeTextColor;
+ ctx.font = `${Math.min(12, 12 / globalScale)}px "Arial", sans-serif`;
+ ctx.textAlign = "center";
+ ctx.fillText(node.name, node.x, node.y + size + 8);
+ }
+ };
+
+ const handleEngineStop = () => {
+ if (typeof ref !== "function" && ref && "current" in ref && ref.current) {
+ ref.current.zoomToFit(400);
+ }
+ };
+
+ return (
+
+ {
+ return `${node.name}\n${node.description || ""}\n${node.type === "service" ? "Сервис" : "Агент"}\nПКМ для удаления`;
+ }}
+ linkLabel={(link: GraphLink) => {
+ const sourceName =
+ data.nodes.find((n) => n.id === link.source)?.name || link.source;
+ const targetName =
+ data.nodes.find((n) => n.id === link.target)?.name || link.target;
+ return `Связь: ${sourceName} → ${targetName}\nПКМ для удаления`;
+ }}
+ linkColor={(link: any) => {
+ return highlightLinks.has(link) ? "#fbbf24" : "#4b5563";
+ }}
+ linkWidth={(link: any) => (highlightLinks.has(link) ? 3 : 1.5)}
+ linkDirectionalParticles={0}
+ onNodeClick={handleNodeClick}
+ onNodeRightClick={onNodeRightClick}
+ onNodeHover={handleNodeHover}
+ cooldownTicks={50}
+ cooldownTime={2000}
+ d3AlphaDecay={0.03}
+ d3VelocityDecay={0.4}
+ warmupTicks={50}
+ onEngineStop={handleEngineStop}
+ />
+
+ );
+ },
+);
+
+ForceGraph.displayName = "ForceGraph";
diff --git a/frontend/src/modules/graph/components/GraphContextMenu.tsx b/frontend/src/modules/graph/components/GraphContextMenu.tsx
new file mode 100644
index 0000000..46704ed
--- /dev/null
+++ b/frontend/src/modules/graph/components/GraphContextMenu.tsx
@@ -0,0 +1,86 @@
+import React from "react";
+import { FiLink, FiTrash2 } from "react-icons/fi";
+import type { ContextMenuState, GraphNode, GraphData } from "../types";
+import { useGraphStore } from "../store/useGraphStore";
+
+interface GraphContextMenuProps {
+ menu: ContextMenuState | null;
+ data: GraphData;
+ onClose: () => void;
+}
+
+export const GraphContextMenu: React.FC = ({
+ menu,
+ data,
+ onClose,
+}) => {
+ const removeNode = useGraphStore((s) => s.removeNode);
+ const toggleLinkMode = useGraphStore((s) => s.toggleLinkMode);
+ const setSelectedNode = useGraphStore((s) => s.setSelectedNode);
+
+ if (!menu) return null;
+
+ const handleDeleteNode = (node: GraphNode) => {
+ removeNode(node.id);
+ onClose();
+ };
+
+ const handleCreateLink = (node: GraphNode) => {
+ toggleLinkMode();
+ setSelectedNode(node);
+ onClose();
+ };
+
+ return (
+ e.stopPropagation()}
+ >
+ {menu.node && (
+ <>
+
+ {menu.node.name}
+
+
handleCreateLink(menu.node!)}
+ className="w-full text-left px-4 py-2 text-sm flex items-center gap-2"
+ style={{ color: "var(--text-primary)" }}
+ onMouseEnter={(e) =>
+ (e.currentTarget.style.backgroundColor = "var(--bg-secondary)")
+ }
+ onMouseLeave={(e) =>
+ (e.currentTarget.style.backgroundColor = "transparent")
+ }
+ >
+ Создать связь
+
+
handleDeleteNode(menu.node!)}
+ className="w-full text-left px-4 py-2 text-sm flex items-center gap-2"
+ style={{ color: "#f87171" }}
+ onMouseEnter={(e) =>
+ (e.currentTarget.style.backgroundColor = "rgba(248,113,113,0.1)")
+ }
+ onMouseLeave={(e) =>
+ (e.currentTarget.style.backgroundColor = "transparent")
+ }
+ >
+ Удалить узел
+
+ >
+ )}
+
+ );
+};
diff --git a/frontend/src/modules/graph/components/GraphControls.tsx b/frontend/src/modules/graph/components/GraphControls.tsx
new file mode 100644
index 0000000..2b15d5d
--- /dev/null
+++ b/frontend/src/modules/graph/components/GraphControls.tsx
@@ -0,0 +1,105 @@
+import React from "react";
+import {
+ FiDownload,
+ FiZoomIn,
+ FiZoomOut,
+ FiMove,
+ FiLink,
+} from "react-icons/fi";
+import { useGraphStore } from "../store/useGraphStore";
+import type { GraphData } from "../types";
+
+interface GraphControlsProps {
+ fgRef: React.RefObject;
+ onExport?: () => void;
+ onDataChange?: (data: GraphData) => void;
+}
+
+const btnStyle: React.CSSProperties = {
+ backgroundColor: "var(--bg-secondary)",
+ color: "var(--text-primary)",
+};
+
+export const GraphControls: React.FC = ({
+ fgRef,
+ onExport,
+ onDataChange,
+}) => {
+ const isLinkMode = useGraphStore((s) => s.isLinkMode);
+ const toggleLinkMode = useGraphStore((s) => s.toggleLinkMode);
+ const exportData = useGraphStore((s) => s.exportData);
+
+ const handleZoomIn = () => {
+ if (fgRef.current) {
+ const currentZoom = fgRef.current.zoom();
+ fgRef.current.zoom(currentZoom * 1.2);
+ }
+ };
+
+ const handleZoomOut = () => {
+ if (fgRef.current) {
+ const currentZoom = fgRef.current.zoom();
+ fgRef.current.zoom(currentZoom / 1.2);
+ }
+ };
+
+ const handleFit = () => {
+ if (fgRef.current) {
+ fgRef.current.zoomToFit(400);
+ }
+ };
+
+ return (
+
+ {/* Режим создания связи */}
+ {/*
+
+ {isLinkMode ? "Создание связи..." : "Добавить связь"}
+ */}
+
+ {/* Зум + */}
+
+
+
+
+ {/* Зум - */}
+
+
+
+
+ {/* Fit */}
+
+
+
+
+ {/* Экспорт */}
+
+
+ Экспорт
+
+
+ );
+};
diff --git a/frontend/src/modules/graph/components/GraphStats.tsx b/frontend/src/modules/graph/components/GraphStats.tsx
new file mode 100644
index 0000000..856782d
--- /dev/null
+++ b/frontend/src/modules/graph/components/GraphStats.tsx
@@ -0,0 +1,27 @@
+import React from "react";
+import type { GraphData } from "../types";
+
+interface GraphStatsProps {
+ data: GraphData;
+}
+
+export const GraphStats: React.FC = ({ data }) => {
+ return (
+
+
+ Сервисы: {data.nodes.filter((n) => n.type === "service").length}
+
+
Агенты: {data.nodes.filter((n) => n.type === "agent").length}
+
+
+
Связи: {data.links.length}
+
+
+ );
+};
diff --git a/frontend/src/modules/graph/components/GraphStatusBar.tsx b/frontend/src/modules/graph/components/GraphStatusBar.tsx
new file mode 100644
index 0000000..f98d340
--- /dev/null
+++ b/frontend/src/modules/graph/components/GraphStatusBar.tsx
@@ -0,0 +1,27 @@
+import React from "react";
+import { FiLink } from "react-icons/fi";
+import type { GraphNode } from "../types";
+
+interface GraphStatusBarProps {
+ isLinkMode: boolean;
+ selectedNode: GraphNode | null;
+}
+
+export const GraphStatusBar: React.FC = ({
+ isLinkMode,
+ selectedNode,
+}) => {
+ if (!isLinkMode) return null;
+
+ return (
+
+ Режим создания связей: кликните на два узла для соединения
+ {selectedNode && (
+ Выбран: {selectedNode.name}
+ )}
+
+ );
+};
diff --git a/frontend/src/modules/graph/components/index.ts b/frontend/src/modules/graph/components/index.ts
new file mode 100644
index 0000000..076d0b7
--- /dev/null
+++ b/frontend/src/modules/graph/components/index.ts
@@ -0,0 +1,5 @@
+export { ForceGraph } from "./ForceGraph";
+export { GraphControls } from "./GraphControls";
+export { GraphContextMenu } from "./GraphContextMenu";
+export { GraphStatusBar } from "./GraphStatusBar";
+export { GraphStats } from "./GraphStats";
diff --git a/frontend/src/modules/graph/index.ts b/frontend/src/modules/graph/index.ts
new file mode 100644
index 0000000..2de88fb
--- /dev/null
+++ b/frontend/src/modules/graph/index.ts
@@ -0,0 +1,3 @@
+export { Graph } from "./Graph";
+export { useGraphStore } from "./store/useGraphStore";
+export type { GraphData, GraphNode, GraphLink } from "./types";
diff --git a/frontend/src/modules/graph/store/useGraphStore.ts b/frontend/src/modules/graph/store/useGraphStore.ts
new file mode 100644
index 0000000..4207af4
--- /dev/null
+++ b/frontend/src/modules/graph/store/useGraphStore.ts
@@ -0,0 +1,113 @@
+import { create } from "zustand";
+import type { GraphData, GraphNode, GraphLink } from "../types";
+
+interface GraphState {
+ data: GraphData;
+ highlightNodes: Set;
+ highlightLinks: Set;
+ isLinkMode: boolean;
+ selectedNode: GraphNode | null;
+
+ // Действия с данными
+ setData: (data: GraphData) => void;
+ addNode: (node: GraphNode) => void;
+ removeNode: (nodeId: string) => void;
+ addLink: (link: GraphLink) => void;
+ removeLink: (link: GraphLink) => void;
+
+ // Подсветка
+ setHighlight: (nodeIds: Set, links: Set) => void;
+
+ // Режим связи
+ toggleLinkMode: () => void;
+ setSelectedNode: (node: GraphNode | null) => void;
+ createLink: (sourceId: string, targetId: string) => void;
+
+ // Экспорт
+ exportData: () => void;
+}
+
+export const useGraphStore = create((set, get) => ({
+ data: { nodes: [], links: [] },
+ highlightNodes: new Set(),
+ highlightLinks: new Set(),
+ isLinkMode: false,
+ selectedNode: null,
+
+ setData: (data) => set({ data }),
+
+ addNode: (node) => {
+ set((state) => ({
+ data: {
+ ...state.data,
+ nodes: [...state.data.nodes, node],
+ },
+ }));
+ },
+
+ removeNode: (nodeId) => {
+ set((state) => ({
+ data: {
+ nodes: state.data.nodes.filter((n) => n.id !== nodeId),
+ links: state.data.links.filter(
+ (l) => l.source !== nodeId && l.target !== nodeId,
+ ),
+ },
+ }));
+ },
+
+ addLink: (link) => {
+ set((state) => ({
+ data: {
+ ...state.data,
+ links: [...state.data.links, link],
+ },
+ }));
+ },
+
+ removeLink: (linkToRemove) => {
+ set((state) => ({
+ data: {
+ ...state.data,
+ links: state.data.links.filter((l) => l !== linkToRemove),
+ },
+ }));
+ },
+
+ setHighlight: (nodeIds, links) =>
+ set({ highlightNodes: nodeIds, highlightLinks: links }),
+
+ toggleLinkMode: () =>
+ set((state) => ({
+ isLinkMode: !state.isLinkMode,
+ selectedNode: null,
+ })),
+
+ setSelectedNode: (node) => set({ selectedNode: node }),
+
+ createLink: (sourceId, targetId) => {
+ const { data, addLink } = get();
+
+ const linkExists = data.links.some(
+ (link) =>
+ (link.source === sourceId && link.target === targetId) ||
+ (link.source === targetId && link.target === sourceId),
+ );
+
+ if (!linkExists) {
+ addLink({ source: sourceId, target: targetId, type: "custom" });
+ }
+ },
+
+ exportData: () => {
+ const { data } = get();
+ const dataStr = JSON.stringify(data, null, 2);
+ const blob = new Blob([dataStr], { type: "application/json" });
+ const url = URL.createObjectURL(blob);
+ const link = document.createElement("a");
+ link.href = url;
+ link.download = "graph-data.json";
+ link.click();
+ URL.revokeObjectURL(url);
+ },
+}));
diff --git a/frontend/src/modules/graph/types.ts b/frontend/src/modules/graph/types.ts
new file mode 100644
index 0000000..0410b75
--- /dev/null
+++ b/frontend/src/modules/graph/types.ts
@@ -0,0 +1,50 @@
+export interface GraphNode {
+ id: string;
+ name: string;
+ type: "agent" | "service";
+ val?: number;
+ description?: string;
+ x?: number;
+ y?: number;
+ status?: "up" | "down";
+}
+
+export interface GraphLink {
+ source: string;
+ target: string;
+ type?: string;
+}
+
+export interface GraphData {
+ nodes: GraphNode[];
+ links: GraphLink[];
+}
+
+export interface ContextMenuState {
+ x: number;
+ y: number;
+ node: GraphNode | null;
+ link: GraphLink | null;
+}
+
+// API response types for GET /graph
+export interface GraphDependencyTarget {
+ name: string;
+}
+
+export interface GraphDependency {
+ condition: string;
+ target: GraphDependencyTarget;
+}
+
+export interface GraphServiceNode {
+ dependencies: GraphDependency[];
+}
+
+export interface GraphAgentNode {
+ services: Record;
+}
+
+export interface GraphApiResponse {
+ nodes: Record;
+}
diff --git a/frontend/src/modules/ide/IDE.tsx b/frontend/src/modules/ide/IDE.tsx
new file mode 100644
index 0000000..010ae06
--- /dev/null
+++ b/frontend/src/modules/ide/IDE.tsx
@@ -0,0 +1,338 @@
+import React, { useEffect } from "react";
+import { MdAdd, MdArrowBack } from "react-icons/md";
+import { GoTrash } from "react-icons/go";
+import {
+ useIDEStore,
+ initialFiles as defaultInitialFiles,
+} from "./store/useIDEStore";
+import type { FileNode } from "./types";
+import {
+ FileExplorer,
+ TabBar,
+ CodeEditor,
+ TitleBar,
+ StatusBar,
+} from "./components";
+import { useThemeStore } from "@/modules/theme-bw/stores/theme.store";
+
+interface IDEProps {
+ initialFiles?: FileNode;
+ onBack?: () => void;
+}
+
+const darkColors = {
+ bg: "#1e1e1e",
+ bgSecondary: "#252526",
+ bgTertiary: "#2d2d30",
+ border: "#3e3e42",
+ textPrimary: "#cccccc",
+ textSecondary: "#858585",
+ accent: "#0e639c",
+ accentHover: "#1177bb",
+ statusBar: "#007acc",
+};
+
+const lightColors = {
+ bg: "#ffffff",
+ bgSecondary: "#f3f3f3",
+ bgTertiary: "#e8e8e8",
+ border: "#e0e0e0",
+ textPrimary: "#333333",
+ textSecondary: "#616161",
+ accent: "#0e639c",
+ accentHover: "#1177bb",
+ statusBar: "#007acc",
+};
+
+export const IDE: React.FC = ({
+ initialFiles: externalFiles,
+ onBack,
+}: IDEProps = {}) => {
+ const theme = useThemeStore((s) => s.theme);
+ const isDark = theme === "dark";
+ const c = isDark ? darkColors : lightColors;
+
+ const files = useIDEStore((state) => state.files);
+ const openFiles = useIDEStore((state) => state.openFiles);
+ const activeFile = useIDEStore((state) => state.activeFile);
+ const createNewProject = useIDEStore((state) => state.createNewProject);
+ const selectFile = useIDEStore((state) => state.selectFile);
+ const updateFileContent = useIDEStore((state) => state.updateFileContent);
+ const saveActiveFile = useIDEStore((state) => state.saveActiveFile);
+ const closeFile = useIDEStore((state) => state.closeFile);
+ const closeAllFiles = useIDEStore((state) => state.closeAllFiles);
+ const closeOtherFiles = useIDEStore((state) => state.closeOtherFiles);
+ const initialize = useIDEStore((state) => state.initialize);
+ const isInitialized = useIDEStore((state) => state.isInitialized);
+ const fetchTree = useIDEStore((state) => state.fetchTree);
+ const fetchInterpreters = useIDEStore((state) => state.fetchInterpreters);
+
+ // Загружаем интерпретаторы при инициализации
+ useEffect(() => {
+ fetchInterpreters();
+ }, []);
+
+ // Обработка Ctrl+S
+ useEffect(() => {
+ const handleKeyDown = (e: KeyboardEvent) => {
+ if ((e.ctrlKey || e.metaKey) && e.key === "s") {
+ e.preventDefault();
+ saveActiveFile();
+ }
+ };
+ window.addEventListener("keydown", handleKeyDown);
+ return () => window.removeEventListener("keydown", handleKeyDown);
+ }, [saveActiveFile]);
+
+ // При загрузке пробуем загрузить дерево с сервера
+ useEffect(() => {
+ if (!isInitialized) {
+ fetchTree().catch(() => {
+ // Только при ошибке — используем моковые данные
+ const state = useIDEStore.getState();
+ if (!state.files) {
+ const filesToInit = externalFiles || defaultInitialFiles;
+ initialize(filesToInit);
+ }
+ });
+ }
+ }, [isInitialized]);
+
+ // Если проект не открыт
+ if (!files) {
+ return (
+
+
+ {onBack && (
+
{
+ e.currentTarget.style.backgroundColor = c.border;
+ e.currentTarget.style.color = "#fff";
+ e.currentTarget.style.borderColor = "#555";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ e.currentTarget.style.color = c.textPrimary;
+ e.currentTarget.style.borderColor = c.border;
+ }}
+ title="Go back"
+ >
+
+ Back
+
+ )}
+
+
+
+
+
+
+ No project open
+
+
+ Create a new project to get started
+
+
{
+ e.currentTarget.style.backgroundColor = c.accentHover;
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = c.accent;
+ }}
+ >
+ New Project
+
+
+
+
+
+ );
+ }
+
+ return (
+
+
+ {onBack && (
+
{
+ e.currentTarget.style.backgroundColor = c.border;
+ e.currentTarget.style.color = "#fff";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ e.currentTarget.style.color = c.textPrimary;
+ }}
+ title="Go back"
+ >
+
+ Back
+
+ )}
+ {!onBack &&
}
+
+ {activeFile
+ ? `${activeFile.name}${activeFile.dirty ? " •" : ""} - `
+ : ""}
+ {files.name}
+
+
+ {activeFile?.dirty && (
+
+ Сохранить
+
+ )}
+
+
+
+
+
+ );
+};
+
+export default IDE;
diff --git a/frontend/src/modules/ide/api/scripts.api.ts b/frontend/src/modules/ide/api/scripts.api.ts
new file mode 100644
index 0000000..480d404
--- /dev/null
+++ b/frontend/src/modules/ide/api/scripts.api.ts
@@ -0,0 +1,138 @@
+import { apiClient } from "@/shared/api/axios.instance";
+import type { Interpreter } from "../types";
+
+export interface ScriptNodeDto {
+ id: number;
+ name: string;
+ type: "file" | "folder";
+ content?: string;
+ children?: string[];
+ interpreter_id?: number;
+}
+
+export interface ScriptResponse {
+ id: number;
+ content: string;
+ interpreter_id: number;
+ path: string;
+ created_at: string;
+ updated_at: string;
+}
+
+export interface CreateScriptPayload {
+ content: string;
+ interpreter_id: number;
+ path: string;
+}
+
+export interface UpdateScriptPayload {
+ content: string;
+ interpreter_id: number;
+ path: string;
+}
+
+export interface RunScriptPayload {
+ stdin?: string;
+ token: string;
+}
+
+export interface RunScriptResponse {
+ command: string[];
+ id: number;
+ wait_url: string;
+}
+
+export interface CreateInterpreterPayload {
+ argv: string[];
+ label: string;
+ name: string;
+}
+
+export interface JobWaitResponse {
+ command: string[];
+ id: number;
+ status: number;
+ stderr: string;
+ stdin: string;
+ stdout: string;
+}
+
+// apiClient уже имеет интерсептор для Authorization header
+export const scriptsApi = {
+ getInterpreters: async (): Promise => {
+ const res = await apiClient.get("/scripts/interpreters");
+ return res.data;
+ },
+
+ getTree: async (): Promise => {
+ const res = await apiClient.get("/scripts/tree");
+ return res.data;
+ },
+
+ createScript: async (
+ payload: CreateScriptPayload,
+ ): Promise => {
+ const res = await apiClient.post("/scripts", payload);
+ return res.data;
+ },
+
+ updateScript: async (
+ id: number,
+ payload: UpdateScriptPayload,
+ ): Promise => {
+ const res = await apiClient.put(`/scripts/${id}`, payload);
+ return res.data;
+ },
+
+ deleteScript: async (id: number): Promise => {
+ await apiClient.delete(`/scripts/${id}`);
+ },
+
+ createFolder: async (path: string): Promise<{ path: string }> => {
+ const res = await apiClient.post<{ path: string }>("/scripts/folder", {
+ path,
+ });
+ return res.data;
+ },
+
+ deleteFolder: async (path: string): Promise => {
+ await apiClient.delete(`/scripts/folder`, { data: { path } });
+ },
+
+ rename: async (payload: {
+ old_path: string;
+ new_path: string;
+ }): Promise<{ path: string }> => {
+ const res = await apiClient.post<{ path: string }>(
+ "/scripts/rename",
+ payload,
+ );
+ return res.data;
+ },
+
+ runScript: async (
+ id: number,
+ payload: RunScriptPayload,
+ ): Promise => {
+ const res = await apiClient.post(
+ `/scripts/${id}/run`,
+ payload,
+ );
+ return res.data;
+ },
+
+ waitJob: async (id: number): Promise => {
+ const res = await apiClient.post(`/jobs/${id}/wait`);
+ return res.data;
+ },
+
+ createInterpreter: async (
+ payload: CreateInterpreterPayload,
+ ): Promise => {
+ const res = await apiClient.post(
+ "/scripts/interpreters",
+ payload,
+ );
+ return res.data;
+ },
+};
diff --git a/frontend/src/modules/ide/components/AddInterpreterModal.tsx b/frontend/src/modules/ide/components/AddInterpreterModal.tsx
new file mode 100644
index 0000000..99948aa
--- /dev/null
+++ b/frontend/src/modules/ide/components/AddInterpreterModal.tsx
@@ -0,0 +1,276 @@
+import React, { useState, useRef } from "react";
+import { MdClose, MdAdd } from "react-icons/md";
+import { scriptsApi } from "../api/scripts.api";
+import type { CreateInterpreterPayload } from "../api/scripts.api";
+
+interface AddInterpreterModalProps {
+ onClose: () => void;
+ onSuccess: () => void;
+}
+
+export const AddInterpreterModal: React.FC = ({
+ onClose,
+ onSuccess,
+}) => {
+ const [name, setName] = useState("");
+ const [label, setLabel] = useState("");
+ const [argv, setArgv] = useState("");
+ const [loading, setLoading] = useState(false);
+ const [error, setError] = useState(null);
+ const nameRef = useRef(null);
+
+ React.useEffect(() => {
+ nameRef.current?.focus();
+ }, []);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+ if (!name.trim() || !label.trim()) {
+ setError("Name and Label are required");
+ return;
+ }
+
+ setLoading(true);
+ setError(null);
+
+ try {
+ const payload: CreateInterpreterPayload = {
+ name: name.trim(),
+ label: label.trim(),
+ argv: argv
+ .split(" ")
+ .map((s) => s.trim())
+ .filter(Boolean),
+ };
+
+ await scriptsApi.createInterpreter(payload);
+ onSuccess();
+ onClose();
+ } catch (e: any) {
+ console.error("Failed to create interpreter:", e);
+ setError(e?.response?.data?.detail || "Failed to create interpreter");
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+
e.stopPropagation()}
+ >
+ {/* Header */}
+
+
+ Add Interpreter
+
+
+
+
+
+
+ {/* Form */}
+
+
+
+ );
+};
diff --git a/frontend/src/modules/ide/components/CodeEditor.tsx b/frontend/src/modules/ide/components/CodeEditor.tsx
new file mode 100644
index 0000000..4b50be5
--- /dev/null
+++ b/frontend/src/modules/ide/components/CodeEditor.tsx
@@ -0,0 +1,89 @@
+import React from "react";
+import Editor from "@monaco-editor/react";
+import { FiFolder } from "react-icons/fi";
+import { getLanguage } from "../helpers/fileTree";
+
+interface CodeEditorProps {
+ filePath: string;
+ content: string;
+ onChange: (content: string) => void;
+}
+
+export const CodeEditor: React.FC = ({
+ filePath,
+ content,
+ onChange,
+}) => {
+ return (
+
+
+ {filePath ? (
+
onChange(value || "")}
+ theme="vs-dark"
+ options={{
+ minimap: { enabled: false },
+ fontSize: 14,
+ fontFamily: "'Cascadia Code', 'Fira Code', monospace",
+ tabSize: 4,
+ wordWrap: "on",
+ lineNumbers: "on",
+ automaticLayout: true,
+ renderWhitespace: "selection",
+ smoothScrolling: true,
+ }}
+ />
+ ) : (
+
+
+
+
+
+
+ Welcome to Web VS Code
+
+
+ Right-click on a folder to create files
+
+
+ Or right-click anywhere in the explorer
+
+
+
+ )}
+
+
+ );
+};
diff --git a/frontend/src/modules/ide/components/ContextMenu.tsx b/frontend/src/modules/ide/components/ContextMenu.tsx
new file mode 100644
index 0000000..d07cb43
--- /dev/null
+++ b/frontend/src/modules/ide/components/ContextMenu.tsx
@@ -0,0 +1,99 @@
+import React, { useEffect } from "react";
+import { FiFile, FiFolder, FiEdit3, FiTrash2 } from "react-icons/fi";
+
+const MenuItem: React.FC<{
+ onClick: () => void;
+ danger?: boolean;
+ children: React.ReactNode;
+}> = ({ onClick, danger, children }) => (
+ {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+ {children}
+
+);
+
+interface ContextMenuProps {
+ x: number;
+ y: number;
+ onClose: () => void;
+ onNewFile: () => void;
+ onNewFolder: () => void;
+ onRename: () => void;
+ onDelete: () => void;
+ hasNode: boolean;
+}
+
+export const ContextMenu: React.FC = ({
+ x,
+ y,
+ onClose,
+ onNewFile,
+ onNewFolder,
+ onRename,
+ onDelete,
+ hasNode,
+}) => {
+ useEffect(() => {
+ const handleClick = () => onClose();
+ document.addEventListener("click", handleClick);
+ return () => document.removeEventListener("click", handleClick);
+ }, [onClose]);
+
+ return (
+
+
+ New File
+
+
+ New Folder
+
+ {hasNode && (
+ <>
+
+
+ Rename
+
+
+ Delete
+
+ >
+ )}
+
+ );
+};
diff --git a/frontend/src/modules/ide/components/FileExplorer.tsx b/frontend/src/modules/ide/components/FileExplorer.tsx
new file mode 100644
index 0000000..17d3856
--- /dev/null
+++ b/frontend/src/modules/ide/components/FileExplorer.tsx
@@ -0,0 +1,345 @@
+import React, { useEffect, useState, useRef, useCallback } from "react";
+import { FiSearch, FiFile, FiFolder, FiMinus } from "react-icons/fi";
+import { GoKebabHorizontal } from "react-icons/go";
+import { MdClose, MdAdd } from "react-icons/md";
+import { FileTreeItem } from "./FileTreeItem";
+import { ContextMenu } from "./ContextMenu";
+import { InputDialog } from "./InputDialog";
+import { filterTree, collectPathsToExpand } from "../helpers/fileTree";
+import { useIDEStore } from "../store/useIDEStore";
+import type { FileNode } from "../types";
+
+interface FileExplorerProps {
+ files: FileNode;
+ onDeleteRoot: () => void;
+}
+
+export const FileExplorer: React.FC = ({
+ files,
+ onDeleteRoot,
+}) => {
+ const store = useIDEStore();
+ const [showSearch, setShowSearch] = useState(false);
+ const searchInputRef = useRef(null);
+
+ // Фокус на инпут при открытии поиска
+ useEffect(() => {
+ if (showSearch) {
+ searchInputRef.current?.focus();
+ }
+ }, [showSearch]);
+
+ const handleSearchBlur = useCallback(() => {
+ // Скрываем поиск при потере фокуса с небольшой задержкой,
+ // чтобы клики по кнопке очистки успели сработать
+ setTimeout(() => {
+ if (
+ searchInputRef.current &&
+ !searchInputRef.current.contains(document.activeElement)
+ ) {
+ setShowSearch(false);
+ store.setSearchQuery("");
+ }
+ }, 100);
+ }, [store]);
+
+ const handleEmptyContextMenu = (e: React.MouseEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ // Загружаем интерпретаторы перед открытием меню
+ if (store.interpreters.length === 0) {
+ store.fetchInterpreters();
+ }
+ store.setContextMenu({ x: e.clientX, y: e.clientY, node: null });
+ };
+
+ const handleNodeContextMenu = (e: React.MouseEvent, node: FileNode) => {
+ e.preventDefault();
+ e.stopPropagation();
+ store.setContextMenu({ x: e.clientX, y: e.clientY, node });
+ };
+
+ // Загружаем интерпретаторы при монтировании компонента
+ useEffect(() => {
+ if (store.interpreters.length === 0) {
+ store.fetchInterpreters();
+ }
+ }, []);
+
+ const filteredFiles = store.searchQuery
+ ? (files.children || [])
+ .map((child) => filterTree(child, store.searchQuery))
+ .filter((child): child is FileNode => child !== null)
+ : files.children || [];
+
+ useEffect(() => {
+ if (store.searchQuery && files) {
+ const pathsToExpand = collectPathsToExpand(files, store.searchQuery);
+ if (pathsToExpand.size > 0) {
+ store.autoExpandPaths(pathsToExpand);
+ }
+ }
+ }, [store.searchQuery, files, store.autoExpandPaths]);
+
+ return (
+
+
+
+ EXPLORER
+
+
+ {
+ if (!showSearch) {
+ setShowSearch(true);
+ } else {
+ setShowSearch(false);
+ store.setSearchQuery("");
+ }
+ }}
+ style={{
+ background: "transparent",
+ border: "none",
+ color: showSearch ? "#cccccc" : "#858585",
+ cursor: "pointer",
+ padding: "4px",
+ borderRadius: "4px",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ transition: "all 0.1s",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ title="Search in files"
+ >
+
+
+ {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ e.currentTarget.style.color = "#cccccc";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ e.currentTarget.style.color = "#858585";
+ }}
+ title="Collapse All"
+ >
+
+
+ {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ e.currentTarget.style.color = "#cccccc";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ e.currentTarget.style.color = "#858585";
+ }}
+ title="Expand All"
+ >
+
+
+
+
+
+ {showSearch && (
+
+
+
+ store.setSearchQuery(e.target.value)}
+ onBlur={handleSearchBlur}
+ placeholder="Search..."
+ style={{
+ flex: 1,
+ padding: "5px 6px",
+ backgroundColor: "transparent",
+ border: "none",
+ color: "#cccccc",
+ fontSize: "12px",
+ outline: "none",
+ }}
+ />
+ {store.searchQuery && (
+ store.setSearchQuery("")}
+ style={{
+ background: "none",
+ border: "none",
+ color: "#858585",
+ cursor: "pointer",
+ padding: "2px",
+ display: "flex",
+ alignItems: "center",
+ }}
+ >
+
+
+ )}
+
+
+ )}
+
+
+ {filteredFiles.length > 0 ? (
+ filteredFiles.map((child, idx) => (
+
+ ))
+ ) : (
+
+ No results found
+
+ )}
+
+
+ {store.contextMenu && (
+
store.setContextMenu(null)}
+ onNewFile={() => {
+ store.setDialog({
+ type: "newFile",
+ node: store.contextMenu?.node || null,
+ });
+ store.setContextMenu(null);
+ }}
+ onNewFolder={() => {
+ store.setDialog({
+ type: "newFolder",
+ node: store.contextMenu?.node || null,
+ });
+ store.setContextMenu(null);
+ }}
+ onRename={() => {
+ store.setDialog({
+ type: "rename",
+ node: store.contextMenu?.node || null,
+ });
+ store.setContextMenu(null);
+ }}
+ onDelete={() => {
+ if (store.contextMenu?.node) {
+ store.handleDeleteNode(store.contextMenu.node);
+ }
+ store.setContextMenu(null);
+ }}
+ hasNode={!!store.contextMenu.node}
+ />
+ )}
+
+ {store.dialog && (
+ {
+ store.handleDialogConfirm(value, interpreterId);
+ }}
+ onCancel={() => store.setDialog(null)}
+ interpreters={
+ store.dialog.type === "newFile" ? store.interpreters : undefined
+ }
+ />
+ )}
+
+ );
+};
diff --git a/frontend/src/modules/ide/components/FilePicker.tsx b/frontend/src/modules/ide/components/FilePicker.tsx
new file mode 100644
index 0000000..7b704f4
--- /dev/null
+++ b/frontend/src/modules/ide/components/FilePicker.tsx
@@ -0,0 +1,83 @@
+import React from "react";
+import type { FileNode } from "../types";
+import { FilePickerItem } from "./FilePickerItem";
+import { useFilePickerStore } from "../store/useFilePickerStore";
+import { TerminalOutput } from "@/modules/terminal";
+import { useTerminalStore } from "@/modules/terminal/store/useTerminalStore";
+
+interface FilePickerProps {
+ files: FileNode;
+ onRun?: (path: string) => void;
+}
+
+const FilePickerTree: React.FC<{
+ node: FileNode;
+ level: number;
+ onRun?: (path: string) => void;
+}> = ({ node, level, onRun }) => {
+ const expandedFolders = useFilePickerStore((s) => s.expandedFolders);
+ const toggleFolder = useFilePickerStore((s) => s.toggleFolder);
+
+ const nodePath = node.path || node.name;
+ const isExpanded = expandedFolders.has(nodePath);
+
+ if (node.type === "file") {
+ return (
+
+ );
+ }
+
+ return (
+ <>
+
+ {node.children?.map((child, idx) => (
+
+ ))}
+
+ >
+ );
+};
+
+export const FilePicker: React.FC = ({ files, onRun }) => {
+ const terminalOpen = useTerminalStore((s) => s.isOpen);
+ const jobs = useTerminalStore((s) => s.jobs);
+
+ return (
+
+ {/* Terminal — сверху, над списком файлов */}
+ {terminalOpen && jobs.length > 0 && (
+
+
+
+ )}
+
+ {(files.children || []).map((child, idx) => (
+
+ ))}
+
+ );
+};
diff --git a/frontend/src/modules/ide/components/FilePickerItem.tsx b/frontend/src/modules/ide/components/FilePickerItem.tsx
new file mode 100644
index 0000000..7a9d113
--- /dev/null
+++ b/frontend/src/modules/ide/components/FilePickerItem.tsx
@@ -0,0 +1,165 @@
+import React from "react";
+import {
+ FiChevronRight,
+ FiChevronDown,
+ FiFile,
+ FiFolder,
+ FiPlay,
+} from "react-icons/fi";
+
+interface FilePickerItemProps {
+ name: string;
+ type: "file" | "folder";
+ path: string;
+ isExpanded?: boolean;
+ children?: React.ReactNode;
+ level: number;
+ onToggleSelect?: (path: string) => void;
+ onToggleFolder?: (path: string) => void;
+ onRun?: (path: string) => void;
+}
+
+export const FilePickerItem: React.FC = ({
+ name,
+ type,
+ path,
+ isExpanded,
+ children,
+ level,
+ onToggleSelect,
+ onToggleFolder,
+ onRun,
+}) => {
+ const isFolder = type === "folder";
+ const extension = name.includes(".")
+ ? name.split(".").pop()?.toUpperCase()
+ : "";
+ const paddingLeft = 12 + level * 20;
+
+ return (
+
+
{
+ if (isFolder && onToggleFolder) {
+ onToggleFolder(path);
+ } else if (!isFolder && onToggleSelect) {
+ onToggleSelect(path);
+ }
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "var(--bg-secondary)";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+ {/* Folder expand icon */}
+ {isFolder && (
+
+ {isExpanded ? (
+
+ ) : (
+
+ )}
+
+ )}
+
+ {/* File/Folder icon */}
+
+ {isFolder ? (
+
+ ) : (
+
+ )}
+
+
+ {/* Name */}
+
+ {name}
+
+
+ {/* Extension badge — только у файлов */}
+ {!isFolder && extension && (
+
+ {extension}
+
+ )}
+
+ {/* Run button — только у файлов */}
+ {!isFolder && onRun && (
+ {
+ e.stopPropagation();
+ onRun(path);
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "#238636";
+ e.currentTarget.style.color = "#ffffff";
+ e.currentTarget.style.borderColor = "#2ea043";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ e.currentTarget.style.color = "var(--text-secondary)";
+ e.currentTarget.style.borderColor = "transparent";
+ }}
+ title="Run script"
+ >
+
+
+ )}
+
+
+ {/* Children */}
+ {isFolder && isExpanded && children}
+
+ );
+};
diff --git a/frontend/src/modules/ide/components/FileTreeItem.tsx b/frontend/src/modules/ide/components/FileTreeItem.tsx
new file mode 100644
index 0000000..05c7039
--- /dev/null
+++ b/frontend/src/modules/ide/components/FileTreeItem.tsx
@@ -0,0 +1,169 @@
+import React, { useState } from "react";
+import { FiChevronRight, FiChevronDown, FiTrash2 } from "react-icons/fi";
+import { GoFile } from "react-icons/go";
+import type { FileNode } from "../types";
+
+interface FileTreeItemProps {
+ node: FileNode;
+ level: number;
+ onFileSelect: (node: FileNode) => void;
+ selectedFile: string | null;
+ onContextMenu: (e: React.MouseEvent, node: FileNode) => void;
+ expandedFolders: Set;
+ onToggleFolder: (path: string) => void;
+ onDelete: (node: FileNode) => void;
+ isRoot?: boolean;
+ searchQuery?: string;
+}
+
+export const FileTreeItem: React.FC = ({
+ node,
+ level,
+ onFileSelect,
+ selectedFile,
+ onContextMenu,
+ expandedFolders,
+ onToggleFolder,
+ onDelete,
+ isRoot,
+ searchQuery,
+}) => {
+ const isFolder = node.type === "folder";
+ const isSelected = selectedFile === node.path && !isFolder;
+ const isExpanded = expandedFolders.has(node.path || node.name);
+ const [hovered, setHovered] = useState(false);
+
+ const handleClick = () => {
+ if (isFolder) {
+ onToggleFolder(node.path || node.name);
+ } else {
+ onFileSelect(node);
+ }
+ };
+
+ const handleDelete = (e: React.MouseEvent) => {
+ e.stopPropagation();
+ onDelete(node);
+ };
+
+ const highlightText = (text: string, query: string) => {
+ if (!query) return text;
+ const idx = text.toLowerCase().indexOf(query.toLowerCase());
+ if (idx === -1) return text;
+ return (
+ <>
+ {text.slice(0, idx)}
+
+ {text.slice(idx, idx + query.length)}
+
+ {text.slice(idx + query.length)}
+ >
+ );
+ };
+
+ return (
+
+
onContextMenu(e, node)}
+ onMouseEnter={() => setHovered(true)}
+ onMouseLeave={() => setHovered(false)}
+ style={{
+ paddingLeft: isRoot ? "8px" : `${level * 16 + 8}px`,
+ paddingTop: "4px",
+ paddingBottom: "4px",
+ cursor: "pointer",
+ display: "flex",
+ alignItems: "center",
+ gap: "6px",
+ backgroundColor: isSelected ? "#094771" : "transparent",
+ color: isSelected ? "#fff" : "#cccccc",
+ fontSize: "13px",
+ transition: "background-color 0.1s",
+ userSelect: "none",
+ minHeight: "28px",
+ }}
+ >
+
+ {isFolder ? (
+ isExpanded ? (
+
+ ) : (
+
+ )
+ ) : (
+
+ )}
+
+
+ {searchQuery ? highlightText(node.name, searchQuery) : node.name}
+
+ {hovered && !isRoot && (
+ {
+ e.currentTarget.style.color = "#f48771";
+ e.currentTarget.style.backgroundColor = "#3e3e42";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = "#858585";
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+
+
+ )}
+
+ {isFolder && isExpanded && node.children && (
+
+ {node.children.map((child, idx) => (
+
+ ))}
+
+ )}
+
+ );
+};
diff --git a/frontend/src/modules/ide/components/InputDialog.tsx b/frontend/src/modules/ide/components/InputDialog.tsx
new file mode 100644
index 0000000..3005c57
--- /dev/null
+++ b/frontend/src/modules/ide/components/InputDialog.tsx
@@ -0,0 +1,169 @@
+import React, { useState, useRef, useEffect } from "react";
+import type { Interpreter } from "../types";
+
+interface InputDialogProps {
+ title: string;
+ initialValue?: string;
+ onConfirm: (value: string, interpreterId?: number) => void;
+ onCancel: () => void;
+ interpreters?: Interpreter[];
+}
+
+export const InputDialog: React.FC = ({
+ title,
+ initialValue = "",
+ onConfirm,
+ onCancel,
+ interpreters,
+}) => {
+ const [value, setValue] = useState(initialValue);
+ const [interpreterId, setInterpreterId] = useState(
+ interpreters?.[0]?.id,
+ );
+ const inputRef = useRef(null);
+
+ useEffect(() => {
+ inputRef.current?.focus();
+ inputRef.current?.select();
+ }, []);
+
+ const showInterpreterDropdown = interpreters && interpreters.length > 0;
+
+ return (
+
+
e.stopPropagation()}
+ >
+
+ {title}
+
+
+ Enter a name
+
+
setValue(e.target.value)}
+ onKeyDown={(e) =>
+ e.key === "Enter" &&
+ value.trim() &&
+ onConfirm(value.trim(), interpreterId)
+ }
+ style={{
+ width: "100%",
+ padding: "10px",
+ backgroundColor: "#3c3c3c",
+ border: "1px solid #3e3e42",
+ borderRadius: "6px",
+ color: "#ccc",
+ fontSize: "14px",
+ marginBottom: showInterpreterDropdown ? "12px" : "20px",
+ outline: "none",
+ }}
+ />
+
+ {/* Interpreter dropdown */}
+ {showInterpreterDropdown && (
+
+
+ Interpreter
+
+ setInterpreterId(Number(e.target.value))}
+ style={{
+ width: "100%",
+ padding: "10px",
+ backgroundColor: "#3c3c3c",
+ border: "1px solid #3e3e42",
+ borderRadius: "6px",
+ color: "#ccc",
+ fontSize: "14px",
+ outline: "none",
+ cursor: "pointer",
+ }}
+ >
+ {interpreters.map((interp) => (
+
+ {interp.label}
+
+ ))}
+
+
+ )}
+
+
+
+ Cancel
+
+
+ value.trim() && onConfirm(value.trim(), interpreterId)
+ }
+ style={{
+ padding: "6px 16px",
+ backgroundColor: "#0e639c",
+ border: "none",
+ borderRadius: "4px",
+ color: "#fff",
+ cursor: "pointer",
+ fontSize: "12px",
+ }}
+ >
+ OK
+
+
+
+
+ );
+};
diff --git a/frontend/src/modules/ide/components/RunScriptModal.tsx b/frontend/src/modules/ide/components/RunScriptModal.tsx
new file mode 100644
index 0000000..4da4264
--- /dev/null
+++ b/frontend/src/modules/ide/components/RunScriptModal.tsx
@@ -0,0 +1,302 @@
+import React, { useState, useRef, useEffect } from "react";
+import { MdClose } from "react-icons/md";
+import { scriptsApi } from "../api/scripts.api";
+import { useTerminalStore } from "@/modules/terminal/store/useTerminalStore";
+import { useAgentStore } from "@/app/providers/layout/store/agent.store";
+
+interface RunScriptModalProps {
+ scriptPath: string;
+ scriptId: number;
+ onClose: () => void;
+}
+
+export const RunScriptModal: React.FC = ({
+ scriptPath,
+ scriptId,
+ onClose,
+}) => {
+ const [selectedAgentIdx, setSelectedAgentIdx] = useState(0);
+ const [stdinValue, setStdinValue] = useState("");
+ const [loading, setLoading] = useState(false);
+ const [error, setError] = useState(null);
+ const inputRef = useRef(null);
+
+ const agents = useAgentStore((s) => s.agents);
+ const addJob = useTerminalStore((s) => s.addJob);
+ const openTerminal = useTerminalStore((s) => s.openTerminal);
+
+ const selectedAgent = agents[selectedAgentIdx];
+
+ useEffect(() => {
+ inputRef.current?.focus();
+ }, []);
+
+ const handleRun = async () => {
+ if (!selectedAgent) {
+ setError("No agents available");
+ return;
+ }
+
+ setLoading(true);
+ setError(null);
+
+ try {
+ // 1. Запускаем скрипт
+ const runResult = await scriptsApi.runScript(scriptId, {
+ stdin: stdinValue,
+ token: selectedAgent.token,
+ });
+
+ // 2. Добавляем джоб в терминал
+ addJob({
+ id: runResult.id,
+ scriptPath,
+ command: runResult.command,
+ });
+
+ // 3. Открываем терминал
+ openTerminal();
+
+ // 4. Ждём завершения по id
+ const jobResult = await scriptsApi.waitJob(runResult.id);
+
+ // 5. Обновляем существующий джоб (не создаём новый!)
+ const terminalStore = useTerminalStore.getState();
+ terminalStore.updateJob(runResult.id, {
+ command: jobResult.command,
+ stdin: jobResult.stdin,
+ status: jobResult.status,
+ stdout: jobResult.stdout,
+ stderr: jobResult.stderr,
+ isRunning: false,
+ });
+
+ onClose();
+ } catch (e: any) {
+ console.error("Failed to run script:", e);
+ setError(e?.response?.data?.detail || "Failed to run script");
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+
e.stopPropagation()}
+ >
+ {/* Header */}
+
+
+ Run Script
+
+
+
+
+
+
+ {/* Content */}
+
+ {/* Script path */}
+
+
+ Script
+
+
+ {scriptPath}
+
+
+
+ {/* Agent selector */}
+
+
+ Agent *
+
+ setSelectedAgentIdx(Number(e.target.value))}
+ style={{
+ width: "100%",
+ padding: "8px 12px",
+ backgroundColor: "var(--input-bg)",
+ border: "1px solid var(--border)",
+ borderRadius: "4px",
+ color: "var(--text-primary)",
+ fontSize: "13px",
+ outline: "none",
+ }}
+ >
+ {agents.length === 0 && (
+ No agents available
+ )}
+ {agents.map((agent, idx) => (
+
+ {agent.label}
+
+ ))}
+
+
+
+ {/* Stdin (optional) */}
+
+
+ Stdin (optional)
+
+
+
+ {/* Error */}
+ {error && (
+
+ {error}
+
+ )}
+
+ {/* Run button */}
+
+ {loading ? (
+ <>
+
+ ⏳
+
+ Running...
+ >
+ ) : (
+ <>▶ Run>
+ )}
+
+
+
+
+ );
+};
diff --git a/frontend/src/modules/ide/components/StatusBar.tsx b/frontend/src/modules/ide/components/StatusBar.tsx
new file mode 100644
index 0000000..257cd45
--- /dev/null
+++ b/frontend/src/modules/ide/components/StatusBar.tsx
@@ -0,0 +1,44 @@
+import React from "react";
+import { FiGitBranch, FiCheckCircle, FiAlertCircle } from "react-icons/fi";
+import type { FileNode } from "../types";
+
+interface StatusBarProps {
+ activeFile: FileNode | null;
+}
+
+export const StatusBar: React.FC = ({ activeFile }) => {
+ return (
+
+
+
+ main
+
+
+ 0 0
+
+
+
+ {activeFile && (
+
+ Ln 1, Col 1 | Spaces: 4 | UTF-8 |{" "}
+ {activeFile.path?.split(".").pop()?.toUpperCase() || "TXT"}
+
+ )}
+ Web VS Code
+
+
+ );
+};
diff --git a/frontend/src/modules/ide/components/TabBar.tsx b/frontend/src/modules/ide/components/TabBar.tsx
new file mode 100644
index 0000000..6b51daf
--- /dev/null
+++ b/frontend/src/modules/ide/components/TabBar.tsx
@@ -0,0 +1,207 @@
+import React, { useState } from "react";
+import { GoFile } from "react-icons/go";
+import { MdClose } from "react-icons/md";
+import type { FileNode } from "../types";
+
+interface TabBarProps {
+ openFiles: FileNode[];
+ activeFile: FileNode | null;
+ onSelectFile: (file: FileNode) => void;
+ onCloseFile: (file: FileNode) => void;
+ onCloseAll: () => void;
+ onCloseOthers: (file: FileNode) => void;
+}
+
+export const TabBar: React.FC = ({
+ openFiles,
+ activeFile,
+ onSelectFile,
+ onCloseFile,
+ onCloseAll,
+ onCloseOthers,
+}) => {
+ const [showContextMenu, setShowContextMenu] = useState<{
+ x: number;
+ y: number;
+ file: FileNode;
+ } | null>(null);
+
+ const handleContextMenu = (e: React.MouseEvent, file: FileNode) => {
+ e.preventDefault();
+ setShowContextMenu({ x: e.clientX, y: e.clientY, file });
+ };
+
+ return (
+ <>
+
+
+ {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ title="Close All"
+ >
+
+ Close All
+
+
+ {openFiles.map((file) => (
+
onSelectFile(file)}
+ onContextMenu={(e) => handleContextMenu(e, file)}
+ style={{
+ display: "flex",
+ alignItems: "center",
+ padding: "8px 16px",
+ backgroundColor:
+ activeFile?.path === file.path ? "#1e1e1e" : "#2d2d30",
+ color: activeFile?.path === file.path ? "#fff" : "#cccccc",
+ borderRight: "1px solid #3e3e42",
+ cursor: "pointer",
+ fontSize: "13px",
+ gap: "10px",
+ whiteSpace: "nowrap",
+ transition: "all 0.1s",
+ borderTop:
+ activeFile?.path === file.path
+ ? "2px solid #0e639c"
+ : "2px solid transparent",
+ }}
+ >
+
+ {file.name}
+ {file.dirty && (
+
+ )}
+ {
+ e.stopPropagation();
+ onCloseFile(file);
+ }}
+ style={{
+ background: "none",
+ border: "none",
+ color: "#858585",
+ cursor: "pointer",
+ fontSize: "16px",
+ padding: "0 4px",
+ borderRadius: "4px",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.color = "#fff";
+ e.currentTarget.style.backgroundColor = "#3e3e42";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = "#858585";
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+
+
+
+ ))}
+
+ {showContextMenu && (
+
+
{
+ onCloseOthers(showContextMenu.file);
+ setShowContextMenu(null);
+ }}
+ style={{
+ padding: "8px 16px",
+ cursor: "pointer",
+ color: "#cccccc",
+ fontSize: "13px",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+ Close Others
+
+
{
+ onCloseAll();
+ setShowContextMenu(null);
+ }}
+ style={{
+ padding: "8px 16px",
+ cursor: "pointer",
+ color: "#cccccc",
+ fontSize: "13px",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+ Close All
+
+
+ )}
+ >
+ );
+};
diff --git a/frontend/src/modules/ide/components/TitleBar.tsx b/frontend/src/modules/ide/components/TitleBar.tsx
new file mode 100644
index 0000000..99fae56
--- /dev/null
+++ b/frontend/src/modules/ide/components/TitleBar.tsx
@@ -0,0 +1,55 @@
+import React from "react";
+import { FiGitBranch, FiCheckCircle } from "react-icons/fi";
+
+export const TitleBar: React.FC = () => {
+ return (
+
+ );
+};
diff --git a/frontend/src/modules/ide/components/index.ts b/frontend/src/modules/ide/components/index.ts
new file mode 100644
index 0000000..7a2a8e9
--- /dev/null
+++ b/frontend/src/modules/ide/components/index.ts
@@ -0,0 +1,10 @@
+export { ContextMenu } from "./ContextMenu";
+export { InputDialog } from "./InputDialog";
+export { FileTreeItem } from "./FileTreeItem";
+export { FileExplorer } from "./FileExplorer";
+export { TabBar } from "./TabBar";
+export { CodeEditor } from "./CodeEditor";
+export { TitleBar } from "./TitleBar";
+export { StatusBar } from "./StatusBar";
+export { FilePickerItem } from "./FilePickerItem";
+export { FilePicker } from "./FilePicker";
diff --git a/frontend/src/modules/ide/helpers/fileTree.ts b/frontend/src/modules/ide/helpers/fileTree.ts
new file mode 100644
index 0000000..22f60be
--- /dev/null
+++ b/frontend/src/modules/ide/helpers/fileTree.ts
@@ -0,0 +1,174 @@
+import type { FileNode } from "../types";
+
+export const addPaths = (node: FileNode, parentPath: string = ""): FileNode => {
+ const currentPath = parentPath ? `${parentPath}/${node.name}` : node.name;
+ const newNode = { ...node, path: currentPath };
+ if (newNode.children) {
+ newNode.children = newNode.children.map((child) =>
+ addPaths(child, currentPath),
+ );
+ }
+ return newNode;
+};
+
+export const getAllFolderPaths = (node: FileNode): string[] => {
+ let paths: string[] = [];
+ if (node.type === "folder") {
+ paths.push(node.path || node.name);
+ if (node.children) {
+ node.children.forEach((child) => {
+ paths = [...paths, ...getAllFolderPaths(child)];
+ });
+ }
+ }
+ return paths;
+};
+
+export const findNode = (node: FileNode, path: string): FileNode | null => {
+ if (node.path === path) return node;
+ if (node.children) {
+ for (const child of node.children) {
+ const found = findNode(child, path);
+ if (found) return found;
+ }
+ }
+ return null;
+};
+
+export const deleteNode = (node: FileNode, path: string): FileNode | null => {
+ if (node.path === path) return null;
+
+ if (node.children) {
+ const filtered = node.children.filter((child) => child.path !== path);
+ const mapped = filtered
+ .map((child) => deleteNode(child, path))
+ .filter((child): child is FileNode => child !== null);
+ return { ...node, children: mapped };
+ }
+ return node;
+};
+
+export const addNode = (
+ node: FileNode,
+ parentPath: string,
+ newNode: FileNode,
+): FileNode => {
+ if (node.path === parentPath) {
+ const newPath = addPaths(newNode, node.path);
+ return { ...node, children: [...(node.children || []), newPath] };
+ }
+ if (node.children) {
+ return {
+ ...node,
+ children: node.children.map((child) =>
+ addNode(child, parentPath, newNode),
+ ),
+ };
+ }
+ return node;
+};
+
+export const renameNode = (
+ node: FileNode,
+ oldPath: string,
+ newName: string,
+): FileNode | null => {
+ if (node.path === oldPath) {
+ const pathParts = node.path?.split("/") || [];
+ pathParts[pathParts.length - 1] = newName;
+ const newPath = pathParts.join("/");
+ const renamedNode = { ...node, name: newName, path: newPath };
+
+ if (renamedNode.children) {
+ renamedNode.children = renamedNode.children.map((child) => {
+ const oldChildPath = child.path || "";
+ const newChildPath = oldChildPath.replace(oldPath, newPath);
+ return (
+ renameNode(
+ child,
+ oldChildPath,
+ newChildPath.split("/").pop() || "",
+ ) || child
+ );
+ });
+ }
+ return renamedNode;
+ }
+
+ if (node.children) {
+ return {
+ ...node,
+ children: node.children.map(
+ (child) => renameNode(child, oldPath, newName) || child,
+ ),
+ };
+ }
+ return node;
+};
+
+export const filterTree = (node: FileNode, query: string): FileNode | null => {
+ if (!query) return node;
+ const lowerQuery = query.toLowerCase();
+
+ if (node.type === "file") {
+ if (node.name.toLowerCase().includes(lowerQuery)) return node;
+ return null;
+ }
+
+ if (node.children) {
+ const filteredChildren = node.children
+ .map((child) => filterTree(child, query))
+ .filter((child): child is FileNode => child !== null);
+
+ if (filteredChildren.length > 0) {
+ return { ...node, children: filteredChildren };
+ }
+ }
+
+ if (node.name.toLowerCase().includes(lowerQuery)) return node;
+ return null;
+};
+
+export const collectPathsToExpand = (
+ node: FileNode,
+ query: string,
+): Set => {
+ const paths = new Set();
+ if (!query) return paths;
+
+ const lowerQuery = query.toLowerCase();
+
+ const search = (n: FileNode, currentPath: string) => {
+ if (n.name.toLowerCase().includes(lowerQuery)) {
+ const pathParts = currentPath.split("/");
+ for (let i = 1; i < pathParts.length; i++) {
+ paths.add(pathParts.slice(0, i).join("/"));
+ }
+ }
+ if (n.children) {
+ n.children.forEach((child) => {
+ const childPath = child.path || `${currentPath}/${child.name}`;
+ search(child, childPath);
+ });
+ }
+ };
+
+ search(node, node.path || node.name);
+ return paths;
+};
+
+export const getLanguage = (path: string) => {
+ const ext = path.split(".").pop();
+ const map: Record = {
+ py: "python",
+ js: "javascript",
+ ts: "typescript",
+ jsx: "javascript",
+ tsx: "typescript",
+ json: "json",
+ md: "markdown",
+ css: "css",
+ html: "html",
+ };
+ return map[ext || ""] || "plaintext";
+};
diff --git a/frontend/src/modules/ide/index.ts b/frontend/src/modules/ide/index.ts
new file mode 100644
index 0000000..294db1d
--- /dev/null
+++ b/frontend/src/modules/ide/index.ts
@@ -0,0 +1,5 @@
+export { IDE } from "./IDE";
+export { FilePicker } from "./components/FilePicker";
+export { useIDEStore, initialFiles } from "./store/useIDEStore";
+export { useFilePickerStore } from "./store/useFilePickerStore";
+export type { FileNode } from "./types";
diff --git a/frontend/src/modules/ide/store/useFilePickerStore.ts b/frontend/src/modules/ide/store/useFilePickerStore.ts
new file mode 100644
index 0000000..e6b9e74
--- /dev/null
+++ b/frontend/src/modules/ide/store/useFilePickerStore.ts
@@ -0,0 +1,57 @@
+import { create } from "zustand";
+
+interface FilePickerState {
+ selectedPaths: Set;
+ expandedFolders: Set;
+
+ toggleSelection: (path: string) => void;
+ selectAll: (paths: string[]) => void;
+ clearSelection: () => void;
+ toggleFolder: (path: string) => void;
+ getSelectedPaths: () => string[];
+}
+
+export const useFilePickerStore = create((set, get) => ({
+ selectedPaths: new Set(),
+ expandedFolders: new Set(),
+
+ toggleSelection: (path: string) => {
+ set((state) => {
+ const newSet = new Set(state.selectedPaths);
+ if (newSet.has(path)) {
+ newSet.delete(path);
+ } else {
+ newSet.add(path);
+ }
+ return { selectedPaths: newSet };
+ });
+ },
+
+ selectAll: (paths: string[]) => {
+ set((state) => {
+ const newSet = new Set(state.selectedPaths);
+ paths.forEach((p) => newSet.add(p));
+ return { selectedPaths: newSet };
+ });
+ },
+
+ clearSelection: () => {
+ set({ selectedPaths: new Set() });
+ },
+
+ toggleFolder: (path: string) => {
+ set((state) => {
+ const newSet = new Set(state.expandedFolders);
+ if (newSet.has(path)) {
+ newSet.delete(path);
+ } else {
+ newSet.add(path);
+ }
+ return { expandedFolders: newSet };
+ });
+ },
+
+ getSelectedPaths: () => {
+ return Array.from(get().selectedPaths);
+ },
+}));
diff --git a/frontend/src/modules/ide/store/useIDEStore.ts b/frontend/src/modules/ide/store/useIDEStore.ts
new file mode 100644
index 0000000..f9f2687
--- /dev/null
+++ b/frontend/src/modules/ide/store/useIDEStore.ts
@@ -0,0 +1,641 @@
+import { create } from "zustand";
+import type { FileNode, Interpreter, DialogState } from "../types";
+import {
+ addPaths,
+ getAllFolderPaths,
+ findNode,
+ deleteNode,
+ addNode,
+ renameNode,
+} from "../helpers/fileTree";
+import { scriptsApi } from "../api/scripts.api";
+
+export const initialFiles: FileNode = {
+ name: "my-project",
+ type: "folder",
+ children: [
+ {
+ name: "src",
+ type: "folder",
+ children: [
+ {
+ name: "main.py",
+ type: "file",
+ content:
+ 'print("Hello, World!")\n\ndef main():\n print("Welcome!")\n\nif __name__ == "__main__":\n main()',
+ },
+ {
+ name: "utils.py",
+ type: "file",
+ content: "def helper():\n return 42",
+ },
+ ],
+ },
+ {
+ name: "README.md",
+ type: "file",
+ content: "# My Project\n\nWelcome!",
+ },
+ ],
+};
+
+interface IDEFileNode extends FileNode {
+ dirty?: boolean;
+}
+
+interface IDEState {
+ // Файловая система
+ files: FileNode | null;
+ openFiles: IDEFileNode[];
+ activeFile: IDEFileNode | null;
+ expandedFolders: Set;
+ searchQuery: string;
+ showSearch: boolean;
+ isInitialized: boolean;
+ interpreters: Interpreter[];
+
+ // Диалоги и контекстные меню
+ contextMenu: { x: number; y: number; node: FileNode | null } | null;
+ dialog: DialogState | null;
+ tabContextMenu: { x: number; y: number; file: FileNode } | null;
+
+ // Действия с файлами
+ selectFile: (node: FileNode) => void;
+ updateFileContent: (content: string) => void;
+ saveActiveFile: () => Promise;
+ closeFile: (file: FileNode) => void;
+ closeAllFiles: () => void;
+ closeOtherFiles: (file: FileNode) => void;
+
+ // Действия с деревом
+ refreshFiles: (newFiles: FileNode | null, newFile?: FileNode) => void;
+ toggleFolder: (path: string) => void;
+ expandAllFolders: () => void;
+ collapseAllFolders: () => void;
+ autoExpandPaths: (paths: Set) => void;
+ deleteRoot: () => void;
+ createNewProject: () => void;
+
+ // Интерпретаторы
+ fetchInterpreters: () => Promise;
+
+ // API методы
+ fetchTree: () => Promise;
+ createScript: (payload: {
+ content: string;
+ interpreter_id: number;
+ path: string;
+ }) => Promise;
+ createFolder: (path: string) => Promise;
+ updateScript: (
+ id: number,
+ payload: { content: string; interpreter_id: number; path: string },
+ ) => Promise;
+ deleteScript: (id: number) => Promise;
+ deleteFolder: (payload: { path: string }) => Promise;
+ saveActiveFile: () => Promise;
+
+ // Поиск
+ setSearchQuery: (query: string) => void;
+ toggleSearch: () => void;
+
+ // Контекстные меню и диалоги
+ setContextMenu: (
+ menu: { x: number; y: number; node: FileNode | null } | null,
+ ) => void;
+ setDialog: (
+ dialog: {
+ type: "newFile" | "newFolder" | "rename";
+ node: FileNode | null;
+ } | null,
+ ) => void;
+ setTabContextMenu: (
+ menu: { x: number; y: number; file: FileNode } | null,
+ ) => void;
+
+ // Инициализация
+ initialize: (initialFiles: FileNode) => void;
+
+ // Диалог подтверждения
+ handleDialogConfirm: (value: string, interpreterId?: number) => Promise;
+ handleDeleteNode: (node: FileNode) => Promise;
+}
+
+export const useIDEStore = create((set, get) => ({
+ // Начальное состояние
+ files: null,
+ openFiles: [],
+ activeFile: null,
+ expandedFolders: new Set(),
+ searchQuery: "",
+ showSearch: false,
+ isInitialized: false,
+
+ contextMenu: null,
+ dialog: null,
+ tabContextMenu: null,
+ interpreters: [],
+
+ // Инициализация
+ initialize: (initialFiles: FileNode) => {
+ const filesWithPaths = addPaths(initialFiles);
+ set({
+ files: filesWithPaths,
+ expandedFolders: new Set([filesWithPaths.path || filesWithPaths.name]),
+ isInitialized: true,
+ });
+ },
+
+ // Выбор файла
+ selectFile: (node: FileNode) => {
+ if (node.type === "file") {
+ const { openFiles, files } = get();
+ // Берём актуальную версию из дерева файлов
+ const latestFile = files ? findNode(files, node.path || "") : null;
+ const fileToOpen =
+ latestFile && latestFile.type === "file" ? latestFile : node;
+
+ if (!openFiles.find((f) => f.path === fileToOpen.path)) {
+ set((state) => ({ openFiles: [...state.openFiles, fileToOpen] }));
+ }
+ set({ activeFile: fileToOpen });
+ }
+ },
+
+ // Обновление содержимого файла
+ updateFileContent: (content: string) => {
+ const { activeFile, files } = get();
+ if (activeFile && files) {
+ const updatedFile = { ...activeFile, content, dirty: true };
+ set({ activeFile: updatedFile });
+ set((state) => ({
+ openFiles: state.openFiles.map((f) =>
+ f.path === activeFile.path ? updatedFile : f,
+ ),
+ }));
+
+ // Обновляем также в дереве файлов
+ const updateFileInTree = (node: FileNode): FileNode => {
+ if (node.path === activeFile.path) {
+ return updatedFile;
+ }
+ if (node.children) {
+ return {
+ ...node,
+ children: node.children.map((child) => updateFileInTree(child)),
+ };
+ }
+ return node;
+ };
+ set({ files: updateFileInTree(files) });
+ }
+ },
+
+ // Закрытие файла
+ closeFile: (file: FileNode) => {
+ const { openFiles, activeFile } = get();
+ const newOpenFiles = openFiles.filter((f) => f.path !== file.path);
+ set({ openFiles: newOpenFiles });
+
+ if (activeFile?.path === file.path) {
+ set({ activeFile: newOpenFiles[newOpenFiles.length - 1] || null });
+ }
+ },
+
+ // Закрыть все файлы
+ closeAllFiles: () => {
+ set({ openFiles: [], activeFile: null });
+ },
+
+ // Закрыть другие файлы
+ closeOtherFiles: (file: FileNode) => {
+ set({ openFiles: [file], activeFile: file });
+ },
+
+ // Обновить файловую систему
+ refreshFiles: (newFiles: FileNode | null, newFile?: FileNode) => {
+ const { openFiles, activeFile, selectFile } = get();
+
+ set({ files: newFiles });
+
+ if (!newFiles) {
+ set({ openFiles: [], activeFile: null });
+ return;
+ }
+
+ const updatedOpenFiles = openFiles
+ .map((f) => {
+ const found = findNode(newFiles, f.path || "");
+ return found && found.type === "file" ? found : null;
+ })
+ .filter((f): f is FileNode => f !== null);
+
+ set({ openFiles: updatedOpenFiles });
+
+ if (newFile) {
+ selectFile(newFile);
+ } else if (activeFile) {
+ const stillExists = findNode(newFiles, activeFile.path || "");
+ if (!stillExists) {
+ set({
+ activeFile: updatedOpenFiles[updatedOpenFiles.length - 1] || null,
+ });
+ } else if (stillExists.type === "file") {
+ set({ activeFile: stillExists });
+ }
+ }
+ },
+
+ // Переключить папку
+ toggleFolder: (path: string) => {
+ set((state) => {
+ const newSet = new Set(state.expandedFolders);
+ if (newSet.has(path)) {
+ newSet.delete(path);
+ } else {
+ newSet.add(path);
+ }
+ return { expandedFolders: newSet };
+ });
+ },
+
+ // Раскрыть все папки
+ expandAllFolders: () => {
+ const { files } = get();
+ if (files) {
+ set({ expandedFolders: new Set(getAllFolderPaths(files)) });
+ }
+ },
+
+ // Свернуть все папки
+ collapseAllFolders: () => {
+ set({ expandedFolders: new Set() });
+ },
+
+ // Автоматически раскрыть пути
+ autoExpandPaths: (paths: Set) => {
+ set((state) => ({
+ expandedFolders: new Set([...state.expandedFolders, ...paths]),
+ }));
+ },
+
+ // Удалить корень
+ deleteRoot: () => {
+ set({
+ files: null,
+ openFiles: [],
+ activeFile: null,
+ expandedFolders: new Set(),
+ });
+ },
+
+ // Создать новый проект
+ createNewProject: () => {
+ const newProject = addPaths(initialFiles);
+ set({
+ files: newProject,
+ expandedFolders: new Set([newProject.path || newProject.name]),
+ searchQuery: "",
+ });
+ },
+
+ // Интерпретаторы
+ fetchInterpreters: async () => {
+ try {
+ const interpreters = await scriptsApi.getInterpreters();
+ set({ interpreters });
+ } catch (e) {
+ console.error("Failed to fetch interpreters:", e);
+ }
+ },
+
+ // API: загрузка дерева с сервера
+ fetchTree: async () => {
+ try {
+ const data = await scriptsApi.getTree();
+ const { expandedFolders } = get();
+
+ const convertItem = (item: any): FileNode => {
+ const node: FileNode = {
+ id: item.id,
+ name: item.name,
+ type: item.type === "folder" ? "folder" : "file",
+ content: item.content || "",
+ path: item.name,
+ interpreter_id: item.interpreter_id,
+ };
+
+ if (item.type === "folder") {
+ node.children = [];
+ if (item.children && Array.isArray(item.children)) {
+ node.children = item.children.map((child: any) => {
+ const childNode = convertItem(child);
+ childNode.path = `${item.name}/${child.name}`;
+ return childNode;
+ });
+ }
+ }
+
+ return node;
+ };
+
+ const roots = data.map((item) => convertItem(item));
+
+ set({
+ files: {
+ name: "scripts",
+ type: "folder",
+ children: roots,
+ },
+ expandedFolders,
+ isInitialized: true,
+ });
+ } catch (e) {
+ console.error("Failed to fetch tree:", e);
+ throw e;
+ }
+ },
+
+ // API: создание скрипта
+ createScript: async (payload) => {
+ try {
+ await scriptsApi.createScript(payload);
+ await get().fetchTree();
+ } catch (e) {
+ console.error("Failed to create script:", e);
+ throw e;
+ }
+ },
+
+ // API: создание папки
+ createFolder: async (path: string) => {
+ try {
+ await scriptsApi.createFolder(path);
+ await get().fetchTree();
+ } catch (e) {
+ console.error("Failed to create folder:", e);
+ throw e;
+ }
+ },
+
+ // API: удаление папки
+ deleteFolder: async ({ path }: { path: string }) => {
+ try {
+ const { openFiles } = get();
+
+ // Закрываем все файлы, которые находятся в удаляемой папке
+ const folderPathPrefix = path.endsWith("/") ? path : `${path}/`;
+ const filesToClose = openFiles.filter(
+ (f) => f.path === path || f.path?.startsWith(folderPathPrefix),
+ );
+ filesToClose.forEach((f) => get().closeFile(f));
+
+ await scriptsApi.deleteFolder(path);
+ await get().fetchTree();
+ } catch (e) {
+ console.error("Failed to delete folder:", e);
+ throw e;
+ }
+ },
+
+ // API: обновление скрипта
+ updateScript: async (id, payload) => {
+ try {
+ await scriptsApi.updateScript(id, payload);
+ } catch (e) {
+ console.error("Failed to update script:", e);
+ throw e;
+ }
+ },
+
+ // API: удаление скрипта
+ deleteScript: async (id) => {
+ try {
+ await scriptsApi.deleteScript(id);
+ await get().fetchTree();
+ } catch (e) {
+ console.error("Failed to delete script:", e);
+ throw e;
+ }
+ },
+
+ // API: сохранение активного файла
+ saveActiveFile: async () => {
+ const { activeFile } = get();
+ if (!activeFile || !activeFile.id) return;
+
+ try {
+ await scriptsApi.updateScript(activeFile.id, {
+ content: activeFile.content || "",
+ interpreter_id: activeFile.interpreter_id || 0,
+ path: activeFile.path || "",
+ });
+ set((state) => ({
+ activeFile: state.activeFile
+ ? { ...state.activeFile, dirty: false }
+ : null,
+ openFiles: state.openFiles.map((f) =>
+ f.path === state.activeFile?.path ? { ...f, dirty: false } : f,
+ ),
+ }));
+ } catch (e) {
+ console.error("Failed to save file:", e);
+ }
+ },
+
+ // Поиск
+ setSearchQuery: (query: string) => {
+ set({ searchQuery: query });
+ },
+
+ toggleSearch: () => {
+ set((state) => ({ showSearch: !state.showSearch }));
+ },
+
+ // Контекстные меню и диалоги
+ setContextMenu: (menu) => set({ contextMenu: menu }),
+ setDialog: (dialog) => set({ dialog: dialog }),
+ setTabContextMenu: (menu) => set({ tabContextMenu: menu }),
+
+ // Подтверждение диалога
+ handleDialogConfirm: async (value: string, interpreterId?: number) => {
+ const { dialog, files, toggleFolder, autoExpandPaths } = get();
+ if (!dialog) return;
+
+ if (dialog.type === "rename" && dialog.node) {
+ const parentPath =
+ dialog.node.path?.split("/").slice(0, -1).join("/") || "";
+ const parentNode = parentPath ? findNode(files!, parentPath) : files;
+ if (
+ parentNode?.children?.some(
+ (c) =>
+ c.name.toLowerCase() === value.toLowerCase() &&
+ c.path !== dialog.node?.path,
+ )
+ ) {
+ alert(`"${value}" already exists.`);
+ return;
+ }
+
+ const oldPath = dialog.node.path || dialog.node.name;
+ const newPath = parentPath ? `${parentPath}/${value}` : value;
+
+ // Сохраняем раскрытые папки
+ const savedExpandedFolders = new Set(get().expandedFolders);
+
+ try {
+ await scriptsApi.rename({ old_path: oldPath, new_path: newPath });
+ await get().fetchTree();
+
+ // Восстанавливаем раскрытые папки
+ set({ expandedFolders: savedExpandedFolders });
+
+ // Раскрываем родительскую цепочку
+ const allParentPaths: string[] = [];
+ let current = parentPath;
+ while (current) {
+ allParentPaths.push(current);
+ const parts = current.split("/");
+ parts.pop();
+ current = parts.join("/");
+ }
+ autoExpandPaths(new Set(allParentPaths));
+
+ // Если переименованный файл был открыт — обновим его в openFiles
+ const { openFiles, activeFile } = get();
+ const updatedOpenFiles = openFiles.map((f) =>
+ f.path === oldPath ? { ...f, name: value, path: newPath } : f,
+ );
+ set({ openFiles: updatedOpenFiles });
+
+ if (activeFile?.path === oldPath) {
+ set({ activeFile: { ...activeFile, name: value, path: newPath } });
+ }
+ } catch (e) {
+ console.error("Failed to rename:", e);
+ }
+
+ set({ dialog: null });
+ return;
+ }
+
+ // Определяем родительский путь
+ let parentPath: string;
+ if (!dialog.node) {
+ parentPath = "";
+ } else if (dialog.node.type === "folder") {
+ parentPath = dialog.node.path || dialog.node.name;
+ } else {
+ const pathParts = (dialog.node.path || dialog.node.name).split("/");
+ pathParts.pop();
+ parentPath = pathParts.join("/");
+ }
+
+ // Проверяем наличие расширения
+ const hasExtension =
+ value.includes(".") && value.split(".").pop() !== value;
+ let finalName = value;
+ let isFile = false;
+
+ // Если диалог создания файла
+ if (dialog.type === "newFile") {
+ isFile = true;
+ // Если нет расширения — добавляем .txt
+ if (!hasExtension) {
+ finalName = `${value}.txt`;
+ }
+ } else if (dialog.type === "newFolder") {
+ // Если диалог создания папки — но имя с расширением, считаем файлом
+ if (hasExtension) {
+ isFile = true;
+ }
+ }
+
+ const fullPath = parentPath ? `${parentPath}/${finalName}` : finalName;
+
+ // Сохраняем раскрытые папки ДО перезагрузки дерева
+ const savedExpandedFolders = new Set(get().expandedFolders);
+
+ try {
+ // Создание папки
+ if (dialog.type === "newFolder" && !isFile) {
+ await scriptsApi.createFolder(fullPath);
+ await get().fetchTree();
+
+ // Восстанавливаем раскрытые папки
+ set({ expandedFolders: savedExpandedFolders });
+
+ // Собираем все пути от корня до родительской папки
+ const allParentPaths: string[] = [];
+ let current = parentPath;
+ while (current) {
+ allParentPaths.push(current);
+ const parts = current.split("/");
+ parts.pop();
+ current = parts.join("/");
+ }
+
+ // Раскрываем родительскую цепочку
+ autoExpandPaths(new Set(allParentPaths));
+ } else {
+ // Создание файла
+ const result = await scriptsApi.createScript({
+ content: "",
+ interpreter_id: interpreterId || 0,
+ path: fullPath,
+ });
+
+ await get().fetchTree();
+
+ // Восстанавливаем раскрытые папки
+ set({ expandedFolders: savedExpandedFolders });
+
+ // Собираем все пути от корня до родительской папки
+ const allParentPaths: string[] = [];
+ let current = parentPath;
+ while (current) {
+ allParentPaths.push(current);
+ const parts = current.split("/");
+ parts.pop();
+ current = parts.join("/");
+ }
+
+ // Раскрываем родительскую цепочку
+ autoExpandPaths(new Set(allParentPaths));
+
+ const createdNode: FileNode = {
+ id: result.id,
+ name: finalName,
+ type: "file",
+ content: result.content,
+ path: result.path,
+ interpreter_id: result.interpreter_id,
+ };
+ get().selectFile(createdNode);
+ }
+ } catch (e) {
+ console.error("Failed to create:", e);
+ }
+
+ set({ dialog: null });
+ },
+
+ // Удаление узла
+ handleDeleteNode: async (node: FileNode) => {
+ const { files } = get();
+ const isRootNode = node.path === files?.path;
+ if (isRootNode) {
+ get().deleteRoot();
+ } else if (window.confirm(`Delete "${node.name}"?`)) {
+ try {
+ if (node.type === "folder") {
+ await get().deleteFolder({ path: node.path || node.name });
+ } else if (node.id) {
+ await get().deleteScript(node.id);
+ }
+ } catch (e) {
+ console.error("Failed to delete:", e);
+ }
+ }
+ },
+}));
diff --git a/frontend/src/modules/ide/types.ts b/frontend/src/modules/ide/types.ts
new file mode 100644
index 0000000..e60f340
--- /dev/null
+++ b/frontend/src/modules/ide/types.ts
@@ -0,0 +1,34 @@
+export interface FileNode {
+ name: string;
+ type: "file" | "folder";
+ content?: string;
+ children?: FileNode[];
+ path?: string;
+}
+
+export interface Interpreter {
+ id: number;
+ name: string;
+ label: string;
+ argv: string[];
+ created_at: string;
+ updated_at: string;
+}
+
+export interface ContextMenuState {
+ x: number;
+ y: number;
+ node: FileNode | null;
+}
+
+export interface DialogState {
+ type: "newFile" | "newFolder" | "rename";
+ node: FileNode | null;
+ interpreterId?: number;
+}
+
+export interface TabContextMenuState {
+ x: number;
+ y: number;
+ file: FileNode;
+}
diff --git a/frontend/src/modules/terminal/components/TerminalOutput.tsx b/frontend/src/modules/terminal/components/TerminalOutput.tsx
new file mode 100644
index 0000000..933d255
--- /dev/null
+++ b/frontend/src/modules/terminal/components/TerminalOutput.tsx
@@ -0,0 +1,262 @@
+import React from "react";
+import { useTerminalStore } from "../store/useTerminalStore";
+import { MdClose, MdClearAll } from "react-icons/md";
+import { FiTerminal } from "react-icons/fi";
+
+export const TerminalOutput: React.FC = () => {
+ const {
+ jobs,
+ isOpen,
+ activeJobId,
+ closeTerminal,
+ setActiveJob,
+ clearJobs,
+ removeJob,
+ } = useTerminalStore();
+
+ if (!isOpen) return null;
+
+ const activeJob = jobs.find((j) => j.id === activeJobId) || jobs[jobs.length - 1];
+
+ return (
+
+ {/* Terminal header */}
+
+
+
+
+ TERMINAL
+
+ {jobs.length > 0 && (
+
+ {jobs.length}
+
+ )}
+
+
+ {jobs.length > 0 && (
+
+
+
+ )}
+
+
+
+
+
+
+ {/* Job tabs */}
+ {jobs.length > 1 && (
+
+ {jobs.map((job) => (
+ setActiveJob(job.id)}
+ style={{
+ padding: "6px 16px",
+ backgroundColor:
+ job.id === activeJobId ? "#1e1e1e" : "transparent",
+ border: "none",
+ borderBottom:
+ job.id === activeJobId
+ ? "2px solid #0e639c"
+ : "2px solid transparent",
+ color: job.isRunning ? "#cccccc" : "#858585",
+ fontSize: "12px",
+ cursor: "pointer",
+ display: "flex",
+ alignItems: "center",
+ gap: "6px",
+ whiteSpace: "nowrap",
+ }}
+ >
+
+ {job.scriptPath.split("/").pop()}
+
+ ))}
+
+ )}
+
+ {/* Terminal output */}
+
+ {activeJob ? (
+ <>
+ {/* Command header */}
+
+ $
+
+ {activeJob.command.join(" ")}
+
+
+
+ {/* Stdin if provided */}
+ {activeJob.stdin && (
+
+
stdin:
+
+ {activeJob.stdin}
+
+
+ )}
+
+ {/* Stdout */}
+ {activeJob.stdout && (
+
+ {activeJob.stdout}
+
+ )}
+
+ {/* Stderr */}
+ {activeJob.stderr && (
+
+ {activeJob.stderr}
+
+ )}
+
+ {/* Status */}
+ {activeJob.isRunning ? (
+
⏳ Running...
+ ) : activeJob.status !== null ? (
+
+ {activeJob.status === 0
+ ? "✓ Process exited with code 0"
+ : `✗ Process exited with code ${activeJob.status}`}
+
+ ) : null}
+ >
+ ) : (
+
+
+ No active jobs
+
+ )}
+
+
+ );
+};
diff --git a/frontend/src/modules/terminal/index.ts b/frontend/src/modules/terminal/index.ts
new file mode 100644
index 0000000..6639f65
--- /dev/null
+++ b/frontend/src/modules/terminal/index.ts
@@ -0,0 +1 @@
+export { TerminalOutput } from "./components/TerminalOutput";
diff --git a/frontend/src/modules/terminal/store/useTerminalStore.ts b/frontend/src/modules/terminal/store/useTerminalStore.ts
new file mode 100644
index 0000000..5f16e77
--- /dev/null
+++ b/frontend/src/modules/terminal/store/useTerminalStore.ts
@@ -0,0 +1,75 @@
+import { create } from "zustand";
+
+export interface TerminalJob {
+ id: number;
+ scriptPath: string;
+ command: string[];
+ status: number | null;
+ stdout: string;
+ stderr: string;
+ stdin: string;
+ isRunning: boolean;
+}
+
+interface TerminalState {
+ jobs: TerminalJob[];
+ isOpen: boolean;
+ activeJobId: number | null;
+
+ openTerminal: () => void;
+ closeTerminal: () => void;
+ addJob: (job: Omit) => void;
+ updateJob: (id: number, updates: Partial) => void;
+ setActiveJob: (id: number | null) => void;
+ clearJobs: () => void;
+ removeJob: (id: number) => void;
+}
+
+export const useTerminalStore = create((set) => ({
+ jobs: [],
+ isOpen: false,
+ activeJobId: null,
+
+ openTerminal: () => set({ isOpen: true }),
+
+ closeTerminal: () => set({ isOpen: false }),
+
+ addJob: (job) =>
+ set((state) => ({
+ jobs: [
+ ...state.jobs,
+ {
+ ...job,
+ status: null,
+ stdout: "",
+ stderr: "",
+ stdin: "",
+ isRunning: true,
+ },
+ ],
+ activeJobId: job.id,
+ })),
+
+ updateJob: (id, updates) =>
+ set((state) => ({
+ jobs: state.jobs.map((j) => (j.id === id ? { ...j, ...updates } : j)),
+ })),
+
+ setActiveJob: (id) => set({ activeJobId: id }),
+
+ clearJobs: () => set({ jobs: [], activeJobId: null }),
+
+ removeJob: (id) =>
+ set((state) => {
+ const newJobs = state.jobs.filter((j) => j.id !== id);
+ return {
+ jobs: newJobs,
+ activeJobId:
+ state.activeJobId === id
+ ? newJobs.length > 0
+ ? newJobs[newJobs.length - 1].id
+ : null
+ : state.activeJobId,
+ };
+ }),
+}));
diff --git a/frontend/src/pages/add-agents.page.tsx b/frontend/src/pages/add-agents.page.tsx
index a56fffa..0eee91c 100644
--- a/frontend/src/pages/add-agents.page.tsx
+++ b/frontend/src/pages/add-agents.page.tsx
@@ -1,20 +1,24 @@
import React, { useState } from "react";
import { SSHAgentForm } from "../modules/agent/ui/SSHAgentForm";
-import { FiPlusCircle, FiSend } from "react-icons/fi";
-
-interface SSHAgentConfig {
- user: string;
- ip: string;
- authMethod: string;
- sshKey?: string;
- password?: string;
- extraFields: { key: string; value: string }[];
- deployType: string;
-}
+import { agentApiService } from "../modules/agent/api/agent.api.service";
+import type { SSHAgentConfig } from "../modules/agent/ui/SSHAgentForm";
+import type {
+ DeployAgentsRequest,
+ DeployResult,
+} from "../modules/agent/types/agent.types";
+import {
+ FiPlusCircle,
+ FiSend,
+ FiCheck,
+ FiX,
+ FiAlertCircle,
+} from "react-icons/fi";
const createEmptyAgentConfig = (): SSHAgentConfig => ({
+ agentLabel: "",
user: "",
ip: "",
+ port: 22,
authMethod: "key",
sshKey: "",
password: "",
@@ -50,7 +54,9 @@ export const AddAgentsPage: React.FC = () => {
// Валидация
const isValid = agents.every((agent) => {
- if (!agent.user || !agent.ip) return false;
+ if (!agent.agentLabel || !agent.user || !agent.ip || !agent.port)
+ return false;
+ if (agent.port < 1 || agent.port > 65535) return false;
if (agent.authMethod === "key" && !agent.sshKey) return false;
if (agent.authMethod === "password" && !agent.password) return false;
return true;
@@ -66,18 +72,53 @@ export const AddAgentsPage: React.FC = () => {
setSubmitError(null);
try {
- // TODO: Реальный API вызов для развертывания агентов
- console.log("Deploying agents:", agents);
+ // Преобразуем данные из формы в формат API
+ const deployData: DeployAgentsRequest = {
+ servers: agents.map((agent) => ({
+ agentLabel: agent.agentLabel,
+ ip: agent.ip,
+ user: agent.user,
+ port: agent.port,
+ authMethod: agent.authMethod as "key" | "password",
+ deployType: (agent.deployType === "deploy"
+ ? "docker"
+ : agent.deployType) as "docker" | "binary",
+ ...(agent.authMethod === "key"
+ ? { sshKey: agent.sshKey }
+ : { password: agent.password }),
+ })),
+ };
- // Имитация задержки API
- await new Promise((resolve) => setTimeout(resolve, 1500));
+ // Вызываем API для развертывания агентов
+ const response = await agentApiService.deployAgents(deployData);
- setSubmitMessage(
- `Успешно отправлено ${agents.length} сервер(ов) на развертывание`,
- );
- setAgents([createEmptyAgentConfig()]);
+ // Формируем сообщение о результатах
+ const successCount = response.results.filter(
+ (r: DeployResult) => r.success,
+ ).length;
+ const failCount = response.results.length - successCount;
+
+ if (failCount === 0) {
+ setSubmitMessage(
+ `Успешно развернуто ${successCount} агент(ов) на ${agents.length} сервер(ах)`,
+ );
+ setAgents([createEmptyAgentConfig()]);
+ } else {
+ const errorMsg = response.results
+ .filter((r: DeployResult) => !r.success)
+ .map(
+ (r: DeployResult) => `${r.ip}: ${r.error || "Неизвестная ошибка"}`,
+ )
+ .join("\n");
+ setSubmitMessage(`Успешно: ${successCount}, Ошибки: ${failCount}`);
+ setSubmitError(`Ошибки при развертывании:\n${errorMsg}`);
+ }
} catch (error) {
- setSubmitError("Ошибка при развертывании на серверах");
+ setSubmitError(
+ error instanceof Error
+ ? error.message
+ : "Ошибка при развертывании агентов",
+ );
} finally {
setIsSubmitting(false);
}
@@ -162,20 +203,26 @@ export const AddAgentsPage: React.FC = () => {
color: "var(--success-text)",
}}
>
- {submitMessage}
+
+
+ {submitMessage}
+
)}
{submitError && (
- {submitError}
+
+
+ {submitError}
+
)}
diff --git a/frontend/src/pages/admin.page.tsx b/frontend/src/pages/admin.page.tsx
new file mode 100644
index 0000000..600ce98
--- /dev/null
+++ b/frontend/src/pages/admin.page.tsx
@@ -0,0 +1,5 @@
+import { AdminPanel } from "@/modules/admin";
+
+export const AdminPage = () => {
+ return ;
+};
diff --git a/frontend/src/pages/agent-dashboard.page.tsx b/frontend/src/pages/agent-dashboard.page.tsx
new file mode 100644
index 0000000..f7e4019
--- /dev/null
+++ b/frontend/src/pages/agent-dashboard.page.tsx
@@ -0,0 +1,398 @@
+import { useEffect, useMemo, useState } from "react";
+import { useParams, useNavigate } from "react-router-dom";
+import {
+ ResponsiveContainer,
+ BarChart,
+ Bar,
+ XAxis,
+ YAxis,
+ CartesianGrid,
+ Tooltip,
+} from "recharts";
+import {
+ startMetricsPolling,
+ stopMetricsPolling,
+} from "@/app/providers/layout/store/metrics.store";
+import { useMetricsStore } from "@/app/providers/layout/store/metrics.store";
+import { FiArrowLeft, FiCpu, FiHardDrive } from "react-icons/fi";
+import { FaMemory, FaNetworkWired } from "react-icons/fa";
+
+const formatBytes = (bytes: number): string => {
+ if (bytes === 0) return "0 B";
+ const k = 1024;
+ const sizes = ["B", "KB", "MB", "GB", "TB"];
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i];
+};
+
+interface MetricsSnapshot {
+ timestamp: string;
+ metrics: Record;
+}
+
+interface SystemMetrics {
+ connected_at: string;
+ cpu_percent: number;
+ disk_percent: number;
+ id: string;
+ label: string;
+ memory_percent: number;
+ network_rx_bytes: number;
+ network_tx_bytes: number;
+}
+
+export const AgentDashboardPage = () => {
+ const { agentLabel } = useParams<{ agentLabel: string }>();
+ const navigate = useNavigate();
+ const { metrics, lastUpdated } = useMetricsStore();
+ const [history, setHistory] = useState([]);
+
+ useEffect(() => {
+ startMetricsPolling();
+ return () => stopMetricsPolling();
+ }, []);
+
+ const agentMetric = useMemo(
+ () => metrics.find((m) => m.label === agentLabel),
+ [metrics, agentLabel],
+ );
+
+ useEffect(() => {
+ if (metrics.length > 0) {
+ const now = new Date().toLocaleTimeString("ru-RU", {
+ hour: "2-digit",
+ minute: "2-digit",
+ });
+ const map: Record = {};
+ metrics.forEach((m) => {
+ map[m.label] = m;
+ });
+ setHistory((prev) =>
+ [...prev, { timestamp: now, metrics: map }].slice(-60),
+ );
+ }
+ }, [metrics]);
+
+ const historyData = useMemo(() => {
+ return history
+ .map((s) => {
+ const m = s.metrics[agentLabel || ""];
+ return m
+ ? [
+ { timestamp: s.timestamp, value: m.cpu_percent, metric: "CPU" },
+ {
+ timestamp: s.timestamp,
+ value: m.memory_percent,
+ metric: "RAM",
+ },
+ { timestamp: s.timestamp, value: m.disk_percent, metric: "Disk" },
+ ]
+ : [];
+ })
+ .flat();
+ }, [history, agentLabel]);
+
+ const cpuHistory = useMemo(
+ () => historyData.filter((d) => d.metric === "CPU"),
+ [historyData],
+ );
+ const ramHistory = useMemo(
+ () => historyData.filter((d) => d.metric === "RAM"),
+ [historyData],
+ );
+ const diskHistory = useMemo(
+ () => historyData.filter((d) => d.metric === "Disk"),
+ [historyData],
+ );
+
+ const displayMetric = agentMetric;
+
+ if (!displayMetric) {
+ return (
+
+
+
+ Метрики для агента "{agentLabel}" не найдены
+
+
+
+ );
+ }
+
+ return (
+
+ {/* Header */}
+
+
navigate("/dashboard")}
+ style={{
+ background: "transparent",
+ border: "1px solid var(--border)",
+ color: "var(--text-primary)",
+ padding: "6px 10px",
+ borderRadius: "4px",
+ cursor: "pointer",
+ display: "flex",
+ alignItems: "center",
+ gap: "4px",
+ }}
+ >
+
+ Назад
+
+
+
+ {displayMetric.label}
+
+
+ {lastUpdated && (
+
+ Обновлено {new Date(lastUpdated).toLocaleTimeString()}
+
+ )}
+
+
+
+
+ {/* Metric cards */}
+
+
+
+
+
+ CPU
+
+
+
+ {displayMetric.cpu_percent.toFixed(1)}%
+
+
+
+
+
+
+
+ RAM
+
+
+
+ {displayMetric.memory_percent.toFixed(1)}%
+
+
+
+
+
+
+
+ Disk
+
+
+
+ {displayMetric.disk_percent.toFixed(1)}%
+
+
+
+
+
+
+
+ Network
+
+
+
+ ↓ {formatBytes(displayMetric.network_rx_bytes)}
+
+
+ ↑ {formatBytes(displayMetric.network_tx_bytes)}
+
+
+
+
+ {/* Charts */}
+
+ {/* CPU History */}
+
+
+ CPU Usage History (%)
+
+
+
+
+
+
+
+ `${v.toFixed(0)}%`,
+ }}
+ />
+
+
+
+
+ {/* RAM History */}
+
+
+ Memory Usage History (%)
+
+
+
+
+
+
+
+ `${v.toFixed(0)}%`,
+ }}
+ />
+
+
+
+
+
+ );
+};
diff --git a/frontend/src/pages/dashboard.page.tsx b/frontend/src/pages/dashboard.page.tsx
new file mode 100644
index 0000000..0141041
--- /dev/null
+++ b/frontend/src/pages/dashboard.page.tsx
@@ -0,0 +1,197 @@
+import { DashboardChart } from "@/modules/dashboard/components/dashboard.chart";
+import {
+ ResponsiveContainer,
+ PieChart,
+ Pie,
+ Cell,
+ Tooltip,
+ Legend,
+} from "recharts";
+
+const generateTimeData = (count: number, base: number, variance: number) => {
+ const data = [];
+ const now = new Date();
+ for (let i = count - 1; i >= 0; i--) {
+ const time = new Date(now.getTime() - i * 60000);
+ const h = time.getHours().toString().padStart(2, "0");
+ const m = time.getMinutes().toString().padStart(2, "0");
+ data.push({
+ timestamp: `${h}:${m}`,
+ value: Math.round(
+ base + Math.sin(i / 3) * variance + Math.random() * variance * 0.5,
+ ),
+ });
+ }
+ return data;
+};
+
+const cpuData = generateTimeData(20, 45, 25).map((d, i) => ({
+ timestamp: d.timestamp,
+ "Использование %": d.value,
+}));
+
+const ramData = generateTimeData(20, 60, 15).map((d) => ({
+ timestamp: d.timestamp,
+ "Использовано ГБ": d.value / 10,
+ "Свободно ГБ": 16 - d.value / 10,
+}));
+
+const diskData = generateTimeData(20, 70, 5).map((d) => ({
+ timestamp: d.timestamp,
+ "Занято ГБ": d.value,
+}));
+
+const networkData = generateTimeData(20, 50, 30).map((d) => ({
+ timestamp: d.timestamp,
+ "Входящий Мбит/с": d.value,
+ "Исходящий Мбит/с": Math.round(d.value * 0.4),
+}));
+
+const metricData = [
+ { name: "INFO", value: 125 },
+ { name: "WARN", value: 42 },
+ { name: "ERROR", value: 18 },
+ { name: "CRITICAL", value: 5 },
+];
+
+export const DashboardPage = () => {
+ return (
+
+
+ Мониторинг системы
+
+
+
+ {/* Центр: Метрика логов — круговая диаграмма */}
+
+
+
+ Метрики логов
+
+
+
+
+
+ {metricData.map((entry, index) => (
+ |
+ ))}
+
+
+
+
+
+
+
+
+
+ {/* Верхний ряд: CPU + RAM */}
+
+
+
+
+
+
+ {/* Нижний ряд: Диск + Сеть */}
+
+
+
+
+
+
+
+ );
+};
diff --git a/frontend/src/pages/graphs.page.tsx b/frontend/src/pages/graphs.page.tsx
new file mode 100644
index 0000000..59c7320
--- /dev/null
+++ b/frontend/src/pages/graphs.page.tsx
@@ -0,0 +1,150 @@
+import { useState, useEffect, useMemo } from "react";
+import {
+ Graph,
+ type GraphData,
+ type GraphNode,
+ type GraphLink,
+} from "@/modules/graph";
+import { agentApiService } from "@/modules/agent/api/agent.api.service";
+import { FaSpinner } from "react-icons/fa";
+
+import { useAgentStore } from "@/app/providers/layout/store/agent.store";
+
+const buildGraphFromApi = (apiData: any, agents: any[]): GraphData => {
+ const nodes: GraphNode[] = [];
+ const links: GraphLink[] = [];
+
+ // Build a map of service statuses from agents
+ const serviceStatusMap = new Map();
+ agents.forEach((agent) => {
+ const services = agent.services || [];
+ services.forEach((svc: string) => {
+ // Parse "serviceName:up" or "serviceName:down"
+ const parts = svc.split(":");
+ const svcName = parts[0];
+ const status = parts[1] === "down" ? "down" : "up";
+ serviceStatusMap.set(`${agent.label}-${svcName}`, status);
+ });
+ });
+
+ if (!apiData?.nodes) return { nodes, links };
+
+ Object.entries(apiData.nodes).forEach(
+ ([agentLabel, agentNode]: [string, any]) => {
+ // Агент как узел
+ nodes.push({
+ id: agentLabel,
+ name: agentLabel,
+ type: "agent",
+ val: 8,
+ description: `Агент: ${agentLabel}`,
+ });
+
+ // Сервисы агента
+ const services = agentNode?.services || {};
+ Object.entries(services).forEach(
+ ([serviceName, serviceNode]: [string, any]) => {
+ const serviceId = `${agentLabel}-${serviceName}`;
+ const status = serviceStatusMap.get(serviceId) || "up";
+
+ nodes.push({
+ id: serviceId,
+ name: serviceName,
+ type: "service",
+ val: 12,
+ description: `Сервис: ${serviceName}`,
+ status,
+ });
+
+ // Связь агент → сервис
+ links.push({
+ source: agentLabel,
+ target: serviceId,
+ type: "hosts",
+ });
+
+ // Зависимости между сервисами
+ const dependencies = serviceNode?.dependencies || [];
+ dependencies.forEach((dep: any) => {
+ const targetServiceName = dep?.target?.name;
+ if (targetServiceName) {
+ const targetServiceId = `${agentLabel}-${targetServiceName}`;
+ links.push({
+ source: serviceId,
+ target: targetServiceId,
+ type: dep.condition || "dependency",
+ });
+ }
+ });
+ },
+ );
+ },
+ );
+
+ return { nodes, links };
+};
+
+export const GraphsPage = () => {
+ const agents = useAgentStore((s) => s.agents);
+ const [graphData, setGraphData] = useState({
+ nodes: [],
+ links: [],
+ });
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ const fetchGraph = async () => {
+ setLoading(true);
+ setError(null);
+ try {
+ const apiData = await agentApiService.getGraph();
+ const data = buildGraphFromApi(apiData, agents);
+ setGraphData(data);
+ } catch (e) {
+ console.error("Failed to fetch graph:", e);
+ setError(e instanceof Error ? e.message : "Failed to load graph");
+ setGraphData({ nodes: [], links: [] });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchGraph();
+ const interval = setInterval(fetchGraph, 30000);
+ return () => clearInterval(interval);
+ }, [agents]);
+
+ if (loading) {
+ return (
+
+ );
+ }
+
+ if (error && graphData.nodes.length === 0) {
+ return (
+
+ );
+ }
+
+ return (
+
+
+
+ );
+};
diff --git a/frontend/src/pages/ide.page.tsx b/frontend/src/pages/ide.page.tsx
new file mode 100644
index 0000000..a5fe8ef
--- /dev/null
+++ b/frontend/src/pages/ide.page.tsx
@@ -0,0 +1,18 @@
+import { useLocation, useNavigate } from "react-router-dom";
+import { IDE } from "../modules/ide";
+import type { FileNode } from "../modules/ide";
+
+export const IDEPage = () => {
+ const navigate = useNavigate();
+ const location = useLocation();
+ const files: FileNode | undefined = location.state?.files;
+
+ return (
+
+ navigate("/templates")} initialFiles={files} />
+
+ );
+};
diff --git a/frontend/src/pages/logs.page.tsx b/frontend/src/pages/logs.page.tsx
new file mode 100644
index 0000000..80dc89b
--- /dev/null
+++ b/frontend/src/pages/logs.page.tsx
@@ -0,0 +1,422 @@
+import React, { useState, useEffect, useCallback } from "react";
+import { agentApiService } from "@/modules/agent";
+import type { LogEntry } from "@/modules/agent";
+import { LogFilters } from "@/modules/agent/ui/LogFilters";
+import { useLogFilterStore } from "@/modules/agent/store/logFilter.store";
+import {
+ FiFileText,
+ FiRefreshCw,
+ FiChevronLeft,
+ FiChevronRight,
+ FiInfo,
+ FiAlertTriangle,
+ FiAlertCircle,
+ FiXOctagon,
+} from "react-icons/fi";
+
+const logLevelIcons: Record = {
+ info: ,
+ warning: ,
+ error: ,
+ fatal: ,
+};
+
+const logLevelColors: Record<
+ string,
+ { bg: string; text: string; border: string }
+> = {
+ info: {
+ bg: "rgba(59, 130, 246, 0.1)",
+ text: "#3b82f6",
+ border: "rgba(59, 130, 246, 0.3)",
+ },
+ warning: {
+ bg: "rgba(245, 158, 11, 0.1)",
+ text: "#f59e0b",
+ border: "rgba(245, 158, 11, 0.3)",
+ },
+ error: {
+ bg: "var(--error-bg)",
+ text: "var(--error-text)",
+ border: "var(--error-border)",
+ },
+ fatal: {
+ bg: "rgba(168, 85, 247, 0.1)",
+ text: "#a855f7",
+ border: "rgba(168, 85, 247, 0.3)",
+ },
+};
+
+export const LogsPage: React.FC = () => {
+ const [logs, setLogs] = useState([]);
+ const [isLoading, setIsLoading] = useState(false);
+ const [error, setError] = useState(null);
+ const [availableServices, setAvailableServices] = useState([]);
+ const [availableAgents, setAvailableAgents] = useState([]);
+ const [totalLogs, setTotalLogs] = useState(0);
+
+ const { getFilters, limit, offset, setOffset } = useLogFilterStore();
+
+ const fetchLogs = useCallback(async () => {
+ setIsLoading(true);
+ setError(null);
+ try {
+ const filters = getFilters();
+ const data = await agentApiService.searchLogs(filters);
+ if (!Array.isArray(data)) {
+ console.error("[Logs] Expected array, got:", typeof data);
+ setLogs([]);
+ setTotalLogs(0);
+ return;
+ }
+ setLogs(data);
+ setTotalLogs(data.length);
+ } catch (err) {
+ setError(
+ err instanceof Error ? err.message : "Ошибка при загрузке логов",
+ );
+ setLogs([]);
+ setTotalLogs(0);
+ } finally {
+ setIsLoading(false);
+ }
+ }, [getFilters]);
+
+ const fetchDistinctData = useCallback(async () => {
+ try {
+ const [servicesResult, agentsResult] = await Promise.allSettled([
+ agentApiService.getDistinctServices(),
+ agentApiService.getDistinctAgents(),
+ ]);
+
+ if (
+ servicesResult.status === "fulfilled" &&
+ Array.isArray(servicesResult.value)
+ ) {
+ setAvailableServices(servicesResult.value);
+ } else {
+ console.error(
+ "[Logs] Failed to fetch services:",
+ servicesResult.status === "rejected"
+ ? servicesResult.reason
+ : "non-array response",
+ );
+ setAvailableServices([]);
+ }
+
+ if (
+ agentsResult.status === "fulfilled" &&
+ Array.isArray(agentsResult.value)
+ ) {
+ setAvailableAgents(agentsResult.value);
+ } else {
+ console.error(
+ "[Logs] Failed to fetch agents:",
+ agentsResult.status === "rejected"
+ ? agentsResult.reason
+ : "non-array response",
+ );
+ setAvailableAgents([]);
+ }
+ } catch (err) {
+ console.error("[Logs] Failed to fetch distinct data:", err);
+ setAvailableServices([]);
+ setAvailableAgents([]);
+ }
+ }, []);
+
+ useEffect(() => {
+ fetchDistinctData();
+ }, [fetchDistinctData]);
+
+ useEffect(() => {
+ fetchLogs();
+ }, [fetchLogs, offset, limit]);
+
+ const handleFilterApply = () => {
+ setOffset(0);
+ fetchLogs();
+ };
+
+ const handleNextPage = () => {
+ setOffset(offset + limit);
+ };
+
+ const handlePrevPage = () => {
+ setOffset(Math.max(0, offset - limit));
+ };
+
+ const formatTimestamp = (timestamp: string | undefined | null) => {
+ if (!timestamp) return "—";
+ const date = new Date(timestamp);
+ if (isNaN(date.getTime())) return "—";
+ return date.toLocaleString("ru-RU", {
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: "2-digit",
+ minute: "2-digit",
+ second: "2-digit",
+ });
+ };
+
+ return (
+
+
+ {/* Header */}
+
+
+
+
+
+
+
+ Поиск логов
+
+
+ Фильтрация и анализ логов системы
+
+
+
+
+
+ {/* Filters */}
+
+
+
+
+ {/* Error Message */}
+ {error && (
+
+ {error}
+
+ )}
+
+ {/* Logs Table */}
+
+ {/* Table Header */}
+
+
+ Найдено: {totalLogs} записей
+
+
+
+ Обновить
+
+
+
+ {isLoading ? (
+
+
+ Загрузка логов...
+
+ ) : logs.length === 0 ? (
+
+ Логи не найдены
+
+ ) : (
+ <>
+
+
+
+
+
+ Время
+
+
+ Уровень
+
+
+ Сервис
+
+
+ Агент
+
+
+ Сообщение
+
+
+
+
+ {logs.map((log, index) => {
+ const level = log.Level?.toLowerCase() || "info";
+ const colors =
+ logLevelColors[level] || logLevelColors.info;
+ return (
+ {
+ e.currentTarget.style.backgroundColor =
+ "var(--border)";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor =
+ index % 2 === 0
+ ? "var(--card-bg)"
+ : "var(--bg-secondary)";
+ }}
+ >
+
+ {formatTimestamp(log.Timestamp)}
+
+
+
+ {logLevelIcons[level]}
+ {level}
+
+
+
+ {log.Service || "—"}
+
+
+ {log.Agent || "—"}
+
+
+ {log.Message || "—"}
+
+
+ );
+ })}
+
+
+
+
+ {/* Pagination */}
+
+
+
+ Назад
+
+
+ Показано {logs.length} записей (смещение: {offset})
+
+
+ Далее
+
+
+
+ >
+ )}
+
+
+
+ );
+};
diff --git a/frontend/src/pages/register.page.tsx b/frontend/src/pages/register.page.tsx
index 98d8843..7406899 100644
--- a/frontend/src/pages/register.page.tsx
+++ b/frontend/src/pages/register.page.tsx
@@ -5,7 +5,7 @@ import { useAuthStore } from "@/modules/auth/store/useAuthStore";
export const RegisterPage: React.FC = () => {
const navigate = useNavigate();
- const { register, isLoading, error, clearError, token } = useAuthStore();
+ const { register, isLoading, error, clearError } = useAuthStore();
const [formData, setFormData] = useState({
login: "",
password: "",
@@ -14,12 +14,7 @@ export const RegisterPage: React.FC = () => {
lastName: "",
});
const [passwordError, setPasswordError] = useState(null);
-
- useEffect(() => {
- if (token) {
- navigate("/");
- }
- }, [token, navigate]);
+ const [successMessage, setSuccessMessage] = useState(null);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
@@ -38,7 +33,17 @@ export const RegisterPage: React.FC = () => {
firstName: formData.firstName,
lastName: formData.lastName,
});
- navigate("/");
+ setSuccessMessage("Аккаунт успешно создан! Теперь вы можете войти.");
+ setFormData({
+ login: "",
+ password: "",
+ confirmPassword: "",
+ firstName: "",
+ lastName: "",
+ });
+ setTimeout(() => {
+ navigate("/auth");
+ }, 2000);
} catch (err) {
// Error is handled by store
}
@@ -82,7 +87,10 @@ export const RegisterPage: React.FC = () => {
className="w-16 h-16 mx-auto mb-4 rounded-full flex items-center justify-center"
style={{ backgroundColor: "var(--bg-secondary)" }}
>
-
+
{
)}
+ {/* Success Message */}
+ {successMessage && (
+
+ {successMessage}
+
+ )}
+
{/* Form */}
@@ -311,7 +341,8 @@ export const RegisterPage: React.FC = () => {
}}
onMouseEnter={(e) => {
if (!isLoading) {
- e.currentTarget.style.backgroundColor = "var(--button-primary-hover)";
+ e.currentTarget.style.backgroundColor =
+ "var(--button-primary-hover)";
}
}}
onMouseLeave={(e) => {
diff --git a/frontend/src/pages/registration.page.tsx b/frontend/src/pages/registration.page.tsx
new file mode 100644
index 0000000..ecf464a
--- /dev/null
+++ b/frontend/src/pages/registration.page.tsx
@@ -0,0 +1,423 @@
+import React, { useState } from "react";
+import { agentApiService } from "@/modules/agent/api/agent.api.service";
+import { FiKey, FiPlus, FiTrash2, FiCopy, FiCheck, FiX } from "react-icons/fi";
+
+interface RegistrationTokenForm {
+ label: string;
+}
+
+interface RegistrationResult {
+ label: string;
+ token: string;
+}
+
+export const RegistrationTokenPage: React.FC = () => {
+ const [tokens, setTokens] = useState([
+ { label: "" },
+ ]);
+ const [results, setResults] = useState([]);
+ const [isSubmitting, setIsSubmitting] = useState(false);
+ const [error, setError] = useState(null);
+ const [successMessage, setSuccessMessage] = useState(null);
+ const [copiedIndex, setCopiedIndex] = useState(null);
+
+ const handleTokenChange = (index: number, label: string) => {
+ const newTokens = [...tokens];
+ newTokens[index] = { label };
+ setTokens(newTokens);
+ };
+
+ const handleAddToken = () => {
+ setTokens([...tokens, { label: "" }]);
+ };
+
+ const handleRemoveToken = (index: number) => {
+ const newTokens = tokens.filter((_, i) => i !== index);
+ setTokens(newTokens);
+ };
+
+ const handleCopyToken = async (token: string, index: number) => {
+ await navigator.clipboard.writeText(token);
+ setCopiedIndex(index);
+ setTimeout(() => setCopiedIndex(null), 2000);
+ };
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ // Валидация
+ const validTokens = tokens.filter((t) => t.label.trim());
+ if (validTokens.length === 0) {
+ setError("Введите хотя бы одну метку для токена");
+ return;
+ }
+
+ setIsSubmitting(true);
+ setError(null);
+ setSuccessMessage(null);
+ setResults([]);
+
+ try {
+ const createdTokens: RegistrationResult[] = [];
+
+ for (const tokenData of validTokens) {
+ const response = await agentApiService.createRegistrationToken({
+ label: tokenData.label,
+ });
+
+ // API возвращает объект с токеном
+ const token = response.token || Object.values(response)[0] as string;
+
+ createdTokens.push({
+ label: tokenData.label,
+ token,
+ });
+ }
+
+ setResults(createdTokens);
+ setSuccessMessage(
+ `Успешно создано ${createdTokens.length} токен(ов)`
+ );
+ setTokens([{ label: "" }]);
+ } catch (err) {
+ setError(
+ err instanceof Error
+ ? err.message
+ : "Ошибка при создании токенов"
+ );
+ } finally {
+ setIsSubmitting(false);
+ }
+ };
+
+ const inputStyle: React.CSSProperties = {
+ width: "100%",
+ padding: "10px 12px",
+ border: "1px solid var(--border)",
+ borderRadius: "8px",
+ backgroundColor: "var(--input-bg)",
+ color: "var(--text-primary)",
+ fontSize: "14px",
+ transition: "border-color 0.2s, box-shadow 0.2s",
+ };
+
+ const labelStyle: React.CSSProperties = {
+ display: "block",
+ marginBottom: "8px",
+ color: "var(--text-secondary)",
+ fontSize: "14px",
+ fontWeight: 500,
+ };
+
+ return (
+
+
+ {/* Header */}
+
+
+
+
+
+
+
+ Регистрация токенов для агентов
+
+
+ Создайте токены для регистрации новых агентов
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/frontend/src/pages/templates.page.tsx b/frontend/src/pages/templates.page.tsx
new file mode 100644
index 0000000..69a8fa3
--- /dev/null
+++ b/frontend/src/pages/templates.page.tsx
@@ -0,0 +1,230 @@
+import { useState, useEffect } from "react";
+import { useNavigate } from "react-router-dom";
+import { FiEdit3 } from "react-icons/fi";
+import { MdAdd } from "react-icons/md";
+import { FaSpinner } from "react-icons/fa";
+import { FilePicker } from "../modules/ide";
+import { RunScriptModal } from "../modules/ide/components/RunScriptModal";
+import { AddInterpreterModal } from "../modules/ide/components/AddInterpreterModal";
+import type { FileNode } from "../modules/ide";
+import { scriptsApi } from "../modules/ide/api/scripts.api";
+import { useAuthStore } from "@/modules/auth/store/useAuthStore";
+
+const convertTreeToFileNode = (data: any[]): FileNode => {
+ const convertItem = (item: any): FileNode => {
+ const node: FileNode = {
+ id: item.id,
+ name: item.name,
+ type: item.type === "folder" ? "folder" : "file",
+ content: item.content || "",
+ path: item.name,
+ interpreter_id: item.interpreter_id,
+ };
+
+ if (item.type === "folder") {
+ node.children = [];
+ if (item.children && Array.isArray(item.children)) {
+ node.children = item.children.map((child: any) => {
+ const childNode = convertItem(child);
+ childNode.path = `${item.name}/${child.name}`;
+ return childNode;
+ });
+ }
+ }
+
+ return node;
+ };
+
+ return {
+ name: "templates",
+ type: "folder",
+ children: data.map((item) => convertItem(item)),
+ };
+};
+
+export const TemplatesPage = () => {
+ const navigate = useNavigate();
+ const { user } = useAuthStore();
+ const canManageAgent = user?.permission_manage_agent;
+ const [files, setFiles] = useState(null);
+ const [loading, setLoading] = useState(true);
+ const [runModal, setRunModal] = useState<{
+ scriptPath: string;
+ scriptId: number;
+ } | null>(null);
+ const [showAddInterpreter, setShowAddInterpreter] = useState(false);
+
+ const reloadTree = () => {
+ setLoading(true);
+ scriptsApi
+ .getTree()
+ .then((data) => {
+ setFiles(convertTreeToFileNode(data));
+ })
+ .catch((e) => {
+ console.error("Failed to load tree:", e);
+ setFiles({ name: "templates", type: "folder", children: [] });
+ })
+ .finally(() => setLoading(false));
+ };
+
+ useEffect(() => {
+ reloadTree();
+ }, []);
+
+ const handleRun = (path: string, id?: number) => {
+ if (!id) {
+ console.warn("Script ID not found for:", path);
+ return;
+ }
+ setRunModal({ scriptPath: path, scriptId: id });
+ };
+
+ return (
+
+ {/* Header bar */}
+
+ {/* Add Interpreter button */}
+ setShowAddInterpreter(true)}
+ style={{
+ display: "flex",
+ alignItems: "center",
+ gap: "6px",
+ padding: "6px 14px",
+ backgroundColor: "#238636",
+ border: "none",
+ borderRadius: "4px",
+ color: "#ffffff",
+ cursor: "pointer",
+ fontSize: "12px",
+ fontWeight: 500,
+ transition: "all 0.15s",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "#2ea043";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "#238636";
+ }}
+ >
+
+ Add Interpreter
+
+
+ {/* Open in Editor button — только с правом manage_agent */}
+ {canManageAgent && (
+ navigate("/ide")}
+ style={{
+ display: "flex",
+ alignItems: "center",
+ gap: "8px",
+ padding: "6px 16px",
+ backgroundColor: "#0e639c",
+ border: "none",
+ borderRadius: "4px",
+ color: "#ffffff",
+ cursor: "pointer",
+ fontSize: "12px",
+ fontWeight: 500,
+ transition: "all 0.15s",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "#1177bb";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "#0e639c";
+ }}
+ >
+
+ Open Editor
+
+ )}
+
+
+ {/* File Picker (terminal встроен внутрь) */}
+
+ {loading ? (
+
+
+
+ ) : files ? (
+
{
+ // Находим ID скрипта по пути
+ const findNodeById = (
+ node: FileNode,
+ p: string,
+ ): FileNode | null => {
+ if (node.path === p) return node;
+ if (node.children) {
+ for (const child of node.children) {
+ const found = findNodeById(child, p);
+ if (found) return found;
+ }
+ }
+ return null;
+ };
+ const node = findNodeById(files, path);
+ if (node?.id) {
+ handleRun(path, node.id);
+ } else {
+ console.warn("Script ID not found for path:", path);
+ }
+ }}
+ />
+ ) : null}
+
+
+ {/* Run Script Modal */}
+ {runModal && (
+
setRunModal(null)}
+ />
+ )}
+
+ {/* Add Interpreter Modal */}
+ {showAddInterpreter && (
+ setShowAddInterpreter(false)}
+ onSuccess={reloadTree}
+ />
+ )}
+
+ );
+};
diff --git a/frontend/src/pages/test.page.tsx b/frontend/src/pages/test.page.tsx
new file mode 100644
index 0000000..8a34386
--- /dev/null
+++ b/frontend/src/pages/test.page.tsx
@@ -0,0 +1,1688 @@
+import React, { useState, useCallback, useRef, useEffect } from "react";
+import Editor from "@monaco-editor/react";
+import {
+ FiFile,
+ FiFolder,
+ FiEdit3,
+ FiTrash2,
+ FiChevronRight,
+ FiChevronDown,
+ FiSearch,
+ FiGitBranch,
+ FiCheckCircle,
+ FiMinus,
+ FiAlertCircle,
+} from "react-icons/fi";
+import { MdClose, MdAdd } from "react-icons/md";
+import { GoFile, GoTrash, GoKebabHorizontal } from "react-icons/go";
+
+/* eslint react-refresh/only-export-components: "off" */
+
+export interface FileNode {
+ name: string;
+ type: "file" | "folder";
+ content?: string;
+ children?: FileNode[];
+ path?: string;
+}
+
+export const initialFiles: FileNode = {
+ name: "my-project",
+ type: "folder",
+ children: [
+ {
+ name: "src",
+ type: "folder",
+ children: [
+ {
+ name: "main.py",
+ type: "file",
+ content:
+ 'print("Hello, World!")\n\ndef main():\n print("Welcome!")\n\nif __name__ == "__main__":\n main()',
+ },
+ {
+ name: "utils.py",
+ type: "file",
+ content: "def helper():\n return 42",
+ },
+ ],
+ },
+ {
+ name: "README.md",
+ type: "file",
+ content: "# My Project\n\nWelcome!",
+ },
+ ],
+};
+
+const addPaths = (node: FileNode, parentPath: string = ""): FileNode => {
+ const currentPath = parentPath ? `${parentPath}/${node.name}` : node.name;
+ const newNode = { ...node, path: currentPath };
+ if (newNode.children) {
+ newNode.children = newNode.children.map((child) =>
+ addPaths(child, currentPath),
+ );
+ }
+ return newNode;
+};
+
+const getAllFolderPaths = (node: FileNode): string[] => {
+ let paths: string[] = [];
+ if (node.type === "folder") {
+ paths.push(node.path || node.name);
+ if (node.children) {
+ node.children.forEach((child) => {
+ paths = [...paths, ...getAllFolderPaths(child)];
+ });
+ }
+ }
+ return paths;
+};
+
+const findNode = (node: FileNode, path: string): FileNode | null => {
+ if (node.path === path) return node;
+ if (node.children) {
+ for (const child of node.children) {
+ const found = findNode(child, path);
+ if (found) return found;
+ }
+ }
+ return null;
+};
+
+const deleteNode = (node: FileNode, path: string): FileNode | null => {
+ if (node.path === path) return null;
+
+ if (node.children) {
+ const filtered = node.children.filter((child) => child.path !== path);
+ const mapped = filtered
+ .map((child) => deleteNode(child, path))
+ .filter((child): child is FileNode => child !== null);
+ return { ...node, children: mapped };
+ }
+ return node;
+};
+
+const addNode = (
+ node: FileNode,
+ parentPath: string,
+ newNode: FileNode,
+): FileNode => {
+ if (node.path === parentPath) {
+ const newPath = addPaths(newNode, node.path);
+ return { ...node, children: [...(node.children || []), newPath] };
+ }
+ if (node.children) {
+ return {
+ ...node,
+ children: node.children.map((child) =>
+ addNode(child, parentPath, newNode),
+ ),
+ };
+ }
+ return node;
+};
+
+const renameNode = (
+ node: FileNode,
+ oldPath: string,
+ newName: string,
+): FileNode | null => {
+ if (node.path === oldPath) {
+ const pathParts = node.path?.split("/") || [];
+ pathParts[pathParts.length - 1] = newName;
+ const newPath = pathParts.join("/");
+ const renamedNode = { ...node, name: newName, path: newPath };
+
+ if (renamedNode.children) {
+ renamedNode.children = renamedNode.children.map((child) => {
+ const oldChildPath = child.path || "";
+ const newChildPath = oldChildPath.replace(oldPath, newPath);
+ return (
+ renameNode(
+ child,
+ oldChildPath,
+ newChildPath.split("/").pop() || "",
+ ) || child
+ );
+ });
+ }
+ return renamedNode;
+ }
+
+ if (node.children) {
+ return {
+ ...node,
+ children: node.children.map(
+ (child) => renameNode(child, oldPath, newName) || child,
+ ),
+ };
+ }
+ return node;
+};
+
+const ContextMenu: React.FC<{
+ x: number;
+ y: number;
+ node: FileNode | null;
+ onClose: () => void;
+ onNewFile: () => void;
+ onNewFolder: () => void;
+ onRename: () => void;
+ onDelete: () => void;
+}> = ({ x, y, node, onClose, onNewFile, onNewFolder, onRename, onDelete }) => {
+ useEffect(() => {
+ const handleClick = () => onClose();
+ document.addEventListener("click", handleClick);
+ return () => document.removeEventListener("click", handleClick);
+ }, [onClose]);
+
+ return (
+
+
+ New File
+
+
+ New Folder
+
+ {node && (
+ <>
+
+
+ Rename
+
+
+ Delete
+
+ >
+ )}
+
+ );
+};
+
+const MenuItem: React.FC<{
+ onClick: () => void;
+ danger?: boolean;
+ children: React.ReactNode;
+}> = ({ onClick, danger, children }) => (
+ {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+ {children}
+
+);
+
+const InputDialog: React.FC<{
+ title: string;
+ initialValue?: string;
+ onConfirm: (value: string) => void;
+ onCancel: () => void;
+}> = ({ title, initialValue = "", onConfirm, onCancel }) => {
+ const [value, setValue] = useState(initialValue);
+ const inputRef = useRef(null);
+
+ useEffect(() => {
+ inputRef.current?.focus();
+ inputRef.current?.select();
+ }, []);
+
+ return (
+
+
e.stopPropagation()}
+ >
+
+ {title}
+
+
+ Enter a new name
+
+
setValue(e.target.value)}
+ onKeyDown={(e) =>
+ e.key === "Enter" && value.trim() && onConfirm(value.trim())
+ }
+ style={{
+ width: "100%",
+ padding: "10px",
+ backgroundColor: "#3c3c3c",
+ border: "1px solid #3e3e42",
+ borderRadius: "6px",
+ color: "#ccc",
+ fontSize: "14px",
+ marginBottom: "20px",
+ outline: "none",
+ }}
+ />
+
+
+ Cancel
+
+ value.trim() && onConfirm(value.trim())}
+ style={{
+ padding: "6px 16px",
+ backgroundColor: "#0e639c",
+ border: "none",
+ borderRadius: "4px",
+ color: "#fff",
+ cursor: "pointer",
+ fontSize: "12px",
+ }}
+ >
+ OK
+
+
+
+
+ );
+};
+
+const filterTree = (node: FileNode, query: string): FileNode | null => {
+ if (!query) return node;
+ const lowerQuery = query.toLowerCase();
+
+ if (node.type === "file") {
+ if (node.name.toLowerCase().includes(lowerQuery)) return node;
+ return null;
+ }
+
+ if (node.children) {
+ const filteredChildren = node.children
+ .map((child) => filterTree(child, query))
+ .filter((child): child is FileNode => child !== null);
+
+ if (filteredChildren.length > 0) {
+ return { ...node, children: filteredChildren };
+ }
+ }
+
+ if (node.name.toLowerCase().includes(lowerQuery)) return node;
+ return null;
+};
+
+const collectPathsToExpand = (node: FileNode, query: string): Set => {
+ const paths = new Set();
+ if (!query) return paths;
+
+ const lowerQuery = query.toLowerCase();
+
+ const search = (n: FileNode, currentPath: string) => {
+ if (n.name.toLowerCase().includes(lowerQuery)) {
+ const pathParts = currentPath.split("/");
+ for (let i = 1; i < pathParts.length; i++) {
+ paths.add(pathParts.slice(0, i).join("/"));
+ }
+ }
+ if (n.children) {
+ n.children.forEach((child) => {
+ const childPath = child.path || `${currentPath}/${child.name}`;
+ search(child, childPath);
+ });
+ }
+ };
+
+ search(node, node.path || node.name);
+ return paths;
+};
+
+const FileTreeItem: React.FC<{
+ node: FileNode;
+ level: number;
+ onFileSelect: (node: FileNode) => void;
+ selectedFile: string | null;
+ onContextMenu: (e: React.MouseEvent, node: FileNode) => void;
+ expandedFolders: Set;
+ onToggleFolder: (path: string) => void;
+ onDelete: (node: FileNode) => void;
+ isRoot?: boolean;
+ searchQuery?: string;
+}> = ({
+ node,
+ level,
+ onFileSelect,
+ selectedFile,
+ onContextMenu,
+ expandedFolders,
+ onToggleFolder,
+ onDelete,
+ isRoot,
+ searchQuery,
+}) => {
+ const isFolder = node.type === "folder";
+ const isSelected = selectedFile === node.path && !isFolder;
+ const isExpanded = expandedFolders.has(node.path || node.name);
+ const [hovered, setHovered] = useState(false);
+
+ const handleClick = () => {
+ if (isFolder) {
+ onToggleFolder(node.path || node.name);
+ } else {
+ onFileSelect(node);
+ }
+ };
+
+ const handleDelete = (e: React.MouseEvent) => {
+ e.stopPropagation();
+ onDelete(node);
+ };
+
+ const highlightText = (text: string, query: string) => {
+ if (!query) return text;
+ const idx = text.toLowerCase().indexOf(query.toLowerCase());
+ if (idx === -1) return text;
+ return (
+ <>
+ {text.slice(0, idx)}
+
+ {text.slice(idx, idx + query.length)}
+
+ {text.slice(idx + query.length)}
+ >
+ );
+ };
+
+ return (
+
+
onContextMenu(e, node)}
+ onMouseEnter={() => setHovered(true)}
+ onMouseLeave={() => setHovered(false)}
+ style={{
+ paddingLeft: isRoot ? "8px" : `${level * 16 + 8}px`,
+ paddingTop: "4px",
+ paddingBottom: "4px",
+ cursor: "pointer",
+ display: "flex",
+ alignItems: "center",
+ gap: "6px",
+ backgroundColor: isSelected ? "#094771" : "transparent",
+ color: isSelected ? "#fff" : "#cccccc",
+ fontSize: "13px",
+ transition: "background-color 0.1s",
+ userSelect: "none",
+ minHeight: "28px",
+ }}
+ >
+
+ {isFolder ? (
+ isExpanded ? (
+
+ ) : (
+
+ )
+ ) : (
+
+ )}
+
+
+ {searchQuery ? highlightText(node.name, searchQuery) : node.name}
+
+ {hovered && !isRoot && (
+ {
+ e.currentTarget.style.color = "#f48771";
+ e.currentTarget.style.backgroundColor = "#3e3e42";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = "#858585";
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+
+
+ )}
+
+ {isFolder && isExpanded && node.children && (
+
+ {node.children.map((child, idx) => (
+
+ ))}
+
+ )}
+
+ );
+};
+
+const TabBar: React.FC<{
+ openFiles: FileNode[];
+ activeFile: FileNode | null;
+ onSelectFile: (file: FileNode) => void;
+ onCloseFile: (file: FileNode) => void;
+ onCloseAll: () => void;
+ onCloseOthers: (file: FileNode) => void;
+}> = ({
+ openFiles,
+ activeFile,
+ onSelectFile,
+ onCloseFile,
+ onCloseAll,
+ onCloseOthers,
+}) => {
+ const [showContextMenu, setShowContextMenu] = useState<{
+ x: number;
+ y: number;
+ file: FileNode;
+ } | null>(null);
+
+ const handleContextMenu = (e: React.MouseEvent, file: FileNode) => {
+ e.preventDefault();
+ setShowContextMenu({ x: e.clientX, y: e.clientY, file });
+ };
+
+ return (
+ <>
+
+
+ {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ title="Close All"
+ >
+
+ Close All
+
+
+ {openFiles.map((file) => (
+
onSelectFile(file)}
+ onContextMenu={(e) => handleContextMenu(e, file)}
+ style={{
+ display: "flex",
+ alignItems: "center",
+ padding: "8px 16px",
+ backgroundColor:
+ activeFile?.path === file.path ? "#1e1e1e" : "#2d2d30",
+ color: activeFile?.path === file.path ? "#fff" : "#cccccc",
+ borderRight: "1px solid #3e3e42",
+ cursor: "pointer",
+ fontSize: "13px",
+ gap: "10px",
+ whiteSpace: "nowrap",
+ transition: "all 0.1s",
+ borderTop:
+ activeFile?.path === file.path
+ ? "2px solid #0e639c"
+ : "2px solid transparent",
+ }}
+ >
+
+ {file.name}
+ {
+ e.stopPropagation();
+ onCloseFile(file);
+ }}
+ style={{
+ background: "none",
+ border: "none",
+ color: "#858585",
+ cursor: "pointer",
+ fontSize: "16px",
+ padding: "0 4px",
+ borderRadius: "4px",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.color = "#fff";
+ e.currentTarget.style.backgroundColor = "#3e3e42";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.color = "#858585";
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+
+
+
+ ))}
+
+ {showContextMenu && (
+
+
{
+ onCloseOthers(showContextMenu.file);
+ setShowContextMenu(null);
+ }}
+ style={{
+ padding: "8px 16px",
+ cursor: "pointer",
+ color: "#cccccc",
+ fontSize: "13px",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+ Close Others
+
+
{
+ onCloseAll();
+ setShowContextMenu(null);
+ }}
+ style={{
+ padding: "8px 16px",
+ cursor: "pointer",
+ color: "#cccccc",
+ fontSize: "13px",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ >
+ Close All
+
+
+ )}
+ >
+ );
+};
+
+const TitleBar: React.FC = () => {
+ return (
+
+ );
+};
+
+const FileExplorer: React.FC<{
+ files: FileNode;
+ onFileSelect: (node: FileNode) => void;
+ selectedFile: string | null;
+ onRefresh: (newFiles: FileNode | null, newFile?: FileNode) => void;
+ expandedFolders: Set;
+ onToggleFolder: (path: string) => void;
+ onExpandAll: () => void;
+ onCollapseAll: () => void;
+ onDeleteRoot: () => void;
+ searchQuery: string;
+ onSearchChange: (query: string) => void;
+ onAutoExpand: (paths: Set) => void;
+}> = ({
+ files,
+ onFileSelect,
+ selectedFile,
+ onRefresh,
+ expandedFolders,
+ onToggleFolder,
+ onExpandAll,
+ onCollapseAll,
+ onDeleteRoot,
+ searchQuery,
+ onSearchChange,
+ onAutoExpand,
+}) => {
+ const [contextMenu, setContextMenu] = useState<{
+ x: number;
+ y: number;
+ node: FileNode | null;
+ } | null>(null);
+ const [dialog, setDialog] = useState<{
+ type: "newFile" | "newFolder" | "rename";
+ node: FileNode | null;
+ } | null>(null);
+ const [showSearch, setShowSearch] = useState(false);
+
+ // Для контекстного меню на пустом месте (фон эксплорера)
+ const handleEmptyContextMenu = (e: React.MouseEvent) => {
+ e.preventDefault();
+ e.stopPropagation();
+ setContextMenu({ x: e.clientX, y: e.clientY, node: null });
+ };
+
+ // Для контекстного меню на элементе (передаётся из FileTreeItem)
+ const handleNodeContextMenu = (e: React.MouseEvent, node: FileNode) => {
+ e.preventDefault();
+ e.stopPropagation(); // ВАЖНО: предотвращаем всплытие
+ setContextMenu({ x: e.clientX, y: e.clientY, node });
+ };
+
+ const handleDelete = (node: FileNode) => {
+ const isRootNode = node.path === files.path;
+ if (isRootNode) {
+ onDeleteRoot();
+ } else if (window.confirm(`Delete "${node.name}"?`)) {
+ const newFiles = deleteNode(files, node.path || node.name);
+ if (newFiles) onRefresh(newFiles);
+ }
+ };
+
+ const filteredFiles = searchQuery ? filterTree(files, searchQuery) : files;
+
+ useEffect(() => {
+ if (searchQuery && files) {
+ const pathsToExpand = collectPathsToExpand(files, searchQuery);
+ if (pathsToExpand.size > 0) {
+ onAutoExpand(pathsToExpand);
+ }
+ }
+ }, [searchQuery, files, onAutoExpand]);
+
+ const handleDialogConfirm = (value: string) => {
+ if (!dialog) return;
+
+ if (dialog.type === "rename" && dialog.node) {
+ const parentPath =
+ dialog.node.path?.split("/").slice(0, -1).join("/") || "";
+ const parentNode = parentPath ? findNode(files, parentPath) : files;
+ if (
+ parentNode?.children?.some(
+ (c) =>
+ c.name.toLowerCase() === value.toLowerCase() &&
+ c.path !== dialog.node?.path,
+ )
+ ) {
+ alert(`"${value}" already exists.`);
+ return;
+ }
+ const newFiles = renameNode(
+ files,
+ dialog.node.path || dialog.node.name,
+ value,
+ );
+ if (newFiles) {
+ onRefresh(newFiles);
+ }
+ setDialog(null);
+ return;
+ }
+
+ let parentPath: string;
+
+ if (!dialog.node) {
+ parentPath = files.path || files.name;
+ } else if (dialog.node.type === "folder") {
+ parentPath = dialog.node.path || dialog.node.name;
+ } else {
+ const pathParts = (dialog.node.path || dialog.node.name).split("/");
+ pathParts.pop();
+ parentPath = pathParts.join("/") || files.path || files.name;
+ }
+
+ const parentNode = findNode(files, parentPath);
+ if (
+ parentNode?.children?.some(
+ (c) => c.name.toLowerCase() === value.toLowerCase(),
+ )
+ ) {
+ alert(`"${value}" already exists in this folder.`);
+ setDialog(null);
+ return;
+ }
+
+ let newFiles: FileNode | null = null;
+ let createdNode: FileNode | null = null;
+
+ if (dialog.type === "newFile") {
+ createdNode = { name: value, type: "file", content: "" };
+ newFiles = addNode(files, parentPath, createdNode);
+ } else if (dialog.type === "newFolder") {
+ createdNode = { name: value, type: "folder", children: [] };
+ newFiles = addNode(files, parentPath, createdNode);
+ }
+
+ if (newFiles) {
+ const allParentPaths: string[] = [];
+ let current = parentPath;
+ while (current) {
+ allParentPaths.push(current);
+ const parts = current.split("/");
+ parts.pop();
+ current = parts.join("/");
+ }
+ allParentPaths.forEach((p) => {
+ if (!expandedFolders.has(p)) {
+ onToggleFolder(p);
+ }
+ });
+ onAutoExpand(new Set(allParentPaths));
+
+ if (createdNode && createdNode.type === "file") {
+ const findAndOpen = (node: FileNode, name: string): FileNode | null => {
+ if (node.name === name && node.type === "file") return node;
+ if (node.children) {
+ for (const child of node.children) {
+ const found = findAndOpen(child, name);
+ if (found) return found;
+ }
+ }
+ return null;
+ };
+ const openedFile = findAndOpen(newFiles, value);
+ onRefresh(newFiles, openedFile || undefined);
+ } else {
+ onRefresh(newFiles);
+ }
+ }
+ setDialog(null);
+ };
+
+ return (
+
+
+
+ EXPLORER
+
+
+ setShowSearch(!showSearch)}
+ style={{
+ background: "transparent",
+ border: "none",
+ color: showSearch ? "#cccccc" : "#858585",
+ cursor: "pointer",
+ padding: "4px",
+ borderRadius: "4px",
+ display: "flex",
+ alignItems: "center",
+ justifyContent: "center",
+ transition: "all 0.1s",
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ }}
+ title="Search in files"
+ >
+
+
+ {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ e.currentTarget.style.color = "#cccccc";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ e.currentTarget.style.color = "#858585";
+ }}
+ title="Collapse All"
+ >
+
+
+ {
+ e.currentTarget.style.backgroundColor = "#2a2d2e";
+ e.currentTarget.style.color = "#cccccc";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "transparent";
+ e.currentTarget.style.color = "#858585";
+ }}
+ title="Expand All"
+ >
+
+
+
+
+
+
+
+
+ {files.name}
+
+
+
+ {showSearch && (
+
+
+
+ onSearchChange(e.target.value)}
+ placeholder="Search..."
+ autoFocus
+ style={{
+ flex: 1,
+ padding: "5px 6px",
+ backgroundColor: "transparent",
+ border: "none",
+ color: "#cccccc",
+ fontSize: "12px",
+ outline: "none",
+ }}
+ />
+ {searchQuery && (
+ onSearchChange("")}
+ style={{
+ background: "none",
+ border: "none",
+ color: "#858585",
+ cursor: "pointer",
+ padding: "2px",
+ display: "flex",
+ alignItems: "center",
+ }}
+ >
+
+
+ )}
+
+
+ )}
+
+
+ {filteredFiles ? (
+
+ ) : (
+
+ No results found
+
+ )}
+
+
+ {contextMenu && (
+
setContextMenu(null)}
+ onNewFile={() => {
+ setDialog({ type: "newFile", node: contextMenu.node });
+ setContextMenu(null);
+ }}
+ onNewFolder={() => {
+ setDialog({ type: "newFolder", node: contextMenu.node });
+ setContextMenu(null);
+ }}
+ onRename={() => {
+ setDialog({ type: "rename", node: contextMenu.node });
+ setContextMenu(null);
+ }}
+ onDelete={() => {
+ if (contextMenu.node) {
+ handleDelete(contextMenu.node);
+ }
+ setContextMenu(null);
+ }}
+ />
+ )}
+
+ {dialog && (
+ setDialog(null)}
+ />
+ )}
+
+ );
+};
+
+const CodeEditor: React.FC<{
+ filePath: string;
+ content: string;
+ onChange: (content: string) => void;
+}> = ({ filePath, content, onChange }) => {
+ const getLanguage = (path: string) => {
+ const ext = path.split(".").pop();
+ const map: Record = {
+ py: "python",
+ js: "javascript",
+ ts: "typescript",
+ jsx: "javascript",
+ tsx: "typescript",
+ json: "json",
+ md: "markdown",
+ css: "css",
+ html: "html",
+ };
+ return map[ext || ""] || "plaintext";
+ };
+
+ return (
+
+
+ {filePath ? (
+
onChange(value || "")}
+ theme="vs-dark"
+ options={{
+ minimap: { enabled: false },
+ fontSize: 14,
+ fontFamily: "'Cascadia Code', 'Fira Code', monospace",
+ tabSize: 4,
+ wordWrap: "on",
+ lineNumbers: "on",
+ automaticLayout: true,
+ renderWhitespace: "selection",
+ smoothScrolling: true,
+ }}
+ />
+ ) : (
+
+
+
+
+
+
+ Welcome to Web VS Code
+
+
+ Right-click on a folder to create files
+
+
+ Or right-click anywhere in the explorer
+
+
+
+ )}
+
+
+ );
+};
+
+export const TestPage: React.FC = () => {
+ const [files, setFiles] = useState(() =>
+ addPaths(initialFiles),
+ );
+ const [openFiles, setOpenFiles] = useState([]);
+ const [activeFile, setActiveFile] = useState(null);
+ const [expandedFolders, setExpandedFolders] = useState>(
+ new Set(["my-project"]),
+ );
+ const [searchQuery, setSearchQuery] = useState("");
+
+ const handleFileSelect = useCallback(
+ (node: FileNode) => {
+ if (node.type === "file") {
+ if (!openFiles.find((f) => f.path === node.path)) {
+ setOpenFiles((prev) => [...prev, node]);
+ }
+ setActiveFile(node);
+ }
+ },
+ [openFiles],
+ );
+
+ const handleContentChange = useCallback(
+ (newContent: string) => {
+ if (activeFile && files) {
+ const updatedActiveFile = { ...activeFile, content: newContent };
+ setActiveFile(updatedActiveFile);
+ setOpenFiles((prev) =>
+ prev.map((f) => (f.path === activeFile.path ? updatedActiveFile : f)),
+ );
+ }
+ },
+ [activeFile, files],
+ );
+
+ const handleCloseFile = useCallback(
+ (file: FileNode) => {
+ const newOpenFiles = openFiles.filter((f) => f.path !== file.path);
+ setOpenFiles(newOpenFiles);
+
+ if (activeFile?.path === file.path) {
+ setActiveFile(newOpenFiles[newOpenFiles.length - 1] || null);
+ }
+ },
+ [openFiles, activeFile],
+ );
+
+ const handleCloseAll = useCallback(() => {
+ setOpenFiles([]);
+ setActiveFile(null);
+ }, []);
+
+ const handleCloseOthers = useCallback((file: FileNode) => {
+ setOpenFiles([file]);
+ setActiveFile(file);
+ }, []);
+
+ const handleRefresh = useCallback(
+ (newFiles: FileNode | null, newFile?: FileNode) => {
+ setFiles(newFiles);
+
+ if (!newFiles) {
+ setOpenFiles([]);
+ setActiveFile(null);
+ return;
+ }
+
+ const updatedOpenFiles = openFiles
+ .map((f) => {
+ const found = findNode(newFiles, f.path || "");
+ return found && found.type === "file" ? found : null;
+ })
+ .filter((f): f is FileNode => f !== null);
+
+ setOpenFiles(updatedOpenFiles);
+
+ if (newFile) {
+ handleFileSelect(newFile);
+ } else if (activeFile) {
+ const stillExists = findNode(newFiles, activeFile.path || "");
+ if (!stillExists) {
+ setActiveFile(updatedOpenFiles[updatedOpenFiles.length - 1] || null);
+ } else if (stillExists.type === "file") {
+ setActiveFile(stillExists);
+ }
+ }
+ },
+ [openFiles, activeFile, handleFileSelect],
+ );
+
+ const handleToggleFolder = useCallback((path: string) => {
+ setExpandedFolders((prev) => {
+ const newSet = new Set(prev);
+ if (newSet.has(path)) {
+ newSet.delete(path);
+ } else {
+ newSet.add(path);
+ }
+ return newSet;
+ });
+ }, []);
+
+ const handleExpandAll = useCallback(() => {
+ if (files) {
+ const allPaths = getAllFolderPaths(files);
+ setExpandedFolders(new Set(allPaths));
+ }
+ }, [files]);
+
+ const handleCollapseAll = useCallback(() => {
+ setExpandedFolders(new Set());
+ }, []);
+
+ const handleDeleteRoot = useCallback(() => {
+ setFiles(null);
+ setOpenFiles([]);
+ setActiveFile(null);
+ setExpandedFolders(new Set());
+ }, []);
+
+ const handleCreateNewProject = useCallback(() => {
+ const newProject = addPaths(initialFiles);
+ setFiles(newProject);
+ setExpandedFolders(new Set([newProject.path || newProject.name]));
+ setSearchQuery("");
+ }, []);
+
+ if (!files) {
+ return (
+
+
+
+
+
+
+
+
+ No project open
+
+
+ Create a new project to get started
+
+
{
+ e.currentTarget.style.backgroundColor = "#1177bb";
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = "#0e639c";
+ }}
+ >
+ New Project
+
+
+
+
+
+
+ main
+
+
+ 0 0
+
+
+
+ {activeFile && (
+
+ Ln 1, Col 1 | Spaces: 4 | UTF-8 |{" "}
+ {activeFile.path?.split(".").pop()?.toUpperCase() || "TXT"}
+
+ )}
+ Web VS Code
+
+
+
+ );
+ }
+
+ return (
+
+
+
+ {activeFile ? `${activeFile.name} - ` : ""}
+ {files.name}
+
+
+
+
+
+ setExpandedFolders((prev) => new Set([...prev, ...paths]))
+ }
+ />
+
+
+
+
+
+
+
+
+
+ main
+
+
+ 0 0
+
+
+
+ {activeFile && (
+
+ Ln 1, Col 1 | Spaces: 4 | UTF-8 |{" "}
+ {activeFile.path?.split(".").pop()?.toUpperCase() || "TXT"}
+
+ )}
+ Web VS Code
+
+
+
+ );
+};
diff --git a/frontend/src/pages/themes.page.tsx b/frontend/src/pages/themes.page.tsx
deleted file mode 100644
index fa02cc9..0000000
--- a/frontend/src/pages/themes.page.tsx
+++ /dev/null
@@ -1,9 +0,0 @@
-import { ThemeChanger } from "@/modules/theme-changer";
-
-export const ThemesPage = () => {
- return (
-
-
-
- );
-};
diff --git a/frontend/src/shared/api/axios.instance.ts b/frontend/src/shared/api/axios.instance.ts
index 0b72df6..e5381c3 100644
--- a/frontend/src/shared/api/axios.instance.ts
+++ b/frontend/src/shared/api/axios.instance.ts
@@ -16,13 +16,40 @@ class ApiClient {
constructor() {
this.axiosInstance = axios.create({
- baseURL: "http://194.113.106.59:8080/api/v1",
+ baseURL: "http://213.165.213.170:8080/api/v1",
timeout: 10000,
headers: {
"Content-Type": "application/json",
},
validateStatus: (status) => {
- return status >= 200 && status < 500;
+ return status >= 200 && status < 400;
+ },
+ // Добавляем кастомный сериализатор параметров
+ paramsSerializer: {
+ serialize: (params) => {
+ const parts: string[] = [];
+
+ Object.entries(params).forEach(([key, value]) => {
+ if (value === undefined || value === null) return;
+
+ if (Array.isArray(value)) {
+ // Преобразуем массив в множественные параметры: level=info&level=warning
+ value.forEach((item) => {
+ if (item !== undefined && item !== null) {
+ parts.push(
+ `${encodeURIComponent(key)}=${encodeURIComponent(item)}`,
+ );
+ }
+ });
+ } else {
+ parts.push(
+ `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`,
+ );
+ }
+ });
+
+ return parts.join("&");
+ },
},
});
diff --git a/frontend/src/shared/api/websocket.service.ts b/frontend/src/shared/api/websocket.service.ts
index 08419b9..fb13c97 100644
--- a/frontend/src/shared/api/websocket.service.ts
+++ b/frontend/src/shared/api/websocket.service.ts
@@ -1,5 +1,5 @@
// shared/api/websocket.service.ts
-import { useAgentStore } from "@/components/layout/sidebar/store/agent.store";
+import { useAgentStore } from "@/app/providers/layout/store/agent.store";
import { useWebSocket, type LogMessage } from "@/shared/hooks/useWebSocket";
import { useEffect, useRef, useCallback, useMemo } from "react";
@@ -25,12 +25,12 @@ export const useWebSocketService = ({
const selectedServices: string[] = [];
const selectedHosts: string[] = [];
+ // TODO: реализовать механизм выбора сервисов
+ // Пока выбираем все
agents.forEach((agent) => {
agent.services.forEach((service) => {
- if (service.isSelected) {
- selectedServices.push(service.name);
- selectedHosts.push(agent.token);
- }
+ selectedServices.push(service);
+ selectedHosts.push(agent.token);
});
});
diff --git a/frontend/src/shared/layouts/DefaultLayout.tsx b/frontend/src/shared/layouts/DefaultLayout.tsx
index 3a3e439..0b64907 100644
--- a/frontend/src/shared/layouts/DefaultLayout.tsx
+++ b/frontend/src/shared/layouts/DefaultLayout.tsx
@@ -1,90 +1,17 @@
import { useAuthStore } from "@/modules/auth/store/useAuthStore";
-import { ThemeToggle } from "@/modules/theme-bw/ui/ThemeToggle";
-import React from "react";
-import { Outlet, useNavigate } from "react-router-dom";
+import { Navigate, Outlet } from "react-router-dom";
+import { Layout } from "@/app/providers/layout/layout";
-interface DefaultLayoutProps {
- children?: React.ReactNode;
-}
+export const DefaultLayout = () => {
+ const { token } = useAuthStore();
-export const DefaultLayout: React.FC = ({ children }) => {
- const { user, logout } = useAuthStore();
- const navigate = useNavigate();
-
- const handleLogout = () => {
- logout();
- navigate("/auth");
- };
+ // if (!token) {
+ // return ;
+ // }
return (
-
- {/* Header */}
-
-
-
- {/* Logo */}
-
navigate("/")}
- >
- HellreigN
-
-
- {/* Right side */}
-
-
- {user && (
-
-
- {user.firstName} {user.lastName}
-
- {
- e.currentTarget.style.backgroundColor = "var(--button-danger-hover)";
- }}
- onMouseLeave={(e) => {
- e.currentTarget.style.backgroundColor = "var(--button-danger)";
- }}
- >
- Выйти
-
-
- )}
-
-
-
-
-
- {/* Main content */}
-
{children || }
-
- {/* Footer */}
-
-
+
+
+
);
};
diff --git a/frontend/src/shared/styles/index.css b/frontend/src/shared/styles/index.css
index 755d870..580b131 100644
--- a/frontend/src/shared/styles/index.css
+++ b/frontend/src/shared/styles/index.css
@@ -2,3 +2,13 @@
@import "./normalize.css";
@import "./root.css";
@import "./themes.css";
+
+/* Hide scrollbar but keep functionality */
+.scrollbar-hide {
+ -ms-overflow-style: none; /* IE and Edge */
+ scrollbar-width: none; /* Firefox */
+}
+
+.scrollbar-hide::-webkit-scrollbar {
+ display: none; /* Chrome, Safari and Opera */
+}
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index 0c45968..e800e91 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -4,7 +4,7 @@
"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0":
version "7.29.0"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz"
integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==
dependencies:
"@babel/helper-validator-identifier" "^7.28.5"
@@ -13,12 +13,12 @@
"@babel/compat-data@^7.28.6":
version "7.29.0"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d"
+ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz"
integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==
"@babel/core@^7.24.4":
version "7.29.0"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322"
+ resolved "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz"
integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==
dependencies:
"@babel/code-frame" "^7.29.0"
@@ -39,7 +39,7 @@
"@babel/generator@^7.29.0":
version "7.29.1"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50"
+ resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz"
integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==
dependencies:
"@babel/parser" "^7.29.0"
@@ -50,7 +50,7 @@
"@babel/helper-compilation-targets@^7.28.6":
version "7.28.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25"
+ resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz"
integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==
dependencies:
"@babel/compat-data" "^7.28.6"
@@ -61,12 +61,12 @@
"@babel/helper-globals@^7.28.0":
version "7.28.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674"
+ resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz"
integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==
"@babel/helper-module-imports@^7.28.6":
version "7.28.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c"
+ resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz"
integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==
dependencies:
"@babel/traverse" "^7.28.6"
@@ -74,7 +74,7 @@
"@babel/helper-module-transforms@^7.28.6":
version "7.28.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e"
+ resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz"
integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==
dependencies:
"@babel/helper-module-imports" "^7.28.6"
@@ -83,22 +83,22 @@
"@babel/helper-string-parser@^7.27.1":
version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
+ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz"
integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
"@babel/helper-validator-identifier@^7.28.5":
version "7.28.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz"
integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==
"@babel/helper-validator-option@^7.27.1":
version "7.27.1"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz"
integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==
"@babel/helpers@^7.28.6":
version "7.29.2"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.2.tgz#9cfbccb02b8e229892c0b07038052cc1a8709c49"
+ resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz"
integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==
dependencies:
"@babel/template" "^7.28.6"
@@ -106,40 +106,40 @@
"@babel/parser@^7.24.4", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0":
version "7.29.2"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1"
+ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz"
integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==
dependencies:
"@babel/types" "^7.29.0"
"@babel/runtime@7.1.2":
version "7.1.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz"
integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==
dependencies:
regenerator-runtime "^0.12.0"
"@babel/runtime@7.2.0":
version "7.2.0"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.2.0.tgz"
integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==
dependencies:
regenerator-runtime "^0.12.0"
"@babel/runtime@7.3.4":
version "7.3.4"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz"
integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==
dependencies:
regenerator-runtime "^0.12.0"
"@babel/runtime@^7.18.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
version "7.29.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.2.tgz#9a6e2d05f4b6692e1801cd4fb176ad823930ed5e"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz"
integrity sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==
"@babel/template@^7.28.6":
version "7.28.6"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57"
+ resolved "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz"
integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==
dependencies:
"@babel/code-frame" "^7.28.6"
@@ -148,7 +148,7 @@
"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0":
version "7.29.0"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a"
+ resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz"
integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==
dependencies:
"@babel/code-frame" "^7.29.0"
@@ -161,7 +161,7 @@
"@babel/types@^7.28.6", "@babel/types@^7.29.0":
version "7.29.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7"
+ resolved "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz"
integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==
dependencies:
"@babel/helper-string-parser" "^7.27.1"
@@ -169,7 +169,7 @@
"@codemirror/autocomplete@^6.0.0":
version "6.20.1"
- resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz#4cfbc8b2e1e25f890ec34a081037e58b4e44143e"
+ resolved "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.1.tgz"
integrity sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==
dependencies:
"@codemirror/language" "^6.0.0"
@@ -179,7 +179,7 @@
"@codemirror/commands@^6.0.0", "@codemirror/commands@^6.1.0":
version "6.10.3"
- resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.10.3.tgz#01877060befdec352e8300dec1f185489c300635"
+ resolved "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.3.tgz"
integrity sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==
dependencies:
"@codemirror/language" "^6.0.0"
@@ -189,7 +189,7 @@
"@codemirror/lang-sql@^6.10.0":
version "6.10.0"
- resolved "https://registry.yarnpkg.com/@codemirror/lang-sql/-/lang-sql-6.10.0.tgz#49bfbf6cf31516a99e674da9a399f4426101a95a"
+ resolved "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.10.0.tgz"
integrity sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==
dependencies:
"@codemirror/autocomplete" "^6.0.0"
@@ -201,7 +201,7 @@
"@codemirror/language@^6.0.0":
version "6.12.3"
- resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.12.3.tgz#0b220182973a4c19850b29f7dd82aec1bbae3d7e"
+ resolved "https://registry.npmjs.org/@codemirror/language/-/language-6.12.3.tgz"
integrity sha512-QwCZW6Tt1siP37Jet9Tb02Zs81TQt6qQrZR2H+eGMcFsL1zMrk2/b9CLC7/9ieP1fjIUMgviLWMmgiHoJrj+ZA==
dependencies:
"@codemirror/state" "^6.0.0"
@@ -213,7 +213,7 @@
"@codemirror/lint@^6.0.0":
version "6.9.5"
- resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.9.5.tgz#c7da006f3335a33014799a7375c82df558e89f90"
+ resolved "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.5.tgz"
integrity sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==
dependencies:
"@codemirror/state" "^6.0.0"
@@ -222,7 +222,7 @@
"@codemirror/search@^6.0.0":
version "6.6.0"
- resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-6.6.0.tgz#3b83a1e35391e1575a83a3b485e3f95263ddaa0b"
+ resolved "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz"
integrity sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==
dependencies:
"@codemirror/state" "^6.0.0"
@@ -231,14 +231,14 @@
"@codemirror/state@^6.0.0", "@codemirror/state@^6.1.1", "@codemirror/state@^6.6.0":
version "6.6.0"
- resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.6.0.tgz#b88dbdc14aea4ace3c6d67bb77fe28bb84e4394e"
+ resolved "https://registry.npmjs.org/@codemirror/state/-/state-6.6.0.tgz"
integrity sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==
dependencies:
"@marijn/find-cluster-break" "^1.0.0"
"@codemirror/theme-one-dark@^6.0.0":
version "6.1.3"
- resolved "https://registry.yarnpkg.com/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz#1dbb73f6e73c53c12ad2aed9f48c263c4e63ea37"
+ resolved "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz"
integrity sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==
dependencies:
"@codemirror/language" "^6.0.0"
@@ -248,7 +248,7 @@
"@codemirror/view@^6.0.0", "@codemirror/view@^6.17.0", "@codemirror/view@^6.23.0", "@codemirror/view@^6.27.0", "@codemirror/view@^6.35.0", "@codemirror/view@^6.37.0":
version "6.41.0"
- resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.41.0.tgz#482cbcb5f8f90131908e5f9c0e2f4681e0684db0"
+ resolved "https://registry.npmjs.org/@codemirror/view/-/view-6.41.0.tgz"
integrity sha512-6H/qadXsVuDY219Yljhohglve8xf4B8xJkVOEWfA5uiYKiTFppjqsvsfR5iPA0RbvRBoOyTZpbLIxe9+0UR8xA==
dependencies:
"@codemirror/state" "^6.6.0"
@@ -256,6 +256,329 @@
style-mod "^4.1.0"
w3c-keyname "^2.2.4"
+"@codingame/monaco-vscode-api@25.1.2", "@codingame/monaco-vscode-api@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-25.1.2.tgz"
+ integrity sha512-K04QcQA+Zb0KXucBAK/BGCT5dldiwIqdUbBQq7yuLvBLbof3cP1WSUuxasMHGYwM0MWyzIAsDtyAYMS7is8ZuA==
+ dependencies:
+ "@codingame/monaco-vscode-base-service-override" "25.1.2"
+ "@codingame/monaco-vscode-environment-service-override" "25.1.2"
+ "@codingame/monaco-vscode-extensions-service-override" "25.1.2"
+ "@codingame/monaco-vscode-files-service-override" "25.1.2"
+ "@codingame/monaco-vscode-host-service-override" "25.1.2"
+ "@codingame/monaco-vscode-layout-service-override" "25.1.2"
+ "@codingame/monaco-vscode-quickaccess-service-override" "25.1.2"
+ "@vscode/iconv-lite-umd" "0.7.1"
+ dompurify "3.3.1"
+ jschardet "3.1.4"
+ marked "14.0.0"
+
+"@codingame/monaco-vscode-base-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-base-service-override/-/monaco-vscode-base-service-override-25.1.2.tgz"
+ integrity sha512-OwYs6h1ATUAeMmX+Q1c8esTG7GLMqniBs+fLEr1/9b/ciY485ArKo5UvrUxVPDtRNy/7F06vRW9IUCq9iKP14w==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-bulk-edit-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-bulk-edit-service-override/-/monaco-vscode-bulk-edit-service-override-25.1.2.tgz"
+ integrity sha512-+EfSzjiFakCf0IIJKPZrHVGioq5N8GBsp51bXuKBR5J/B58cUaJY0Dc12PNTSpgAusAGOppUIOSBqUk4F/7IaQ==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-configuration-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-configuration-service-override/-/monaco-vscode-configuration-service-override-25.1.2.tgz"
+ integrity sha512-oeoZ3WtM42zHA1IWHrx9UGEfE+TixE+G8Bl9M9bjgFj1EROnkB5yOfELwRYPo4WOEtcK1C5nvIvWIj/hL9MaLg==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-files-service-override" "25.1.2"
+
+"@codingame/monaco-vscode-editor-api@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-editor-api/-/monaco-vscode-editor-api-25.1.2.tgz"
+ integrity sha512-dVXoBLRN8vyFHsLY6iYISaNetZ3ispXLut0qL+jvN0e0CEFkUv1F/3EAE7myptrJSS/N1AptrRIxATT3lwFP+Q==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-editor-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-editor-service-override/-/monaco-vscode-editor-service-override-25.1.2.tgz"
+ integrity sha512-EadvDCyWdgxOPmaIvbcVVDNjTUYuKdjYWwKbPbbcTs9t4z1/DjdE7mV3ZdT6aGh5m6zkEEUOi143l27Y5eRt+Q==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-environment-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-environment-service-override/-/monaco-vscode-environment-service-override-25.1.2.tgz"
+ integrity sha512-8GoD3lk0CN0dIMZOrZNS/i8RCaF1YSQ6nmrf+rqneOSHG9S382EnsZZD69d4+i7JnoeyttO7Kr9KH8WOhRV6OA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-extension-api@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-extension-api/-/monaco-vscode-extension-api-25.1.2.tgz"
+ integrity sha512-SJW/YOhjo+9MXEyzMwQMUWdJVR3Llc6pTq5JQqs6Y30v73gTrpLqtzbd9FNdCuQR8S6bUk5ScH8GL4QrVuL5FA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-extensions-service-override" "25.1.2"
+
+"@codingame/monaco-vscode-extensions-service-override@25.1.2", "@codingame/monaco-vscode-extensions-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-extensions-service-override/-/monaco-vscode-extensions-service-override-25.1.2.tgz"
+ integrity sha512-rTTZW2biPxcg+JumhVf2L+38C5ptvNNxiJlwz39VfXFEh6qOHtAsIMy7vIXa0uGg5/y8DNp0SnOQJP/RKhLYZA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-files-service-override" "25.1.2"
+
+"@codingame/monaco-vscode-files-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-files-service-override/-/monaco-vscode-files-service-override-25.1.2.tgz"
+ integrity sha512-TenLLAFIwY7keZFF8e3beUn7OVfnNINR5Noi4PVrjeeTcy6FuNH6Jghdul2JwpRAkvyJLdFMvomE2jlT6F03jQ==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-host-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-host-service-override/-/monaco-vscode-host-service-override-25.1.2.tgz"
+ integrity sha512-lgaalpA9CUQW7i0bBwgBOK0DQNDvOo3QO3p6Rz6yVsHpgA4iMqq2d11dBDUKvuQSwIHPRu8CMHCqhQk/BQN/YA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-keybindings-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-keybindings-service-override/-/monaco-vscode-keybindings-service-override-25.1.2.tgz"
+ integrity sha512-cp/gGyTvCTAzCYnQm0HJykXJRB0Huz8Lvq60lj5LutgWcb8S3w6dOB2Houm8dHoeUm/jOko8SQNIP8hzWN92Zw==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-files-service-override" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-cs@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-cs/-/monaco-vscode-language-pack-cs-25.1.2.tgz"
+ integrity sha512-v0cB2uAOCwj135aGIf0arGV+DNW32lbWh04bv8ctTxcWRt1Pr2kTQ1pjfE8ynKgxabPfAk8E25/CerKSYOmZ+A==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-de@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-de/-/monaco-vscode-language-pack-de-25.1.2.tgz"
+ integrity sha512-xA3WOt1w5jlAOnyx4PBwx+qV3vx8C8/zie29qjYbgJMxGKDkb0HfpuKUwywDA2uUMI2wJZS+PnNG00zPDoLIrw==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-es@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-es/-/monaco-vscode-language-pack-es-25.1.2.tgz"
+ integrity sha512-1/upuO9lRJilZ3sRr0QLTpz55KYRaBWDe8wtPvghOFYOHyWgW8A4VhUQxa6L9SJgY1JkypUAm0U8WcMX2G4LnQ==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-fr@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-fr/-/monaco-vscode-language-pack-fr-25.1.2.tgz"
+ integrity sha512-iq+xx+tv1QIMmFD0eBhFRMF4xMAsVf/HyA1WogqBofteCWeAvRE9HUjZ5JzHz7jXBPe3dLP1LOM0r0GrJZs4fQ==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-it@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-it/-/monaco-vscode-language-pack-it-25.1.2.tgz"
+ integrity sha512-FajWCML9OR8ppLnJ0mcg+sFHEhYJl8zhb3/DHnd+pNysw8dLfetXoSWjaPnwPPpwiQgkNN1UsToZHOU9czVifQ==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-ja@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ja/-/monaco-vscode-language-pack-ja-25.1.2.tgz"
+ integrity sha512-NwKh0BnPgUrJkxsm0X6vY4ftnd9DjxkcnQqK+bohta6UOzm09J1EjZ6QD42fjWngxrp/xiegtrYQ9NA2q6VpoA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-ko@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ko/-/monaco-vscode-language-pack-ko-25.1.2.tgz"
+ integrity sha512-fvaisgfcg8YaAwnyPcGmQDLwkwqzamLQUyx9HmnwDpXw0YANzd058Kwn6bz+Vfn9MjwuMNT0nllD0qQMnpdyew==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-pl@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-pl/-/monaco-vscode-language-pack-pl-25.1.2.tgz"
+ integrity sha512-9hDRyzFJkDia5rO9QE262JgxwP/cnalFisLFo7FQcw57ZhqzqXIdQIuwcKaHuAgzeQ6W2+A3KOLfTr3m7VZrXw==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-pt-br@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-pt-br/-/monaco-vscode-language-pack-pt-br-25.1.2.tgz"
+ integrity sha512-7fFnqOTAJGb5RuJ4uwh9sh0JmXALuHPGOl7iL9rZkcgIuVP5y6wVDUDXq5qjiRTNSFDs7Bzh463Ir5m5D6mJbA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-qps-ploc@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-qps-ploc/-/monaco-vscode-language-pack-qps-ploc-25.1.2.tgz"
+ integrity sha512-IFjoqrSuPtIFWb+KlPT6PFWKszzNX+TCD9drgCV6AigvBO/xfGL3QwHB68l/DLbmDbohOz4Xdkutv20wuENAeA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-ru@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ru/-/monaco-vscode-language-pack-ru-25.1.2.tgz"
+ integrity sha512-0uDAeXO+GllKUPhJzP893rlDhlFV1IwCu/515rBdcyegt48iGm/xAgj26V90hNz8hmB6EuM/7d8MFeklbiIpYA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-tr@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-tr/-/monaco-vscode-language-pack-tr-25.1.2.tgz"
+ integrity sha512-MJhHxDyJEiuVLQ9+jb8MnnN9lsbJOjJjMswVCeJ7v/Q/msAhq25QYUfn0DbOIzESJE1f7crffRb5e38XP8sYWA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-zh-hans@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-zh-hans/-/monaco-vscode-language-pack-zh-hans-25.1.2.tgz"
+ integrity sha512-c7MMrhnSLb59NxpAa8nVy9aIbxy4gVYrCpDMq8W380LOaXTYb7nueTrw8QJ5QbJBNi2P2KZoGkn2BlONuBtJJg==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-language-pack-zh-hant@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-zh-hant/-/monaco-vscode-language-pack-zh-hant-25.1.2.tgz"
+ integrity sha512-ARedFTM6JCluoPLJqkBcTJaQFdJNcN86OX6B8/NMApIPrnSIAfanMndpyilt8XjzUG6IH22cypR+DAlEjf48cA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-languages-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-languages-service-override/-/monaco-vscode-languages-service-override-25.1.2.tgz"
+ integrity sha512-ipuS1V3NgXDkNrj0vBcgMBFnqo+19HVsZjjFGfPFH3x0uptP9aiWWK42wtDK3Qbu4teSjHL7WnSLrmw94rplWw==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-files-service-override" "25.1.2"
+
+"@codingame/monaco-vscode-layout-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-layout-service-override/-/monaco-vscode-layout-service-override-25.1.2.tgz"
+ integrity sha512-SxBGcMK3RgkGtUn7ZDl7dCoyNW0CWFQ/bfSRYUY06A0IA4JNS5jq1lhof57d0WXewm+5l8w1Spr/vMsfx1c9ig==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-localization-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-localization-service-override/-/monaco-vscode-localization-service-override-25.1.2.tgz"
+ integrity sha512-QLj62A8XDOIQW3KjsZlNxs+sfsNNHYxWMjQMwZu/y2Vw3IIHGly2Lpn4t4SFbeaBHJQJy4i5s7NpzlbF9MbEzQ==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-log-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-log-service-override/-/monaco-vscode-log-service-override-25.1.2.tgz"
+ integrity sha512-OoileAUtPAJ0j3RW31DFSxtOipy0EcFq+iIXEdGvoRlsQPZJ3o9ayjf1JvCXpxUjJ3QkmvQVhXsWNUFREjEFLg==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-environment-service-override" "25.1.2"
+
+"@codingame/monaco-vscode-model-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-model-service-override/-/monaco-vscode-model-service-override-25.1.2.tgz"
+ integrity sha512-MGz/eV1CxibLvnl6WzK6idUHJCXJOVepJvKM6Trkv5050vRe+f/o1TjCiG8PaznAypYqZvnwkTG0B7/OTizCpQ==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-monarch-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-monarch-service-override/-/monaco-vscode-monarch-service-override-25.1.2.tgz"
+ integrity sha512-akyNHOJQRS7YHyk6kf0Encnkt+shlR+bIB84UJRUHFgSeF8s5gkDkQuFJph0YeUDWJWat+yBLUSZx2nHomdbHQ==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-quickaccess-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-25.1.2.tgz"
+ integrity sha512-7IIrXnwHiF3w9d9p9kspEUz/LCibMLUztmRpGdZQfFtWBJw043q7rk8V1O42KdXr1hVg9IR5vfffwjy9nbiiUg==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-textmate-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-textmate-service-override/-/monaco-vscode-textmate-service-override-25.1.2.tgz"
+ integrity sha512-AL0FtSQBW+1vtoXYQvUqB2hfWojpK73Kq/n6KuNXxjLF/XBJ5FpeeZDfrBfwhWPPoHuBTsaFUCQy4L8xQgbVlA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-files-service-override" "25.1.2"
+
+"@codingame/monaco-vscode-theme-defaults-default-extension@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-theme-defaults-default-extension/-/monaco-vscode-theme-defaults-default-extension-25.1.2.tgz"
+ integrity sha512-0vTMFiC89YSDSmjFckuQBUKwRuFNtsILNO3k0PBiSLN/MW+VDItjJpiVLXC42+rUWlGgY2lYxOneGVa5slCV1w==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-theme-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-theme-service-override/-/monaco-vscode-theme-service-override-25.1.2.tgz"
+ integrity sha512-hsTwl6YYTiheFuQMmCmiEGLIdIdgYaf8Z85XWyxe6YgPtDaYGnp0fGSOXKA9/bf0JtuynzoLKtUUfDupK/A7Tw==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-files-service-override" "25.1.2"
+
+"@codingame/monaco-vscode-view-banner-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-view-banner-service-override/-/monaco-vscode-view-banner-service-override-25.1.2.tgz"
+ integrity sha512-zhujHd1PQ6rRXsC2OQGrx/282G2v3lpPFl9heDFGKzpdj5119SgcW+B9p/MwJ1qF3LJpuRRgefNiQtqC/KT1eA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-view-common-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-view-common-service-override/-/monaco-vscode-view-common-service-override-25.1.2.tgz"
+ integrity sha512-4Po/YaHUvVf4VmhVCZmM2lc/flOptiWSM140bIRNpMcfH0VwihYg15CcDeu1Oc+6DaauzsG3u59GtEvlMmJ9Zw==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-bulk-edit-service-override" "25.1.2"
+
+"@codingame/monaco-vscode-view-status-bar-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-view-status-bar-service-override/-/monaco-vscode-view-status-bar-service-override-25.1.2.tgz"
+ integrity sha512-Jp9ytLaWZ6evabTPtG3Mu3dFx+7WTIPz69BsGpl9PnU0kiSWUqQhPSob0Jz7E2qmMj0ZcNv2Wqvm6bMBu5OyrA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-view-title-bar-service-override@25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-view-title-bar-service-override/-/monaco-vscode-view-title-bar-service-override-25.1.2.tgz"
+ integrity sha512-NVYtTAFR35NV/Fx7tSlbASicvpAjK5A14fmxF7/LJJN8ZmzhA/P3Y+UzhqOQl6/VcPV4pAMU0Z7Sicgwbn37dw==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+
+"@codingame/monaco-vscode-views-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-views-service-override/-/monaco-vscode-views-service-override-25.1.2.tgz"
+ integrity sha512-LfzlztsvobdP5L5EvJ/rqSEgy5fEVmrkMqRteuhEtNGd4hnmdBoX8W7BNMBPff6d4NfCK74pGHJF57RyT4Iixg==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-keybindings-service-override" "25.1.2"
+ "@codingame/monaco-vscode-layout-service-override" "25.1.2"
+ "@codingame/monaco-vscode-quickaccess-service-override" "25.1.2"
+ "@codingame/monaco-vscode-view-common-service-override" "25.1.2"
+
+"@codingame/monaco-vscode-workbench-service-override@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-workbench-service-override/-/monaco-vscode-workbench-service-override-25.1.2.tgz"
+ integrity sha512-2LMHr+na03FhOAaXpIGmamq9hf7e4wt2kULn8NqNZRd3i+0v1tx/TSSjGhsA5EkrNrFD7CMSoXayBq8tgpCq/A==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-keybindings-service-override" "25.1.2"
+ "@codingame/monaco-vscode-quickaccess-service-override" "25.1.2"
+ "@codingame/monaco-vscode-view-banner-service-override" "25.1.2"
+ "@codingame/monaco-vscode-view-common-service-override" "25.1.2"
+ "@codingame/monaco-vscode-view-status-bar-service-override" "25.1.2"
+ "@codingame/monaco-vscode-view-title-bar-service-override" "25.1.2"
+
"@emnapi/core@^1.8.1":
version "1.9.2"
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.9.2.tgz#3870265ecffc7352d01ead62d8d83d8358a2d034"
@@ -280,19 +603,19 @@
"@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1":
version "4.9.1"
- resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595"
+ resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz"
integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==
dependencies:
eslint-visitor-keys "^3.4.3"
"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2":
version "4.12.2"
- resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b"
+ resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz"
integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==
"@eslint/config-array@^0.21.2":
version "0.21.2"
- resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.2.tgz#f29e22057ad5316cf23836cee9a34c81fffcb7e6"
+ resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz"
integrity sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==
dependencies:
"@eslint/object-schema" "^2.1.7"
@@ -301,21 +624,21 @@
"@eslint/config-helpers@^0.4.2":
version "0.4.2"
- resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda"
+ resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz"
integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==
dependencies:
"@eslint/core" "^0.17.0"
"@eslint/core@^0.17.0":
version "0.17.0"
- resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c"
+ resolved "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz"
integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==
dependencies:
"@types/json-schema" "^7.0.15"
"@eslint/eslintrc@^3.3.5":
version "3.3.5"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.5.tgz#c131793cfc1a7b96f24a83e0a8bbd4b881558c60"
+ resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz"
integrity sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==
dependencies:
ajv "^6.14.0"
@@ -330,17 +653,17 @@
"@eslint/js@9.39.4", "@eslint/js@^9.39.4":
version "9.39.4"
- resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.4.tgz#a3f83bfc6fd9bf33a853dfacd0b49b398eb596c1"
+ resolved "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz"
integrity sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==
"@eslint/object-schema@^2.1.7":
version "2.1.7"
- resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad"
+ resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz"
integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==
"@eslint/plugin-kit@^0.4.1":
version "0.4.1"
- resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2"
+ resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz"
integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==
dependencies:
"@eslint/core" "^0.17.0"
@@ -348,12 +671,12 @@
"@humanfs/core@^0.19.1":
version "0.19.1"
- resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77"
+ resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz"
integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==
"@humanfs/node@^0.16.6":
version "0.16.7"
- resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26"
+ resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz"
integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==
dependencies:
"@humanfs/core" "^0.19.1"
@@ -361,17 +684,17 @@
"@humanwhocodes/module-importer@^1.0.1":
version "1.0.1"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2":
version "0.4.3"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba"
+ resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz"
integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==
"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5":
version "0.3.13"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"
integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
dependencies:
"@jridgewell/sourcemap-codec" "^1.5.0"
@@ -379,7 +702,7 @@
"@jridgewell/remapping@^2.3.5":
version "2.3.5"
- resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1"
+ resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz"
integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==
dependencies:
"@jridgewell/gen-mapping" "^0.3.5"
@@ -387,17 +710,17 @@
"@jridgewell/resolve-uri@^3.1.0":
version "3.1.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5":
version "1.5.5"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"
integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28":
version "0.3.31"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"
integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
@@ -405,28 +728,42 @@
"@lezer/common@^1.0.0", "@lezer/common@^1.1.0", "@lezer/common@^1.2.0", "@lezer/common@^1.3.0", "@lezer/common@^1.5.0":
version "1.5.1"
- resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.5.1.tgz#6e8c114ff5d36a41148e146a253734d3bb8807d3"
+ resolved "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz"
integrity sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==
"@lezer/highlight@^1.0.0":
version "1.2.3"
- resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.2.3.tgz#a20f324b71148a2ea9ba6ff42e58bbfaec702857"
+ resolved "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz"
integrity sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==
dependencies:
"@lezer/common" "^1.3.0"
"@lezer/lr@^1.0.0":
version "1.4.8"
- resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.4.8.tgz#333de9bc9346057323ff09beb4cda47ccc38a498"
+ resolved "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.8.tgz"
integrity sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==
dependencies:
"@lezer/common" "^1.0.0"
"@marijn/find-cluster-break@^1.0.0":
version "1.0.2"
- resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8"
+ resolved "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz"
integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==
+"@monaco-editor/loader@^1.5.0":
+ version "1.7.0"
+ resolved "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz"
+ integrity sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==
+ dependencies:
+ state-local "^1.0.6"
+
+"@monaco-editor/react@^4.6.0", "@monaco-editor/react@^4.7.0":
+ version "4.7.0"
+ resolved "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz"
+ integrity sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==
+ dependencies:
+ "@monaco-editor/loader" "^1.5.0"
+
"@napi-rs/wasm-runtime@^1.1.1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz#e25454b4d44cfabd21d1bc801705359870e33ecc"
@@ -436,12 +773,142 @@
"@oxc-project/types@=0.122.0":
version "0.122.0"
- resolved "https://registry.yarnpkg.com/@oxc-project/types/-/types-0.122.0.tgz#2f4e77a3b183c87b2a326affd703ef71ba836601"
+ resolved "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz"
integrity sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==
+"@radix-ui/primitive@1.1.3":
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz"
+ integrity sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==
+
+"@radix-ui/react-collection@1.1.7":
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz"
+ integrity sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.2"
+ "@radix-ui/react-context" "1.1.2"
+ "@radix-ui/react-primitive" "2.1.3"
+ "@radix-ui/react-slot" "1.2.3"
+
+"@radix-ui/react-compose-refs@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz"
+ integrity sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==
+
+"@radix-ui/react-context@1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz"
+ integrity sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==
+
+"@radix-ui/react-dismissable-layer@1.1.11":
+ version "1.1.11"
+ resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz"
+ integrity sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==
+ dependencies:
+ "@radix-ui/primitive" "1.1.3"
+ "@radix-ui/react-compose-refs" "1.1.2"
+ "@radix-ui/react-primitive" "2.1.3"
+ "@radix-ui/react-use-callback-ref" "1.1.1"
+ "@radix-ui/react-use-escape-keydown" "1.1.1"
+
+"@radix-ui/react-portal@1.1.9":
+ version "1.1.9"
+ resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz"
+ integrity sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==
+ dependencies:
+ "@radix-ui/react-primitive" "2.1.3"
+ "@radix-ui/react-use-layout-effect" "1.1.1"
+
+"@radix-ui/react-presence@1.1.5":
+ version "1.1.5"
+ resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz"
+ integrity sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.2"
+ "@radix-ui/react-use-layout-effect" "1.1.1"
+
+"@radix-ui/react-primitive@2.1.3":
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz"
+ integrity sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==
+ dependencies:
+ "@radix-ui/react-slot" "1.2.3"
+
+"@radix-ui/react-slot@1.2.3":
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz"
+ integrity sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.2"
+
+"@radix-ui/react-slot@^1.1.0":
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.4.tgz"
+ integrity sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==
+ dependencies:
+ "@radix-ui/react-compose-refs" "1.1.2"
+
+"@radix-ui/react-toast@^1.2.1":
+ version "1.2.15"
+ resolved "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz"
+ integrity sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==
+ dependencies:
+ "@radix-ui/primitive" "1.1.3"
+ "@radix-ui/react-collection" "1.1.7"
+ "@radix-ui/react-compose-refs" "1.1.2"
+ "@radix-ui/react-context" "1.1.2"
+ "@radix-ui/react-dismissable-layer" "1.1.11"
+ "@radix-ui/react-portal" "1.1.9"
+ "@radix-ui/react-presence" "1.1.5"
+ "@radix-ui/react-primitive" "2.1.3"
+ "@radix-ui/react-use-callback-ref" "1.1.1"
+ "@radix-ui/react-use-controllable-state" "1.2.2"
+ "@radix-ui/react-use-layout-effect" "1.1.1"
+ "@radix-ui/react-visually-hidden" "1.2.3"
+
+"@radix-ui/react-use-callback-ref@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz"
+ integrity sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==
+
+"@radix-ui/react-use-controllable-state@1.2.2":
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz"
+ integrity sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==
+ dependencies:
+ "@radix-ui/react-use-effect-event" "0.0.2"
+ "@radix-ui/react-use-layout-effect" "1.1.1"
+
+"@radix-ui/react-use-effect-event@0.0.2":
+ version "0.0.2"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz"
+ integrity sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==
+ dependencies:
+ "@radix-ui/react-use-layout-effect" "1.1.1"
+
+"@radix-ui/react-use-escape-keydown@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz"
+ integrity sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==
+ dependencies:
+ "@radix-ui/react-use-callback-ref" "1.1.1"
+
+"@radix-ui/react-use-layout-effect@1.1.1":
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz"
+ integrity sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==
+
+"@radix-ui/react-visually-hidden@1.2.3":
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz"
+ integrity sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==
+ dependencies:
+ "@radix-ui/react-primitive" "2.1.3"
+
"@reduxjs/toolkit@^1.9.0 || 2.x.x":
version "2.11.2"
- resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.11.2.tgz#582225acea567329ca6848583e7dd72580d38e82"
+ resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.11.2.tgz"
integrity sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ==
dependencies:
"@standard-schema/spec" "^1.0.0"
@@ -525,32 +992,32 @@
"@rolldown/binding-win32-x64-msvc@1.0.0-rc.12":
version "1.0.0-rc.12"
- resolved "https://registry.yarnpkg.com/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz#d762765d5660598a96b570b513f535c151272985"
+ resolved "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz"
integrity sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==
"@rolldown/pluginutils@1.0.0-rc.12":
version "1.0.0-rc.12"
- resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz#74163aec62fa51cee18d62709483963dceb3f6dc"
+ resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz"
integrity sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==
"@rolldown/pluginutils@1.0.0-rc.7":
version "1.0.0-rc.7"
- resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz#0414869467f0e471a6515d4f506c85fde867e022"
+ resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.7.tgz"
integrity sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==
"@standard-schema/spec@^1.0.0":
version "1.1.0"
- resolved "https://registry.yarnpkg.com/@standard-schema/spec/-/spec-1.1.0.tgz#a79b55dbaf8604812f52d140b2c9ab41bc150bb8"
+ resolved "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz"
integrity sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==
"@standard-schema/utils@^0.3.0":
version "0.3.0"
- resolved "https://registry.yarnpkg.com/@standard-schema/utils/-/utils-0.3.0.tgz#3d5e608f16c2390c10528e98e59aef6bf73cae7b"
+ resolved "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz"
integrity sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==
"@tailwindcss/node@4.2.2":
version "4.2.2"
- resolved "https://registry.yarnpkg.com/@tailwindcss/node/-/node-4.2.2.tgz#840e904226dc1b379609de8a72323fc211568993"
+ resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz"
integrity sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==
dependencies:
"@jridgewell/remapping" "^2.3.5"
@@ -625,12 +1092,12 @@
"@tailwindcss/oxide-win32-x64-msvc@4.2.2":
version "4.2.2"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz#10fc71b73883f9c3999b5b8c338fd96a45240dcb"
+ resolved "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz"
integrity sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==
"@tailwindcss/oxide@4.2.2":
version "4.2.2"
- resolved "https://registry.yarnpkg.com/@tailwindcss/oxide/-/oxide-4.2.2.tgz#c6534cb4b22650df605a58258235523a6abd7de8"
+ resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz"
integrity sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==
optionalDependencies:
"@tailwindcss/oxide-android-arm64" "4.2.2"
@@ -648,113 +1115,123 @@
"@tailwindcss/vite@^4.2.2":
version "4.2.2"
- resolved "https://registry.yarnpkg.com/@tailwindcss/vite/-/vite-4.2.2.tgz#49240a41691c34b78ed4a80d07a39301f1a5129f"
+ resolved "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz"
integrity sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==
dependencies:
"@tailwindcss/node" "4.2.2"
"@tailwindcss/oxide" "4.2.2"
tailwindcss "4.2.2"
+"@tweenjs/tween.js@18 - 25":
+ version "25.0.0"
+ resolved "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz"
+ integrity sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==
+
"@tybys/wasm-util@^0.10.1":
version "0.10.1"
- resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414"
+ resolved "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz"
integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==
dependencies:
tslib "^2.4.0"
"@types/d3-array@^3.0.3":
version "3.2.2"
- resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.2.tgz#e02151464d02d4a1b44646d0fcdb93faf88fde8c"
+ resolved "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz"
integrity sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==
"@types/d3-color@*":
version "3.1.3"
- resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2"
+ resolved "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz"
integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==
"@types/d3-ease@^3.0.0":
version "3.0.2"
- resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b"
+ resolved "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz"
integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==
"@types/d3-interpolate@^3.0.1":
version "3.0.4"
- resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c"
+ resolved "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz"
integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==
dependencies:
"@types/d3-color" "*"
"@types/d3-path@*":
version "3.1.1"
- resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.1.tgz#f632b380c3aca1dba8e34aa049bcd6a4af23df8a"
+ resolved "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz"
integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==
"@types/d3-scale@^4.0.2":
version "4.0.9"
- resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.9.tgz#57a2f707242e6fe1de81ad7bfcccaaf606179afb"
+ resolved "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz"
integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==
dependencies:
"@types/d3-time" "*"
"@types/d3-shape@^3.1.0":
version "3.1.8"
- resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.8.tgz#d1516cc508753be06852cd06758e3bb54a22b0e3"
+ resolved "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz"
integrity sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==
dependencies:
"@types/d3-path" "*"
"@types/d3-time@*", "@types/d3-time@^3.0.0":
version "3.0.4"
- resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f"
+ resolved "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz"
integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==
"@types/d3-timer@^3.0.0":
version "3.0.2"
- resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70"
+ resolved "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz"
integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==
"@types/estree@^1.0.6":
version "1.0.8"
- resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e"
+ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
"@types/json-schema@^7.0.15":
version "7.0.15"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz"
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
"@types/node@^24.12.0":
version "24.12.2"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-24.12.2.tgz#353cb161dbf1785ea25e8829ba7ec574c5c629ac"
+ resolved "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz"
integrity sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==
dependencies:
undici-types "~7.16.0"
"@types/react-dom@^19.2.3":
version "19.2.3"
- resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.2.3.tgz#c1e305d15a52a3e508d54dca770d202cb63abf2c"
+ resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz"
integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==
"@types/react-transition-group@^4.4.1":
version "4.4.12"
- resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044"
+ resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
"@types/react@^19.2.14":
version "19.2.14"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.14.tgz#39604929b5e3957e3a6fa0001dafb17c7af70bad"
+ resolved "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz"
integrity sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==
dependencies:
csstype "^3.2.2"
+"@types/trusted-types@^2.0.7":
+ version "2.0.7"
+ resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz"
+ integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==
+
"@types/use-sync-external-store@^0.0.6":
version "0.0.6"
- resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz#60be8d21baab8c305132eb9cb912ed497852aadc"
+ resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz"
integrity sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==
"@typescript-eslint/eslint-plugin@8.58.0":
version "8.58.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz#ad40e492f1931f46da1bd888e52b9e56df9063aa"
+ resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz"
integrity sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==
dependencies:
"@eslint-community/regexpp" "^4.12.2"
@@ -768,7 +1245,7 @@
"@typescript-eslint/parser@8.58.0":
version "8.58.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.58.0.tgz#da04ece1967b6c2fe8f10c3473dabf3825795ef7"
+ resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.58.0.tgz"
integrity sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==
dependencies:
"@typescript-eslint/scope-manager" "8.58.0"
@@ -779,7 +1256,7 @@
"@typescript-eslint/project-service@8.58.0":
version "8.58.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.58.0.tgz#66ceda0aabf7427aec3e2713fa43eb278dead2aa"
+ resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.0.tgz"
integrity sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==
dependencies:
"@typescript-eslint/tsconfig-utils" "^8.58.0"
@@ -788,7 +1265,7 @@
"@typescript-eslint/scope-manager@8.58.0":
version "8.58.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz#e304142775e49a1b7ac3c8bf2536714447c72cab"
+ resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.0.tgz"
integrity sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==
dependencies:
"@typescript-eslint/types" "8.58.0"
@@ -796,12 +1273,12 @@
"@typescript-eslint/tsconfig-utils@8.58.0", "@typescript-eslint/tsconfig-utils@^8.58.0":
version "8.58.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz#c5a8edb21f31e0fdee565724e1b984171c559482"
+ resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.0.tgz"
integrity sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==
"@typescript-eslint/type-utils@8.58.0":
version "8.58.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz#ce0e72cd967ffbbe8de322db6089bd4374be352f"
+ resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.58.0.tgz"
integrity sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==
dependencies:
"@typescript-eslint/types" "8.58.0"
@@ -812,12 +1289,12 @@
"@typescript-eslint/types@8.58.0", "@typescript-eslint/types@^8.58.0":
version "8.58.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.58.0.tgz#e94ae7abdc1c6530e71183c1007b61fa93112a5a"
+ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz"
integrity sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==
"@typescript-eslint/typescript-estree@8.58.0":
version "8.58.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz#ed233faa8e2f2a2e1357c3e7d553d6465a0ee59a"
+ resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.0.tgz"
integrity sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==
dependencies:
"@typescript-eslint/project-service" "8.58.0"
@@ -832,7 +1309,7 @@
"@typescript-eslint/utils@8.58.0":
version "8.58.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.58.0.tgz#21a74a7963b0d288b719a4121c7dd555adaab3c3"
+ resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.0.tgz"
integrity sha512-RfeSqcFeHMHlAWzt4TBjWOAtoW9lnsAGiP3GbaX9uVgTYYrMbVnGONEfUCiSss+xMHFl+eHZiipmA8WkQ7FuNA==
dependencies:
"@eslint-community/eslint-utils" "^4.9.1"
@@ -842,7 +1319,7 @@
"@typescript-eslint/visitor-keys@8.58.0":
version "8.58.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz#2abd55a4be70fd55967aceaba4330b9ba9f45189"
+ resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.0.tgz"
integrity sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==
dependencies:
"@typescript-eslint/types" "8.58.0"
@@ -850,7 +1327,7 @@
"@uiw/codemirror-extensions-basic-setup@4.25.9":
version "4.25.9"
- resolved "https://registry.yarnpkg.com/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.9.tgz#67e584f437ea40eb2fbbc29a1b489d451c6164e2"
+ resolved "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.9.tgz"
integrity sha512-QFAqr+pu6lDmNpAlecODcF49TlsrZ0bj15zPzfhiqSDl+Um3EsDLFLppixC7kFLn+rdDM2LTvVjn5CPvefpRgw==
dependencies:
"@codemirror/autocomplete" "^6.0.0"
@@ -863,7 +1340,7 @@
"@uiw/react-codemirror@^4.25.8":
version "4.25.9"
- resolved "https://registry.yarnpkg.com/@uiw/react-codemirror/-/react-codemirror-4.25.9.tgz#f0c1f7c9b28c696dcb339e074fe8aa02912214c8"
+ resolved "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.9.tgz"
integrity sha512-HftqCBUYShAOH0pGi1CHP8vfm5L8fQ3+0j0VI6lQD6QpK+UBu3J7nxfEN5O/BXMilMNf9ZyFJRvRcuMMOLHMng==
dependencies:
"@babel/runtime" "^7.18.6"
@@ -875,32 +1352,42 @@
"@vitejs/plugin-react@^6.0.1":
version "6.0.1"
- resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz#d9113b71a0a592714913eafd9e5e63bcafd0ff15"
+ resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz"
integrity sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ==
dependencies:
"@rolldown/pluginutils" "1.0.0-rc.7"
+"@vscode/iconv-lite-umd@0.7.1":
+ version "0.7.1"
+ resolved "https://registry.npmjs.org/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.1.tgz"
+ integrity sha512-tK6k0DXFHW7q5+GGuGZO+phpAqpxO4WXl+BLc/8/uOk3RsM2ssAL3CQUQDb1TGfwltjsauhN6S4ghYZzs4sPFw==
+
accepts@~1.3.5:
version "1.3.8"
- resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz"
integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
dependencies:
mime-types "~2.1.34"
negotiator "0.6.3"
+accessor-fn@1:
+ version "1.5.3"
+ resolved "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz"
+ integrity sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==
+
acorn-jsx@^5.3.2:
version "5.3.2"
- resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn@^8.15.0:
version "8.16.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz"
integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==
ajv@6.10.0:
version "6.10.0"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz"
integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==
dependencies:
fast-deep-equal "^2.0.1"
@@ -910,7 +1397,7 @@ ajv@6.10.0:
ajv@^6.14.0:
version "6.14.0"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz"
integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==
dependencies:
fast-deep-equal "^3.1.1"
@@ -920,7 +1407,7 @@ ajv@^6.14.0:
amqplib@0.5.2:
version "0.5.2"
- resolved "https://registry.yarnpkg.com/amqplib/-/amqplib-0.5.2.tgz#d2d7313c7ffaa4d10bcf1e6252de4591b6cc7b63"
+ resolved "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz"
integrity sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==
dependencies:
bitsyntax "~0.0.4"
@@ -931,31 +1418,31 @@ amqplib@0.5.2:
ansi-styles@^3.2.1:
version "3.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
ansi-styles@^4.1.0:
version "4.3.0"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
app-root-path@2.1.0:
version "2.1.0"
- resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.1.0.tgz#98bf6599327ecea199309866e8140368fd2e646a"
+ resolved "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz"
integrity sha512-z5BqVjscbjmJBybKlICogJR2jCr2q/Ixu7Pvui5D4y97i7FLsJlvEG9XOR/KJRlkxxZz7UaaS2TMwQh1dRJ2dA==
argparse@^2.0.1:
version "2.0.1"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b"
+ resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz"
integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==
dependencies:
call-bound "^1.0.3"
@@ -963,12 +1450,12 @@ array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
array-flatten@1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz"
integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
array.prototype.reduce@^1.0.8:
version "1.0.8"
- resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz#42f97f5078daedca687d4463fd3c05cbfd83da57"
+ resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz"
integrity sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==
dependencies:
call-bind "^1.0.8"
@@ -982,7 +1469,7 @@ array.prototype.reduce@^1.0.8:
arraybuffer.prototype.slice@^1.0.4:
version "1.0.4"
- resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c"
+ resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz"
integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==
dependencies:
array-buffer-byte-length "^1.0.1"
@@ -995,41 +1482,41 @@ arraybuffer.prototype.slice@^1.0.4:
asn1@0.2.3:
version "0.2.3"
- resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+ resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz"
integrity sha512-6i37w/+EhlWlGUJff3T/Q8u1RGmP5wgbiwYnOnbOqvtrPxT63/sYFyP9RcpxtxGymtfA075IvmOnL7ycNOWl3w==
async-function@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b"
+ resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz"
integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==
async-limiter@~1.0.0:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+ resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz"
integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
async-retry@1.2.3:
version "1.2.3"
- resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.2.3.tgz#a6521f338358d322b1a0012b79030c6f411d1ce0"
+ resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.2.3.tgz"
integrity sha512-tfDb02Th6CE6pJUF2gjW5ZVjsgwlucVXOEQMvEX9JgSJMs9gAX+Nz3xRuJBKuUYjTSYORqvDBORdAQ3LU59g7Q==
dependencies:
retry "0.12.0"
asynckit@^0.4.0:
version "0.4.0"
- resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
available-typed-arrays@^1.0.7:
version "1.0.7"
- resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
+ resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz"
integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
dependencies:
possible-typed-array-names "^1.0.0"
axios@^1.13.6:
version "1.14.0"
- resolved "https://registry.yarnpkg.com/axios/-/axios-1.14.0.tgz#7c29f4cf2ea91ef05018d5aa5399bf23ed3120eb"
+ resolved "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz"
integrity sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==
dependencies:
follow-redirects "^1.15.11"
@@ -1038,7 +1525,7 @@ axios@^1.13.6:
babel-runtime@6.26.0:
version "6.26.0"
- resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz"
integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==
dependencies:
core-js "^2.4.0"
@@ -1046,41 +1533,46 @@ babel-runtime@6.26.0:
balanced-match@^1.0.0:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
balanced-match@^4.0.2:
version "4.0.4"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz"
integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==
baseline-browser-mapping@^2.10.12:
version "2.10.14"
- resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz#d25463733a8f80bb59ab9f797c902dc88832d47c"
+ resolved "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz"
integrity sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA==
basic-auth@~2.0.0:
version "2.0.1"
- resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a"
+ resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz"
integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==
dependencies:
safe-buffer "5.1.2"
+"bezier-js@3 - 6":
+ version "6.1.4"
+ resolved "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz"
+ integrity sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==
+
bitsyntax@~0.0.4:
version "0.0.4"
- resolved "https://registry.yarnpkg.com/bitsyntax/-/bitsyntax-0.0.4.tgz#eb10cc6f82b8c490e3e85698f07e83d46e0cba82"
+ resolved "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz"
integrity sha512-Pav3HSZXD2NLQOWfJldY3bpJLt8+HS2nUo5Z1bLLmHg2vCE/cM1qfEvNjlYo7GgYQPneNr715Bh42i01ZHZPvw==
dependencies:
buffer-more-ints "0.0.2"
bluebird@^3.4.6:
version "3.7.2"
- resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
body-parser@1.18.3:
version "1.18.3"
- resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4"
+ resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz"
integrity sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ==
dependencies:
bytes "3.0.0"
@@ -1096,22 +1588,29 @@ body-parser@1.18.3:
brace-expansion@^1.1.7:
version "1.1.13"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.13.tgz#d37875c01dc9eff988dd49d112a57cb67b54efe6"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz"
integrity sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
+brace-expansion@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz"
+ integrity sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==
+ dependencies:
+ balanced-match "^1.0.0"
+
brace-expansion@^5.0.5:
version "5.0.5"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz"
integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==
dependencies:
balanced-match "^4.0.2"
browserslist@^4.24.0:
version "4.28.2"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.2.tgz#f50b65362ef48974ca9f50b3680566d786b811d2"
+ resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz"
integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==
dependencies:
baseline-browser-mapping "^2.10.12"
@@ -1122,22 +1621,22 @@ browserslist@^4.24.0:
buffer-equal-constant-time@^1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
+ resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz"
integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==
buffer-more-ints@0.0.2:
version "0.0.2"
- resolved "https://registry.yarnpkg.com/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz#26b3885d10fa13db7fc01aae3aab870199e0124c"
+ resolved "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz"
integrity sha512-PDgX2QJgUc5+Jb2xAoBFP5MxhtVUmZHR33ak+m/SDxRdCrbnX1BggRIaxiW7ImwfmO4iJeCQKN18ToSXWGjYkA==
bytes@3.0.0:
version "3.0.0"
- resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+ resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz"
integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==
call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
+ resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz"
integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
dependencies:
es-errors "^1.3.0"
@@ -1145,7 +1644,7 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-
call-bind@^1.0.7, call-bind@^1.0.8:
version "1.0.8"
- resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c"
+ resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz"
integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==
dependencies:
call-bind-apply-helpers "^1.0.0"
@@ -1155,7 +1654,7 @@ call-bind@^1.0.7, call-bind@^1.0.8:
call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4:
version "1.0.4"
- resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a"
+ resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz"
integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
dependencies:
call-bind-apply-helpers "^1.0.2"
@@ -1163,17 +1662,24 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4:
callsites@^3.0.0:
version "3.1.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
caniuse-lite@^1.0.30001782:
version "1.0.30001784"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz#bdf9733a0813ccfb5ab4d02f2127e62ee4c6b718"
+ resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001784.tgz"
integrity sha512-WU346nBTklUV9YfUl60fqRbU5ZqyXlqvo1SgigE1OAXK5bFL8LL9q1K7aap3N739l4BvNqnkm3YrGHiY9sfUQw==
+canvas-color-tracker@^1.3:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz"
+ integrity sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg==
+ dependencies:
+ tinycolor2 "^1.6.0"
+
chalk@2.4.1:
version "2.4.1"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz"
integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==
dependencies:
ansi-styles "^3.2.1"
@@ -1182,20 +1688,27 @@ chalk@2.4.1:
chalk@^4.0.0:
version "4.1.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+class-variance-authority@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz"
+ integrity sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==
+ dependencies:
+ clsx "^2.1.1"
+
clsx@^2.1.1:
version "2.1.1"
- resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999"
+ resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz"
integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==
codemirror@^6.0.0:
version "6.0.2"
- resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-6.0.2.tgz#4d3fea1ad60b6753f97ca835f2f48c6936a8946e"
+ resolved "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz"
integrity sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==
dependencies:
"@codemirror/autocomplete" "^6.0.0"
@@ -1208,38 +1721,38 @@ codemirror@^6.0.0:
color-convert@^1.9.0:
version "1.9.3"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
dependencies:
color-name "1.1.3"
color-convert@^2.0.1:
version "2.0.1"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
dependencies:
color-name "~1.1.4"
color-name@1.1.3:
version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@~1.1.4:
version "1.1.4"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
combined-stream@^1.0.8:
version "1.0.8"
- resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
dependencies:
delayed-stream "~1.0.0"
commands-events@1.0.4:
version "1.0.4"
- resolved "https://registry.yarnpkg.com/commands-events/-/commands-events-1.0.4.tgz#772123d7f175b2984474bce37a722f4c2d3d2830"
+ resolved "https://registry.npmjs.org/commands-events/-/commands-events-1.0.4.tgz"
integrity sha512-HdP/+1Anoc7z+6L2h7nd4Imz54+LW+BjMGt30riBZrZ3ZeP/8el93wD8Jj8ltAaqVslqNgjX6qlhSBJwuDSmpg==
dependencies:
"@babel/runtime" "7.2.0"
@@ -1248,19 +1761,19 @@ commands-events@1.0.4:
comparejs@1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/comparejs/-/comparejs-1.0.0.tgz#1f61a4c2c19c5aed08983952e88bd1fe8924e3df"
+ resolved "https://registry.npmjs.org/comparejs/-/comparejs-1.0.0.tgz"
integrity sha512-Ue/Zd9aOucHzHXwaCe4yeHR7jypp7TKrIBZ5yls35nPNiVXlW14npmNVKM1ZaLlQTKZ6/4ewA//gYKHHIwCpOw==
compressible@~2.0.14:
version "2.0.18"
- resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
+ resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz"
integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
dependencies:
mime-db ">= 1.43.0 < 2"
compression@1.7.3:
version "1.7.3"
- resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db"
+ resolved "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz"
integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==
dependencies:
accepts "~1.3.5"
@@ -1273,57 +1786,57 @@ compression@1.7.3:
concat-map@0.0.1:
version "0.0.1"
- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
content-disposition@0.5.2:
version "0.5.2"
- resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+ resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz"
integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==
content-type@1.0.4:
version "1.0.4"
- resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+ resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz"
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
content-type@~1.0.4:
version "1.0.5"
- resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+ resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz"
integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
convert-source-map@^2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
cookie-signature@1.0.6:
version "1.0.6"
- resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz"
integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
cookie@0.3.1:
version "0.3.1"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz"
integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==
cookie@^1.0.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.1.1.tgz#3bb9bdfc82369db9c2f69c93c9c3ceb310c88b3c"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz"
integrity sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==
core-js@^2.4.0:
version "2.6.12"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz"
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-util-is@~1.0.0:
version "1.0.3"
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz"
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
cors@2.8.5:
version "2.8.5"
- resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz"
integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
dependencies:
object-assign "^4"
@@ -1331,12 +1844,12 @@ cors@2.8.5:
crelt@^1.0.5, crelt@^1.0.6:
version "1.0.6"
- resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72"
+ resolved "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz"
integrity sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==
cross-spawn@^7.0.6:
version "7.0.6"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz"
integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
dependencies:
path-key "^3.1.0"
@@ -1345,7 +1858,7 @@ cross-spawn@^7.0.6:
crypto2@2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/crypto2/-/crypto2-2.0.0.tgz#5539f45b283d8c2bdca0ea4faf8b34014a4ea2cd"
+ resolved "https://registry.npmjs.org/crypto2/-/crypto2-2.0.0.tgz"
integrity sha512-jdXdAgdILldLOF53md25FiQ6ybj2kUFTiRjs7msKTUoZrzgT/M1FPX5dYGJjbbwFls+RJIiZxNTC02DE/8y0ZQ==
dependencies:
babel-runtime "6.26.0"
@@ -1354,46 +1867,93 @@ crypto2@2.0.0:
csstype@^3.0.2, csstype@^3.2.2:
version "3.2.3"
- resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a"
+ resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz"
integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
-"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6:
+"d3-array@1 - 3", "d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6:
version "3.2.4"
- resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5"
+ resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"
integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
dependencies:
internmap "1 - 2"
+d3-binarytree@1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz"
+ integrity sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==
+
"d3-color@1 - 3":
version "3.1.0"
- resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2"
+ resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz"
integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
-d3-ease@^3.0.1:
+"d3-dispatch@1 - 3":
version "3.0.1"
- resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4"
+ resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz"
+ integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==
+
+"d3-drag@2 - 3":
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz"
+ integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==
+ dependencies:
+ d3-dispatch "1 - 3"
+ d3-selection "3"
+
+"d3-ease@1 - 3", d3-ease@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz"
integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==
+"d3-force-3d@2 - 3":
+ version "3.0.6"
+ resolved "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz"
+ integrity sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==
+ dependencies:
+ d3-binarytree "1"
+ d3-dispatch "1 - 3"
+ d3-octree "1"
+ d3-quadtree "1 - 3"
+ d3-timer "1 - 3"
+
"d3-format@1 - 3":
version "3.1.2"
- resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.2.tgz#01fdb46b58beb1f55b10b42ad70b6e344d5eb2ae"
+ resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz"
integrity sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==
-"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1:
+"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1:
version "3.0.1"
- resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
+ resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz"
integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
dependencies:
d3-color "1 - 3"
+d3-octree@1:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz"
+ integrity sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==
+
d3-path@^3.1.0:
version "3.1.0"
- resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526"
+ resolved "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz"
integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
-d3-scale@^4.0.2:
+"d3-quadtree@1 - 3":
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz"
+ integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==
+
+"d3-scale-chromatic@1 - 3":
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz"
+ integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==
+ dependencies:
+ d3-color "1 - 3"
+ d3-interpolate "1 - 3"
+
+"d3-scale@1 - 4", d3-scale@^4.0.2:
version "4.0.2"
- resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396"
+ resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz"
integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==
dependencies:
d3-array "2.10.0 - 3"
@@ -1402,35 +1962,62 @@ d3-scale@^4.0.2:
d3-time "2.1.1 - 3"
d3-time-format "2 - 4"
+"d3-selection@2 - 3", d3-selection@3:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz"
+ integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
+
d3-shape@^3.1.0:
version "3.2.0"
- resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5"
+ resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz"
integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==
dependencies:
d3-path "^3.1.0"
"d3-time-format@2 - 4":
version "4.1.0"
- resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a"
+ resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz"
integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==
dependencies:
d3-time "1 - 3"
"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0:
version "3.1.0"
- resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7"
+ resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz"
integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
dependencies:
d3-array "2 - 3"
-d3-timer@^3.0.1:
+"d3-timer@1 - 3", d3-timer@^3.0.1:
version "3.0.1"
- resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0"
+ resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz"
integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
+"d3-transition@2 - 3":
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz"
+ integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==
+ dependencies:
+ d3-color "1 - 3"
+ d3-dispatch "1 - 3"
+ d3-ease "1 - 3"
+ d3-interpolate "1 - 3"
+ d3-timer "1 - 3"
+
+"d3-zoom@2 - 3":
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz"
+ integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==
+ dependencies:
+ d3-dispatch "1 - 3"
+ d3-drag "2 - 3"
+ d3-interpolate "1 - 3"
+ d3-selection "2 - 3"
+ d3-transition "2 - 3"
+
data-view-buffer@^1.0.2:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570"
+ resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz"
integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==
dependencies:
call-bound "^1.0.3"
@@ -1439,7 +2026,7 @@ data-view-buffer@^1.0.2:
data-view-byte-length@^1.0.2:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735"
+ resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz"
integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==
dependencies:
call-bound "^1.0.3"
@@ -1448,7 +2035,7 @@ data-view-byte-length@^1.0.2:
data-view-byte-offset@^1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191"
+ resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz"
integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==
dependencies:
call-bound "^1.0.2"
@@ -1457,7 +2044,7 @@ data-view-byte-offset@^1.0.1:
datasette@1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/datasette/-/datasette-1.0.1.tgz#c8786bbd36be6606179e7a2525430b9dbd9395e8"
+ resolved "https://registry.npmjs.org/datasette/-/datasette-1.0.1.tgz"
integrity sha512-aJdlCBToEJUP4M57r67r4V6tltwGKa3qetnjpBtXYIlqbX9tM9jsoDMxb4xd9AGjpp3282oHRmqI5Z8TVAU0Mg==
dependencies:
comparejs "1.0.0"
@@ -1466,31 +2053,31 @@ datasette@1.0.1:
debug@2.6.9:
version "2.6.9"
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.4.3:
version "4.4.3"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"
integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
dependencies:
ms "^2.1.3"
decimal.js-light@^2.5.1:
version "2.5.1"
- resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934"
+ resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz"
integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==
deep-is@^0.1.3:
version "0.1.4"
- resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
define-data-property@^1.0.1, define-data-property@^1.1.4:
version "1.1.4"
- resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz"
integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
dependencies:
es-define-property "^1.0.0"
@@ -1499,7 +2086,7 @@ define-data-property@^1.0.1, define-data-property@^1.1.4:
define-properties@^1.1.2, define-properties@^1.2.1:
version "1.2.1"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz"
integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
dependencies:
define-data-property "^1.0.1"
@@ -1508,42 +2095,49 @@ define-properties@^1.1.2, define-properties@^1.2.1:
delayed-stream@~1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
depd@~1.1.2:
version "1.1.2"
- resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+ resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
destroy@~1.0.4:
version "1.0.4"
- resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+ resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz"
integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==
detect-libc@^2.0.3:
version "2.1.2"
- resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad"
+ resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz"
integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==
dom-helpers@^5.0.1:
version "5.2.1"
- resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
+ resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz"
integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
dependencies:
"@babel/runtime" "^7.8.7"
csstype "^3.0.2"
+dompurify@3.3.1:
+ version "3.3.1"
+ resolved "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz"
+ integrity sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==
+ optionalDependencies:
+ "@types/trusted-types" "^2.0.7"
+
draht@1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/draht/-/draht-1.0.1.tgz#c4c8879923d2130dfa9c5930e956c85d62b1e975"
+ resolved "https://registry.npmjs.org/draht/-/draht-1.0.1.tgz"
integrity sha512-yNNHL864dniNmIE9ZKD++mKypiAUAvVZtyV0QrbXH/ak3ebzFqo5xsmRBRqV8pZVhImOSBiyq500Wcmrf44zAg==
dependencies:
eventemitter2 "5.0.1"
dunder-proto@^1.0.0, dunder-proto@^1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
+ resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz"
integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
dependencies:
call-bind-apply-helpers "^1.0.1"
@@ -1552,29 +2146,29 @@ dunder-proto@^1.0.0, dunder-proto@^1.0.1:
ecdsa-sig-formatter@1.0.11:
version "1.0.11"
- resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
+ resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz"
integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
dependencies:
safe-buffer "^5.0.1"
ee-first@1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
electron-to-chromium@^1.5.328:
version "1.5.331"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz#3e4e845042d517c68b3c00be5fc33204f13b2058"
+ resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz"
integrity sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q==
encodeurl@~1.0.2:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz"
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
enhanced-resolve@^5.19.0:
version "5.20.1"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz#eeeb3966bea62c348c40a0cc9e7912e2557d0be0"
+ resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz"
integrity sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==
dependencies:
graceful-fs "^4.2.4"
@@ -1582,7 +2176,7 @@ enhanced-resolve@^5.19.0:
es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0:
version "1.24.1"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.1.tgz#f0c131ed5ea1bb2411134a8dd94def09c46c7899"
+ resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz"
integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==
dependencies:
array-buffer-byte-length "^1.0.2"
@@ -1642,29 +2236,29 @@ es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0:
es-array-method-boxes-properly@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e"
+ resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz"
integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==
es-define-property@^1.0.0, es-define-property@^1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
+ resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz"
integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
es-errors@^1.3.0:
version "1.3.0"
- resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz"
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1"
+ resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz"
integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
dependencies:
es-errors "^1.3.0"
es-set-tostringtag@^2.1.0:
version "2.1.0"
- resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
+ resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz"
integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
dependencies:
es-errors "^1.3.0"
@@ -1674,7 +2268,7 @@ es-set-tostringtag@^2.1.0:
es-to-primitive@^1.3.0:
version "1.3.0"
- resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18"
+ resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz"
integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==
dependencies:
is-callable "^1.2.7"
@@ -1683,32 +2277,32 @@ es-to-primitive@^1.3.0:
es-toolkit@^1.39.3:
version "1.45.1"
- resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.45.1.tgz#21b28b2bd43178fd4c9c937c445d5bcaccce907b"
+ resolved "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.45.1.tgz"
integrity sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==
escalade@^3.2.0:
version "3.2.0"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"
integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
escape-html@~1.0.3:
version "1.0.3"
- resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
escape-string-regexp@^1.0.5:
version "1.0.5"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
escape-string-regexp@^4.0.0:
version "4.0.0"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
eslint-plugin-react-hooks@^7.0.1:
version "7.0.1"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz#66e258db58ece50723ef20cc159f8aa908219169"
+ resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz"
integrity sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==
dependencies:
"@babel/core" "^7.24.4"
@@ -1719,12 +2313,12 @@ eslint-plugin-react-hooks@^7.0.1:
eslint-plugin-react-refresh@^0.5.2:
version "0.5.2"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz#39e11021be10e1cd9adab2bdeabc65b17222409f"
+ resolved "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.2.tgz"
integrity sha512-hmgTH57GfzoTFjVN0yBwTggnsVUF2tcqi7RJZHqi9lIezSs4eFyAMktA68YD4r5kNw1mxyY4dmkyoFDb3FIqrA==
eslint-scope@^8.4.0:
version "8.4.0"
- resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82"
+ resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz"
integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==
dependencies:
esrecurse "^4.3.0"
@@ -1732,22 +2326,22 @@ eslint-scope@^8.4.0:
eslint-visitor-keys@^3.4.3:
version "3.4.3"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint-visitor-keys@^4.2.1:
version "4.2.1"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz"
integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==
eslint-visitor-keys@^5.0.0:
version "5.0.1"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz"
integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==
eslint@^9.39.4:
version "9.39.4"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.4.tgz#855da1b2e2ad66dc5991195f35e262bcec8117b5"
+ resolved "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz"
integrity sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==
dependencies:
"@eslint-community/eslint-utils" "^4.8.0"
@@ -1787,7 +2381,7 @@ eslint@^9.39.4:
espree@^10.0.1, espree@^10.4.0:
version "10.4.0"
- resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837"
+ resolved "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz"
integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==
dependencies:
acorn "^8.15.0"
@@ -1796,46 +2390,46 @@ espree@^10.0.1, espree@^10.4.0:
esquery@^1.5.0:
version "1.7.0"
- resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d"
+ resolved "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz"
integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==
dependencies:
estraverse "^5.1.0"
esrecurse@^4.3.0:
version "4.3.0"
- resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
dependencies:
estraverse "^5.2.0"
estraverse@^5.1.0, estraverse@^5.2.0:
version "5.3.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
esutils@^2.0.2:
version "2.0.3"
- resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
etag@~1.8.1:
version "1.8.1"
- resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz"
integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
eventemitter2@5.0.1:
version "5.0.1"
- resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452"
+ resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz"
integrity sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==
eventemitter3@^5.0.1:
version "5.0.4"
- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.4.tgz#a86d66170433712dde814707ac52b5271ceb1feb"
+ resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz"
integrity sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==
"express@4.16.4 ":
version "4.16.4"
- resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
+ resolved "https://registry.npmjs.org/express/-/express-4.16.4.tgz"
integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==
dependencies:
accepts "~1.3.5"
@@ -1871,39 +2465,55 @@ eventemitter3@^5.0.1:
fast-deep-equal@^2.0.1:
version "2.0.1"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz"
integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
fast-levenshtein@^2.0.6:
version "2.0.6"
- resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
fdir@^6.5.0:
version "6.5.0"
- resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350"
+ resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"
integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
file-entry-cache@^8.0.0:
version "8.0.0"
- resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f"
+ resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz"
integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==
dependencies:
flat-cache "^4.0.0"
+file-surf@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/file-surf/-/file-surf-1.0.3.tgz"
+ integrity sha512-XdNCxUASI/teXZ22/e4eDtPWhqqzDSWkkd0TFdqH3y8KUdSCpleZtId5XAahDxvdJdQDoWrpe8+SQiVb9yD5OQ==
+ dependencies:
+ "@monaco-editor/react" "^4.6.0"
+ "@radix-ui/react-slot" "^1.1.0"
+ "@radix-ui/react-toast" "^1.2.1"
+ class-variance-authority "^0.7.1"
+ clsx "^2.1.1"
+ lucide-react "^0.462.0"
+ monaco-editor "^0.45.0"
+ sonner "^1.5.0"
+ tailwind-merge "^2.5.2"
+ tailwindcss-animate "^1.0.7"
+
finalhandler@1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
+ resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz"
integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==
dependencies:
debug "2.6.9"
@@ -1916,12 +2526,12 @@ finalhandler@1.1.1:
find-root@1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
+ resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz"
integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
find-up@^5.0.0:
version "5.0.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
dependencies:
locate-path "^6.0.0"
@@ -1929,7 +2539,7 @@ find-up@^5.0.0:
flaschenpost@1.1.3:
version "1.1.3"
- resolved "https://registry.yarnpkg.com/flaschenpost/-/flaschenpost-1.1.3.tgz#2c1e7bf4eecf9f30333dd672b427a174c2d37449"
+ resolved "https://registry.npmjs.org/flaschenpost/-/flaschenpost-1.1.3.tgz"
integrity sha512-1VAYPvDsVBGFJyUrOa/6clnJwZYC3qVq9nJLcypy6lvaaNbo1wOQiH8HQ+4Fw/k51pVG7JHzSf5epb8lmIW86g==
dependencies:
"@babel/runtime" "7.2.0"
@@ -1949,7 +2559,7 @@ flaschenpost@1.1.3:
flat-cache@^4.0.0:
version "4.0.1"
- resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c"
+ resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz"
integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==
dependencies:
flatted "^3.2.9"
@@ -1957,24 +2567,54 @@ flat-cache@^4.0.0:
flatted@^3.2.9:
version "3.4.2"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726"
+ resolved "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz"
integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==
+float-tooltip@^1.7:
+ version "1.7.5"
+ resolved "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz"
+ integrity sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==
+ dependencies:
+ d3-selection "2 - 3"
+ kapsule "^1.16"
+ preact "10"
+
follow-redirects@^1.15.11:
version "1.15.11"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340"
+ resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz"
integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==
for-each@^0.3.3, for-each@^0.3.5:
version "0.3.5"
- resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47"
+ resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz"
integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==
dependencies:
is-callable "^1.2.7"
+force-graph@^1.51:
+ version "1.51.2"
+ resolved "https://registry.npmjs.org/force-graph/-/force-graph-1.51.2.tgz"
+ integrity sha512-zZNdMqx8qIQGurgnbgYIUsdXxSfvhfRSIdncsKGv/twUOZpwCsk9hPHmdjdcme1+epATgb41G0rkIGHJ0Wydng==
+ dependencies:
+ "@tweenjs/tween.js" "18 - 25"
+ accessor-fn "1"
+ bezier-js "3 - 6"
+ canvas-color-tracker "^1.3"
+ d3-array "1 - 3"
+ d3-drag "2 - 3"
+ d3-force-3d "2 - 3"
+ d3-scale "1 - 4"
+ d3-scale-chromatic "1 - 3"
+ d3-selection "2 - 3"
+ d3-zoom "2 - 3"
+ float-tooltip "^1.7"
+ index-array-by "1"
+ kapsule "^1.16"
+ lodash-es "4"
+
form-data@^4.0.5:
version "4.0.5"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053"
+ resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz"
integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==
dependencies:
asynckit "^0.4.0"
@@ -1985,17 +2625,17 @@ form-data@^4.0.5:
formats@1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/formats/-/formats-1.0.0.tgz#327154084786eac09d3b839cab28d150b982b163"
+ resolved "https://registry.npmjs.org/formats/-/formats-1.0.0.tgz"
integrity sha512-For0Y8egwEK96JgJo4NONErPhtl7H2QzeB2NYGmzeGeJ8a1JZqPgLYOtM3oJRCYhmgsdDFd6KGRYyfe37XY4Yg==
forwarded@0.2.0:
version "0.2.0"
- resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz"
integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
framer-motion@^12.38.0:
version "12.38.0"
- resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-12.38.0.tgz#cf28e072a95942881ca4e33fd33be41192fd146b"
+ resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz"
integrity sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==
dependencies:
motion-dom "^12.38.0"
@@ -2004,7 +2644,7 @@ framer-motion@^12.38.0:
fresh@0.5.2:
version "0.5.2"
- resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"
integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
fsevents@~2.3.3:
@@ -2014,12 +2654,12 @@ fsevents@~2.3.3:
function-bind@^1.1.2:
version "1.1.2"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
function.prototype.name@^1.1.6, function.prototype.name@^1.1.8:
version "1.1.8"
- resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78"
+ resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz"
integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==
dependencies:
call-bind "^1.0.8"
@@ -2031,22 +2671,22 @@ function.prototype.name@^1.1.6, function.prototype.name@^1.1.8:
functions-have-names@^1.2.3:
version "1.2.3"
- resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
generator-function@^2.0.0:
version "2.0.1"
- resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2"
+ resolved "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz"
integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==
gensync@^1.0.0-beta.2:
version "1.0.0-beta.2"
- resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0:
version "1.3.0"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
+ resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz"
integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
dependencies:
call-bind-apply-helpers "^1.0.2"
@@ -2062,12 +2702,12 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@
get-own-enumerable-property-symbols@^3.0.0:
version "3.0.2"
- resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664"
+ resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz"
integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==
get-proto@^1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
+ resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz"
integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
dependencies:
dunder-proto "^1.0.1"
@@ -2075,7 +2715,7 @@ get-proto@^1.0.1:
get-symbol-description@^1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee"
+ resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz"
integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==
dependencies:
call-bound "^1.0.3"
@@ -2084,24 +2724,24 @@ get-symbol-description@^1.1.0:
glob-parent@^6.0.2:
version "6.0.2"
- resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
dependencies:
is-glob "^4.0.3"
globals@^14.0.0:
version "14.0.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e"
+ resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz"
integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==
globals@^17.4.0:
version "17.4.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-17.4.0.tgz#33d7d297ed1536b388a0e2f4bcd0ff19c8ff91b5"
+ resolved "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz"
integrity sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==
globalthis@^1.0.4:
version "1.0.4"
- resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
+ resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz"
integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
dependencies:
define-properties "^1.2.1"
@@ -2109,58 +2749,58 @@ globalthis@^1.0.4:
gopd@^1.0.1, gopd@^1.2.0:
version "1.2.0"
- resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
+ resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz"
integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
graceful-fs@^4.2.4:
version "4.2.11"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
has-bigints@^1.0.2:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe"
+ resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz"
integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==
has-flag@^3.0.0:
version "3.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
has-flag@^4.0.0:
version "4.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz"
integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
dependencies:
es-define-property "^1.0.0"
has-proto@^1.2.0:
version "1.2.0"
- resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5"
+ resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz"
integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==
dependencies:
dunder-proto "^1.0.0"
has-symbols@^1.0.3, has-symbols@^1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
+ resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz"
integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
has-tostringtag@^1.0.2:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+ resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz"
integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
dependencies:
has-symbols "^1.0.3"
hase@2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/hase/-/hase-2.0.0.tgz#344aed71d00826c45d0a37cdf94fe7faf7154c60"
+ resolved "https://registry.npmjs.org/hase/-/hase-2.0.0.tgz"
integrity sha512-L83pBR/oZvQQNjv4kw9aUpTqBxERPiY7B42jsmkt1VDeUaRVhYkEIKzkCqrppjtxHe2EZqzZJzuhMXsWsxYIsw==
dependencies:
"@babel/runtime" "7.1.2"
@@ -2168,26 +2808,26 @@ hase@2.0.0:
hasown@^2.0.2:
version "2.0.2"
- resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
dependencies:
function-bind "^1.1.2"
hermes-estree@0.25.1:
version "0.25.1"
- resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480"
+ resolved "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz"
integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==
hermes-parser@^0.25.1:
version "0.25.1"
- resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.25.1.tgz#5be0e487b2090886c62bd8a11724cd766d5f54d1"
+ resolved "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz"
integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==
dependencies:
hermes-estree "0.25.1"
http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
version "1.6.3"
- resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
dependencies:
depd "~1.1.2"
@@ -2197,34 +2837,34 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
iconv-lite@0.4.23:
version "0.4.23"
- resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz"
integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==
dependencies:
safer-buffer ">= 2.1.2 < 3"
ignore@^5.2.0:
version "5.3.2"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz"
integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
ignore@^7.0.5:
version "7.0.5"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9"
+ resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz"
integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==
immer@^10.1.1:
version "10.2.0"
- resolved "https://registry.yarnpkg.com/immer/-/immer-10.2.0.tgz#88a4ce06a1af64172d254b70f7cb04df51c871b1"
+ resolved "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz"
integrity sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==
immer@^11.0.0:
version "11.1.4"
- resolved "https://registry.yarnpkg.com/immer/-/immer-11.1.4.tgz#37aee86890b134a8f1a2fadd44361fb86c6ae67e"
+ resolved "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz"
integrity sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==
import-fresh@^3.2.1:
version "3.3.1"
- resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf"
+ resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz"
integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==
dependencies:
parent-module "^1.0.0"
@@ -2232,22 +2872,27 @@ import-fresh@^3.2.1:
imurmurhash@^0.1.4:
version "0.1.4"
- resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+index-array-by@1:
+ version "1.4.2"
+ resolved "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz"
+ integrity sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==
+
inherits@2.0.3:
version "2.0.3"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
inherits@^2.0.3, inherits@~2.0.1:
version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
internal-slot@^1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961"
+ resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz"
integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==
dependencies:
es-errors "^1.3.0"
@@ -2256,17 +2901,17 @@ internal-slot@^1.1.0:
"internmap@1 - 2":
version "2.0.3"
- resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
+ resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz"
integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
ipaddr.js@1.9.1:
version "1.9.1"
- resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
version "3.0.5"
- resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280"
+ resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz"
integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==
dependencies:
call-bind "^1.0.8"
@@ -2275,7 +2920,7 @@ is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
is-async-function@^2.0.0:
version "2.1.1"
- resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523"
+ resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz"
integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==
dependencies:
async-function "^1.0.0"
@@ -2286,14 +2931,14 @@ is-async-function@^2.0.0:
is-bigint@^1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672"
+ resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz"
integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==
dependencies:
has-bigints "^1.0.2"
is-boolean-object@^1.2.1:
version "1.2.2"
- resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e"
+ resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz"
integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==
dependencies:
call-bound "^1.0.3"
@@ -2301,12 +2946,12 @@ is-boolean-object@^1.2.1:
is-callable@^1.2.7:
version "1.2.7"
- resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz"
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
is-data-view@^1.0.1, is-data-view@^1.0.2:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e"
+ resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz"
integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==
dependencies:
call-bound "^1.0.2"
@@ -2315,7 +2960,7 @@ is-data-view@^1.0.1, is-data-view@^1.0.2:
is-date-object@^1.0.5, is-date-object@^1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7"
+ resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz"
integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==
dependencies:
call-bound "^1.0.2"
@@ -2323,19 +2968,19 @@ is-date-object@^1.0.5, is-date-object@^1.1.0:
is-extglob@^2.1.1:
version "2.1.1"
- resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-finalizationregistry@^1.1.0:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90"
+ resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz"
integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==
dependencies:
call-bound "^1.0.3"
is-generator-function@^1.0.10:
version "1.1.2"
- resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5"
+ resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz"
integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==
dependencies:
call-bound "^1.0.4"
@@ -2346,24 +2991,24 @@ is-generator-function@^1.0.10:
is-glob@^4.0.0, is-glob@^4.0.3:
version "4.0.3"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
is-map@^2.0.3:
version "2.0.3"
- resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
+ resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz"
integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
is-negative-zero@^2.0.3:
version "2.0.3"
- resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
+ resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz"
integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
is-number-object@^1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541"
+ resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz"
integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==
dependencies:
call-bound "^1.0.3"
@@ -2371,12 +3016,12 @@ is-number-object@^1.1.1:
is-obj@^1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+ resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz"
integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==
is-regex@^1.2.1:
version "1.2.1"
- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22"
+ resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz"
integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==
dependencies:
call-bound "^1.0.2"
@@ -2386,24 +3031,24 @@ is-regex@^1.2.1:
is-regexp@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
+ resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz"
integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==
is-set@^2.0.3:
version "2.0.3"
- resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d"
+ resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz"
integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
is-shared-array-buffer@^1.0.4:
version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f"
+ resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz"
integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==
dependencies:
call-bound "^1.0.3"
is-string@^1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9"
+ resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz"
integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==
dependencies:
call-bound "^1.0.3"
@@ -2411,7 +3056,7 @@ is-string@^1.1.1:
is-symbol@^1.0.4, is-symbol@^1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634"
+ resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz"
integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==
dependencies:
call-bound "^1.0.2"
@@ -2420,26 +3065,26 @@ is-symbol@^1.0.4, is-symbol@^1.1.1:
is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15:
version "1.1.15"
- resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b"
+ resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz"
integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==
dependencies:
which-typed-array "^1.1.16"
is-weakmap@^2.0.2:
version "2.0.2"
- resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd"
+ resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz"
integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==
is-weakref@^1.0.2, is-weakref@^1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293"
+ resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz"
integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==
dependencies:
call-bound "^1.0.3"
is-weakset@^2.0.3:
version "2.0.4"
- resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca"
+ resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz"
integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==
dependencies:
call-bound "^1.0.3"
@@ -2447,71 +3092,81 @@ is-weakset@^2.0.3:
isarray@0.0.1:
version "0.0.1"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz"
integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==
isarray@^2.0.5:
version "2.0.5"
- resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz"
integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
isexe@^2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+jerrypick@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.2.tgz"
+ integrity sha512-YKnxXEekXKzhpf7CLYA0A+oDP8V0OhICNCr5lv96FvSsDEmrb0GKM776JgQvHTMjr7DTTPEVv/1Ciaw0uEWzBA==
+
jiti@^2.6.1:
version "2.6.1"
- resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92"
+ resolved "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz"
integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
js-yaml@^4.1.1:
version "4.1.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b"
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz"
integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==
dependencies:
argparse "^2.0.1"
+jschardet@3.1.4:
+ version "3.1.4"
+ resolved "https://registry.npmjs.org/jschardet/-/jschardet-3.1.4.tgz"
+ integrity sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg==
+
jsesc@^3.0.2:
version "3.1.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz"
integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
json-buffer@3.0.1:
version "3.0.1"
- resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
json-lines@1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/json-lines/-/json-lines-1.0.0.tgz#4ac6d7531deec3b928516c7f86897b548f82711d"
+ resolved "https://registry.npmjs.org/json-lines/-/json-lines-1.0.0.tgz"
integrity sha512-ytuLZb4RBQb3bTRsG/QBenyIo5oHLpjeCVph3s2NnoAsZE9K6h+uR+OWpEOWV1UeHdX63tYctGppBpGAc+JNMA==
dependencies:
timer2 "1.0.0"
json-schema-traverse@^0.4.1:
version "0.4.1"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
json5@^2.2.3:
version "2.2.3"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
jsonwebtoken@8.5.0:
version "8.5.0"
- resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz#ebd0ca2a69797816e1c5af65b6c759787252947e"
+ resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.0.tgz"
integrity sha512-IqEycp0znWHNA11TpYi77bVgyBO/pGESDh7Ajhas+u0ttkGkKYIIAjniL4Bw5+oVejVF+SYkaI7XKfwCCyeTuA==
dependencies:
jws "^3.2.1"
@@ -2527,7 +3182,7 @@ jsonwebtoken@8.5.0:
jwa@^1.4.2:
version "1.4.2"
- resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9"
+ resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz"
integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==
dependencies:
buffer-equal-constant-time "^1.0.1"
@@ -2536,22 +3191,29 @@ jwa@^1.4.2:
jws@^3.2.1:
version "3.2.3"
- resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.3.tgz#5ac0690b460900a27265de24520526853c0b8ca1"
+ resolved "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz"
integrity sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==
dependencies:
jwa "^1.4.2"
safe-buffer "^5.0.1"
+kapsule@^1.16:
+ version "1.16.3"
+ resolved "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz"
+ integrity sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==
+ dependencies:
+ lodash-es "4"
+
keyv@^4.5.4:
version "4.5.4"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz"
integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
dependencies:
json-buffer "3.0.1"
levn@^0.4.1:
version "0.4.1"
- resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
dependencies:
prelude-ls "^1.2.1"
@@ -2609,12 +3271,12 @@ lightningcss-win32-arm64-msvc@1.32.0:
lightningcss-win32-x64-msvc@1.32.0:
version "1.32.0"
- resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz#141aa5605645064928902bb4af045fa7d9f4220a"
+ resolved "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz"
integrity sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==
lightningcss@1.32.0, lightningcss@^1.32.0:
version "1.32.0"
- resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.32.0.tgz#b85aae96486dcb1bf49a7c8571221273f4f1e4a9"
+ resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz"
integrity sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==
dependencies:
detect-libc "^2.0.3"
@@ -2633,7 +3295,7 @@ lightningcss@1.32.0, lightningcss@^1.32.0:
limes@2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/limes/-/limes-2.0.0.tgz#32b9fa0c62fe728262c8b2316ca3496ede7153fe"
+ resolved "https://registry.npmjs.org/limes/-/limes-2.0.0.tgz"
integrity sha512-evWD0pnTgPX7QueaSoJl5JBUL30T1ZVzo34ke97tIKmeagqhBTYK/JkKL0vtG3MpNApw8ZY9TlbybfwEz9knBA==
dependencies:
"@babel/runtime" "7.3.4"
@@ -2641,153 +3303,220 @@ limes@2.0.0:
locate-path@^6.0.0:
version "6.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
dependencies:
p-locate "^5.0.0"
+lodash-es@4:
+ version "4.18.1"
+ resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz"
+ integrity sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==
+
lodash.includes@^4.3.0:
version "4.3.0"
- resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
+ resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz"
integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==
lodash.isboolean@^3.0.3:
version "3.0.3"
- resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
+ resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz"
integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==
lodash.isinteger@^4.0.4:
version "4.0.4"
- resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
+ resolved "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz"
integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==
lodash.isnumber@^3.0.3:
version "3.0.3"
- resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
+ resolved "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz"
integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==
lodash.isplainobject@^4.0.6:
version "4.0.6"
- resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+ resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz"
integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
lodash.isstring@^4.0.1:
version "4.0.1"
- resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
+ resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz"
integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==
lodash.merge@^4.6.2:
version "4.6.2"
- resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
lodash.once@^4.0.0:
version "4.1.1"
- resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
+ resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz"
integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==
lodash@4.17.11:
version "4.17.11"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
+ resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
lodash@4.17.5:
version "4.17.5"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511"
+ resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz"
integrity sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==
loose-envify@^1.4.0:
version "1.4.0"
- resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
lru-cache@^5.1.1:
version "5.1.1"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"
integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
dependencies:
yallist "^3.0.2"
+lucide-react@^0.462.0:
+ version "0.462.0"
+ resolved "https://registry.npmjs.org/lucide-react/-/lucide-react-0.462.0.tgz"
+ integrity sha512-NTL7EbAao9IFtuSivSZgrAh4fZd09Lr+6MTkqIxuHaH2nnYiYIzXPo06cOxHg9wKLdj6LL8TByG4qpePqwgx/g==
+
lusca@1.6.1:
version "1.6.1"
- resolved "https://registry.yarnpkg.com/lusca/-/lusca-1.6.1.tgz#f7445e50c720030f5ee53d1336e9e53d1786c34f"
+ resolved "https://registry.npmjs.org/lusca/-/lusca-1.6.1.tgz"
integrity sha512-+JzvUMH/rsE/4XfHdDOl70bip0beRcHSviYATQM0vtls59uVtdn1JMu4iD7ZShBpAmFG8EnaA+PrYG9sECMIOQ==
dependencies:
tsscmp "^1.0.5"
magic-string@^0.30.21:
version "0.30.21"
- resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91"
+ resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz"
integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==
dependencies:
"@jridgewell/sourcemap-codec" "^1.5.5"
+marked@14.0.0:
+ version "14.0.0"
+ resolved "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz"
+ integrity sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==
+
math-intrinsics@^1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
+ resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz"
integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
media-typer@0.3.0:
version "0.3.0"
- resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"
integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
merge-descriptors@1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+ resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz"
integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
methods@~1.1.2:
version "1.1.2"
- resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"
integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
mime-db@1.52.0:
version "1.52.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
"mime-db@>= 1.43.0 < 2":
version "1.54.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz"
integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
mime@1.4.1:
version "1.4.1"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
+ resolved "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz"
integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
minimatch@^10.2.2:
version "10.2.5"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz"
integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==
dependencies:
brace-expansion "^5.0.5"
minimatch@^3.1.5:
version "3.1.5"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz"
integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==
dependencies:
brace-expansion "^1.1.7"
+minimatch@^5.1.0:
+ version "5.1.9"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz"
+ integrity sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==
+ dependencies:
+ brace-expansion "^2.0.1"
+
moment@2.22.2:
version "2.22.2"
- resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66"
+ resolved "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz"
integrity sha512-LRvkBHaJGnrcWvqsElsOhHCzj8mU39wLx5pQ0pc6s153GynCTsPdGdqsVNKAQD9sKnWj11iF7TZx9fpLwdD3fw==
+monaco-editor@^0.45.0:
+ version "0.45.0"
+ resolved "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.45.0.tgz"
+ integrity sha512-mjv1G1ZzfEE3k9HZN0dQ2olMdwIfaeAAjFiwNprLfYNRSz7ctv9XuCT7gPtBGrMUeV1/iZzYKj17Khu1hxoHOA==
+
+monaco-languageclient@^10.7.0:
+ version "10.7.0"
+ resolved "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-10.7.0.tgz"
+ integrity sha512-oA5cOFixkF4bspVL2zMSn48LvlNR/Cu3vJ8MCVam3PdjobSULGgHtOASuZIi3FgWK42X1z8/6hrG0LCjvNu1Hw==
+ dependencies:
+ "@codingame/monaco-vscode-api" "^25.1.2"
+ "@codingame/monaco-vscode-configuration-service-override" "^25.1.2"
+ "@codingame/monaco-vscode-editor-api" "^25.1.2"
+ "@codingame/monaco-vscode-editor-service-override" "^25.1.2"
+ "@codingame/monaco-vscode-extension-api" "^25.1.2"
+ "@codingame/monaco-vscode-extensions-service-override" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-cs" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-de" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-es" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-fr" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-it" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-ja" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-ko" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-pl" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-pt-br" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-qps-ploc" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-ru" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-tr" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-zh-hans" "^25.1.2"
+ "@codingame/monaco-vscode-language-pack-zh-hant" "^25.1.2"
+ "@codingame/monaco-vscode-languages-service-override" "^25.1.2"
+ "@codingame/monaco-vscode-localization-service-override" "^25.1.2"
+ "@codingame/monaco-vscode-log-service-override" "^25.1.2"
+ "@codingame/monaco-vscode-model-service-override" "^25.1.2"
+ "@codingame/monaco-vscode-monarch-service-override" "^25.1.2"
+ "@codingame/monaco-vscode-textmate-service-override" "^25.1.2"
+ "@codingame/monaco-vscode-theme-defaults-default-extension" "^25.1.2"
+ "@codingame/monaco-vscode-theme-service-override" "^25.1.2"
+ "@codingame/monaco-vscode-views-service-override" "^25.1.2"
+ "@codingame/monaco-vscode-workbench-service-override" "^25.1.2"
+ vscode "npm:@codingame/monaco-vscode-extension-api@^25.1.2"
+ vscode-languageclient "~9.0.1"
+ vscode-languageserver-protocol "~3.17.5"
+ vscode-ws-jsonrpc "~3.5.0"
+
morgan@1.9.1:
version "1.9.1"
- resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59"
+ resolved "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz"
integrity sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==
dependencies:
basic-auth "~2.0.0"
@@ -2798,81 +3527,81 @@ morgan@1.9.1:
motion-dom@^12.38.0:
version "12.38.0"
- resolved "https://registry.yarnpkg.com/motion-dom/-/motion-dom-12.38.0.tgz#9ef3253ea0fb28b6757588327073848d940e9aab"
+ resolved "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz"
integrity sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==
dependencies:
motion-utils "^12.36.0"
motion-utils@^12.36.0:
version "12.36.0"
- resolved "https://registry.yarnpkg.com/motion-utils/-/motion-utils-12.36.0.tgz#cff2df2a28c3fe53a3de7e0103ba7f73ff7d77a7"
+ resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz"
integrity sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==
ms@2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
ms@^2.1.1, ms@^2.1.3:
version "2.1.3"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
nanoid@^3.3.11:
version "3.3.11"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz"
integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==
natural-compare@^1.4.0:
version "1.4.0"
- resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
negotiator@0.6.3:
version "0.6.3"
- resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
nocache@2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.0.0.tgz#202b48021a0c4cbde2df80de15a17443c8b43980"
+ resolved "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz"
integrity sha512-YdKcy2x0dDwOh+8BEuHvA+mnOKAhmMQDgKBOCUGaLpewdmsRYguYZSom3yA+/OrE61O/q+NMQANnun65xpI1Hw==
node-releases@^2.0.36:
version "2.0.37"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.37.tgz#9bd4f10b77ba39c2b9402d4e8399c482a797f671"
+ resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz"
integrity sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==
node-rsa@0.4.2:
version "0.4.2"
- resolved "https://registry.yarnpkg.com/node-rsa/-/node-rsa-0.4.2.tgz#d6391729ec16a830ed5a38042b3157d2d5d72530"
+ resolved "https://registry.npmjs.org/node-rsa/-/node-rsa-0.4.2.tgz"
integrity sha512-Bvso6Zi9LY4otIZefYrscsUpo2mUpiAVIEmSZV2q41sP8tHZoert3Yu6zv4f/RXJqMNZQKCtnhDugIuCma23YA==
dependencies:
asn1 "0.2.3"
node-statsd@0.1.1:
version "0.1.1"
- resolved "https://registry.yarnpkg.com/node-statsd/-/node-statsd-0.1.1.tgz#27a59348763d0af7a037ac2a031fef3f051013d3"
+ resolved "https://registry.npmjs.org/node-statsd/-/node-statsd-0.1.1.tgz"
integrity sha512-QDf6R8VXF56QVe1boek8an/Rb3rSNaxoFWb7Elpsv2m1+Noua1yy0F1FpKpK5VluF8oymWM4w764A4KsYL4pDg==
object-assign@^4, object-assign@^4.1.1:
version "4.1.1"
- resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
object-inspect@^1.13.3, object-inspect@^1.13.4:
version "1.13.4"
- resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
+ resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz"
integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
object-keys@^1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
object.assign@^4.1.7:
version "4.1.7"
- resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d"
+ resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz"
integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==
dependencies:
call-bind "^1.0.8"
@@ -2884,7 +3613,7 @@ object.assign@^4.1.7:
object.getownpropertydescriptors@^2.0.3:
version "2.1.9"
- resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz#bf9e7520f14d50de88dee2b9c9eca841166322dc"
+ resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.9.tgz"
integrity sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==
dependencies:
array.prototype.reduce "^1.0.8"
@@ -2897,19 +3626,19 @@ object.getownpropertydescriptors@^2.0.3:
on-finished@~2.3.0:
version "2.3.0"
- resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz"
integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==
dependencies:
ee-first "1.1.1"
on-headers@~1.0.1:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+ resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz"
integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
optionator@^0.9.3:
version "0.9.4"
- resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
+ resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz"
integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
dependencies:
deep-is "^0.1.3"
@@ -2921,7 +3650,7 @@ optionator@^0.9.3:
own-keys@^1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358"
+ resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz"
integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==
dependencies:
get-intrinsic "^1.2.6"
@@ -2930,87 +3659,92 @@ own-keys@^1.0.1:
p-limit@^3.0.2:
version "3.1.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
dependencies:
yocto-queue "^0.1.0"
p-locate@^5.0.0:
version "5.0.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
dependencies:
p-limit "^3.0.2"
parent-module@^1.0.0:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
dependencies:
callsites "^3.0.0"
parseurl@~1.3.2:
version "1.3.3"
- resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
partof@1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/partof/-/partof-1.0.0.tgz#d9d7946a14a7d9d9738a59e7c88f478ec5c964ca"
+ resolved "https://registry.npmjs.org/partof/-/partof-1.0.0.tgz"
integrity sha512-+TXdhKCySpJDynCxgAPoGVyAkiK3QPusQ63/BdU5t68QcYzyU6zkP/T7F3gkMQBVUYqdWEADKa6Kx5zg8QIKrg==
path-exists@^4.0.0:
version "4.0.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
path-key@^3.1.0:
version "3.1.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
path-to-regexp@0.1.7:
version "0.1.7"
- resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+ resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz"
integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
picocolors@^1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
picomatch@^4.0.3, picomatch@^4.0.4:
version "4.0.4"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz"
integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==
possible-typed-array-names@^1.0.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae"
+ resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz"
integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==
postcss@^8.5.8:
version "8.5.8"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.8.tgz#6230ecc8fb02e7a0f6982e53990937857e13f399"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz"
integrity sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==
dependencies:
nanoid "^3.3.11"
picocolors "^1.1.1"
source-map-js "^1.2.1"
+preact@10:
+ version "10.29.1"
+ resolved "https://registry.npmjs.org/preact/-/preact-10.29.1.tgz"
+ integrity sha512-gQCLc/vWroE8lIpleXtdJhTFDogTdZG9AjMUpVkDf2iTCNwYNWA+u16dL41TqUDJO4gm2IgrcMv3uTpjd4Pwmg==
+
prelude-ls@^1.2.1:
version "1.2.1"
- resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
primeicons@^7.0.0:
version "7.0.0"
- resolved "https://registry.yarnpkg.com/primeicons/-/primeicons-7.0.0.tgz#6b25c3fdcb29bb745a3035bdc1ed5902f4a419cf"
+ resolved "https://registry.npmjs.org/primeicons/-/primeicons-7.0.0.tgz"
integrity sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==
primereact@^10.9.7:
version "10.9.7"
- resolved "https://registry.yarnpkg.com/primereact/-/primereact-10.9.7.tgz#a79a5de7d842826e7f7fb853f216bb37e581f78b"
+ resolved "https://registry.npmjs.org/primereact/-/primereact-10.9.7.tgz"
integrity sha512-Ap/lg9GGaS8Pq7IIlzguuG3qlaU6PYF6E0cCRo0rnWauRw/SQGvfreSVIIxqEhtR6xqlf7OV759lyvVOvBzmsQ==
dependencies:
"@types/react-transition-group" "^4.4.1"
@@ -3018,14 +3752,14 @@ primereact@^10.9.7:
processenv@1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/processenv/-/processenv-1.1.0.tgz#3867422468954f1af82ce7bfb944c8adadd5cdf7"
+ resolved "https://registry.npmjs.org/processenv/-/processenv-1.1.0.tgz"
integrity sha512-SymqIsn8GjEUy8nG7HiyEjgbfk1xFosRIakUX1NHLpriq3vVpKniGrr9RdMWCaGYWByIovbRt2f/WvmP/IOApQ==
dependencies:
babel-runtime "6.26.0"
-prop-types@^15.6.2:
+prop-types@15, prop-types@^15.6.2:
version "15.8.1"
- resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
+ resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz"
integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
dependencies:
loose-envify "^1.4.0"
@@ -3034,7 +3768,7 @@ prop-types@^15.6.2:
proxy-addr@~2.0.4:
version "2.0.7"
- resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz"
integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
dependencies:
forwarded "0.2.0"
@@ -3042,27 +3776,27 @@ proxy-addr@~2.0.4:
proxy-from-env@^2.1.0:
version "2.1.0"
- resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba"
+ resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz"
integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==
punycode@^2.1.0:
version "2.3.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz"
integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
qs@6.5.2:
version "6.5.2"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz"
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
range-parser@~1.2.0:
version "1.2.1"
- resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
raw-body@2.3.3:
version "2.3.3"
- resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3"
+ resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz"
integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==
dependencies:
bytes "3.0.0"
@@ -3072,24 +3806,40 @@ raw-body@2.3.3:
react-dom@^19.2.4:
version "19.2.4"
- resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.4.tgz#6fac6bd96f7db477d966c7ec17c1a2b1ad8e6591"
+ resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz"
integrity sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==
dependencies:
scheduler "^0.27.0"
+react-force-graph-2d@^1.29.1:
+ version "1.29.1"
+ resolved "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.29.1.tgz"
+ integrity sha512-1Rl/1Z3xy2iTHKj6a0jRXGyiI86xUti81K+jBQZ+Oe46csaMikp47L5AjrzA9hY9fNGD63X8ffrqnvaORukCuQ==
+ dependencies:
+ force-graph "^1.51"
+ prop-types "15"
+ react-kapsule "^2.5"
+
react-icons@^5.6.0:
version "5.6.0"
- resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.6.0.tgz#27bcc4acbc836e762548d76041cf9b9fef4e3837"
+ resolved "https://registry.npmjs.org/react-icons/-/react-icons-5.6.0.tgz"
integrity sha512-RH93p5ki6LfOiIt0UtDyNg/cee+HLVR6cHHtW3wALfo+eOHTp8RnU2kRkI6E+H19zMIs03DyxUG/GfZMOGvmiA==
react-is@^16.13.1:
version "16.13.1"
- resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+react-kapsule@^2.5:
+ version "2.5.7"
+ resolved "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.5.7.tgz"
+ integrity sha512-kifAF4ZPD77qZKc4CKLmozq6GY1sBzPEJTIJb0wWFK6HsePJatK3jXplZn2eeAt3x67CDozgi7/rO8fNQ/AL7A==
+ dependencies:
+ jerrypick "^1.1.1"
+
"react-redux@8.x.x || 9.x.x":
version "9.2.0"
- resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.2.0.tgz#96c3ab23fb9a3af2cb4654be4b51c989e32366f5"
+ resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz"
integrity sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==
dependencies:
"@types/use-sync-external-store" "^0.0.6"
@@ -3097,14 +3847,14 @@ react-is@^16.13.1:
react-router-dom@^7.13.1:
version "7.14.0"
- resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.14.0.tgz#9d2df92ec9ce47e696808dc2a0e0a0c794ab278a"
+ resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.14.0.tgz"
integrity sha512-2G3ajSVSZMEtmTjIklRWlNvo8wICEpLihfD/0YMDxbWK2UyP5EGfnoIn9AIQGnF3G/FX0MRbHXdFcD+rL1ZreQ==
dependencies:
react-router "7.14.0"
react-router@7.14.0:
version "7.14.0"
- resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.14.0.tgz#33169c9ac03b298bb51aad13e038ba548c79a862"
+ resolved "https://registry.npmjs.org/react-router/-/react-router-7.14.0.tgz"
integrity sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ==
dependencies:
cookie "^1.0.1"
@@ -3112,7 +3862,7 @@ react-router@7.14.0:
react-transition-group@^4.4.1:
version "4.4.5"
- resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
+ resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz"
integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
dependencies:
"@babel/runtime" "^7.5.5"
@@ -3122,12 +3872,12 @@ react-transition-group@^4.4.1:
react@^19.2.4:
version "19.2.4"
- resolved "https://registry.yarnpkg.com/react/-/react-19.2.4.tgz#438e57baa19b77cb23aab516cf635cd0579ee09a"
+ resolved "https://registry.npmjs.org/react/-/react-19.2.4.tgz"
integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==
"readable-stream@1.x >=1.1.9":
version "1.1.14"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz"
integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==
dependencies:
core-util-is "~1.0.0"
@@ -3137,7 +3887,7 @@ react@^19.2.4:
readable-stream@^3.0.0:
version "3.6.2"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
dependencies:
inherits "^2.0.3"
@@ -3146,7 +3896,7 @@ readable-stream@^3.0.0:
recharts@^3.8.0:
version "3.8.1"
- resolved "https://registry.yarnpkg.com/recharts/-/recharts-3.8.1.tgz#1784b14784dab9a27eb426c475e6a9187f14cf01"
+ resolved "https://registry.npmjs.org/recharts/-/recharts-3.8.1.tgz"
integrity sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg==
dependencies:
"@reduxjs/toolkit" "^1.9.0 || 2.x.x"
@@ -3163,17 +3913,17 @@ recharts@^3.8.0:
redux-thunk@^3.1.0:
version "3.1.0"
- resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3"
+ resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz"
integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==
redux@^5.0.1:
version "5.0.1"
- resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b"
+ resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz"
integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==
reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9:
version "1.0.10"
- resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9"
+ resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz"
integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==
dependencies:
call-bind "^1.0.8"
@@ -3187,17 +3937,17 @@ reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9:
regenerator-runtime@^0.11.0:
version "0.11.1"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz"
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
regenerator-runtime@^0.12.0:
version "0.12.1"
- resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz"
integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==
regexp.prototype.flags@^1.5.4:
version "1.5.4"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19"
+ resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz"
integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==
dependencies:
call-bind "^1.0.8"
@@ -3209,22 +3959,22 @@ regexp.prototype.flags@^1.5.4:
reselect@5.1.1, reselect@^5.1.0:
version "5.1.1"
- resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.1.tgz#c766b1eb5d558291e5e550298adb0becc24bb72e"
+ resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz"
integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==
resolve-from@^4.0.0:
version "4.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
retry@0.12.0:
version "0.12.0"
- resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+ resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz"
integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
rolldown@1.0.0-rc.12:
version "1.0.0-rc.12"
- resolved "https://registry.yarnpkg.com/rolldown/-/rolldown-1.0.0-rc.12.tgz#e226fa74a4c21c71a13f8e44f778f81d58853ad5"
+ resolved "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz"
integrity sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==
dependencies:
"@oxc-project/types" "=0.122.0"
@@ -3248,7 +3998,7 @@ rolldown@1.0.0-rc.12:
safe-array-concat@^1.1.3:
version "1.1.3"
- resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3"
+ resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz"
integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==
dependencies:
call-bind "^1.0.8"
@@ -3259,17 +4009,17 @@ safe-array-concat@^1.1.3:
safe-buffer@5.1.2:
version "5.1.2"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@^5.0.1, safe-buffer@~5.2.0:
version "5.2.1"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-push-apply@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5"
+ resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz"
integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==
dependencies:
es-errors "^1.3.0"
@@ -3277,7 +4027,7 @@ safe-push-apply@^1.0.0:
safe-regex-test@^1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1"
+ resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz"
integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==
dependencies:
call-bound "^1.0.2"
@@ -3286,32 +4036,32 @@ safe-regex-test@^1.1.0:
"safer-buffer@>= 2.1.2 < 3":
version "2.1.2"
- resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
scheduler@^0.27.0:
version "0.27.0"
- resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd"
+ resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz"
integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==
semver@^5.6.0:
version "5.7.2"
- resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz"
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
semver@^6.3.1:
version "6.3.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-semver@^7.7.3:
+semver@^7.3.7, semver@^7.7.3:
version "7.7.4"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a"
+ resolved "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz"
integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==
send@0.16.2:
version "0.16.2"
- resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
+ resolved "https://registry.npmjs.org/send/-/send-0.16.2.tgz"
integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==
dependencies:
debug "2.6.9"
@@ -3330,7 +4080,7 @@ send@0.16.2:
serve-static@1.13.2:
version "1.13.2"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
+ resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz"
integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==
dependencies:
encodeurl "~1.0.2"
@@ -3340,12 +4090,12 @@ serve-static@1.13.2:
set-cookie-parser@^2.6.0:
version "2.7.2"
- resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz#ccd08673a9ae5d2e44ea2a2de25089e67c7edf68"
+ resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz"
integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==
set-function-length@^1.2.2:
version "1.2.2"
- resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz"
integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
dependencies:
define-data-property "^1.1.4"
@@ -3357,7 +4107,7 @@ set-function-length@^1.2.2:
set-function-name@^2.0.2:
version "2.0.2"
- resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
+ resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz"
integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
dependencies:
define-data-property "^1.1.4"
@@ -3367,7 +4117,7 @@ set-function-name@^2.0.2:
set-proto@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e"
+ resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz"
integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==
dependencies:
dunder-proto "^1.0.1"
@@ -3376,29 +4126,29 @@ set-proto@^1.0.0:
setprototypeof@1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+ resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz"
integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
sha-1@0.1.1:
version "0.1.1"
- resolved "https://registry.yarnpkg.com/sha-1/-/sha-1-0.1.1.tgz#2a39304bf41bbab11dd9efb7474ec25b1a92c257"
+ resolved "https://registry.npmjs.org/sha-1/-/sha-1-0.1.1.tgz"
integrity sha512-dexizf3hB7d4Jq6Cd0d/NYQiqgEqIfZIpuMfwPfvSb6h06DZKmHyUe55jYwpHC12R42wpqXO6ouhiBpRzIcD/g==
shebang-command@^2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
dependencies:
shebang-regex "^3.0.0"
shebang-regex@^3.0.0:
version "3.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
side-channel-list@^1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad"
+ resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz"
integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
dependencies:
es-errors "^1.3.0"
@@ -3406,7 +4156,7 @@ side-channel-list@^1.0.0:
side-channel-map@^1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42"
+ resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz"
integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
dependencies:
call-bound "^1.0.2"
@@ -3416,7 +4166,7 @@ side-channel-map@^1.0.1:
side-channel-weakmap@^1.0.2:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea"
+ resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz"
integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
dependencies:
call-bound "^1.0.2"
@@ -3427,7 +4177,7 @@ side-channel-weakmap@^1.0.2:
side-channel@^1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
+ resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz"
integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
dependencies:
es-errors "^1.3.0"
@@ -3436,43 +4186,53 @@ side-channel@^1.1.0:
side-channel-map "^1.0.1"
side-channel-weakmap "^1.0.2"
+sonner@^1.5.0:
+ version "1.7.4"
+ resolved "https://registry.npmjs.org/sonner/-/sonner-1.7.4.tgz"
+ integrity sha512-DIS8z4PfJRbIyfVFDVnK9rO3eYDtse4Omcm6bt0oEr5/jtLgysmjuBl1frJ9E/EQZrFmKx2A8m/s5s9CRXIzhw==
+
source-map-js@^1.2.1:
version "1.2.1"
- resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
+ resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"
integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
split2@3.0.0:
version "3.0.0"
- resolved "https://registry.yarnpkg.com/split2/-/split2-3.0.0.tgz#55057cd560687a7ef6464471597404577ff1735d"
+ resolved "https://registry.npmjs.org/split2/-/split2-3.0.0.tgz"
integrity sha512-Cp7G+nUfKJyHCrAI8kze3Q00PFGEG1pMgrAlTFlDbn+GW24evSZHJuMl+iUJx1w/NTRDeBiTgvwnf6YOt94FMw==
dependencies:
readable-stream "^3.0.0"
stack-trace@0.0.10:
version "0.0.10"
- resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+ resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz"
integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==
+state-local@^1.0.6:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz"
+ integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==
+
"statuses@>= 1.4.0 < 2":
version "1.5.0"
- resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
statuses@~1.4.0:
version "1.4.0"
- resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz"
integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
stethoskop@1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/stethoskop/-/stethoskop-1.0.0.tgz#b838e8f6f78f8e66f86139524e8058e4a2f78b62"
+ resolved "https://registry.npmjs.org/stethoskop/-/stethoskop-1.0.0.tgz"
integrity sha512-4JnZ+UmTs9SFfDjSHFlD/EoXcb1bfwntkt4h1ipNGrpxtRzmHTxOmdquCJvIrVu608Um7a09cGX0ZSOSllWJNQ==
dependencies:
node-statsd "0.1.1"
stop-iteration-iterator@^1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad"
+ resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz"
integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==
dependencies:
es-errors "^1.3.0"
@@ -3480,7 +4240,7 @@ stop-iteration-iterator@^1.1.0:
string.prototype.trim@^1.2.10:
version "1.2.10"
- resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81"
+ resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz"
integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==
dependencies:
call-bind "^1.0.8"
@@ -3493,7 +4253,7 @@ string.prototype.trim@^1.2.10:
string.prototype.trimend@^1.0.9:
version "1.0.9"
- resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942"
+ resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz"
integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==
dependencies:
call-bind "^1.0.8"
@@ -3503,7 +4263,7 @@ string.prototype.trimend@^1.0.9:
string.prototype.trimstart@^1.0.8:
version "1.0.8"
- resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
+ resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz"
integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
dependencies:
call-bind "^1.0.7"
@@ -3512,19 +4272,19 @@ string.prototype.trimstart@^1.0.8:
string_decoder@^1.1.1:
version "1.3.0"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
string_decoder@~0.10.x:
version "0.10.31"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==
stringify-object@3.3.0:
version "3.3.0"
- resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629"
+ resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz"
integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==
dependencies:
get-own-enumerable-property-symbols "^3.0.0"
@@ -3533,31 +4293,36 @@ stringify-object@3.3.0:
strip-json-comments@^3.1.1:
version "3.1.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
style-mod@^4.0.0, style-mod@^4.1.0:
version "4.1.3"
- resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.1.3.tgz#6e9012255bb799bdac37e288f7671b5d71bf9f73"
+ resolved "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz"
integrity sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==
supports-color@^5.3.0:
version "5.5.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
supports-color@^7.1.0:
version "7.2.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
+tailwind-merge@^2.5.2:
+ version "2.6.1"
+ resolved "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz"
+ integrity sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==
+
tailwind@^4.0.0:
version "4.0.0"
- resolved "https://registry.yarnpkg.com/tailwind/-/tailwind-4.0.0.tgz#070b5e5f1c2c190e4c0d1280a46b36c7369ea46e"
+ resolved "https://registry.npmjs.org/tailwind/-/tailwind-4.0.0.tgz"
integrity sha512-LlUNoD/5maFG1h5kQ6/hXfFPdcnYw+1Z7z+kUD/W/E71CUMwcnrskxiBM8c3G8wmPsD1VvCuqGYMHviI8+yrmg==
dependencies:
"@babel/runtime" "7.3.4"
@@ -3588,29 +4353,39 @@ tailwind@^4.0.0:
uuidv4 "3.0.1"
ws "6.2.0"
+tailwindcss-animate@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz"
+ integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==
+
tailwindcss@4.2.2, tailwindcss@^4.2.2:
version "4.2.2"
- resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-4.2.2.tgz#688fb0751c8ca9044e890546510a2ee817308e87"
+ resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz"
integrity sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==
tapable@^2.3.0:
version "2.3.2"
- resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.2.tgz#86755feabad08d82a26b891db044808c6ad00f15"
+ resolved "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz"
integrity sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==
timer2@1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/timer2/-/timer2-1.0.0.tgz#7a2441569c6564cb891f605788eef0377d89f5de"
+ resolved "https://registry.npmjs.org/timer2/-/timer2-1.0.0.tgz"
integrity sha512-UOZql+P2ET0da+B7V3/RImN3IhC5ghb+9cpecfUhmYGIm0z73dDr3A781nBLnFYmRzeT1AmoT4w9Lgr8n7n7xg==
tiny-invariant@^1.3.3:
version "1.3.3"
- resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127"
+ resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz"
integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==
+tinycolor2@^1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz"
+ integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==
+
tinyglobby@^0.2.15:
version "0.2.15"
- resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2"
+ resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz"
integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==
dependencies:
fdir "^6.5.0"
@@ -3618,29 +4393,29 @@ tinyglobby@^0.2.15:
ts-api-utils@^2.5.0:
version "2.5.0"
- resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1"
+ resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz"
integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==
tslib@^2.4.0, tslib@^2.8.1:
version "2.8.1"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
tsscmp@^1.0.5:
version "1.0.6"
- resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
+ resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz"
integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
- resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
dependencies:
prelude-ls "^1.2.1"
type-is@~1.6.16:
version "1.6.18"
- resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"
integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
dependencies:
media-typer "0.3.0"
@@ -3648,7 +4423,7 @@ type-is@~1.6.16:
typed-array-buffer@^1.0.3:
version "1.0.3"
- resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536"
+ resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz"
integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==
dependencies:
call-bound "^1.0.3"
@@ -3657,7 +4432,7 @@ typed-array-buffer@^1.0.3:
typed-array-byte-length@^1.0.3:
version "1.0.3"
- resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce"
+ resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz"
integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==
dependencies:
call-bind "^1.0.8"
@@ -3668,7 +4443,7 @@ typed-array-byte-length@^1.0.3:
typed-array-byte-offset@^1.0.4:
version "1.0.4"
- resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355"
+ resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz"
integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==
dependencies:
available-typed-arrays "^1.0.7"
@@ -3681,7 +4456,7 @@ typed-array-byte-offset@^1.0.4:
typed-array-length@^1.0.7:
version "1.0.7"
- resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d"
+ resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz"
integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==
dependencies:
call-bind "^1.0.7"
@@ -3693,7 +4468,7 @@ typed-array-length@^1.0.7:
typescript-eslint@^8.57.0:
version "8.58.0"
- resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.58.0.tgz#5758b1b68ae7ec05d756b98c63a1f6953a01172b"
+ resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.58.0.tgz"
integrity sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==
dependencies:
"@typescript-eslint/eslint-plugin" "8.58.0"
@@ -3703,12 +4478,12 @@ typescript-eslint@^8.57.0:
typescript@~5.9.3:
version "5.9.3"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f"
+ resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"
integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==
unbox-primitive@^1.1.0:
version "1.1.0"
- resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2"
+ resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz"
integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==
dependencies:
call-bound "^1.0.3"
@@ -3718,22 +4493,22 @@ unbox-primitive@^1.1.0:
undici-types@~7.16.0:
version "7.16.0"
- resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46"
+ resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"
integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
untildify@3.0.3:
version "3.0.3"
- resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9"
+ resolved "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz"
integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==
update-browserslist-db@^1.2.3:
version "1.2.3"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d"
+ resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz"
integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==
dependencies:
escalade "^3.2.0"
@@ -3741,24 +4516,24 @@ update-browserslist-db@^1.2.3:
uri-js@^4.2.2:
version "4.4.1"
- resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
dependencies:
punycode "^2.1.0"
use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0:
version "1.6.0"
- resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz#b174bfa65cb2b526732d9f2ac0a408027876f32d"
+ resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz"
integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==
util-deprecate@^1.0.1:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
util.promisify@1.0.0:
version "1.0.0"
- resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz"
integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
dependencies:
define-properties "^1.1.2"
@@ -3766,17 +4541,17 @@ util.promisify@1.0.0:
utils-merge@1.0.1:
version "1.0.1"
- resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
uuid@3.3.2:
version "3.3.2"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+ resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz"
integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
uuidv4@2.0.0:
version "2.0.0"
- resolved "https://registry.yarnpkg.com/uuidv4/-/uuidv4-2.0.0.tgz#3ec764288f9e9c4e40f8027ad309c2c528be2976"
+ resolved "https://registry.npmjs.org/uuidv4/-/uuidv4-2.0.0.tgz"
integrity sha512-sAUlwUVepcVk6bwnaW/oi6LCwMdueako5QQzRr90ioAVVcms6p1mV0PaSxK8gyAC4CRvKddsk217uUpZUbKd2Q==
dependencies:
sha-1 "0.1.1"
@@ -3784,24 +4559,24 @@ uuidv4@2.0.0:
uuidv4@3.0.1:
version "3.0.1"
- resolved "https://registry.yarnpkg.com/uuidv4/-/uuidv4-3.0.1.tgz#31751b0ab78f50c9e42dbf231693210b3435b673"
+ resolved "https://registry.npmjs.org/uuidv4/-/uuidv4-3.0.1.tgz"
integrity sha512-PPzksdWRl2a5C9hrs3OOYrArTeyoR0ftJ3jtOy+BnVHkT2UlrrzPNt9nTdiGuxmQItHM/AcTXahwZZC57Njojg==
dependencies:
uuid "3.3.2"
varname@2.0.3:
version "2.0.3"
- resolved "https://registry.yarnpkg.com/varname/-/varname-2.0.3.tgz#05e8dc64fbb6e59170de44aad4ddeab8ab87b68e"
+ resolved "https://registry.npmjs.org/varname/-/varname-2.0.3.tgz"
integrity sha512-+DofT9mJAUALhnr9ipZ5Z2icwaEZ7DAajOZT4ffXy3MQqnXtG3b7atItLQEJCkfcJTOf9WcsywneOEibD4eqJg==
vary@^1, vary@~1.1.2:
version "1.1.2"
- resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
victory-vendor@^37.0.2:
version "37.3.6"
- resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-37.3.6.tgz#401ac4b029a0b3d33e0cba8e8a1d765c487254da"
+ resolved "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz"
integrity sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==
dependencies:
"@types/d3-array" "^3.0.3"
@@ -3821,7 +4596,7 @@ victory-vendor@^37.0.2:
vite@^8.0.1:
version "8.0.3"
- resolved "https://registry.yarnpkg.com/vite/-/vite-8.0.3.tgz#036d9e3b077ff57b128660b3e3a5d2d12bac9b42"
+ resolved "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz"
integrity sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==
dependencies:
lightningcss "^1.32.0"
@@ -3832,14 +4607,61 @@ vite@^8.0.1:
optionalDependencies:
fsevents "~2.3.3"
+vscode-jsonrpc@8.2.0:
+ version "8.2.0"
+ resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz"
+ integrity sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==
+
+vscode-jsonrpc@~8.2.1:
+ version "8.2.1"
+ resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz"
+ integrity sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==
+
+vscode-languageclient@~9.0.1:
+ version "9.0.1"
+ resolved "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz"
+ integrity sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==
+ dependencies:
+ minimatch "^5.1.0"
+ semver "^7.3.7"
+ vscode-languageserver-protocol "3.17.5"
+
+vscode-languageserver-protocol@3.17.5, vscode-languageserver-protocol@~3.17.5:
+ version "3.17.5"
+ resolved "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz"
+ integrity sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==
+ dependencies:
+ vscode-jsonrpc "8.2.0"
+ vscode-languageserver-types "3.17.5"
+
+vscode-languageserver-types@3.17.5:
+ version "3.17.5"
+ resolved "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz"
+ integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==
+
+vscode-ws-jsonrpc@^3.5.0, vscode-ws-jsonrpc@~3.5.0:
+ version "3.5.0"
+ resolved "https://registry.npmjs.org/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-3.5.0.tgz"
+ integrity sha512-13ZDy7Od4AfEPK2HIfY3DtyRi4FVsvFql1yobVJrpIoHOKGGJpIjVvIJpMxkrHzCZzWlYlg+WEu2hrYkCTvM0Q==
+ dependencies:
+ vscode-jsonrpc "~8.2.1"
+
+"vscode@npm:@codingame/monaco-vscode-extension-api@^25.1.2":
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@codingame/monaco-vscode-extension-api/-/monaco-vscode-extension-api-25.1.2.tgz"
+ integrity sha512-SJW/YOhjo+9MXEyzMwQMUWdJVR3Llc6pTq5JQqs6Y30v73gTrpLqtzbd9FNdCuQR8S6bUk5ScH8GL4QrVuL5FA==
+ dependencies:
+ "@codingame/monaco-vscode-api" "25.1.2"
+ "@codingame/monaco-vscode-extensions-service-override" "25.1.2"
+
w3c-keyname@^2.2.4:
version "2.2.8"
- resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz#7b17c8c6883d4e8b86ac8aba79d39e880f8869c5"
+ resolved "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz"
integrity sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==
which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1:
version "1.1.1"
- resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e"
+ resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz"
integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==
dependencies:
is-bigint "^1.1.0"
@@ -3850,7 +4672,7 @@ which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1:
which-builtin-type@^1.2.1:
version "1.2.1"
- resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e"
+ resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz"
integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==
dependencies:
call-bound "^1.0.2"
@@ -3869,7 +4691,7 @@ which-builtin-type@^1.2.1:
which-collection@^1.0.2:
version "1.0.2"
- resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
+ resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz"
integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
dependencies:
is-map "^2.0.3"
@@ -3879,7 +4701,7 @@ which-collection@^1.0.2:
which-typed-array@^1.1.16, which-typed-array@^1.1.19:
version "1.1.20"
- resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122"
+ resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz"
integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==
dependencies:
available-typed-arrays "^1.0.7"
@@ -3892,44 +4714,44 @@ which-typed-array@^1.1.16, which-typed-array@^1.1.19:
which@^2.0.1:
version "2.0.2"
- resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
dependencies:
isexe "^2.0.0"
word-wrap@^1.2.5:
version "1.2.5"
- resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+ resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
ws@6.2.0:
version "6.2.0"
- resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.0.tgz#13806d9913b2a5f3cbb9ba47b563c002cbc7c526"
+ resolved "https://registry.npmjs.org/ws/-/ws-6.2.0.tgz"
integrity sha512-deZYUNlt2O4buFCa3t5bKLf8A7FPP/TVjwOeVNpw818Ma5nk4MLXls2eoEGS39o8119QIYxTrTDoPQ5B/gTD6w==
dependencies:
async-limiter "~1.0.0"
yallist@^3.0.2:
version "3.1.1"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
yocto-queue@^0.1.0:
version "0.1.0"
- resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
"zod-validation-error@^3.5.0 || ^4.0.0":
version "4.0.2"
- resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz#bc605eba49ce0fcd598c127fee1c236be3f22918"
+ resolved "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz"
integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==
"zod@^3.25.0 || ^4.0.0":
version "4.3.6"
- resolved "https://registry.yarnpkg.com/zod/-/zod-4.3.6.tgz#89c56e0aa7d2b05107d894412227087885ab112a"
+ resolved "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz"
integrity sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==
zustand@^5.0.12:
version "5.0.12"
- resolved "https://registry.yarnpkg.com/zustand/-/zustand-5.0.12.tgz#ed36f647aa89965c4019b671dfc23ef6c6e3af8c"
+ resolved "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz"
integrity sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==