From aa6f8689edc9a8394876729d228501dce51cf22b Mon Sep 17 00:00:00 2001 From: ducnq1 Date: Wed, 22 Apr 2026 23:25:04 +0700 Subject: [PATCH] Code challenge solution - Nguyen Quang Duc --- readme.md | 13 +- src/problem2/index.html | 27 - src/problem2/script.js | 0 src/problem2/style.css | 8 - src/problem3/.keep | 0 src/problem4/problem4.js | 36 + .../backend-game-inventory/.dockerignore | 4 + .../backend-game-inventory/.env.example | 3 + .../backend-game-inventory/.gitignore | 4 + src/problem5/backend-game-inventory/README.md | 148 + .../docker-compose.dev.yml | 31 + .../docker-compose.prod.yml | 25 + .../docker/Dockerfile.dev | 13 + .../docker/Dockerfile.prod | 28 + .../backend-game-inventory/jest.config.js | 18 + .../backend-game-inventory/package-lock.json | 7942 +++++++++++++++++ .../backend-game-inventory/package.json | 49 + .../backend-game-inventory/scripts/seed.d.ts | 2 + .../scripts/seed.d.ts.map | 1 + .../backend-game-inventory/scripts/seed.js | 46 + .../scripts/seed.js.map | 1 + .../backend-game-inventory/scripts/seed.ts | 47 + .../backend-game-inventory/src/app.ts | 43 + .../backend-game-inventory/src/config/env.ts | 24 + .../src/config/index.ts | 9 + .../__tests__/game.controller.test.ts | 67 + .../src/controllers/game.controller.ts | 64 + .../src/controllers/index.ts | 1 + .../backend-game-inventory/src/db/mongo.ts | 21 + .../src/docs/openapi.yaml | 172 + .../src/dto/game.dto.ts | 9 + .../backend-game-inventory/src/dto/index.ts | 1 + .../src/middleware/errorHandler.ts | 39 + .../src/middleware/index.ts | 2 + .../src/middleware/validate.ts | 39 + .../src/models/game.model.ts | 27 + .../src/models/index.ts | 1 + .../src/routes/game.routes.ts | 25 + .../src/routes/index.ts | 1 + .../backend-game-inventory/src/server.ts | 14 + .../services/__tests__/game.service.test.ts | 76 + .../src/services/game.service.ts | 57 + .../src/services/index.ts | 1 + .../src/types/express.d.ts | 13 + .../backend-game-inventory/src/types/index.ts | 1 + .../src/types/validated-request.ts | 13 + .../src/utils/AppError.ts | 12 + .../src/utils/asyncWrapper.ts | 7 + .../src/utils/errors.ts | 19 + .../src/utils/handler.ts | 6 + .../backend-game-inventory/src/utils/index.ts | 7 + .../src/utils/response.ts | 26 + .../src/validation/game.validation.ts | 59 + .../src/validation/index.ts | 1 + .../backend-game-inventory/tsconfig.json | 27 + src/{problem1 => problem6}/.keep | 0 src/problem6/high-level-design.png | Bin 0 -> 90432 bytes src/problem6/readme.md | 368 + 58 files changed, 9653 insertions(+), 45 deletions(-) delete mode 100644 src/problem2/index.html delete mode 100644 src/problem2/script.js delete mode 100644 src/problem2/style.css delete mode 100644 src/problem3/.keep create mode 100644 src/problem4/problem4.js create mode 100644 src/problem5/backend-game-inventory/.dockerignore create mode 100644 src/problem5/backend-game-inventory/.env.example create mode 100644 src/problem5/backend-game-inventory/.gitignore create mode 100644 src/problem5/backend-game-inventory/README.md create mode 100644 src/problem5/backend-game-inventory/docker-compose.dev.yml create mode 100644 src/problem5/backend-game-inventory/docker-compose.prod.yml create mode 100644 src/problem5/backend-game-inventory/docker/Dockerfile.dev create mode 100644 src/problem5/backend-game-inventory/docker/Dockerfile.prod create mode 100644 src/problem5/backend-game-inventory/jest.config.js create mode 100644 src/problem5/backend-game-inventory/package-lock.json create mode 100644 src/problem5/backend-game-inventory/package.json create mode 100644 src/problem5/backend-game-inventory/scripts/seed.d.ts create mode 100644 src/problem5/backend-game-inventory/scripts/seed.d.ts.map create mode 100644 src/problem5/backend-game-inventory/scripts/seed.js create mode 100644 src/problem5/backend-game-inventory/scripts/seed.js.map create mode 100644 src/problem5/backend-game-inventory/scripts/seed.ts create mode 100644 src/problem5/backend-game-inventory/src/app.ts create mode 100644 src/problem5/backend-game-inventory/src/config/env.ts create mode 100644 src/problem5/backend-game-inventory/src/config/index.ts create mode 100644 src/problem5/backend-game-inventory/src/controllers/__tests__/game.controller.test.ts create mode 100644 src/problem5/backend-game-inventory/src/controllers/game.controller.ts create mode 100644 src/problem5/backend-game-inventory/src/controllers/index.ts create mode 100644 src/problem5/backend-game-inventory/src/db/mongo.ts create mode 100644 src/problem5/backend-game-inventory/src/docs/openapi.yaml create mode 100644 src/problem5/backend-game-inventory/src/dto/game.dto.ts create mode 100644 src/problem5/backend-game-inventory/src/dto/index.ts create mode 100644 src/problem5/backend-game-inventory/src/middleware/errorHandler.ts create mode 100644 src/problem5/backend-game-inventory/src/middleware/index.ts create mode 100644 src/problem5/backend-game-inventory/src/middleware/validate.ts create mode 100644 src/problem5/backend-game-inventory/src/models/game.model.ts create mode 100644 src/problem5/backend-game-inventory/src/models/index.ts create mode 100644 src/problem5/backend-game-inventory/src/routes/game.routes.ts create mode 100644 src/problem5/backend-game-inventory/src/routes/index.ts create mode 100644 src/problem5/backend-game-inventory/src/server.ts create mode 100644 src/problem5/backend-game-inventory/src/services/__tests__/game.service.test.ts create mode 100644 src/problem5/backend-game-inventory/src/services/game.service.ts create mode 100644 src/problem5/backend-game-inventory/src/services/index.ts create mode 100644 src/problem5/backend-game-inventory/src/types/express.d.ts create mode 100644 src/problem5/backend-game-inventory/src/types/index.ts create mode 100644 src/problem5/backend-game-inventory/src/types/validated-request.ts create mode 100644 src/problem5/backend-game-inventory/src/utils/AppError.ts create mode 100644 src/problem5/backend-game-inventory/src/utils/asyncWrapper.ts create mode 100644 src/problem5/backend-game-inventory/src/utils/errors.ts create mode 100644 src/problem5/backend-game-inventory/src/utils/handler.ts create mode 100644 src/problem5/backend-game-inventory/src/utils/index.ts create mode 100644 src/problem5/backend-game-inventory/src/utils/response.ts create mode 100644 src/problem5/backend-game-inventory/src/validation/game.validation.ts create mode 100644 src/problem5/backend-game-inventory/src/validation/index.ts create mode 100644 src/problem5/backend-game-inventory/tsconfig.json rename src/{problem1 => problem6}/.keep (100%) create mode 100644 src/problem6/high-level-design.png create mode 100644 src/problem6/readme.md diff --git a/readme.md b/readme.md index 1ff4bc95b4..3ad51a20dd 100644 --- a/readme.md +++ b/readme.md @@ -1,10 +1,3 @@ -# 99Tech Code Challenge #1 # - -Note that if you fork this repository, your responses may be publicly linked to this repo. -Please submit your application along with the solutions attached or linked. - -It is important that you minimally attempt the problems, even if you do not arrive at a working solution. - -## Submission ## -You can either provide a link to an online repository, attach the solution in your application, or whichever method you prefer. -We're cool as long as we can view your solution without any pain. +## Instructions to Run Projects +Each project inside this repository contains its own README with setup and run instructions. +Please refer to the respective project folder for details. \ No newline at end of file diff --git a/src/problem2/index.html b/src/problem2/index.html deleted file mode 100644 index 4058a68bff..0000000000 --- a/src/problem2/index.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Fancy Form - - - - - - - - -
-
Swap
- - - - - - - -
- - - - diff --git a/src/problem2/script.js b/src/problem2/script.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/problem2/style.css b/src/problem2/style.css deleted file mode 100644 index 915af91c72..0000000000 --- a/src/problem2/style.css +++ /dev/null @@ -1,8 +0,0 @@ -body { - display: flex; - flex-direction: row; - align-items: center; - justify-content: center; - min-width: 360px; - font-family: Arial, Helvetica, sans-serif; -} diff --git a/src/problem3/.keep b/src/problem3/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/problem4/problem4.js b/src/problem4/problem4.js new file mode 100644 index 0000000000..0a1db840c5 --- /dev/null +++ b/src/problem4/problem4.js @@ -0,0 +1,36 @@ + +// Time complexity: O(n) +// Space complexity: O(1) +function sum_to_n_a(n: number): number { + let sum = 0; + + for (let i = 1; i <= n; i++) { + sum += i; + } + + return sum; +} + + +// Time complexity: O(1) +// Space complexity: O(1) +function sum_to_n_b(n: number): number { + return (n * (n + 1)) / 2; +} + + +// Time complexity: O(n) +// Space complexity: O(n) +function sum_to_n_c(n: number): number { + const memo = {}; + + function sum(x: number): number { + if (x <= 1) return x; + if (memo[x] !== undefined) return memo[x]; + + memo[x] = x + sum(x - 1); + return memo[x]; + } + + return sum(n); +} \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/.dockerignore b/src/problem5/backend-game-inventory/.dockerignore new file mode 100644 index 0000000000..bf77ef1087 --- /dev/null +++ b/src/problem5/backend-game-inventory/.dockerignore @@ -0,0 +1,4 @@ +node_modules +dist +.git +.env \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/.env.example b/src/problem5/backend-game-inventory/.env.example new file mode 100644 index 0000000000..5a216e6b78 --- /dev/null +++ b/src/problem5/backend-game-inventory/.env.example @@ -0,0 +1,3 @@ +MONGO_URI=mongodb://db:27017/game_inventory +PORT=3000 +NODE_ENV=development \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/.gitignore b/src/problem5/backend-game-inventory/.gitignore new file mode 100644 index 0000000000..379d26d5f5 --- /dev/null +++ b/src/problem5/backend-game-inventory/.gitignore @@ -0,0 +1,4 @@ +node_modules +# Keep environment variables out of version control +.env +dist \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/README.md b/src/problem5/backend-game-inventory/README.md new file mode 100644 index 0000000000..8cb4adf9ec --- /dev/null +++ b/src/problem5/backend-game-inventory/README.md @@ -0,0 +1,148 @@ +# Game Inventory API + +A simple **Game Inventory Management API** built with **Node.js, Express, TypeScript, MongoDB, and Docker**. + +--- + +# Tech Stack + +- Node.js + Express +- TypeScript +- MongoDB +- Docker & Docker Compose + +--- + +# Project Structure +```bash +├── app.ts +├── server.ts +│ +├── config +│ ├── env.ts +│ └── index.ts +│ +├── controllers +│ ├── game.controller.ts +│ └── tests +│ +├── services +│ ├── game.service.ts +│ └── tests +│ +├── routes +│ └── game.routes.ts +│ +├── models +│ └── game.model.ts +│ +├── db +│ └── mongo.ts +│ +├── dto +│ └── game.dto.ts +│ +├── validation +│ └── game.validation.ts +│ +├── middleware +│ ├── errorHandler.ts +│ └── validate.ts +│ +├── utils +│ ├── AppError.ts +│ ├── asyncWrapper.ts +│ ├── errors.ts +│ ├── handler.ts +│ └── response.ts +│ +├── types +│ ├── express.d.ts +│ └── validated-request.ts +│ +└── docs +└── openapi.yaml +``` + +# Environment Setup + +## 1. Create `.env` file + +Copy from `.env.example`: + +```bash +cp .env.example .env +``` +Example +``` +PORT=3000 +MONGO_URI=mongodb://db:27017/game_inventory +NODE_ENV=development +``` + +## 2. Development setup + +Start dev environment +```bash +docker compose -f docker-compose.dev.yml up -d +``` + +View logs +```bash +docker compose -f docker-compose.dev.yml logs -f app +``` +Access app +``` +http://localhost:3000 +``` + +Stop dev +```bash +docker compose -f docker-compose.dev.yml down +``` + +## 3. Production setup + +Start production +```bash +docker compose -f docker-compose.prod.yml up -d --build +``` + +View logs +```bash +docker compose -f docker-compose.prod.yml logs -f app +``` + +Access app +``` +http://localhost:3000 +``` + +Stop production +```bash +docker compose -f docker-compose.prod.yml down +``` + +## 4. API Documentation + +The API is documented using OpenAPI (Swagger). + +After running the application, you can access the API documentation at: + +``` +http://localhost:3000/api-docs +``` + +## 5. Running Tests + +The project uses Jest for unit testing. + +Run all tests +``` +npm run test +``` + +Run tests in watch mode +``` +npm run test:watch +``` \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/docker-compose.dev.yml b/src/problem5/backend-game-inventory/docker-compose.dev.yml new file mode 100644 index 0000000000..74db8dfa0e --- /dev/null +++ b/src/problem5/backend-game-inventory/docker-compose.dev.yml @@ -0,0 +1,31 @@ +version: "3.9" + +services: + db: + image: mongo:7 + container_name: game-mongo + ports: + - "27017:27017" + volumes: + - mongo_data:/data/db + + app: + build: + context: . + dockerfile: docker/Dockerfile.dev + container_name: game-api + depends_on: + - db + ports: + - "3000:3000" + env_file: + - .env + volumes: + - .:/app + - /app/node_modules + environment: + CHOKIDAR_USEPOLLING: "true" + command: sh -c "npm run seed && npm run dev" + +volumes: + mongo_data: \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/docker-compose.prod.yml b/src/problem5/backend-game-inventory/docker-compose.prod.yml new file mode 100644 index 0000000000..addaa1b03d --- /dev/null +++ b/src/problem5/backend-game-inventory/docker-compose.prod.yml @@ -0,0 +1,25 @@ +version: "3.9" + +services: + db: + image: mongo:7 + container_name: game-mongo + restart: always + volumes: + - mongo_data:/data/db + + app: + build: + context: . + dockerfile: docker/Dockerfile.prod + container_name: game-api + depends_on: + - db + ports: + - "3000:3000" + env_file: + - .env + command: node dist/server.js + +volumes: + mongo_data: \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/docker/Dockerfile.dev b/src/problem5/backend-game-inventory/docker/Dockerfile.dev new file mode 100644 index 0000000000..080517e3a5 --- /dev/null +++ b/src/problem5/backend-game-inventory/docker/Dockerfile.dev @@ -0,0 +1,13 @@ +FROM node:20 + +WORKDIR /app + +COPY package*.json ./ + +RUN npm install + +COPY . . + +EXPOSE 3000 + +CMD ["npm", "run", "dev"] \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/docker/Dockerfile.prod b/src/problem5/backend-game-inventory/docker/Dockerfile.prod new file mode 100644 index 0000000000..8ab3a12b2c --- /dev/null +++ b/src/problem5/backend-game-inventory/docker/Dockerfile.prod @@ -0,0 +1,28 @@ +# ===== BUILD STAGE ===== +FROM node:20 AS builder + +WORKDIR /app + +COPY package*.json ./ +RUN npm install + +COPY . . + +RUN npm run build + + +# ===== RUNTIME STAGE ===== +FROM node:20 + +WORKDIR /app + +COPY package*.json ./ +RUN npm install --omit=dev + +COPY --from=builder /app/dist ./dist + +COPY --from=builder /app/src/docs ./dist/docs + +EXPOSE 3000 + +CMD ["node", "dist/server.js"] \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/jest.config.js b/src/problem5/backend-game-inventory/jest.config.js new file mode 100644 index 0000000000..fb3d9dd953 --- /dev/null +++ b/src/problem5/backend-game-inventory/jest.config.js @@ -0,0 +1,18 @@ +const { createDefaultPreset } = require("ts-jest"); + +const tsJestTransformCfg = createDefaultPreset().transform; + +/** @type {import("jest").Config} **/ +module.exports = { + testEnvironment: "node", + transform: { + ...tsJestTransformCfg, + }, + preset: "ts-jest", + roots: ["/src"], + moduleFileExtensions: ["ts", "js"], + moduleNameMapper: { + "^@/(.*)$": "/src/$1" +}, + clearMocks: true +}; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/package-lock.json b/src/problem5/backend-game-inventory/package-lock.json new file mode 100644 index 0000000000..9c853e163f --- /dev/null +++ b/src/problem5/backend-game-inventory/package-lock.json @@ -0,0 +1,7942 @@ +{ + "name": "backend-game-inventory", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "backend-game-inventory", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "cors": "^2.8.6", + "dotenv": "^17.4.2", + "express": "^5.2.1", + "express-rate-limit": "^8.4.0", + "helmet": "^8.1.0", + "mongoose": "^9.5.0", + "swagger-ui-express": "^5.0.1", + "winston": "^3.13.0", + "yamljs": "^0.3.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/jest": "^30.0.0", + "@types/mongoose": "^5.11.96", + "@types/node": "^25.6.0", + "@types/supertest": "^7.2.0", + "@types/swagger-ui-express": "^4.1.8", + "@types/yamljs": "^0.2.34", + "jest": "^30.3.0", + "nodemon": "^3.1.14", + "supertest": "^7.2.2", + "ts-jest": "^29.4.9", + "ts-node": "^10.9.2", + "ts-node-dev": "^2.0.0", + "tsc-alias": "^1.8.16", + "tsconfig-paths": "^4.2.0", + "tsx": "^4.21.0", + "typescript": "^6.0.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "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.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "license": "MIT", + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz", + "integrity": "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz", + "integrity": "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.3.0", + "jest-config": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-resolve-dependencies": "30.3.0", + "jest-runner": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "jest-watcher": "30.3.0", + "pretty-format": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", + "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz", + "integrity": "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-mock": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.3.0", + "jest-snapshot": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", + "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz", + "integrity": "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@sinonjs/fake-timers": "^15.0.0", + "@types/node": "*", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz", + "integrity": "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/types": "30.3.0", + "jest-mock": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz", + "integrity": "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz", + "integrity": "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz", + "integrity": "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/types": "30.3.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz", + "integrity": "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.3.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz", + "integrity": "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.3.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.3.0", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "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/@mongodb-js/saslprep": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.9.tgz", + "integrity": "sha512-RXSxsokhAF/4nWys8An8npsqOI33Ex1Hlzqjw2pZOO+GKtMAR2noGnUdsFiGwsaO/xXI+56mtjTmDA3JXJsvmA==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@scarf/scarf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", + "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", + "hasInstallScript": true, + "license": "Apache-2.0" + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.49", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", + "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "15.3.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz", + "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "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/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mongoose": { + "version": "5.11.96", + "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.11.96.tgz", + "integrity": "sha512-keiY22ljJtXyM7osgScmZOHV6eL5VFUD5tQumlu+hjS++HND5nM8jNEdj5CSWfKIJpVwQfPuwQ2SfBqUnCAVRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mongoose": "*" + } + }, + "node_modules/@types/node": { + "version": "25.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.0.tgz", + "integrity": "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.19.0" + } + }, + "node_modules/@types/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-7.2.0.tgz", + "integrity": "sha512-uh2Lv57xvggst6lCqNdFAmDSvoMG7M/HDtX4iUCquxQ5EGPtaPM5PL5Hmi7LCvOG8db7YaCPNJEeoI8s/WzIQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/swagger-ui-express": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.8.tgz", + "integrity": "sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/@types/yamljs": { + "version": "0.2.34", + "resolved": "https://registry.npmjs.org/@types/yamljs/-/yamljs-0.2.34.tgz", + "integrity": "sha512-gJvfRlv9ErxdOv7ux7UsJVePtX54NAvQyd8ncoiFqK8G5aeHIfQfGH2fbruvjAQ9657HwAaO54waS+Dsk2QTUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", + "integrity": "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.3.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.3.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz", + "integrity": "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz", + "integrity": "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.3.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.21", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.21.tgz", + "integrity": "sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/bson": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-7.2.0.tgz", + "integrity": "sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001790", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001790.tgz", + "integrity": "sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==", + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "license": "MIT", + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.344", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.344.tgz", + "integrity": "sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.3.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.4.0.tgz", + "integrity": "sha512-gDK8yiqKxrGta+3WtON59arrrw6GLmadA1qoFgYXzdcch8fmKDID2XqO8itsi3f1wufXYPT51387dN6cvVBS3Q==", + "license": "MIT", + "dependencies": { + "ip-address": "10.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-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-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/helmet": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz", + "integrity": "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz", + "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.3.0", + "@jest/types": "30.3.0", + "import-local": "^3.2.0", + "jest-cli": "30.3.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz", + "integrity": "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.3.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz", + "integrity": "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "p-limit": "^3.1.0", + "pretty-format": "30.3.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-cli": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz", + "integrity": "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz", + "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.3.0", + "@jest/types": "30.3.0", + "babel-jest": "30.3.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-circus": "30.3.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-runner": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "parse-json": "^5.2.0", + "pretty-format": "30.3.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", + "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.3.0", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz", + "integrity": "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.3.0", + "chalk": "^4.1.2", + "jest-util": "30.3.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz", + "integrity": "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-mock": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz", + "integrity": "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", + "picomatch": "^4.0.3", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-leak-detector": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz", + "integrity": "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", + "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.3.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", + "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.3.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3", + "pretty-format": "30.3.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz", + "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "jest-util": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz", + "integrity": "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz", + "integrity": "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz", + "integrity": "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.3.0", + "@jest/environment": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-leak-detector": "30.3.0", + "jest-message-util": "30.3.0", + "jest-resolve": "30.3.0", + "jest-runtime": "30.3.0", + "jest-util": "30.3.0", + "jest-watcher": "30.3.0", + "jest-worker": "30.3.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz", + "integrity": "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/globals": "30.3.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.5.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz", + "integrity": "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.3.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.3.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "pretty-format": "30.3.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.3.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz", + "integrity": "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.3.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.3.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz", + "integrity": "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.3.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.3.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/kareem": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.3.0.tgz", + "integrity": "sha512-kpSuLD3/7RenBnjnJdOHXCKC8dTd1JzeOiJhN0necWWci6cC+qX+VuwPnMVgb+a4+KNJSfgqahpnfWaeDXCimw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "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/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.1.1.tgz", + "integrity": "sha512-067DXiMjcpYQl6bGjWQoTUEE9UoRViTtKFcoqX7z08I+iDZv/emH1g8XEFiO3qiDfXAheT5ozl1VffDTKhIW/w==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.3.0", + "bson": "^7.1.1", + "mongodb-connection-string-url": "^7.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.806.0", + "@mongodb-js/zstd": "^7.0.0", + "gcp-metadata": "^7.0.1", + "kerberos": "^7.0.0", + "mongodb-client-encryption": ">=7.0.0 <7.1.0", + "snappy": "^7.3.2", + "socks": "^2.8.6" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.1.tgz", + "integrity": "sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^13.0.0", + "whatwg-url": "^14.1.0" + }, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/mongoose": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.5.0.tgz", + "integrity": "sha512-B4blGFkFL1s0G24URuMvx0qTlx+gRVLmfO7WcSz8NcmW/XHEJ3G69capdyW1iRsGKiycp1tkwKHnxHbnwjwmPw==", + "license": "MIT", + "dependencies": { + "kareem": "3.3.0", + "mongodb": "~7.1", + "mpath": "0.9.0", + "mquery": "6.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-6.0.0.tgz", + "integrity": "sha512-b2KQNsmgtkscfeDgkYMcWGn9vZI9YoXh802VDEwE6qc50zxBFQ0Oo8ROkawbPAsXCY1/Z1yp0MagqsZStPWJjw==", + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mylas": { + "version": "2.1.14", + "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.14.tgz", + "integrity": "sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/raouldeheer" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", + "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^10.2.1", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/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/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/plimit-lit": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", + "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "queue-lit": "^1.5.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/pretty-format": { + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-lit": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", + "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/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/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "license": "MIT", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/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/superagent": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", + "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", + "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-ui-dist": { + "version": "5.32.4", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.32.4.tgz", + "integrity": "sha512-0AADFFQNJzExEN49SrD/34Nn9cxNxVLiydYl2MBwSZFPVXNkVwC/EFAjoezGGqE8oDegiDC+p47t8lKObCinMQ==", + "license": "Apache-2.0", + "dependencies": { + "@scarf/scarf": "=1.4.0" + } + }, + "node_modules/swagger-ui-express": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz", + "integrity": "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==", + "license": "MIT", + "dependencies": { + "swagger-ui-dist": ">=5.0.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0 || >=5.0.0-beta" + } + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/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/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ts-jest": { + "version": "29.4.9", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.9.tgz", + "integrity": "sha512-LTb9496gYPMCqjeDLdPrKuXtncudeV1yRZnF4Wo5l3SFi0RYEnYRNgMrFIdg+FHvfzjCyQk1cLncWVqiSX+EvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.9", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.4", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <7" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node-dev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", + "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.1", + "dynamic-dedupe": "^0.3.0", + "minimist": "^1.2.6", + "mkdirp": "^1.0.4", + "resolve": "^1.0.0", + "rimraf": "^2.6.1", + "source-map-support": "^0.5.12", + "tree-kill": "^1.2.2", + "ts-node": "^10.4.0", + "tsconfig": "^7.0.0" + }, + "bin": { + "ts-node-dev": "lib/bin.js", + "tsnd": "lib/bin.js" + }, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "node-notifier": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/tsc-alias": { + "version": "1.8.16", + "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.16.tgz", + "integrity": "sha512-QjCyu55NFyRSBAl6+MTFwplpFcnm2Pq01rR/uxfqJoLMm6X3O14KEGtaSDZpJYaE1bJBGDjD0eSuiIWPe2T58g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.3", + "commander": "^9.0.0", + "get-tsconfig": "^4.10.0", + "globby": "^11.0.4", + "mylas": "^2.1.9", + "normalize-path": "^3.0.0", + "plimit-lit": "^1.2.6" + }, + "bin": { + "tsc-alias": "dist/bin/index.js" + }, + "engines": { + "node": ">=16.20.2" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/winston": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yamljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", + "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "glob": "^7.0.5" + }, + "bin": { + "json2yaml": "bin/json2yaml", + "yaml2json": "bin/yaml2json" + } + }, + "node_modules/yamljs/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/yamljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/yamljs/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/src/problem5/backend-game-inventory/package.json b/src/problem5/backend-game-inventory/package.json new file mode 100644 index 0000000000..b0d0a8a15e --- /dev/null +++ b/src/problem5/backend-game-inventory/package.json @@ -0,0 +1,49 @@ +{ + "name": "backend-game-inventory", + "version": "1.0.0", + "description": "Game Inventory Management API (Express + TypeScript + MongoDB)", + "main": "dist/server.js", + "scripts": { + "dev": "nodemon --watch src --ext ts --exec \"ts-node -r tsconfig-paths/register src/server.ts\"", + "build": "tsc && tsc-alias && cp -r src/docs dist/docs", + "start": "node dist/server.js", + "test": "jest", + "test:watch": "jest --watch", + "seed": "ts-node -r tsconfig-paths/register scripts/seed.ts" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "cors": "^2.8.6", + "dotenv": "^17.4.2", + "express": "^5.2.1", + "express-rate-limit": "^8.4.0", + "helmet": "^8.1.0", + "mongoose": "^9.5.0", + "swagger-ui-express": "^5.0.1", + "winston": "^3.13.0", + "yamljs": "^0.3.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/jest": "^30.0.0", + "@types/mongoose": "^5.11.96", + "@types/node": "^25.6.0", + "@types/supertest": "^7.2.0", + "@types/swagger-ui-express": "^4.1.8", + "@types/yamljs": "^0.2.34", + "jest": "^30.3.0", + "nodemon": "^3.1.14", + "supertest": "^7.2.2", + "ts-jest": "^29.4.9", + "ts-node": "^10.9.2", + "ts-node-dev": "^2.0.0", + "tsc-alias": "^1.8.16", + "tsconfig-paths": "^4.2.0", + "tsx": "^4.21.0", + "typescript": "^6.0.3" + } +} \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/scripts/seed.d.ts b/src/problem5/backend-game-inventory/scripts/seed.d.ts new file mode 100644 index 0000000000..0986b1c3a4 --- /dev/null +++ b/src/problem5/backend-game-inventory/scripts/seed.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=seed.d.ts.map \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/scripts/seed.d.ts.map b/src/problem5/backend-game-inventory/scripts/seed.d.ts.map new file mode 100644 index 0000000000..c1a0e0b3d1 --- /dev/null +++ b/src/problem5/backend-game-inventory/scripts/seed.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["seed.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/scripts/seed.js b/src/problem5/backend-game-inventory/scripts/seed.js new file mode 100644 index 0000000000..b27d95b7c0 --- /dev/null +++ b/src/problem5/backend-game-inventory/scripts/seed.js @@ -0,0 +1,46 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const game_model_1 = require("../src/models/game.model"); +const mongo_1 = require("../src/db/mongo"); +async function seed() { + try { + await (0, mongo_1.connectDB)(); + const count = await game_model_1.Game.countDocuments(); + if (count > 0) { + console.log("Data already seeded, skipping..."); + return; + } + await game_model_1.Game.insertMany([ + { + title: "Elden Ring", + genre: "RPG", + platform: "PC", + quantity: 10, + price: 59.99, + }, + { + title: "God of War", + genre: "Action", + platform: "PlayStation", + quantity: 5, + price: 49.99, + }, + { + title: "FIFA 24", + genre: "Sports", + platform: "PC", + quantity: 20, + price: 39.99, + }, + ]); + console.log("Seed data inserted"); + } + catch (err) { + console.error(err); + } + finally { + await (0, mongo_1.disconnectDB)(); + } +} +seed(); +//# sourceMappingURL=seed.js.map \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/scripts/seed.js.map b/src/problem5/backend-game-inventory/scripts/seed.js.map new file mode 100644 index 0000000000..51ddfdb63d --- /dev/null +++ b/src/problem5/backend-game-inventory/scripts/seed.js.map @@ -0,0 +1 @@ +{"version":3,"file":"seed.js","sourceRoot":"","sources":["seed.ts"],"names":[],"mappings":";;AAAA,yDAAgD;AAChD,2CAA0D;AAE1D,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,IAAA,iBAAS,GAAE,CAAC;QAElB,MAAM,KAAK,GAAG,MAAM,iBAAI,CAAC,cAAc,EAAE,CAAC;QAE1C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,MAAM,iBAAI,CAAC,UAAU,CAAC;YACpB;gBACE,KAAK,EAAE,YAAY;gBACnB,KAAK,EAAE,KAAK;gBACZ,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,KAAK;aACb;YACD;gBACE,KAAK,EAAE,YAAY;gBACnB,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,aAAa;gBACvB,QAAQ,EAAE,CAAC;gBACX,KAAK,EAAE,KAAK;aACb;YACD;gBACE,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,EAAE;gBACZ,KAAK,EAAE,KAAK;aACb;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,MAAM,IAAA,oBAAY,GAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"} \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/scripts/seed.ts b/src/problem5/backend-game-inventory/scripts/seed.ts new file mode 100644 index 0000000000..2f536ef249 --- /dev/null +++ b/src/problem5/backend-game-inventory/scripts/seed.ts @@ -0,0 +1,47 @@ +import { Game } from "../src/models/game.model"; +import { connectDB, disconnectDB } from "../src/db/mongo"; + +async function seed() { + try { + await connectDB(); + + const count = await Game.countDocuments(); + + if (count > 0) { + console.log("Data already seeded, skipping..."); + return; + } + + await Game.insertMany([ + { + title: "Elden Ring", + genre: "RPG", + platform: "PC", + quantity: 10, + price: 59.99, + }, + { + title: "God of War", + genre: "Action", + platform: "PlayStation", + quantity: 5, + price: 49.99, + }, + { + title: "FIFA 24", + genre: "Sports", + platform: "PC", + quantity: 20, + price: 39.99, + }, + ]); + + console.log("Seed data inserted"); + } catch (err) { + console.error(err); + } finally { + await disconnectDB(); + } +} + +seed(); \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/app.ts b/src/problem5/backend-game-inventory/src/app.ts new file mode 100644 index 0000000000..10802e9a35 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/app.ts @@ -0,0 +1,43 @@ +import express from "express"; +import swaggerUi from "swagger-ui-express"; +import YAML from "yamljs"; +import "dotenv/config"; +import helmet from "helmet"; +import rateLimit from "express-rate-limit"; +import path from "path"; +// middleware +import { errorHandler } from "@/middleware"; +// routes +import {gameRoutes} from "@/routes"; + +const app = express(); + +app.use(helmet()); + +app.use( + rateLimit({ + windowMs: 15 * 60 * 1000, + max: 100, + }) +); + +app.use(express.json()); + +const swaggerDocument = YAML.load( + path.join(__dirname, "./docs/openapi.yaml") +); + +app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerDocument)); + +app.use("/games", gameRoutes); + +app.use((req, res) => { + res.status(404).json({ + success: false, + error: "Route not found", + }); +}); + +app.use(errorHandler); + +export default app; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/config/env.ts b/src/problem5/backend-game-inventory/src/config/env.ts new file mode 100644 index 0000000000..4120762765 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/config/env.ts @@ -0,0 +1,24 @@ +import { z } from "zod"; + + +const envSchema = z.object({ + NODE_ENV: z.enum(["development", "test", "production"]).default("development"), + + PORT: z + .string() + .default("3000") + .transform((val) => Number(val)), + + MONGO_URI: z.string().min(1, "MONGO_URI is required"), + +}); + +const parsed = envSchema.safeParse(process.env); + +if (!parsed.success) { + console.error("Invalid environment variables:"); + console.error(parsed.error.format()); + process.exit(1); +} + +export const env = parsed.data; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/config/index.ts b/src/problem5/backend-game-inventory/src/config/index.ts new file mode 100644 index 0000000000..f928183357 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/config/index.ts @@ -0,0 +1,9 @@ +import { env } from "@/config/env"; + +export const config = { + port: env.PORT, + db: { + uri: env.MONGO_URI, + }, + isProd: env.NODE_ENV === "production", +}; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/controllers/__tests__/game.controller.test.ts b/src/problem5/backend-game-inventory/src/controllers/__tests__/game.controller.test.ts new file mode 100644 index 0000000000..ff7a100ba1 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/controllers/__tests__/game.controller.test.ts @@ -0,0 +1,67 @@ +import { GameController } from "../game.controller"; +import { GameService } from "../../services/game.service"; + +describe("GameController", () => { + const mockRes = () => { + const res: any = {}; + res.status = jest.fn().mockReturnValue(res); + res.json = jest.fn().mockReturnValue(res); + return res; + }; + + afterEach(() => { + jest.clearAllMocks(); + }); + + it("should create game", async () => { + const req: any = { + validated: { + body: { title: "GTA" }, + }, + }; + + const res = mockRes(); + + jest.spyOn(GameService, "create").mockResolvedValue({ id: "1" } as any); + + await GameController.create(req, res); + + expect(GameService.create).toHaveBeenCalled(); + expect(res.status).toHaveBeenCalledWith(200); + }); + + it("should get all games", async () => { + const req: any = { + validated: { + query: { page: 1, limit: 10 }, + }, + }; + + const res = mockRes(); + + jest + .spyOn(GameService, "findAll") + .mockResolvedValue({ data: [], meta: {} } as any); + + await GameController.getAll(req, res); + + expect(GameService.findAll).toHaveBeenCalled(); + expect(res.json).toHaveBeenCalled(); + }); + + it("should return 404 if not found", async () => { + const req: any = { + validated: { + params: { id: "1" }, + }, + }; + + const res = mockRes(); + + jest.spyOn(GameService, "findById").mockResolvedValue(null as any); + + await GameController.getById(req, res); + + expect(res.status).toHaveBeenCalledWith(404); + }); +}); \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/controllers/game.controller.ts b/src/problem5/backend-game-inventory/src/controllers/game.controller.ts new file mode 100644 index 0000000000..f7ee2e7cef --- /dev/null +++ b/src/problem5/backend-game-inventory/src/controllers/game.controller.ts @@ -0,0 +1,64 @@ +import { Response } from "express"; +// Services +import { GameService } from "@/services/game.service"; +// Types +import { + CreateGameBody, + GetAllGamesQuery, + GetGameByIdParams, + UpdateGameBody, + UpdateGameParams, + DeleteGameParams +} from "@/validation/game.validation"; +import { ValidatedRequest } from "@/types/validated-request"; +import { errorResponse, successResponse } from "@/utils/response"; + +export class GameController { + static create = async ( + req: ValidatedRequest, + res: Response + ) => { + const game = await GameService.create(req.validated.body); + return successResponse(res, game); + }; + + static getAll = async ( + req: ValidatedRequest, + res: Response + ) => { + const result = await GameService.findAll(req.validated.query); + + return successResponse(res, result.data, { + total: result.total, + page: Number(req.validated.query.page) || 1, + limit: Number(req.validated.query.limit) || 10, + }); + }; + + static getById = async ( + req: ValidatedRequest, + res: Response + ) => { + const { id } = req.validated.params; + const game = await GameService.findById(id); + if (!game) { + return errorResponse(res, "Game not found", 404); + } + successResponse(res, game); + }; + + static update = async ( + req: ValidatedRequest, + res: Response + ) => { + const { id } = req.validated.params; + const game = await GameService.update(id, req.validated.body); + successResponse(res, game); + }; + + static delete = async (req: ValidatedRequest, res: Response) => { + const { id } = req.validated.params; + await GameService.delete(id); + successResponse(res, { message: "Deleted" }); + }; +} \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/controllers/index.ts b/src/problem5/backend-game-inventory/src/controllers/index.ts new file mode 100644 index 0000000000..7b11edf436 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/controllers/index.ts @@ -0,0 +1 @@ +export * from "@/controllers/game.controller"; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/db/mongo.ts b/src/problem5/backend-game-inventory/src/db/mongo.ts new file mode 100644 index 0000000000..f11fb7bbfd --- /dev/null +++ b/src/problem5/backend-game-inventory/src/db/mongo.ts @@ -0,0 +1,21 @@ +import mongoose from "mongoose"; +import { config } from "@/config"; + +export const connectDB = async () => { + try { + await mongoose.connect(config.db.uri); + console.log("MongoDB connected"); + } catch (error) { + console.error("MongoDB connection error", error); + process.exit(1); + } +}; + +export const disconnectDB = async () => { + try { + await mongoose.connection.close(); + console.log("MongoDB disconnected"); + } catch (error) { + console.error("MongoDB disconnection error", error); + } +}; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/docs/openapi.yaml b/src/problem5/backend-game-inventory/src/docs/openapi.yaml new file mode 100644 index 0000000000..6c136dbfa6 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/docs/openapi.yaml @@ -0,0 +1,172 @@ +openapi: 3.0.0 +info: + title: Game API + version: 1.0.0 + description: API for managing games + +servers: + - url: http://localhost:3000 + +paths: + /games: + get: + summary: Get all games + parameters: + - in: query + name: title + schema: + type: string + - in: query + name: genre + schema: + type: string + - in: query + name: page + schema: + type: integer + default: 1 + - in: query + name: limit + schema: + type: integer + default: 10 + responses: + 200: + description: List of games + content: + application/json: + schema: + $ref: '#/components/schemas/GameListResponse' + + post: + summary: Create a game + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateGame' + responses: + 201: + description: Created + + /games/{id}: + get: + summary: Get game by ID + parameters: + - in: path + name: id + required: true + schema: + type: string + responses: + 200: + description: Game found + content: + application/json: + schema: + $ref: '#/components/schemas/Game' + + 404: + description: Not found + + put: + summary: Update game + parameters: + - in: path + name: id + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateGame' + responses: + 200: + description: Updated + + delete: + summary: Delete game + parameters: + - in: path + name: id + required: true + schema: + type: string + responses: + 200: + description: Deleted + +components: + schemas: + Game: + type: object + properties: + id: + type: string + title: + type: string + genre: + type: string + platform: + type: string + quantity: + type: integer + price: + type: number + createdAt: + type: string + format: date-time + updatedAt: + type: string + format: date-time + + CreateGame: + type: object + required: [title, genre, platform, quantity, price] + properties: + title: + type: string + genre: + type: string + platform: + type: string + quantity: + type: integer + price: + type: number + + UpdateGame: + type: object + properties: + title: + type: string + genre: + type: string + platform: + type: string + quantity: + type: integer + price: + type: number + + GameListResponse: + type: object + properties: + data: + type: array + items: + $ref: '#/components/schemas/Game' + meta: + type: object + properties: + total: + type: integer + page: + type: integer + limit: + type: integer + totalPages: + type: integer \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/dto/game.dto.ts b/src/problem5/backend-game-inventory/src/dto/game.dto.ts new file mode 100644 index 0000000000..c4a95d1189 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/dto/game.dto.ts @@ -0,0 +1,9 @@ +export type CreateGameDTO = { + title: string; + genre: string; + platform: string; + quantity: number; + price: number; +}; + +export type UpdateGameDTO = Partial; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/dto/index.ts b/src/problem5/backend-game-inventory/src/dto/index.ts new file mode 100644 index 0000000000..1fc7edf1ba --- /dev/null +++ b/src/problem5/backend-game-inventory/src/dto/index.ts @@ -0,0 +1 @@ +export * from "@/dto/game.dto"; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/middleware/errorHandler.ts b/src/problem5/backend-game-inventory/src/middleware/errorHandler.ts new file mode 100644 index 0000000000..67a66ac3ba --- /dev/null +++ b/src/problem5/backend-game-inventory/src/middleware/errorHandler.ts @@ -0,0 +1,39 @@ +import { Request, Response, NextFunction } from "express"; +import { ZodError } from "zod"; +import { AppError } from "@/utils"; + +export const errorHandler = ( + err: any, + req: Request, + res: Response, + next: NextFunction +) => { + console.error(err); + + if (err instanceof ZodError) { + return res.status(400).json({ + success: false, + error: "Validation Error", + details: err.message, + }); + } + + if (err.name === "CastError") { + return res.status(400).json({ + success: false, + error: "Invalid ID format", + }); + } + + if (err instanceof AppError) { + return res.status(err.statusCode).json({ + success: false, + error: err.message, + }); + } + + return res.status(500).json({ + success: false, + error: "Internal Server Error", + }); +}; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/middleware/index.ts b/src/problem5/backend-game-inventory/src/middleware/index.ts new file mode 100644 index 0000000000..2f8a5ad874 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/middleware/index.ts @@ -0,0 +1,2 @@ +export * from "@/middleware/validate"; +export * from "@/middleware/errorHandler"; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/middleware/validate.ts b/src/problem5/backend-game-inventory/src/middleware/validate.ts new file mode 100644 index 0000000000..ffd201a31e --- /dev/null +++ b/src/problem5/backend-game-inventory/src/middleware/validate.ts @@ -0,0 +1,39 @@ +import { z, ZodError } from "zod"; +import { Request, Response, NextFunction } from "express"; + +type Schema = Partial<{ + body: z.ZodTypeAny; + query: z.ZodTypeAny; + params: z.ZodTypeAny; +}>; + +export const validate = + (schema: Schema) => + (req: Request, res: Response, next: NextFunction) => { + try { + (req as any).validated = {}; + + if (schema.body) { + (req as any).validated.body = schema.body.parse(req.body); + } + + if (schema.query) { + (req as any).validated.query = schema.query.parse(req.query); + } + + if (schema.params) { + (req as any).validated.params = schema.params.parse(req.params); + } + + next(); + } catch (err) { + if (err instanceof ZodError) { + return res.status(400).json({ + message: "Validation error", + errors: err.flatten(), + }); + } + + next(err); + } + }; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/models/game.model.ts b/src/problem5/backend-game-inventory/src/models/game.model.ts new file mode 100644 index 0000000000..19f9a7b300 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/models/game.model.ts @@ -0,0 +1,27 @@ +import mongoose, { Schema, Document } from "mongoose"; + +export interface IGame extends Document { + title: string; + genre: string; + platform: string; + quantity: number; + price: number; +} + +const GameSchema = new Schema( + { + title: { type: String, required: true, index: true }, + genre: { type: String, required: true, index: true }, + platform: { type: String, required: true }, + quantity: { type: Number, required: true }, + price: { type: Number, required: true }, + }, + { + timestamps: true, + } +); + +GameSchema.index({ title: "text" }); +GameSchema.index({ genre: "text" }); + +export const Game = mongoose.model("Game", GameSchema); \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/models/index.ts b/src/problem5/backend-game-inventory/src/models/index.ts new file mode 100644 index 0000000000..645dd1c641 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/models/index.ts @@ -0,0 +1 @@ +export * from "@/models/game.model" \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/routes/game.routes.ts b/src/problem5/backend-game-inventory/src/routes/game.routes.ts new file mode 100644 index 0000000000..73be903c5f --- /dev/null +++ b/src/problem5/backend-game-inventory/src/routes/game.routes.ts @@ -0,0 +1,25 @@ +import { Router } from "express"; +import { GameController } from "@/controllers/game.controller"; +import { validate } from "@/middleware/validate"; +import { + createGameSchema, + getAllGamesSchema, + getGameByIdSchema, + updateGameSchema, + deleteGameSchema, +} from "@/validation/game.validation"; +import { handler } from "@/utils/handler"; + +const router = Router(); + +router.post("/", validate(createGameSchema), handler(GameController.create)); + +router.get("/", validate(getAllGamesSchema), handler(GameController.getAll)); + +router.get("/:id", validate(getGameByIdSchema), handler(GameController.getById)); + +router.put("/:id", validate(updateGameSchema), handler(GameController.update)); + +router.delete("/:id", validate(deleteGameSchema), handler(GameController.delete)); + +export default router; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/routes/index.ts b/src/problem5/backend-game-inventory/src/routes/index.ts new file mode 100644 index 0000000000..6f5a254d79 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/routes/index.ts @@ -0,0 +1 @@ +export { default as gameRoutes } from "./game.routes"; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/server.ts b/src/problem5/backend-game-inventory/src/server.ts new file mode 100644 index 0000000000..246516c725 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/server.ts @@ -0,0 +1,14 @@ +import app from "@/app"; +import { config } from "@/config"; +import { connectDB, disconnectDB } from "@/db/mongo"; + +app.listen(config.port, () => { + connectDB(); + console.log(`Server running at http://localhost:${config.port}`); +}); + +process.on("SIGINT", async () => { + console.log("Shutting down..."); + await disconnectDB(); + process.exit(0); +}); \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/services/__tests__/game.service.test.ts b/src/problem5/backend-game-inventory/src/services/__tests__/game.service.test.ts new file mode 100644 index 0000000000..409e9802fd --- /dev/null +++ b/src/problem5/backend-game-inventory/src/services/__tests__/game.service.test.ts @@ -0,0 +1,76 @@ +import { GameService } from "../game.service"; +import { Game } from "../../models/game.model"; + +jest.mock("../../models/game.model", () => ({ + Game: { + create: jest.fn(), + find: jest.fn(), + countDocuments: jest.fn(), + findById: jest.fn(), + findByIdAndUpdate: jest.fn(), + findByIdAndDelete: jest.fn(), + }, +})); + +describe("GameService", () => { + afterEach(() => { + jest.clearAllMocks(); + }); + + it("should create a game", async () => { + const mockData = { title: "GTA", genre: "Action" }; + + (Game.create as jest.Mock).mockResolvedValue(mockData); + + const result = await GameService.create(mockData as any); + + expect(Game.create).toHaveBeenCalledWith(mockData); + expect(result).toEqual(mockData); + }); + + it("should return paginated games", async () => { + const mockGames = [{ id: "1", title: "GTA" }]; + + // mock chain: find().skip().limit() + const mockQuery = { + skip: jest.fn().mockReturnThis(), + limit: jest.fn().mockResolvedValue(mockGames), + }; + + (Game.find as jest.Mock).mockReturnValue(mockQuery); + (Game.countDocuments as jest.Mock).mockResolvedValue(1); + + const result = await GameService.findAll({ page: 1, limit: 10 }); + + expect(result.data).toEqual(mockGames); + expect(result.total).toBe(1); + }); + + it("should find by id", async () => { + const mockGame = { id: "1" }; + + (Game.findById as jest.Mock).mockResolvedValue(mockGame); + + const result = await GameService.findById("1"); + + expect(result).toEqual(mockGame); + }); + + it("should update a game", async () => { + const updated = { id: "1", title: "Updated" }; + + (Game.findByIdAndUpdate as jest.Mock).mockResolvedValue(updated); + + const result = await GameService.update("1", { title: "Updated" }); + + expect(result).toEqual(updated); + }); + + it("should delete a game", async () => { + (Game.findByIdAndDelete as jest.Mock).mockResolvedValue({}); + + const result = await GameService.delete("1"); + + expect(result).toEqual({}); + }); +}); \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/services/game.service.ts b/src/problem5/backend-game-inventory/src/services/game.service.ts new file mode 100644 index 0000000000..2c671565d5 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/services/game.service.ts @@ -0,0 +1,57 @@ +import { Game } from "@/models/game.model"; +import { NotFoundError } from "@/utils/errors"; + +export class GameService { + static async create(data: any) { + return Game.create(data); + } + + static async findAll(query: any) { + const { page = 1, limit = 10, search } = query; + + const filter: any = {}; + + if (search) { + filter.title = { $regex: search, $options: "i" }; + } + + const [data, total] = await Promise.all([ + Game.find(filter) + .skip((page - 1) * limit) + .limit(Number(limit)), + Game.countDocuments(filter), + ]); + + return { data, total }; + } + + static async findById(id: string) { + const game = await Game.findById(id); + + if (!game) { + throw new NotFoundError("Game not found"); + } + + return game; +} + + static async update(id: string, data: any) { + const game = await Game.findByIdAndUpdate(id, data, { new: true }); + + if (!game) { + throw new NotFoundError("Game not found"); + } + + return game; + } + + static async delete(id: string) { + const game = await Game.findByIdAndDelete(id); + + if (!game) { + throw new NotFoundError("Game not found"); + } + + return game; + } +} \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/services/index.ts b/src/problem5/backend-game-inventory/src/services/index.ts new file mode 100644 index 0000000000..62f5634619 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/services/index.ts @@ -0,0 +1 @@ +export * from "@/services/game.service"; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/types/express.d.ts b/src/problem5/backend-game-inventory/src/types/express.d.ts new file mode 100644 index 0000000000..7f2cb2cdc3 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/types/express.d.ts @@ -0,0 +1,13 @@ +import "express"; + +declare global { + namespace Express { + interface Request { + validated?: { + body?: any; + query?: any; + params?: any; + }; + } + } +} \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/types/index.ts b/src/problem5/backend-game-inventory/src/types/index.ts new file mode 100644 index 0000000000..d6438da261 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/types/index.ts @@ -0,0 +1 @@ +export * from "@/types/validated-request" \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/types/validated-request.ts b/src/problem5/backend-game-inventory/src/types/validated-request.ts new file mode 100644 index 0000000000..3843ce225e --- /dev/null +++ b/src/problem5/backend-game-inventory/src/types/validated-request.ts @@ -0,0 +1,13 @@ +import { Request } from "express"; + +export type ValidatedRequest< + TBody = unknown, + TQuery = unknown, + TParams = unknown +> = Request & { + validated: { + body: TBody; + query: TQuery; + params: TParams; + }; +}; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/utils/AppError.ts b/src/problem5/backend-game-inventory/src/utils/AppError.ts new file mode 100644 index 0000000000..92abda2806 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/utils/AppError.ts @@ -0,0 +1,12 @@ +export class AppError extends Error { + statusCode: number; + isOperational: boolean; + + constructor(message: string, statusCode = 500) { + super(message); + this.statusCode = statusCode; + this.isOperational = true; + + Error.captureStackTrace(this, this.constructor); + } +} \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/utils/asyncWrapper.ts b/src/problem5/backend-game-inventory/src/utils/asyncWrapper.ts new file mode 100644 index 0000000000..38c6028420 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/utils/asyncWrapper.ts @@ -0,0 +1,7 @@ +import { Request, Response, NextFunction } from "express"; + +export const asyncWrapper = + (fn: any) => + (req: Request, res: Response, next: NextFunction) => { + Promise.resolve(fn(req, res, next)).catch(next); + }; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/utils/errors.ts b/src/problem5/backend-game-inventory/src/utils/errors.ts new file mode 100644 index 0000000000..56394e2033 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/utils/errors.ts @@ -0,0 +1,19 @@ +import { AppError } from "@/utils"; + +export class BadRequestError extends AppError { + constructor(message = "Bad Request") { + super(message, 400); + } +} + +export class NotFoundError extends AppError { + constructor(message = "Resource not found") { + super(message, 404); + } +} + +export class UnauthorizedError extends AppError { + constructor(message = "Unauthorized") { + super(message, 401); + } +} \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/utils/handler.ts b/src/problem5/backend-game-inventory/src/utils/handler.ts new file mode 100644 index 0000000000..3eded84479 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/utils/handler.ts @@ -0,0 +1,6 @@ +import { Request, Response, NextFunction } from "express"; + +export const handler = + (fn: (req: any, res: Response, next: NextFunction) => any) => + (req: Request, res: Response, next: NextFunction) => + Promise.resolve(fn(req, res, next)).catch(next); \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/utils/index.ts b/src/problem5/backend-game-inventory/src/utils/index.ts new file mode 100644 index 0000000000..f03fe90a59 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/utils/index.ts @@ -0,0 +1,7 @@ +export * from "@/utils/AppError"; +export * from "@/utils/errors"; +export * from "@/utils/asyncWrapper"; +export * from "@/utils/handler" +export * from "@/utils/response"; +; + diff --git a/src/problem5/backend-game-inventory/src/utils/response.ts b/src/problem5/backend-game-inventory/src/utils/response.ts new file mode 100644 index 0000000000..9510a0b5e6 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/utils/response.ts @@ -0,0 +1,26 @@ +import { Response } from "express"; + +export const successResponse = ( + res: Response, + data: any, + meta: any = {} +) => { + return res.status(200).json({ + success: true, + data, + meta, + }); +}; + +export const errorResponse = ( + res: Response, + message: string, + status = 500, + details: any = null +) => { + return res.status(status).json({ + success: false, + error: message, + details, + }); +}; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/validation/game.validation.ts b/src/problem5/backend-game-inventory/src/validation/game.validation.ts new file mode 100644 index 0000000000..5402135220 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/validation/game.validation.ts @@ -0,0 +1,59 @@ +import { z } from "zod"; + +export const createGameSchema = { + body: z.object({ + title: z.string(), + genre: z.string(), + platform: z.string(), + quantity: z.number().int(), + price: z.number(), + }), +}; + +export const getAllGamesSchema = { + query: z.object({ + title: z.string().optional(), + genre: z.string().optional(), + + page: z.coerce.number().int().min(1).default(1), + limit: z.coerce.number().int().min(1).max(100).default(10), + + sortBy: z + .enum(["createdAt", "price", "title"]) + .optional() + .default("createdAt"), + + order: z.enum(["asc", "desc"]).optional().default("desc"), + }), +}; +export const getGameByIdSchema = { + params: z.object({ + id: z.string(), + }), +}; + +export const updateGameSchema = { + params: z.object({ + id: z.string(), + }), + body: z.object({ + title: z.string().optional(), + genre: z.string().optional(), + platform: z.string().optional(), + quantity: z.number().int().optional(), + price: z.number().optional(), + }), +}; + +export const deleteGameSchema = { + params: z.object({ + id: z.string(), + }), +}; + +export type CreateGameBody = z.infer; +export type GetAllGamesQuery = z.infer; +export type GetGameByIdParams = z.infer; +export type UpdateGameBody = z.infer; +export type UpdateGameParams = z.infer; +export type DeleteGameParams = z.infer; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/src/validation/index.ts b/src/problem5/backend-game-inventory/src/validation/index.ts new file mode 100644 index 0000000000..40c749aa23 --- /dev/null +++ b/src/problem5/backend-game-inventory/src/validation/index.ts @@ -0,0 +1 @@ +export * from "@/validation/game.validation"; \ No newline at end of file diff --git a/src/problem5/backend-game-inventory/tsconfig.json b/src/problem5/backend-game-inventory/tsconfig.json new file mode 100644 index 0000000000..966569f87f --- /dev/null +++ b/src/problem5/backend-game-inventory/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + }, + "ignoreDeprecations": "6.0", + "rootDir": "./src", + "outDir": "./dist", + "module": "NodeNext", + "target": "ES2020", + "types": ["jest", "node"], + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "sourceMap": true + }, + "include": [ + "src", + "**/*.test.ts", + "**/*.spec.ts" + ], + "exclude": [ + "node_modules", + "dist" + ], +} \ No newline at end of file diff --git a/src/problem1/.keep b/src/problem6/.keep similarity index 100% rename from src/problem1/.keep rename to src/problem6/.keep diff --git a/src/problem6/high-level-design.png b/src/problem6/high-level-design.png new file mode 100644 index 0000000000000000000000000000000000000000..580bb85a392630b30cc9ee7fc9dc5c2a8f16e682 GIT binary patch literal 90432 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

    oWU+y!@ZsEr3A4eg@THJ)x^JWwgWV+_}n5 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 +Idempotency-Key: + +// Request +{ + "actionType": "JUMP_LEVEL_1", + "metadata": { + "level": 3 + } +} + +//Response +{ + "success": true, + "scoreAdded": 10, + "newTotalScore": 120 +} +``` + +### 4.3 Leaderboard APIs +#### Get Top 10 Leaderboard + +``` +GET /leaderboard/top + +// Response +{ + "updatedAt": "2026-04-23T10:00:00Z", + "data": [ + { + "rank": 1, + "userId": "u1", + "score": 9990 + } + ] +} +``` +#### Get My Rank + +``` +GET /leaderboard/me +{ + "updatedAt": "2026-04-23T10:00:00Z", + "data": + { + "rank": 20, + "userId": "u1", + "score": 9990 + } +} +``` + +### 4.4 WebSocket API +``` +// Connection +wss://api.example.com/ws/leaderboard + +// Events +// Leaderboard Update +{ + "type": "LEADERBOARD_UPDATE", + "data": [ + { + "rank": 1, + "userId": "u1", + "score": 9990 + } + ] +} +// User Score Update +{ + "type": "USER_SCORE_UPDATE", + "userId": "u123", + "score": 1200 +} +``` +### 4.5 API Server ↔ Worker Communication + +#### Event Publishing +``` +// Topic: score-events + +// Events +{ + "eventId": "uuid", + "type": "SCORE_UPDATE", + "userId": "u123", + "actionType": "JUMP_LEVEL_1", + "scoreDelta": 10, + "timestamp": 1710000000, + "idempotencyKey": "uuid" +} +``` +#### Worker Consumption + +``` +// Worker subscribe topic: score-events +Validate event +Check idempotency +Compute score +Persist DB +Update Redis (ZSET leaderboard) +``` + + +## 5. Design Decisions + +### 5.1 Async Architecture + +- Prevent API overload +- Handle traffic spikes +- Enable retry mechanism +- Decouple system components + + +### 5.2 Redis Leaderboard Engine + +Using Redis Sorted Set (ZSET): + +```txt +key: leaderboard +member: userId +score: userScore +``` + +Operations +```bash +ZINCRBY leaderboard 10 user123 +# Time Complexity: O(log N) + +ZREVRANGE leaderboard 0 9 WITHSCORES +# Time Complexity: O(log N + K) +``` + +## 6. Real-time Updates + +- WebSocket Gateway broadcasts changes to clients +- Only send updates when **Top 10 leaderboard changes** + +### Optimization + +- Avoid broadcasting every score update +- Batch updates when update frequency is high +- Reduce unnecessary WebSocket traffic to improve scalability + + +## 7. Database Strategy + +- PostgreSQL used as primary persistent storage +- Data is sharded by `userId` to distribute load +- System follows an **eventual consistency model** + - Redis is real-time source + - PostgreSQL is durable source of truth + + +## 8. Caching Strategy + +- Redis → used as leaderboard cache (ZSET) +- CDN → serves static assets (frontend, images, scripts) + + +## 9. Security Design (Anti-Cheat System) + +### 9.1 Request Tampering + +- All score updates are derived from server-side event processing only. +Client has no control over score computation. +- Strict validation of action type (whitelist-based) + + +### 9.2 Replay Attack Protection + +- Use **idempotency keys** for every action request +- Request nonce validation to prevent duplicate execution + + +### 9.3 Bot / Automation Abuse + +- Rate limiting per user and per IP +- CAPTCHA challenge for suspicious behavior +- Behavioral anomaly detection system (future enhancement) + + +### 9.4 Token Theft Protection + +- Use short-lived JWT access tokens +- Refresh token rotation mechanism +- Revoke compromised sessions + + +### 9.5 DDoS Protection + +- CDN absorbs traffic spikes at edge layer +- WAF (Web Application Firewall) filters malicious traffic +- API Gateway enforces rate limiting + + +## 10. Scaling Strategy + +### Components Scaling Model + +- **API Layer** → Stateless horizontal scaling +- **Workers** → Scale dynamically based on queue load +- **Redis** → Cluster mode for high throughput +- **WebSocket Gateway** → Sharded across multiple nodes +- **Database** → Sharded PostgreSQL for horizontal scalability + + +### Handling failure cases + +#### 1. Redis Failure (Crash or Data Loss) + +**Problem:** +Redis is an in-memory cache, so it can lose data if it crashes unexpectedly. + +**Impact:** +- Leaderboard data may become inconsistent +- Recent score updates may be temporarily missing + +**Solution:** +- Redis is NOT the source of truth +- Rebuild Redis from: + - PostgreSQL (persistent storage), or + - Kafka event log (preferred for full replay) + + +#### 2. Worker Failure + +**Problem:** +Worker service crashes while processing events. + +**Impact:** +- Events may not be processed immediately + +**Solution:** +- Use Kafka as a durable queue +- Workers resume processing from last committed offset +- No event is lost + + +#### 3. Database Write Failure + +**Problem:** +Failure when writing score updates to PostgreSQL. + +**Impact:** +- Temporary inconsistency between Redis and DB + +**Solution:** +- Implement retry mechanism with exponential backoff +- Use Dead Letter Queue (DLQ) for failed events +- Ensure idempotent writes + +#### 4. Duplicate Event Processing + +**Problem:** +Same event is processed multiple times due to retries or replays. + +**Impact:** +- Incorrect score increments (data corruption risk) + +**Solution:** +- Use eventId or idempotencyKey +- Store processed event IDs in DB or cache +- Ensure idempotent processing logic: If eventId already exists → ignore event + +#### 5. Partial System Failure + +**Problem:** +One component failure affects others (e.g., DB overload → worker slowdown). + +**Solution:** +- Use circuit breaker pattern +- Apply rate limiting at API Gateway +- Isolate services (stateless API, independent workers) +- Use queue buffering to absorb spikes + +## 11. Observability + +- Logs: centralized logging (ELK / Loki) +- Metrics: Prometheus + Grafana +- Tracing: OpenTelemetry + +Key Metrics: +- score update latency +- queue lag +- Redis ops latency +- WebSocket connection count \ No newline at end of file