diff --git a/.github/workflows/amplify.yml b/.github/workflows/amplify.yml
new file mode 100644
index 0000000..bd336f5
--- /dev/null
+++ b/.github/workflows/amplify.yml
@@ -0,0 +1,25 @@
+# .github/workflows/amplify.yml
+---
+name: Amplify Security
+on:
+ pull_request: {}
+ workflow_dispatch: {}
+ push:
+ branches: ["main", "develop"]
+
+permissions:
+ contents: read
+ id-token: write
+
+jobs:
+ amplify-security-scan:
+ name: Amplify Security Scan
+ runs-on: ubuntu-latest
+ if: (github.event_name != 'pull_request' ||
+ github.repository_id == github.event.pull_request.head.repo.id) &&
+ github.actor != 'dependabot[bot]'
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v5
+ - name: Amplify Runner
+ uses: amplify-security/runner-action@develop
diff --git a/.github/workflows/google.yml b/.github/workflows/google.yml
new file mode 100644
index 0000000..0b5c7d1
--- /dev/null
+++ b/.github/workflows/google.yml
@@ -0,0 +1,116 @@
+# This workflow will build a docker container, publish it to Google Container
+# Registry, and deploy it to GKE when there is a push to the "main"
+# branch.
+#
+# To configure this workflow:
+#
+# 1. Enable the following Google Cloud APIs:
+#
+# - Artifact Registry (artifactregistry.googleapis.com)
+# - Google Kubernetes Engine (container.googleapis.com)
+# - IAM Credentials API (iamcredentials.googleapis.com)
+#
+# You can learn more about enabling APIs at
+# https://support.google.com/googleapi/answer/6158841.
+#
+# 2. Ensure that your repository contains the necessary configuration for your
+# Google Kubernetes Engine cluster, including deployment.yml,
+# kustomization.yml, service.yml, etc.
+#
+# 3. Create and configure a Workload Identity Provider for GitHub:
+# https://github.com/google-github-actions/auth#preferred-direct-workload-identity-federation.
+#
+# Depending on how you authenticate, you will need to grant an IAM principal
+# permissions on Google Cloud:
+#
+# - Artifact Registry Administrator (roles/artifactregistry.admin)
+# - Kubernetes Engine Developer (roles/container.developer)
+#
+# You can learn more about setting IAM permissions at
+# https://cloud.google.com/iam/docs/manage-access-other-resources
+#
+# 5. Change the values in the "env" block to match your values.
+
+name: 'Build and Deploy to GKE'
+
+on:
+ push:
+ branches:
+ - '"main"'
+
+env:
+ PROJECT_ID: 'my-project' # TODO: update to your Google Cloud project ID
+ GAR_LOCATION: 'us-central1' # TODO: update to your region
+ GKE_CLUSTER: 'cluster-1' # TODO: update to your cluster name
+ GKE_ZONE: 'us-central1-c' # TODO: update to your cluster zone
+ DEPLOYMENT_NAME: 'gke-test' # TODO: update to your deployment name
+ REPOSITORY: 'samples' # TODO: update to your Artifact Registry docker repository name
+ IMAGE: 'static-site'
+ WORKLOAD_IDENTITY_PROVIDER: 'projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider' # TODO: update to your workload identity provider
+
+jobs:
+ setup-build-publish-deploy:
+ name: 'Setup, Build, Publish, and Deploy'
+ runs-on: 'ubuntu-latest'
+ environment: 'production'
+
+ permissions:
+ contents: 'read'
+ id-token: 'write'
+
+ steps:
+ - name: 'Checkout'
+ uses: 'actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332' # actions/checkout@v4
+
+ # Configure Workload Identity Federation and generate an access token.
+ #
+ # See https://github.com/google-github-actions/auth for more options,
+ # including authenticating via a JSON credentials file.
+ - id: 'auth'
+ name: 'Authenticate to Google Cloud'
+ uses: 'google-github-actions/auth@f112390a2df9932162083945e46d439060d66ec2' # google-github-actions/auth@v2
+ with:
+ workload_identity_provider: '${{ env.WORKLOAD_IDENTITY_PROVIDER }}'
+
+ # Authenticate Docker to Google Cloud Artifact Registry
+ - name: 'Docker Auth'
+ uses: 'docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567' # docker/login-action@v3
+ with:
+ username: 'oauth2accesstoken'
+ password: '${{ steps.auth.outputs.auth_token }}'
+ registry: '${{ env.GAR_LOCATION }}-docker.pkg.dev'
+
+ # Get the GKE credentials so we can deploy to the cluster
+ - name: 'Set up GKE credentials'
+ uses: 'google-github-actions/get-gke-credentials@6051de21ad50fbb1767bc93c11357a49082ad116' # google-github-actions/get-gke-credentials@v2
+ with:
+ cluster_name: '${{ env.GKE_CLUSTER }}'
+ location: '${{ env.GKE_ZONE }}'
+
+ # Build the Docker image
+ - name: 'Build and push Docker container'
+ run: |-
+ DOCKER_TAG="${GAR_LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY}/${IMAGE}:${GITHUB_SHA}"
+
+ docker build \
+ --tag "${DOCKER_TAG}" \
+ --build-arg GITHUB_SHA="${GITHUB_SHA}" \
+ --build-arg GITHUB_REF="${GITHUB_REF}" \
+ .
+
+ docker push "${DOCKER_TAG}"
+
+ # Set up kustomize
+ - name: 'Set up Kustomize'
+ run: |-
+ curl -sfLo kustomize https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.4.3/kustomize_v5.4.3_linux_amd64.tar.gz
+ chmod u+x ./kustomize
+
+ # Deploy the Docker image to the GKE cluster
+ - name: 'Deploy to GKE'
+ run: |-
+ # replacing the image name in the k8s template
+ ./kustomize edit set image LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG=$GAR_LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/$IMAGE:$GITHUB_SHA
+ ./kustomize build . | kubectl apply -f -
+ kubectl rollout status deployment/$DEPLOYMENT_NAME
+ kubectl get services -o wide
diff --git a/dashboard/.gitignore b/dashboard/.gitignore
new file mode 100644
index 0000000..a547bf3
--- /dev/null
+++ b/dashboard/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/dashboard/README.md b/dashboard/README.md
new file mode 100644
index 0000000..18bc70e
--- /dev/null
+++ b/dashboard/README.md
@@ -0,0 +1,16 @@
+# React + Vite
+
+This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
+
+Currently, two official plugins are available:
+
+- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
+- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
+
+## React Compiler
+
+The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
+
+## Expanding the ESLint configuration
+
+If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.
diff --git a/dashboard/eslint.config.js b/dashboard/eslint.config.js
new file mode 100644
index 0000000..4fa125d
--- /dev/null
+++ b/dashboard/eslint.config.js
@@ -0,0 +1,29 @@
+import js from '@eslint/js'
+import globals from 'globals'
+import reactHooks from 'eslint-plugin-react-hooks'
+import reactRefresh from 'eslint-plugin-react-refresh'
+import { defineConfig, globalIgnores } from 'eslint/config'
+
+export default defineConfig([
+ globalIgnores(['dist']),
+ {
+ files: ['**/*.{js,jsx}'],
+ extends: [
+ js.configs.recommended,
+ reactHooks.configs.flat.recommended,
+ reactRefresh.configs.vite,
+ ],
+ languageOptions: {
+ ecmaVersion: 2020,
+ globals: globals.browser,
+ parserOptions: {
+ ecmaVersion: 'latest',
+ ecmaFeatures: { jsx: true },
+ sourceType: 'module',
+ },
+ },
+ rules: {
+ 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],
+ },
+ },
+])
diff --git a/dashboard/index.html b/dashboard/index.html
new file mode 100644
index 0000000..6352eda
--- /dev/null
+++ b/dashboard/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ dashboard
+
+
+
+
+
+
diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json
new file mode 100644
index 0000000..118923d
--- /dev/null
+++ b/dashboard/package-lock.json
@@ -0,0 +1,3402 @@
+{
+ "name": "dashboard",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "dashboard",
+ "version": "0.0.0",
+ "dependencies": {
+ "lucide-react": "^0.562.0",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ "recharts": "^3.6.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.1",
+ "@types/react": "^19.2.5",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
+ "autoprefixer": "^10.4.23",
+ "eslint": "^9.39.1",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.4.24",
+ "globals": "^16.5.0",
+ "postcss": "^8.5.13",
+ "tailwindcss": "^4.1.18",
+ "vite": "^7.3.2"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz",
+ "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
+ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.5",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.28.3",
+ "@babel/helpers": "^7.28.4",
+ "@babel/parser": "^7.28.5",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.5",
+ "@babel/types": "^7.28.5",
+ "@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.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz",
+ "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.5",
+ "@babel/types": "^7.28.5",
+ "@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.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@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.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
+ "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.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.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
+ "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
+ "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.5"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz",
+ "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.5",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.28.5",
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.5",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
+ "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
+ "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/@esbuild/aix-ppc64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
+ "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
+ "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
+ "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
+ "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
+ "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
+ "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
+ "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
+ "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz",
+ "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
+ "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
+ "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
+ "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
+ "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
+ "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
+ "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
+ "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
+ "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
+ "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
+ "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz",
+ "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
+ "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz",
+ "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz",
+ "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
+ "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
+ "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
+ "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "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.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "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.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz",
+ "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.39.2",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz",
+ "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "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.3",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.3.tgz",
+ "integrity": "sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.53",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz",
+ "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz",
+ "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz",
+ "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz",
+ "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz",
+ "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz",
+ "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz",
+ "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz",
+ "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz",
+ "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz",
+ "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz",
+ "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz",
+ "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz",
+ "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz",
+ "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz",
+ "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz",
+ "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz",
+ "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz",
+ "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz",
+ "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz",
+ "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz",
+ "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz",
+ "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz",
+ "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz",
+ "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz",
+ "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz",
+ "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "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/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "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.7",
+ "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz",
+ "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==",
+ "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/react": {
+ "version": "19.2.7",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz",
+ "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==",
+ "devOptional": true,
+ "license": "MIT",
+ "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/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/@vitejs/plugin-react": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz",
+ "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.28.5",
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+ "@rolldown/pluginutils": "1.0.0-beta.53",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.18.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.23",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz",
+ "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.28.1",
+ "caniuse-lite": "^1.0.30001760",
+ "fraction.js": "^5.3.4",
+ "picocolors": "^1.1.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/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.9.11",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz",
+ "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.9.0",
+ "caniuse-lite": "^1.0.30001759",
+ "electron-to-chromium": "^1.5.263",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.2.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/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.30001762",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001762.tgz",
+ "integrity": "sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==",
+ "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/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/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/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "devOptional": true,
+ "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.0",
+ "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
+ "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/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/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/electron-to-chromium": {
+ "version": "1.5.267",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz",
+ "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/es-toolkit": {
+ "version": "1.43.0",
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.43.0.tgz",
+ "integrity": "sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==",
+ "license": "MIT",
+ "workspaces": [
+ "docs",
+ "benchmarks"
+ ]
+ },
+ "node_modules/esbuild": {
+ "version": "0.27.2",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
+ "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.2",
+ "@esbuild/android-arm": "0.27.2",
+ "@esbuild/android-arm64": "0.27.2",
+ "@esbuild/android-x64": "0.27.2",
+ "@esbuild/darwin-arm64": "0.27.2",
+ "@esbuild/darwin-x64": "0.27.2",
+ "@esbuild/freebsd-arm64": "0.27.2",
+ "@esbuild/freebsd-x64": "0.27.2",
+ "@esbuild/linux-arm": "0.27.2",
+ "@esbuild/linux-arm64": "0.27.2",
+ "@esbuild/linux-ia32": "0.27.2",
+ "@esbuild/linux-loong64": "0.27.2",
+ "@esbuild/linux-mips64el": "0.27.2",
+ "@esbuild/linux-ppc64": "0.27.2",
+ "@esbuild/linux-riscv64": "0.27.2",
+ "@esbuild/linux-s390x": "0.27.2",
+ "@esbuild/linux-x64": "0.27.2",
+ "@esbuild/netbsd-arm64": "0.27.2",
+ "@esbuild/netbsd-x64": "0.27.2",
+ "@esbuild/openbsd-arm64": "0.27.2",
+ "@esbuild/openbsd-x64": "0.27.2",
+ "@esbuild/openharmony-arm64": "0.27.2",
+ "@esbuild/sunos-x64": "0.27.2",
+ "@esbuild/win32-arm64": "0.27.2",
+ "@esbuild/win32-ia32": "0.27.2",
+ "@esbuild/win32-x64": "0.27.2"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "9.39.2",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz",
+ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.1",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.39.2",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-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.4.26",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz",
+ "integrity": "sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=8.40"
+ }
+ },
+ "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/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "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/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fraction.js": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz",
+ "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+ "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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/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/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/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/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-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/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/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.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-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/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/lucide-react": {
+ "version": "0.562.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz",
+ "integrity": "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "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/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/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/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/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/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.13",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.13.tgz",
+ "integrity": "sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
+ "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.3"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.3.tgz",
+ "integrity": "sha512-qJNJfu81ByyabuG7hPFEbXqNcWSU3+eVus+KJs+0ncpGfMyYdvSmxiJxbWR65lYi1I+/0HBcliO029gc4F+PnA==",
+ "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",
+ "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-refresh": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
+ "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/recharts": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.6.0.tgz",
+ "integrity": "sha512-L5bjxvQRAe26RlToBAziKUB7whaGKEwD3znoM6fz3DrTowCIC/FnJYnuq1GEzB8Zv2kdTfaxQfi5GoH0tBinyg==",
+ "license": "MIT",
+ "workspaces": [
+ "www"
+ ],
+ "dependencies": {
+ "@reduxjs/toolkit": "1.x.x || 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"
+ },
+ "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/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/rollup": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz",
+ "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.59.0",
+ "@rollup/rollup-android-arm64": "4.59.0",
+ "@rollup/rollup-darwin-arm64": "4.59.0",
+ "@rollup/rollup-darwin-x64": "4.59.0",
+ "@rollup/rollup-freebsd-arm64": "4.59.0",
+ "@rollup/rollup-freebsd-x64": "4.59.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.59.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.59.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.59.0",
+ "@rollup/rollup-linux-arm64-musl": "4.59.0",
+ "@rollup/rollup-linux-loong64-gnu": "4.59.0",
+ "@rollup/rollup-linux-loong64-musl": "4.59.0",
+ "@rollup/rollup-linux-ppc64-gnu": "4.59.0",
+ "@rollup/rollup-linux-ppc64-musl": "4.59.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.59.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.59.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.59.0",
+ "@rollup/rollup-linux-x64-gnu": "4.59.0",
+ "@rollup/rollup-linux-x64-musl": "4.59.0",
+ "@rollup/rollup-openbsd-x64": "4.59.0",
+ "@rollup/rollup-openharmony-arm64": "4.59.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.59.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.59.0",
+ "@rollup/rollup-win32-x64-gnu": "4.59.0",
+ "@rollup/rollup-win32-x64-msvc": "4.59.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "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/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/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.1.18",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz",
+ "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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/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/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==",
+ "dev": true,
+ "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/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": "7.3.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz",
+ "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.27.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "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",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.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
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/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/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/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.5",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz",
+ "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==",
+ "dev": true,
+ "license": "MIT",
+ "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"
+ }
+ }
+ }
+}
diff --git a/dashboard/package.json b/dashboard/package.json
new file mode 100644
index 0000000..7241ca0
--- /dev/null
+++ b/dashboard/package.json
@@ -0,0 +1,32 @@
+{
+ "name": "dashboard",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "lint": "eslint .",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "lucide-react": "^0.562.0",
+ "react": "^19.2.0",
+ "react-dom": "^19.2.0",
+ "recharts": "^3.6.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.39.1",
+ "@types/react": "^19.2.5",
+ "@types/react-dom": "^19.2.3",
+ "@vitejs/plugin-react": "^5.1.1",
+ "autoprefixer": "^10.4.23",
+ "eslint": "^9.39.1",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-refresh": "^0.4.24",
+ "globals": "^16.5.0",
+ "postcss": "^8.5.13",
+ "tailwindcss": "^4.1.18",
+ "vite": "^7.3.2"
+ }
+}
diff --git a/dashboard/postcss.config.js b/dashboard/postcss.config.js
new file mode 100644
index 0000000..2e7af2b
--- /dev/null
+++ b/dashboard/postcss.config.js
@@ -0,0 +1,6 @@
+export default {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+}
diff --git a/dashboard/public/vite.svg b/dashboard/public/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/dashboard/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/dashboard/src/App.css b/dashboard/src/App.css
new file mode 100644
index 0000000..b9d355d
--- /dev/null
+++ b/dashboard/src/App.css
@@ -0,0 +1,42 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+ transition: filter 300ms;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.react:hover {
+ filter: drop-shadow(0 0 2em #61dafbaa);
+}
+
+@keyframes logo-spin {
+ from {
+ transform: rotate(0deg);
+ }
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ a:nth-of-type(2) .logo {
+ animation: logo-spin infinite 20s linear;
+ }
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
diff --git a/dashboard/src/App.jsx b/dashboard/src/App.jsx
new file mode 100644
index 0000000..312ea36
--- /dev/null
+++ b/dashboard/src/App.jsx
@@ -0,0 +1,265 @@
+import React, { useState, useEffect } from 'react';
+import {
+ AlertTriangle,
+ ArrowDown,
+ Activity,
+ BatteryWarning,
+ TrendingDown,
+ ShieldAlert,
+ XCircle,
+ ZapOff,
+ ShieldCheck,
+ CheckCircle,
+ Lock,
+ UserCheck,
+ Wallet,
+ ArrowRight
+} from 'lucide-react';
+import { LineChart, Line, ResponsiveContainer, YAxis, Tooltip } from 'recharts';
+
+/**
+ * ASSET LIQUIDATION & VITALITY MONITOR
+ * * * Design Philosophy:
+ * - TOP SECTION (Green): Establishes Trust. Shows "Leonardās Digital Improvements" is safe/compliant.
+ * - MAIN SECTION (Red): Shows the Portfolio Health is critical/liquidating.
+ * - ACTION: Prompts user to "Add Funds" to fix the Red status.
+ */
+
+// Mock data simulating a flatlining/dropping asset
+const liquidationData = [
+ { time: '10:00', value: 45 },
+ { time: '11:00', value: 42 },
+ { time: '12:00', value: 38 },
+ { time: '13:00', value: 30 },
+ { time: '14:00', value: 15 },
+ { time: '15:00', value: 5 },
+ { time: '16:00', value: 2 },
+ { time: '17:00', value: 0 }, // Flatline
+ { time: '18:00', value: 0 },
+];
+
+const VitalityGauge = ({ value }) => {
+ // Calculates the rotation for the needle based on value (0-100)
+ const rotation = (value / 100) * 180 - 90; // -90deg to +90deg
+
+ return (
+
+ {/* Background Arc */}
+
+
+ {/* Critical Zone Arc (Red) - Visualizing Weak Energy */}
+
+
+ {/* Needle */}
+
+
+ {/* Labels */}
+
CRITICAL
+
HEALTHY
+
+ );
+};
+
+// NEW: Safety & Compliance Header
+const ComplianceHeader = () => (
+
+
+
+
+
+ {/* Identity Section */}
+
+
+
+
+
+
System Secure
+
+
+ Leonardās Digital Improvements
+
+
+ Identity Verified
+ SSL Encrypted
+ Compliance Approved
+
+
+
+
+ {/* Status Badge */}
+
+
Owner Status
+
AUTHORIZED
+
+
+
+);
+
+// NEW: Funding Module
+const LiquidityInjector = () => (
+
+
+ {/* Background Effect */}
+
+
+
+
+
+ Liquidity Injection Required
+
+
+ To restore portfolio health and reverse the liquidation arrow, additional capital must be allocated to the dashboard immediately.
+
+
+
+
+
+ $
+
+
+
+
+
+);
+
+export default function LiquidationDashboard() {
+ const [energyLevel, setEnergyLevel] = useState(100);
+
+ // Effect to simulate the "Draining" of energy upon load
+ useEffect(() => {
+ const timer = setTimeout(() => {
+ setEnergyLevel(12); // Drops to 12% to show weak energy
+ }, 500);
+ return () => clearTimeout(timer);
+ }, []);
+
+ return (
+
+
+ {/* 1. GREEN ZONE: Trust & Compliance */}
+
+
+ {/* 2. RED ZONE: The Warning Banner */}
+
+
+
+
DASHBOARD HEALTH: CRITICAL
+
+ Operational funds depleted. System cannot maintain active status without capital injection.
+
+
+
+
+
+
+ {/* CARD 1: The Vitality Gauge (Weak Energy) */}
+
+
+
+
+ PORTFOLIO VITALITY
+
+
+ WEAK SIGNAL
+
+
+
+
+
+
+
+
+
+ {energyLevel}%
+
+
System Energy Low
+
+
+
+ {/* CARD 2: Liquidation Status (The Arrow) */}
+
+
+
+
+
+ ASSET DIRECTION
+
+ Liquidating
+
+
+
+ {/* The "Stimulating" Arrow - Pulsing Red */}
+
+
Depleting
+
+
+
+
+
+ {/* CARD 3: Technical Analysis (Flatline) */}
+
+
+
+
+ DIGITAL ASSET PERFORMANCE
+
+
+ Active Investment: NO
+ Mode: RECOVERY ONLY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Insufficient Operational Power
+
+
+ LAST READING: 0.00 KH/s
+
+
+
+
+ {/* 3. ACTION ZONE: The Solution */}
+
+
+
+
+ );
+}
diff --git a/dashboard/src/assets/react.svg b/dashboard/src/assets/react.svg
new file mode 100644
index 0000000..6c87de9
--- /dev/null
+++ b/dashboard/src/assets/react.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/dashboard/src/index.css b/dashboard/src/index.css
new file mode 100644
index 0000000..b5c61c9
--- /dev/null
+++ b/dashboard/src/index.css
@@ -0,0 +1,3 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
diff --git a/dashboard/src/main.jsx b/dashboard/src/main.jsx
new file mode 100644
index 0000000..b9a1a6d
--- /dev/null
+++ b/dashboard/src/main.jsx
@@ -0,0 +1,10 @@
+import { StrictMode } from 'react'
+import { createRoot } from 'react-dom/client'
+import './index.css'
+import App from './App.jsx'
+
+createRoot(document.getElementById('root')).render(
+
+
+ ,
+)
diff --git a/dashboard/tailwind.config.js b/dashboard/tailwind.config.js
new file mode 100644
index 0000000..dca8ba0
--- /dev/null
+++ b/dashboard/tailwind.config.js
@@ -0,0 +1,11 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+ content: [
+ "./index.html",
+ "./src/**/*.{js,ts,jsx,tsx}",
+ ],
+ theme: {
+ extend: {},
+ },
+ plugins: [],
+}
diff --git a/dashboard/vite.config.js b/dashboard/vite.config.js
new file mode 100644
index 0000000..8b0f57b
--- /dev/null
+++ b/dashboard/vite.config.js
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vite.dev/config/
+export default defineConfig({
+ plugins: [react()],
+})
diff --git a/docs/notebooks/thinking_in_jax.ipynb b/docs/notebooks/thinking_in_jax.ipynb
new file mode 100644
index 0000000..2abb70a
--- /dev/null
+++ b/docs/notebooks/thinking_in_jax.ipynb
@@ -0,0 +1,1061 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "LQHmwePqryRU"
+ },
+ "source": [
+ "# Quickstart: How to think in JAX\n",
+ "\n",
+ "\n",
+ "\n",
+ "[](https://colab.research.google.com/github/jax-ml/jax/blob/main/docs/notebooks/thinking_in_jax.ipynb) [](https://kaggle.com/kernels/welcome?src=https://github.com/jax-ml/jax/blob/main/docs/notebooks/thinking_in_jax.ipynb)\n",
+ "\n",
+ "**JAX is a library for array-oriented numerical computation (*Ć la* [NumPy](https://numpy.org/)), with automatic differentiation and JIT compilation to enable high-performance machine learning research**."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# New Section"
+ ],
+ "metadata": {
+ "id": "vMizFSv1YbS9"
+ }
+ },
+ {
+ "cell_type": "code",
+ "source": [],
+ "metadata": {
+ "id": "FaiGmN2_YWr5"
+ },
+ "execution_count": 8,
+ "outputs": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "jcbGIgYSYUM1"
+ },
+ "source": [
+ "This document provides a quick overview of essential JAX features, so you can get started with JAX:\n",
+ "\n",
+ "* JAX provides a unified NumPy-like interface to computations that run on CPU, GPU, or TPU, in local or distributed settings.\n",
+ "* JAX features built-in Just-In-Time (JIT) compilation via [Open XLA](https://github.com/openxla), an open-source machine learning compiler ecosystem.\n",
+ "* JAX functions support efficient evaluation of gradients via its automatic differentiation transformations.\n",
+ "* JAX functions can be automatically vectorized to efficiently map them over arrays representing batches of inputs."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "oKMQhaxVYUM1"
+ },
+ "source": [
+ "## Installation\n",
+ "\n",
+ "JAX can be installed for CPU on Linux, Windows, and macOS directly from the [Python Package Index](https://pypi.org/project/jax/):\n",
+ "\n",
+ "```\n",
+ "pip install jax\n",
+ "```\n",
+ "or, for NVIDIA GPU:\n",
+ "\n",
+ "```\n",
+ "pip install -U \"jax[cuda13]\"\n",
+ "```\n",
+ "For more detailed platform-specific installation information, check out [Installation](https://docs.jax.dev/en/latest/installation.html)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "nayIExVUtsVD"
+ },
+ "source": [
+ "## JAX vs. NumPy\n",
+ "\n",
+ "**Key concepts:**\n",
+ "\n",
+ "- JAX provides a NumPy-inspired interface for convenience.\n",
+ "- Through [duck-typing](https://en.wikipedia.org/wiki/Duck_typing), JAX arrays can often be used as drop-in replacements of NumPy arrays.\n",
+ "- Unlike NumPy arrays, JAX arrays are always immutable."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "JclLwTSrYUM2"
+ },
+ "source": [
+ "NumPy provides a well-known, powerful API for working with numerical data. For convenience, JAX provides [`jax.numpy`](https://docs.jax.dev/en/latest/jax.numpy.html) which closely mirrors the NumPy API and provides easy entry into JAX. Almost anything that can be done with `numpy` can be done with `jax.numpy`, which is typically imported under the `jnp` alias:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "id": "qm2-XRe3YUM2"
+ },
+ "outputs": [],
+ "source": [
+ "import jax.numpy as jnp"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "RoykIdlSYUM3"
+ },
+ "source": [
+ "With this import, you can immediately use JAX in a similar manner to typical NumPy programs, including using NumPy-style array creation functions, Python functions and operators, and array attributes and methods:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "id": "f3EpF0hHYUM4",
+ "outputId": "22918284-59a4-4c57-92bd-b98672125f19",
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 274
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "display_data",
+ "data": {
+ "text/plain": [
+ ""
+ ],
+ "image/png": "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\n"
+ },
+ "metadata": {}
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "x_jnp = jnp.linspace(0, 10, 1000)\n",
+ "y_jnp = 2 * jnp.sin(x_jnp) * jnp.cos(x_jnp)\n",
+ "plt.plot(x_jnp, y_jnp);"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "wyVHuTTeYUM4"
+ },
+ "source": [
+ "The code blocks are identical to what you would expect with NumPy, aside from replacing `np` with `jnp`, and the results are the same. As we can see, JAX arrays can often be used directly in place of NumPy arrays for things like plotting."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "nxZB_CgnYUM4"
+ },
+ "source": [
+ "The arrays themselves are implemented as different Python types:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "id": "kZaOXL7-uvUP"
+ },
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import jax.numpy as jnp\n",
+ "\n",
+ "x_np = np.linspace(0, 10, 1000)\n",
+ "x_jnp = jnp.linspace(0, 10, 1000)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "id": "PjFFunI7xNe8",
+ "outputId": "93fd1fd6-62d9-4b7f-ffc2-d0420dc8bb1a",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "numpy.ndarray"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 4
+ }
+ ],
+ "source": [
+ "type(x_np)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "id": "kpv5K7QYxQnX",
+ "outputId": "54835072-8e9e-4500-8d25-18aebf48ba77",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "execute_result",
+ "data": {
+ "text/plain": [
+ "jaxlib._jax.ArrayImpl"
+ ]
+ },
+ "metadata": {},
+ "execution_count": 5
+ }
+ ],
+ "source": [
+ "type(x_jnp)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Mx94Ri7euEZm"
+ },
+ "source": [
+ "Python's duck-typing allows JAX arrays and NumPy arrays to be used interchangeably in many places. However, there is one important difference between JAX and NumPy arrays: JAX arrays are immutable, meaning that once created their contents cannot be changed.\n",
+ "\n",
+ "Here is an example of mutating an array in NumPy:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "id": "fzp-y1ZVyGD4",
+ "outputId": "d60beeb3-c4c9-488a-95ed-5ccc2c92a5a3",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "[10 1 2 3 4 5 6 7 8 9]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# NumPy: mutable arrays\n",
+ "x = np.arange(10)\n",
+ "x[0] = 10\n",
+ "print(x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "nQ-De0xcJ1lT"
+ },
+ "source": [
+ "The equivalent in JAX results in an error, as JAX arrays are immutable:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "id": "l2AP0QERb0P7",
+ "outputId": "4861f124-2d6e-4987-f11b-a62bd557012f",
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "stream",
+ "name": "stdout",
+ "text": [
+ "Exception reporting mode: Minimal\n"
+ ]
+ }
+ ],
+ "source": [
+ "%xmode minimal"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "id": "pCPX0JR-yM4i",
+ "outputId": "00ed44d6-75a0-4094-bfc9-06aad9292db4",
+ "tags": [
+ "raises-exception"
+ ],
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 289
+ }
+ },
+ "outputs": [
+ {
+ "output_type": "error",
+ "ename": "TypeError",
+ "evalue": "JAX arrays are immutable and do not support in-place item assignment. Instead of x[idx] = y, use x = x.at[idx].set(y) or another .at[] method: https://docs.jax.dev/en/latest/_autosummary/jax.numpy.ndarray.at.html",
+ "traceback": [
+ "\u001b[0;31mTypeError\u001b[0m\u001b[0;31m:\u001b[0m JAX arrays are immutable and do not support in-place item assignment. Instead of x[idx] = y, use x = x.at[idx].set(y) or another .at[] method: https://docs.jax.dev/en/latest/_autosummary/jax.numpy.ndarray.at.html\n"
+ ]
+ }
+ ],
+ "source": [
+ "# JAX: immutable arrays\n",
+ "x = jnp.arange(10)\n",
+ "x[0] = 10"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "GLGeO5qAYlaL"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "source": [],
+ "metadata": {
+ "id": "pTbwX4VYYljc"
+ }
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "yRYF0YgO3F4H"
+ },
+ "source": [
+ "For updating individual elements, JAX provides an [indexed update syntax](https://docs.jax.dev/en/latest/_autosummary/jax.numpy.ndarray.at.html#jax-numpy-ndarray-at) that returns an updated copy:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "8zqPEAeP3UK5"
+ },
+ "outputs": [],
+ "source": [
+ "y = x.at[0].set(10)\n",
+ "print(x)\n",
+ "print(y)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "B0Q0PwD2YUM6"
+ },
+ "source": [
+ "You'll find a few differences between JAX arrays and NumPy arrays once you begin digging in. See also:\n",
+ "\n",
+ "- [Key concepts](https://docs.jax.dev/en/latest/key-concepts.html#jax-arrays-jax-array) for an introduction to the key concepts of JAX, such as transformations, tracing, jaxprs and pytrees.\n",
+ "- [šŖ JAX - The Sharp Bits šŖ](https://docs.jax.dev/en/latest/notebooks/Common_Gotchas_in_JAX.html) for common gotchas when using JAX."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "csFhIsgjYUM7"
+ },
+ "source": [
+ "## JAX arrays (`jax.Array`)\n",
+ "\n",
+ "**Key concepts:**\n",
+ "- Create arrays using JAX API functions.\n",
+ "- JAX array objects have a `devices` attribute that indicates where the array is stored.\n",
+ "- JAX arrays can be *sharded* across multiple devices for parallel computation.\n",
+ "\n",
+ "The default array implementation in JAX is [`jax.Array`](https://docs.jax.dev/en/latest/_autosummary/jax.Array.html#jax.Array). In many ways it is similar to\n",
+ "the [`numpy.ndarray`](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html#numpy.ndarray) type that you may be familiar with from the NumPy package, but it\n",
+ "has some important differences.\n",
+ "\n",
+ "### Array creation\n",
+ "\n",
+ "We typically don't call the `jax.Array` constructor directly, but rather create arrays via JAX API functions.\n",
+ "For example, [`jax.numpy`](https://docs.jax.dev/en/latest/jax.numpy.html#module-jax.numpy) provides familiar NumPy-style array construction functionality\n",
+ "such as `jax.numpy.zeros`, `jax.numpy.linspace`, `jax.numpy.arange`, etc."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "-Ke79S7RYUM7"
+ },
+ "outputs": [],
+ "source": [
+ "import jax\n",
+ "import jax.numpy as jnp\n",
+ "\n",
+ "x = jnp.arange(5)\n",
+ "isinstance(x, jax.Array)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "McNIQ90rYUM7"
+ },
+ "source": [
+ "If you use Python type annotations in your code, `jax.Array` is the appropriate\n",
+ "annotation for jax array objects (see [`jax.typing`](https://docs.jax.dev/en/latest/jax.typing.html#module-jax.typing) for more discussion)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ODGrfK-7YUM7"
+ },
+ "source": [
+ "### Array devices and sharding\n",
+ "\n",
+ "JAX Array objects have a `devices` method that lets you inspect where the contents of the array are stored. In the simplest cases, this will be a single CPU device:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "Pnd_6Q-BYUM7"
+ },
+ "outputs": [],
+ "source": [
+ "x.devices()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ay5JuV62YUM7"
+ },
+ "source": [
+ "In general, an array may be [*sharded*](https://docs.jax.dev/en/latest/notebooks/Distributed_arrays_and_automatic_parallelization.html) across multiple devices, in a manner that can be inspected via the `sharding` attribute:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "55K8-epQYUM7"
+ },
+ "outputs": [],
+ "source": [
+ "x.sharding"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "V35YfFqFYUM8"
+ },
+ "source": [
+ "Here the array is on a single device, but in general a JAX array can be\n",
+ "sharded across multiple devices, or even multiple hosts.\n",
+ "To read more about sharded arrays and parallel computation, refer to [Introduction to parallel programming](https://docs.jax.dev/en/latest/sharded-computation.html)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "aAljVsaKYUM8"
+ },
+ "source": [
+ "## Just-in-time compilation with `jax.jit`\n",
+ "\n",
+ "**Key concepts:**\n",
+ "\n",
+ "- By default JAX executes operations one at a time, in sequence.\n",
+ "- Using a just-in-time (JIT) compilation decorator, sequences of operations can be optimized together and run at once.\n",
+ "- Not all JAX code can be JIT compiled, as it requires array shapes to be static & known at compile time.\n",
+ "\n",
+ "JAX runs transparently on the GPU or TPU (falling back to CPU if you don't have one), with all JAX operations being expressed in terms of XLA. If we have a sequence of operations, we can use the [`jax.jit`](https://docs.jax.dev/en/latest/_autosummary/jax.jit.html) function to compile this sequence of operations together using the XLA compiler."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "5l74lCkOYUM8"
+ },
+ "source": [
+ "For example, consider this function that normalizes the rows of a 2D matrix, expressed in terms of `jax.numpy` operations:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "SQj_UKGc-7kQ"
+ },
+ "outputs": [],
+ "source": [
+ "import jax.numpy as jnp\n",
+ "\n",
+ "def norm(X):\n",
+ " X = X - X.mean(0)\n",
+ " return X / X.std(0)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "MzCVHv2PYUM8"
+ },
+ "source": [
+ "A just-in-time compiled version of the function can be created using the `jax.jit` transform:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "ZZ8PO1q0YUM9"
+ },
+ "outputs": [],
+ "source": [
+ "from jax import jit\n",
+ "norm_compiled = jit(norm)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "IqDN2j65YUM9"
+ },
+ "source": [
+ "This function returns the same results as the original, up to standard floating-point accuracy:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "OeYy3Q5vYUM9"
+ },
+ "outputs": [],
+ "source": [
+ "np.random.seed(1701)\n",
+ "X = jnp.array(np.random.rand(10000, 10))\n",
+ "np.allclose(norm(X), norm_compiled(X), atol=1E-6)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "EmmGCeRrYUM_"
+ },
+ "source": [
+ "But due to the compilation (which includes fusing of operations, avoidance of allocating temporary arrays, and a host of other tricks), execution times can be orders of magnitude faster in the JIT-compiled case. We can use IPython's `%timeit` to quickly benchmark our function, using `block_until_ready()` to account for JAX's [asynchronous dispatch](https://docs.jax.dev/en/latest/async_dispatch.html):"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "FPAu49iqYUM_"
+ },
+ "outputs": [],
+ "source": [
+ "%timeit norm(X).block_until_ready()\n",
+ "%timeit norm_compiled(X).block_until_ready()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Ft8T3Y0cYUM_"
+ },
+ "source": [
+ "That said, `jax.jit` does have limitations: in particular, it requires all arrays to have static shapes. That means that some JAX operations are incompatible with JIT compilation.\n",
+ "\n",
+ "For example, this operation can be executed in op-by-op mode:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "q52JjRnJYUNA"
+ },
+ "outputs": [],
+ "source": [
+ "def get_negatives(x):\n",
+ " return x[x < 0]\n",
+ "\n",
+ "x = jnp.array(np.random.randn(10))\n",
+ "get_negatives(x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "IvvLm-iYYUNA"
+ },
+ "source": [
+ "But it returns an error if you attempt to execute it in jit mode:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "tags": [
+ "raises-exception"
+ ],
+ "id": "icdxGFuRYUNA"
+ },
+ "outputs": [],
+ "source": [
+ "jit(get_negatives)(x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "xilRzJr5YUNB"
+ },
+ "source": [
+ "This is because the function generates an array whose shape is not known at compile time: the size of the output depends on the values of the input array, and so it is not compatible with JIT."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "AVd5BvLkYUNB"
+ },
+ "source": [
+ "For more on JIT compilation in JAX, check out [Just-in-time compilation](https://docs.jax.dev/en/latest/jit-compilation.html)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Foe_K6NtYUNB"
+ },
+ "source": [
+ "## Taking derivatives with `jax.grad`\n",
+ "\n",
+ "**Key concepts:**\n",
+ "- JAX provides automatic differentiation via the `jax.grad` transformation.\n",
+ "- The `jax.grad` and `jax.jit` transformations compose and can be mixed arbitrarily.\n",
+ "\n",
+ "In addition to transforming functions via JIT compilation, JAX also provides other transformations. One such transformation is [`jax.grad`](https://docs.jax.dev/en/latest/_autosummary/jax.grad.html), which performs [automatic differentiation (autodiff)](https://en.wikipedia.org/wiki/Automatic_differentiation):"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "Go_4PYveYUNB"
+ },
+ "outputs": [],
+ "source": [
+ "from jax import grad\n",
+ "\n",
+ "def sum_logistic(x):\n",
+ " return jnp.sum(1.0 / (1.0 + jnp.exp(-x)))\n",
+ "\n",
+ "x_small = jnp.arange(3.)\n",
+ "derivative_fn = grad(sum_logistic)\n",
+ "print(derivative_fn(x_small))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Rlag8ZRHYUNB"
+ },
+ "source": [
+ "Let's verify with finite differences that our result is correct."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "NvsnS8DjYUNB"
+ },
+ "outputs": [],
+ "source": [
+ "def first_finite_differences(f, x, eps=1E-3):\n",
+ " return jnp.array([(f(x + eps * v) - f(x - eps * v)) / (2 * eps)\n",
+ " for v in jnp.eye(len(x))])\n",
+ "\n",
+ "print(first_finite_differences(sum_logistic, x_small))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "thRCyT5FYUNB"
+ },
+ "source": [
+ "The [`jax.grad`](https://docs.jax.dev/en/latest/_autosummary/jax.grad.html) and [`jax.jit`](https://docs.jax.dev/en/latest/_autosummary/jax.jit.html) transformations compose and can be mixed arbitrarily.\n",
+ "For instance, while the `sum_logistic` function was differentiated directly in the previous example, it could also be JIT-compiled, and these operations can be combined. We can go further:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "ozheMCj3YUNB"
+ },
+ "outputs": [],
+ "source": [
+ "print(grad(jit(grad(jit(grad(sum_logistic)))))(1.0))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ikNGfl3nYUNB"
+ },
+ "source": [
+ "Beyond scalar-valued functions, the [`jax.jacobian`](https://docs.jax.dev/en/latest/_autosummary/jax.jacobian.html) transformation can be\n",
+ "used to compute the full Jacobian matrix for vector-valued functions:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "p000jyMSYUNB"
+ },
+ "outputs": [],
+ "source": [
+ "from jax import jacobian\n",
+ "print(jacobian(jnp.exp)(x_small))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "WGA8D4yaYUNB"
+ },
+ "source": [
+ "For more advanced autodiff operations, you can use [`jax.vjp`](https://docs.jax.dev/en/latest/_autosummary/jax.vjp.html) for reverse-mode vector-Jacobian products,\n",
+ "and [`jax.jvp`](https://docs.jax.dev/en/latest/_autosummary/jax.jvp.html) and [`jax.linearize`](https://docs.jax.dev/en/latest/_autosummary/jax.linearize.html) for forward-mode Jacobian-vector products.\n",
+ "The two can be composed arbitrarily with one another, and with other JAX transformations.\n",
+ "For example, `jax.jvp` and `jax.vjp` are used to define the forward-mode [`jax.jacfwd`](https://docs.jax.dev/en/latest/_autosummary/jax.jacfwd.html) and reverse-mode [`jax.jacrev`](https://docs.jax.dev/en/latest/_autosummary/jax.jacrev.html) for computing Jacobians in forward- and reverse-mode, respectively.\n",
+ "Here's one way to compose them to make a function that efficiently computes full Hessian matrices:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "TtPncRBnYUNC"
+ },
+ "outputs": [],
+ "source": [
+ "from jax import jacfwd, jacrev\n",
+ "def hessian(fun):\n",
+ " return jit(jacfwd(jacrev(fun)))\n",
+ "print(hessian(sum_logistic)(x_small))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "9FJV_m5jYUNC"
+ },
+ "source": [
+ "This kind of composition produces efficient code in practice; this is more-or-less how JAX's built-in [`jax.hessian`](https://docs.jax.dev/en/latest/_autosummary/jax.hessian.html) function is implemented.\n",
+ "\n",
+ "For more on automatic differentiation in JAX, check out [Automatic differentiation](https://docs.jax.dev/en/latest/automatic-differentiation.html)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "Z36CRZfcYUNC"
+ },
+ "source": [
+ "## Auto-vectorization with `jax.vmap`\n",
+ "\n",
+ "**Key concepts:**\n",
+ "- JAX provides automatic vectorization via the [`jax.vmap`](https://docs.jax.dev/en/latest/_autosummary/jax.vmap.html) transformation.\n",
+ "- `jax.vmap` can be composed with `jax.jit` to produce efficient vectorized code.\n",
+ "\n",
+ "Another useful transformation is [`jax.vmap`](https://docs.jax.dev/en/latest/_autosummary/jax.vmap.html), the vectorizing map.\n",
+ "It has the familiar semantics of mapping a function along array axes, but instead of explicitly looping\n",
+ "over function calls, it transforms the function into a natively vectorized version for better performance.\n",
+ "When composed with [`jax.jit`](https://docs.jax.dev/en/latest/_autosummary/jax.jit.html), it can be just as performant as manually rewriting your function\n",
+ "to operate over an extra batch dimension.\n",
+ "\n",
+ "We're going to work with a simple example, and promote matrix-vector products into matrix-matrix products using [`jax.vmap`](https://docs.jax.dev/en/latest/_autosummary/jax.vmap.html).\n",
+ "Although this is easy to do by hand in this specific case, the same technique can apply to more complicated functions."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "cvLNXH0EYUNC"
+ },
+ "outputs": [],
+ "source": [
+ "from jax import random\n",
+ "\n",
+ "key = random.key(1701)\n",
+ "key1, key2 = random.split(key)\n",
+ "mat = random.normal(key1, (150, 100))\n",
+ "batched_x = random.normal(key2, (10, 100))\n",
+ "\n",
+ "def apply_matrix(x):\n",
+ " return jnp.dot(mat, x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "wRa-Nv-RYUNC"
+ },
+ "source": [
+ "The `apply_matrix` function maps a vector to a vector, but we may want to apply it row-wise across a matrix.\n",
+ "We could do this by looping over the batch dimension in Python, but this usually results in poor performance."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "JWGZiDllYUNC"
+ },
+ "outputs": [],
+ "source": [
+ "def naively_batched_apply_matrix(v_batched):\n",
+ " return jnp.stack([apply_matrix(v) for v in v_batched])\n",
+ "\n",
+ "print('Naively batched')\n",
+ "%timeit naively_batched_apply_matrix(batched_x).block_until_ready()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "I-qqD1KwYUNC"
+ },
+ "source": [
+ "A programmer familiar with the `jnp.dot` function might recognize that `apply_matrix` can\n",
+ "be rewritten to avoid explicit looping, using the built-in batching semantics of `jnp.dot`:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "sNu0zFNyYUNC"
+ },
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "\n",
+ "@jit\n",
+ "def batched_apply_matrix(batched_x):\n",
+ " return jnp.dot(batched_x, mat.T)\n",
+ "\n",
+ "np.testing.assert_allclose(naively_batched_apply_matrix(batched_x),\n",
+ " batched_apply_matrix(batched_x), atol=1E-4, rtol=1E-4)\n",
+ "print('Manually batched')\n",
+ "%timeit batched_apply_matrix(batched_x).block_until_ready()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "UcBvHRYbYUNC"
+ },
+ "source": [
+ "However, as functions become more complicated, this kind of manual batching becomes more difficult and error-prone.\n",
+ "The `jax.vmap` transformation is designed to automatically transform a function into a batch-aware version:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "vg6Sy-tTYUNC"
+ },
+ "outputs": [],
+ "source": [
+ "from jax import vmap\n",
+ "\n",
+ "@jit\n",
+ "def vmap_batched_apply_matrix(batched_x):\n",
+ " return vmap(apply_matrix)(batched_x)\n",
+ "\n",
+ "np.testing.assert_allclose(naively_batched_apply_matrix(batched_x),\n",
+ " vmap_batched_apply_matrix(batched_x), atol=1E-4, rtol=1E-4)\n",
+ "print('Auto-vectorized with vmap')\n",
+ "%timeit vmap_batched_apply_matrix(batched_x).block_until_ready()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "yFrhG7FpYUND"
+ },
+ "source": [
+ "As you would expect, `jax.vmap` can be arbitrarily composed with `jax.jit`,\n",
+ "`jax.grad`, and any other JAX transformation.\n",
+ "\n",
+ "For more on automatic vectorization in JAX, check out [Automatic vectorization](https://docs.jax.dev/en/latest/automatic-vectorization.html)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "gPnDPvZFYUND"
+ },
+ "source": [
+ "(key-concepts-prngs)=\n",
+ "## Pseudorandom numbers\n",
+ "\n",
+ "**Key concepts:**\n",
+ "\n",
+ "- JAX uses a different model for pseudo random number generation than NumPy.\n",
+ "- JAX random functions consume a random `key` that must be split to generate new independent keys.\n",
+ "- JAX's random key model is thread-safe and avoids issues with global state.\n",
+ "\n",
+ "Generally, JAX strives to be compatible with NumPy, but pseudo random number generation is a notable exception. NumPy supports a method of pseudo random number generation that is based on a global `state`, which can be set using [`numpy.random.seed`](https://numpy.org/doc/stable/reference/random/generated/numpy.random.seed.html). Global random state interacts poorly with JAX's compute model and makes it difficult to enforce reproducibility across different threads, processes, and devices. JAX instead tracks state explicitly via a random `key`:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "oO9zv4qzYUND"
+ },
+ "outputs": [],
+ "source": [
+ "from jax import random\n",
+ "\n",
+ "key = random.key(43)\n",
+ "print(key)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "IC19u-fMYUND"
+ },
+ "source": [
+ "The key is effectively a stand-in for NumPy's hidden state object, but we pass it explicitly to [`jax.random`](https://docs.jax.dev/en/latest/jax.random.html) functions. Importantly, random functions consume the key, but do not modify it: feeding the same key object to a random function will always result in the same sample being generated."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "4katRLceYUND"
+ },
+ "outputs": [],
+ "source": [
+ "print(random.normal(key))\n",
+ "print(random.normal(key))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "ErimsFIDYUND"
+ },
+ "source": [
+ "**The rule of thumb is: never reuse keys (unless you want identical outputs).**\n",
+ "\n",
+ "In order to generate different and independent samples, you must [`jax.random.split`](https://docs.jax.dev/en/latest/_autosummary/jax.random.split.html) the key explicitly before passing it to a random function:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "id": "rbrDM1c3YUND"
+ },
+ "outputs": [],
+ "source": [
+ "for i in range(3):\n",
+ " new_key, subkey = random.split(key)\n",
+ " del key # The old key is consumed by split() -- we must never use it again.\n",
+ "\n",
+ " val = random.normal(subkey)\n",
+ " del subkey # The subkey is consumed by normal().\n",
+ "\n",
+ " print(f\"draw {i}: {val}\")\n",
+ " key = new_key # new_key is safe to use in the next iteration."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "3qcubirBYUND"
+ },
+ "source": [
+ "Note that this code is thread safe, since the local random state eliminates possible race conditions involving global state. `jax.random.split` is a deterministic function that converts one `key` into several independent (in the pseudorandomness sense) keys.\n",
+ "\n",
+ "For more on pseudo random numbers in JAX, see the [Pseudorandom numbers tutorial](https://docs.jax.dev/en/latest/random-numbers.html)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "id": "VGgJzHmpYUND"
+ },
+ "source": [
+ "---\n",
+ "\n",
+ "This is just a taste of what JAX can do. We're really excited to see what you do with it!"
+ ]
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "name": "thinking_in_jax.ipynb",
+ "provenance": []
+ },
+ "jupytext": {
+ "formats": "ipynb,md:myst"
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.11.13"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}
\ No newline at end of file
diff --git a/profile/README.md b/profile/README.md
new file mode 100644
index 0000000..f01e93f
--- /dev/null
+++ b/profile/README.md
@@ -0,0 +1,16 @@
+## Hi there š
+
+
diff --git a/server.log b/server.log
new file mode 100644
index 0000000..bde8062
--- /dev/null
+++ b/server.log
@@ -0,0 +1,9 @@
+
+> dashboard@0.0.0 dev
+> vite
+
+
+ VITE v7.3.0 ready in 676 ms
+
+ ā Local: http://localhost:5173/
+ ā Network: use --host to expose