From 0e36c4a669f6c593537a4cff5d6e62c2e05dfc24 Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Mon, 7 Jul 2025 03:56:30 -0600 Subject: [PATCH 01/20] fix(package): Se cambia de yarn a pnpm, y la version de node a la v22.17.0 en nvm --- .github/workflows/node.js.yml | 6 +- .husky/pre-commit | 2 +- .husky/pre-push | 2 +- README.md | 86 +- package.json | 5 +- pnpm-lock.yaml | 6156 +++++++++++++++++++++++++++++++++ yarn.lock | 5643 ------------------------------ 7 files changed, 6223 insertions(+), 5677 deletions(-) create mode 100644 pnpm-lock.yaml delete mode 100644 yarn.lock diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 9e54891..2898e1c 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -25,11 +25,11 @@ jobs: uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - cache: "yarn" + cache: "pnpm" - name: 📦 Instalar dependencias - run: yarn install + run: pnpm install - name: 🚀 Iniciar aplicación en background (opcional) - run: yarn start & + run: pnpm start & # Usa esto solo si necesitas levantar el servidor para tests e2e, de lo contrario, puedes omitirlo diff --git a/.husky/pre-commit b/.husky/pre-commit index 943f917..7dee2b7 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -10,7 +10,7 @@ export NVM_DIR="$HOME/.nvm" echo "🔍 Verificando archivos antes del commit..." echo "📦 Formateando código con Prettier..." -yarn prettier 'src/**/*.{js,ts,jsx,tsx,json}' server.js package.json --write || exit 1 +pnpm prettier 'src/**/*.{js,ts,jsx,tsx,json}' server.js package.json --write || exit 1 # Agregar los archivos modificados después del formateo diff --git a/.husky/pre-push b/.husky/pre-push index cdb10cb..1068d0f 100644 --- a/.husky/pre-push +++ b/.husky/pre-push @@ -7,7 +7,7 @@ if [ "$BRANCH" = "staging" ]; then echo "📍 Estás en la rama 'staging'. Ejecutando pruebas..." echo "🧪 Ejecutando tests con servidor..." - if ! yarn test:with-server; then + if ! pnpm test:with-server; then echo "❌ Tests fallaron. Corrige los errores antes de hacer commit." exit 1 fi diff --git a/README.md b/README.md index 842fdeb..1976e95 100644 --- a/README.md +++ b/README.md @@ -8,23 +8,52 @@ ## 🔧 Tecnologías Utilizadas -### 🔙 Backend - -- **Node.js** 🟢 -- **Express.js** 🔵 -- **MySQL2** 🐬 -- **Google Auth Libary** 🔡 (Login con google) -- **Argon2** 🔒 (Hash de contraseñas) -- **JWT** 🔑 (Autenticación) -- **Jest y Frisby** 🧪 (Pruebas de las API) -- **Swagger & Swagger-UI** 📚 (Documentación de la API) -- **Express Rate Limit** ⏱️ (Limitación de peticiones) -- **Helmet** 🛡️ (Seguridad en headers HTTP) -- **CORS** 🌐 (Permite el acceso entre dominios) -- **Morgan** 🪵 (Middleware de logging) -- **Commander & Inquirer** ⚙️ (Comandos CLI) -- **Formkit Tempo** 🕒 (Fechas en formato entendible y legible) -- **Husky** 🐶 (Hooks de Git) +### 🔙 Backend - Stack y Librerías + +Tecnologías y herramientas utilizadas en el backend de este proyecto: + +#### 🧠 Core & Framework +- **Node.js** 🟢 – Entorno de ejecución de JavaScript para backend. +- **Express.js** ⚡ – Framework web minimalista para crear APIs y servidores HTTP. + +#### 🛡️ Seguridad y Autenticación +- **Argon2** 🔒 – Algoritmo de hashing seguro para contraseñas. +- **jsonwebtoken (JWT)** 🔑 – Autenticación basada en tokens. +- **Google Auth Library** 🔐 – Autenticación con cuentas de Google. +- **helmet** 🛡️ – Configura cabeceras HTTP seguras. +- **express-rate-limit** ⏱️ – Protección contra ataques de fuerza bruta y abuso. +- **cors** 🌐 – Permite solicitudes entre dominios. + +#### 🐬 Base de Datos +- **MySQL2** 🐬 – Cliente MySQL para Node.js compatible con promesas. + +#### 🪵 Logging y Utilidades +- **morgan** 🪵 – Middleware para registrar peticiones HTTP. +- **commander** ⚙️ – Gestión de comandos CLI (si aplica). + +#### 📦 Formateo, Linting y Calidad de Código +- **prettier** ✨ – Formateador de código automático. +- **@trivago/prettier-plugin-sort-imports** 🔀 – Ordenamiento automático de imports. +- **eslint** 🧹 – Linter para mantener un estilo de código consistente. +- **@eslint/js** ⚙️ – Configuración moderna para `eslint`. +- **standard** 📏 – Estilo de código estándar para JavaScript. + +#### 🧪 Testing +- **jest** ✅ – Framework de testing. +- **frisby** 🧪 – Librería para pruebas HTTP y APIs REST. +- **@faker-js/faker** 👻 – Generador de datos falsos para pruebas. + +#### ⚙️ Automatización y Entorno de Desarrollo +- **nodemon** 🔄 – Reinicio automático del servidor al detectar cambios. +- **concurrently** 🧵 – Ejecuta múltiples comandos en paralelo. +- **dotenv** 🧬 – Carga variables de entorno desde archivos `.env`. +- **husky** 🐶 – Automatiza scripts en Git como pre-commit o pre-push. +- **@formkit/tempo** 🕒 – Formatea fechas en un formato legible y localizado. + +#### 📚 Documentación +- **swagger-jsdoc** 📝 – Generador de especificaciones OpenAPI desde JSDoc. +- **swagger-ui-express** 🌐 – Interfaz de usuario Swagger para probar la API. +- **swagger-themes** 🎨 – Temas visuales personalizados para Swagger UI. --- @@ -110,7 +139,7 @@ cd Backend_RESTFULL 2. Instalar las dependencias ``` -yarn install +pnpm install ``` 3. Crear un archivo .env con las siguientes variables: @@ -128,15 +157,20 @@ JWT_SECRET=your_jwt_secret --- -## 🚀 Comandos +## 📦 Scripts disponibles + +Estos son los scripts definidos en el archivo `package.json`, los cuales automatizan tareas comunes de desarrollo y pruebas. + +| Script | Comando | Descripción | +|------------------------|---------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------| +| `start` | `nodemon server.js` | Inicia el servidor en modo desarrollo usando `nodemon`. | +| `dev` | `nodemon server.js` | Alias de `start`. Ideal para entornos de desarrollo. | +| `format` | `prettier 'src/**/*.{js,ts,jsx,tsx,json}' server.js package.json --write` | Formatea el código en la carpeta `src`, `server.js` y `package.json` usando Prettier. | +| `prepare` | `husky` | Configura los hooks de Git mediante Husky (se ejecuta automáticamente al instalar dependencias). | +| `test` | `jest` | Ejecuta los tests unitarios utilizando Jest. | +| `test:watch` | `jest --watchAll` | Ejecuta los tests y observa cambios en tiempo real para repetir automáticamente las pruebas. | +| `test:with-server` | `concurrently --kill-others --success first "pnpm dev" "pnpm test"` | Ejecuta el servidor de desarrollo y las pruebas en paralelo. Se detiene si uno de ellos finaliza o falla. | -| Comando | Descripción | -| ----------------- | --------------------------------------------------- | -| `yarn dev` | Inicia el servidor en modo desarrollo 🔄 | -| `yarn start` | Inicia en modo producción 🚀 | -| `yarn format` | Formatea el código con Prettier 💅 | -| `yarn test` | Ejecuta pruebas unitarias con Jest ✅ | -| `yarn test:watch` | Ejecuta pruebas automáticamente al hacer cambios 👀 | --- diff --git a/package.json b/package.json index 40fa323..3206e16 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,13 @@ "description": "Backend API for the project, using Node.js, Express, and MySQL.", "main": "server.js", "scripts": { - "start": "nodemon server.js", + "start": "node server.js", "dev": "nodemon server.js", "format": "prettier 'src/**/*.{js,ts,jsx,tsx,json}' server.js package.json --write", "prepare": "husky", "test": "jest", "test:watch": "jest --watchAll", - "test:with-server": "concurrently --kill-others --success first \"yarn dev\" \"yarn test\"" + "test:with-server": "concurrently --kill-others --success first \"pnpm dev\" \"pnpm test\"" }, "license": "MIT", "type": "module", @@ -40,7 +40,6 @@ "google-auth-library": "^9.15.1", "helmet": "^8.1.0", "husky": "^9.1.7", - "inquirer": "^12.6.1", "jsonwebtoken": "^9.0.2", "morgan": "^1.10.0", "mysql2": "^3.11.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..0b84689 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6156 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@formkit/tempo': + specifier: ^0.1.2 + version: 0.1.2 + '@trivago/prettier-plugin-sort-imports': + specifier: ^4.3.0 + version: 4.3.0(prettier@3.6.2) + argon2: + specifier: ^0.41.1 + version: 0.41.1 + cors: + specifier: ^2.8.5 + version: 2.8.5 + express: + specifier: ^4.21.0 + version: 4.21.2 + express-rate-limit: + specifier: ^7.5.0 + version: 7.5.1(express@4.21.2) + google-auth-library: + specifier: ^9.15.1 + version: 9.15.1(encoding@0.1.13) + helmet: + specifier: ^8.1.0 + version: 8.1.0 + husky: + specifier: ^9.1.7 + version: 9.1.7 + jsonwebtoken: + specifier: ^9.0.2 + version: 9.0.2 + morgan: + specifier: ^1.10.0 + version: 1.10.0 + mysql2: + specifier: ^3.11.3 + version: 3.14.1 + standard: + specifier: ^17.1.2 + version: 17.1.2 + swagger-jsdoc: + specifier: ^6.2.8 + version: 6.2.8(openapi-types@12.1.3) + swagger-themes: + specifier: ^1.4.3 + version: 1.4.3 + swagger-ui-express: + specifier: ^5.0.1 + version: 5.0.1(express@4.21.2) + devDependencies: + '@eslint/js': + specifier: ^9.26.0 + version: 9.30.1 + '@faker-js/faker': + specifier: ^9.7.0 + version: 9.9.0 + concurrently: + specifier: ^9.2.0 + version: 9.2.0 + dotenv: + specifier: ^16.5.0 + version: 16.6.1 + eslint: + specifier: ^9.26.0 + version: 9.30.1 + frisby: + specifier: ^2.1.3 + version: 2.1.3 + globals: + specifier: ^16.1.0 + version: 16.3.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@24.0.10) + nodemon: + specifier: ^3.1.10 + version: 3.1.10 + prettier: + specifier: ^3.5.3 + version: 3.6.2 + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@apidevtools/json-schema-ref-parser@9.1.2': + resolution: {integrity: sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==} + + '@apidevtools/openapi-schemas@2.1.0': + resolution: {integrity: sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==} + engines: {node: '>=10'} + + '@apidevtools/swagger-methods@3.0.2': + resolution: {integrity: sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==} + + '@apidevtools/swagger-parser@10.0.3': + resolution: {integrity: sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==} + peerDependencies: + openapi-types: '>=7' + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.0': + resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.17.7': + resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.0': + resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.27.3': + resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.6': + resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.27.1': + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.23.2': + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.0': + resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.17.0': + resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.0': + resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.1': + resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@9.30.1': + resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.3': + resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@faker-js/faker@9.9.0': + resolution: {integrity: sha512-OEl393iCOoo/z8bMezRlJu+GlRGlsKbUAN7jKB6LhnKoqKve5DXRpalbItIIcwnCjs1k/FOPjFzcA6Qn+H+YbA==} + engines: {node: '>=18.0.0', npm: '>=9.0.0'} + + '@formkit/tempo@0.1.2': + resolution: {integrity: sha512-jNPPbjL8oj7hK3eHX++CwbR6X4GKQt+x00/q4yeXkwynXHGKL27dylYhpEgwrmediPP4y7s0XtN1if/M/JYujg==} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@phc/format@1.0.0': + resolution: {integrity: sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==} + engines: {node: '>=10'} + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@scarf/scarf@1.4.0': + resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@trivago/prettier-plugin-sort-imports@4.3.0': + resolution: {integrity: sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ==} + peerDependencies: + '@vue/compiler-sfc': 3.x + prettier: 2.x - 3.x + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/node@24.0.10': + resolution: {integrity: sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argon2@0.41.1: + resolution: {integrity: sha512-dqCW8kJXke8Ik+McUcMDltrbuAWETPyU6iq+4AhxqKphWi7pChB/Zgd/Tp/o8xRLbg8ksMj46F/vph9wnxpTzQ==} + engines: {node: '>=16.17.0'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + aws-ssl-profiles@1.1.2: + resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} + engines: {node: '>= 6.0.0'} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + + bignumber.js@9.3.0: + resolution: {integrity: sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + builtins@5.1.0: + resolution: {integrity: sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + call-me-maybe@1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001727: + resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@6.2.0: + resolution: {integrity: sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==} + engines: {node: '>= 6'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@9.2.0: + resolution: {integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==} + engines: {node: '>=18'} + hasBin: true + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.179: + resolution: {integrity: sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.24.0: + resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-standard-jsx@11.0.0: + resolution: {integrity: sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==} + peerDependencies: + eslint: ^8.8.0 + eslint-plugin-react: ^7.28.0 + + eslint-config-standard@17.1.0: + resolution: {integrity: sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: ^8.0.1 + eslint-plugin-import: ^2.25.2 + eslint-plugin-n: '^15.0.0 || ^16.0.0 ' + eslint-plugin-promise: ^6.0.0 + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.12.1: + resolution: {integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-es@4.1.0: + resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-n@15.7.0: + resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-promise@6.6.0: + resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + eslint@9.30.1: + resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + form-data@2.5.3: + resolution: {integrity: sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==} + engines: {node: '>= 0.12'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + frisby@2.1.3: + resolution: {integrity: sha512-b1HAqx10Ofxj5u9vZbWJRmQNKtYp8sNZuGNqPtUpHIFdwJcS7mzUjjNyEw/miYrILXOah3KbX40h0awjsuXgQg==} + engines: {node: '>= 8.0.0'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} + engines: {node: '>=14'} + + gcp-metadata@6.1.1: + resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} + engines: {node: '>=14'} + + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stdin@8.0.0: + resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==} + engines: {node: '>=10'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.3.0: + resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + google-auth-library@9.15.1: + resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} + engines: {node: '>=14'} + + google-logging-utils@0.0.2: + resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + engines: {node: '>=14'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + helmet@8.1.0: + resolution: {integrity: sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==} + engines: {node: '>=18.0.0'} + + hoek@5.0.4: + resolution: {integrity: sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==} + engines: {node: '>=8.9.0'} + deprecated: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial). + + hoek@6.1.3: + resolution: {integrity: sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==} + deprecated: This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues. + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {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. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isemail@3.2.0: + resolution: {integrity: sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==} + engines: {node: '>=4.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + javascript-natural-sort@0.7.1: + resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + joi@13.7.0: + resolution: {integrity: sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==} + engines: {node: '>=8.9.0'} + deprecated: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial). + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + jwa@1.4.2: + resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-json-file@5.3.0: + resolution: {integrity: sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==} + engines: {node: '>=6'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru.min@1.1.2: + resolution: {integrity: sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==} + engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + morgan@1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mysql2@3.14.1: + resolution: {integrity: sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==} + engines: {node: '>= 8.0'} + + named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + node-addon-api@8.4.0: + resolution: {integrity: sha512-D9DI/gXHvVmjHS08SVch0Em8G5S1P+QWtU31appcKT/8wFSPRcdHadIFSAntdMMVM5zz+/DL+bL/gz3UDppqtg==} + engines: {node: ^18 || ^20 || >= 21} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nodemon@3.1.10: + resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==} + engines: {node: '>=10'} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + + pkg-conf@3.1.0: + resolution: {integrity: sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + standard-engine@15.1.0: + resolution: {integrity: sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + standard@17.1.2: + resolution: {integrity: sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swagger-jsdoc@6.2.8: + resolution: {integrity: sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==} + engines: {node: '>=12.0.0'} + hasBin: true + + swagger-parser@10.0.3: + resolution: {integrity: sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==} + engines: {node: '>=10'} + + swagger-themes@1.4.3: + resolution: {integrity: sha512-1G0CqJC1IBbNxkAOyJoREd9hfwXH1R6+3GOFxLhQho2w2i+AbaJqkF4mTJhkce4yhaEMUXvv4KKu1YO/qpe6nQ==} + + swagger-ui-dist@5.26.1: + resolution: {integrity: sha512-z8uo1H/D8/PCMVZNgWCctQ2rP/2EkDi96BggBu4JBGXHTdfHj2p08Z2DkorCkW1bXmhfWx9hpzz9NNz5sb4lqw==} + + swagger-ui-express@5.0.1: + resolution: {integrity: sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==} + engines: {node: '>= v0.10.32'} + peerDependencies: + express: '>=4.0.0 || >=5.0.0-beta' + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + topo@3.0.3: + resolution: {integrity: sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==} + deprecated: This module has moved and is now available at @hapi/topo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues. + + touch@3.1.1: + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} + hasBin: true + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.3.1: + resolution: {integrity: sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==} + engines: {node: '>=6'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} + + validator@13.15.15: + resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} + engines: {node: '>= 0.10'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + version-guard@1.1.3: + resolution: {integrity: sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ==} + engines: {node: '>=0.10.48'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.0.0-1: + resolution: {integrity: sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==} + engines: {node: '>= 6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + + '@apidevtools/json-schema-ref-parser@9.1.2': + dependencies: + '@jsdevtools/ono': 7.1.3 + '@types/json-schema': 7.0.15 + call-me-maybe: 1.0.2 + js-yaml: 4.1.0 + + '@apidevtools/openapi-schemas@2.1.0': {} + + '@apidevtools/swagger-methods@3.0.2': {} + + '@apidevtools/swagger-parser@10.0.3(openapi-types@12.1.3)': + dependencies: + '@apidevtools/json-schema-ref-parser': 9.1.2 + '@apidevtools/openapi-schemas': 2.1.0 + '@apidevtools/swagger-methods': 3.0.2 + '@jsdevtools/ono': 7.1.3 + call-me-maybe: 1.0.2 + openapi-types: 12.1.3 + z-schema: 5.0.5 + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.0': {} + + '@babel/core@7.28.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) + '@babel/helpers': 7.27.6 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + convert-source-map: 2.0.0 + debug: 4.4.1(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.17.7': + dependencies: + '@babel/types': 7.17.0 + jsesc: 2.5.2 + source-map: 0.5.7 + + '@babel/generator@7.28.0': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.1 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.28.0 + + '@babel/helper-function-name@7.24.7': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.0 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-hoist-variables@7.24.7': + dependencies: + '@babel/types': 7.28.0 + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.28.0 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.27.6': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.0 + + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.0 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + + '@babel/traverse@7.23.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + debug: 4.4.1(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/traverse@7.28.0': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.0 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.0 + debug: 4.4.1(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/types@7.17.0': + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + to-fast-properties: 2.0.0 + + '@babel/types@7.28.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@bcoe/v8-coverage@0.2.3': {} + + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1)': + dependencies: + eslint: 9.30.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.21.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.1(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.3.0': {} + + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.15.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.1(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.1(supports-color@5.5.0) + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@eslint/js@9.30.1': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.3': + dependencies: + '@eslint/core': 0.15.1 + levn: 0.4.1 + + '@faker-js/faker@9.9.0': {} + + '@formkit/tempo@0.1.2': {} + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 24.0.10 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.10 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@24.0.10) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.10 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 24.0.10 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.29 + '@types/node': 24.0.10 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.29 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.28.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.29 + babel-plugin-istanbul: 6.1.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: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.7 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.0.10 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@jsdevtools/ono@7.1.3': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@phc/format@1.0.0': {} + + '@rtsao/scc@1.1.0': {} + + '@scarf/scarf@1.4.0': {} + + '@sinclair/typebox@0.27.8': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.2)': + dependencies: + '@babel/generator': 7.17.7 + '@babel/parser': 7.28.0 + '@babel/traverse': 7.23.2 + '@babel/types': 7.17.0 + javascript-natural-sort: 0.7.1 + lodash: 4.17.21 + prettier: 3.6.2 + transitivePeerDependencies: + - supports-color + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + + '@types/babel__traverse@7.20.7': + dependencies: + '@babel/types': 7.28.0 + + '@types/estree@1.0.8': {} + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 24.0.10 + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/node@24.0.10': + dependencies: + undici-types: 7.8.0 + + '@types/stack-utils@2.0.3': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@ungap/structured-clone@1.3.0': {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + agent-base@7.1.3: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argon2@0.41.1: + dependencies: + '@phc/format': 1.0.0 + node-addon-api: 8.4.0 + node-gyp-build: 4.8.4 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-flatten@1.1.1: {} + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + async-function@1.0.0: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + aws-ssl-profiles@1.1.2: {} + + babel-jest@29.7.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.28.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.27.1 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.0 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.7 + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) + + babel-preset-jest@29.6.3(@babel/core@7.28.0): + dependencies: + '@babel/core': 7.28.0 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + basic-auth@2.0.1: + dependencies: + safe-buffer: 5.1.2 + + bignumber.js@9.3.0: {} + + binary-extensions@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.25.1: + dependencies: + caniuse-lite: 1.0.30001727 + electron-to-chromium: 1.5.179 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.25.1) + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + + builtins@5.1.0: + dependencies: + semver: 7.7.2 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + call-me-maybe@1.0.2: {} + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001727: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + char-regex@1.0.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + ci-info@3.9.0: {} + + cjs-module-lexer@1.4.3: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@6.2.0: {} + + commander@9.5.0: + optional: true + + concat-map@0.0.1: {} + + concurrently@9.2.0: + dependencies: + chalk: 4.1.2 + lodash: 4.17.21 + rxjs: 7.8.2 + shell-quote: 1.8.3 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + create-jest@29.7.0(@types/node@24.0.10): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@24.0.10) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.1(supports-color@5.5.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 + + dedent@1.6.0: {} + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + denque@2.1.0: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-newline@3.1.0: {} + + diff-sequences@29.6.3: {} + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dotenv@16.6.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.179: {} + + emittery@0.13.1: {} + + emoji-regex@8.0.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + safe-array-concat: 1.1.3 + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.37.5(eslint@9.30.1))(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-plugin-react: 7.37.5(eslint@8.57.1) + + eslint-config-standard@17.1.0(eslint-plugin-import@2.32.0(eslint@9.30.1))(eslint-plugin-n@15.7.0(eslint@9.30.1))(eslint-plugin-promise@6.6.0(eslint@9.30.1))(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-plugin-import: 2.32.0(eslint@8.57.1) + eslint-plugin-n: 15.7.0(eslint@8.57.1) + eslint-plugin-promise: 6.6.0(eslint@8.57.1) + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-plugin-es@4.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + + eslint-plugin-import@2.32.0(eslint@8.57.1): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-n@15.7.0(eslint@8.57.1): + dependencies: + builtins: 5.1.0 + eslint: 8.57.1 + eslint-plugin-es: 4.1.0(eslint@8.57.1) + eslint-utils: 3.0.0(eslint@8.57.1) + ignore: 5.3.2 + is-core-module: 2.16.1 + minimatch: 3.1.2 + resolve: 1.22.10 + semver: 7.7.2 + + eslint-plugin-promise@6.6.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react@7.37.5(eslint@8.57.1): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.1 + eslint: 8.57.1 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@2.1.0: + dependencies: + eslint-visitor-keys: 1.3.0 + + eslint-utils@3.0.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@1.3.0: {} + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1(supports-color@5.5.0) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + eslint@9.30.1: + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.0 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.30.1 + '@eslint/plugin-kit': 0.3.3 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1(supports-color@5.5.0) + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit@0.1.2: {} + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + express-rate-limit@7.5.1(express@4.21.2): + dependencies: + express: 4.21.2 + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + form-data@2.5.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + safe-buffer: 5.2.1 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + frisby@2.1.3: + dependencies: + encoding: 0.1.13 + form-data: 2.5.3 + joi: 13.7.0 + lodash: 4.17.21 + node-fetch: 2.7.0(encoding@0.1.13) + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + gaxios@6.7.1(encoding@0.1.13): + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + is-stream: 2.0.1 + node-fetch: 2.7.0(encoding@0.1.13) + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + gcp-metadata@6.1.1(encoding@0.1.13): + dependencies: + gaxios: 6.7.1(encoding@0.1.13) + google-logging-utils: 0.0.2 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + generate-function@2.3.1: + dependencies: + is-property: 1.0.2 + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.3.0: + 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 + + get-package-type@0.1.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stdin@8.0.0: {} + + get-stream@6.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.1.6: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@14.0.0: {} + + globals@16.3.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + google-auth-library@9.15.1(encoding@0.1.13): + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.7.1(encoding@0.1.13) + gcp-metadata: 6.1.1(encoding@0.1.13) + gtoken: 7.1.0(encoding@0.1.13) + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + google-logging-utils@0.0.2: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + gtoken@7.1.0(encoding@0.1.13): + dependencies: + gaxios: 6.7.1(encoding@0.1.13) + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + has-bigints@1.1.0: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + helmet@8.1.0: {} + + hoek@5.0.4: {} + + hoek@6.1.3: {} + + html-escaper@2.0.2: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.1(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + husky@9.1.7: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore-by-default@1.0.1: {} + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + ipaddr.js@1.9.1: {} + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-property@1.0.2: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isemail@3.2.0: + dependencies: + punycode: 2.3.1 + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.28.0 + '@babel/parser': 7.28.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.4.1(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + javascript-natural-sort@0.7.1: {} + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.10 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.6.0 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@24.0.10): + dependencies: + '@jest/core': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@24.0.10) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@24.0.10) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@24.0.10): + dependencies: + '@babel/core': 7.28.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.28.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 24.0.10 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.10 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 24.0.10 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.27.1 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 24.0.10 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.10 + resolve.exports: 2.0.3 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.10 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.10 + chalk: 4.1.2 + cjs-module-lexer: 1.4.3 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.28.0 + '@babel/generator': 7.28.0 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/types': 7.28.0 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 24.0.10 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 24.0.10 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@29.7.0: + dependencies: + '@types/node': 24.0.10 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0(@types/node@24.0.10): + dependencies: + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@24.0.10) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + joi@13.7.0: + dependencies: + hoek: 5.0.4 + isemail: 3.2.0 + topo: 3.0.3 + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + jsesc@3.1.0: {} + + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.0 + + json-buffer@3.0.1: {} + + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonwebtoken@9.0.2: + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.7.2 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + jwa@1.4.2: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.2 + safe-buffer: 5.2.1 + + jws@4.0.0: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kleur@3.0.3: {} + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} + + load-json-file@5.3.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 4.0.1 + strip-bom: 3.0.0 + type-fest: 0.3.1 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.get@4.4.2: {} + + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isequal@4.5.0: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.merge@4.6.2: {} + + lodash.mergewith@4.6.2: {} + + lodash.once@4.1.1: {} + + lodash@4.17.21: {} + + long@5.3.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@7.18.3: {} + + lru.min@1.1.2: {} + + make-dir@4.0.0: + dependencies: + semver: 7.7.2 + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimist@1.2.8: {} + + morgan@1.10.0: + dependencies: + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + transitivePeerDependencies: + - supports-color + + ms@2.0.0: {} + + ms@2.1.3: {} + + mysql2@3.14.1: + dependencies: + aws-ssl-profiles: 1.1.2 + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.3.2 + lru.min: 1.1.2 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + + named-placeholders@1.1.3: + dependencies: + lru-cache: 7.18.3 + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + node-addon-api@8.4.0: {} + + node-fetch@2.7.0(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + + node-gyp-build@4.8.4: {} + + node-int64@0.4.0: {} + + node-releases@2.0.19: {} + + nodemon@3.1.10: + dependencies: + chokidar: 3.6.0 + debug: 4.4.1(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.7.2 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.1 + undefsafe: 2.0.5 + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + openapi-types@12.1.3: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@2.2.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parseurl@1.3.3: {} + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-to-regexp@0.1.12: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pify@4.0.1: {} + + pirates@4.0.7: {} + + pkg-conf@3.1.0: + dependencies: + find-up: 3.0.0 + load-json-file: 5.3.0 + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + possible-typed-array-names@1.1.0: {} + + prelude-ls@1.2.1: {} + + prettier@3.6.2: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pstree.remy@1.1.8: {} + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + queue-microtask@1.2.3: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + regexpp@3.2.0: {} + + require-directory@2.1.1: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve.exports@2.0.3: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + seq-queue@0.0.5: {} + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + simple-update-notifier@2.0.0: + dependencies: + semver: 7.7.2 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + sprintf-js@1.0.3: {} + + sqlstring@2.3.3: {} + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + standard-engine@15.1.0: + dependencies: + get-stdin: 8.0.0 + minimist: 1.2.8 + pkg-conf: 3.1.0 + xdg-basedir: 4.0.0 + + standard@17.1.2: + dependencies: + eslint: 8.57.1 + eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(eslint@9.30.1))(eslint-plugin-n@15.7.0(eslint@9.30.1))(eslint-plugin-promise@6.6.0(eslint@9.30.1))(eslint@8.57.1) + eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.37.5(eslint@9.30.1))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(eslint@8.57.1) + eslint-plugin-n: 15.7.0(eslint@8.57.1) + eslint-plugin-promise: 6.6.0(eslint@8.57.1) + eslint-plugin-react: 7.37.5(eslint@8.57.1) + standard-engine: 15.1.0 + version-guard: 1.1.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + statuses@2.0.1: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.0 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-json-comments@3.1.1: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + swagger-jsdoc@6.2.8(openapi-types@12.1.3): + dependencies: + commander: 6.2.0 + doctrine: 3.0.0 + glob: 7.1.6 + lodash.mergewith: 4.6.2 + swagger-parser: 10.0.3(openapi-types@12.1.3) + yaml: 2.0.0-1 + transitivePeerDependencies: + - openapi-types + + swagger-parser@10.0.3(openapi-types@12.1.3): + dependencies: + '@apidevtools/swagger-parser': 10.0.3(openapi-types@12.1.3) + transitivePeerDependencies: + - openapi-types + + swagger-themes@1.4.3: {} + + swagger-ui-dist@5.26.1: + dependencies: + '@scarf/scarf': 1.4.0 + + swagger-ui-express@5.0.1(express@4.21.2): + dependencies: + express: 4.21.2 + swagger-ui-dist: 5.26.1 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + text-table@0.2.0: {} + + tmpl@1.0.5: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + topo@3.0.3: + dependencies: + hoek: 6.1.3 + + touch@3.1.1: {} + + tr46@0.0.3: {} + + tree-kill@1.2.2: {} + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.3.1: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undefsafe@2.0.5: {} + + undici-types@7.8.0: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.3(browserslist@4.25.1): + dependencies: + browserslist: 4.25.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + utils-merge@1.0.1: {} + + uuid@9.0.1: {} + + v8-to-istanbul@9.3.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.29 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + validator@13.15.15: {} + + vary@1.1.2: {} + + version-guard@1.1.3: {} + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + xdg-basedir@4.0.0: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@2.0.0-1: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + z-schema@5.0.5: + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.15.15 + optionalDependencies: + commander: 9.5.0 diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 1a961ca..0000000 --- a/yarn.lock +++ /dev/null @@ -1,5643 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@apidevtools/json-schema-ref-parser@^9.0.6": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz#8ff5386b365d4c9faa7c8b566ff16a46a577d9b8" - integrity sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg== - dependencies: - "@jsdevtools/ono" "^7.1.3" - "@types/json-schema" "^7.0.6" - call-me-maybe "^1.0.1" - js-yaml "^4.1.0" - -"@apidevtools/openapi-schemas@^2.0.4": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz#9fa08017fb59d80538812f03fc7cac5992caaa17" - integrity sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ== - -"@apidevtools/swagger-methods@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267" - integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg== - -"@apidevtools/swagger-parser@10.0.3": - version "10.0.3" - resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz#32057ae99487872c4dd96b314a1ab4b95d89eaf5" - integrity sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g== - dependencies: - "@apidevtools/json-schema-ref-parser" "^9.0.6" - "@apidevtools/openapi-schemas" "^2.0.4" - "@apidevtools/swagger-methods" "^3.0.2" - "@jsdevtools/ono" "^7.1.3" - call-me-maybe "^1.0.1" - z-schema "^5.0.1" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== - dependencies: - "@babel/helper-validator-identifier" "^7.27.1" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/compat-data@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.2.tgz#4183f9e642fd84e74e3eea7ffa93a412e3b102c9" - integrity sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ== - -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.1.tgz#89de51e86bd12246003e3524704c49541b16c3e6" - integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.1" - "@babel/helper-compilation-targets" "^7.27.1" - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helpers" "^7.27.1" - "@babel/parser" "^7.27.1" - "@babel/template" "^7.27.1" - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@7.17.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.7.tgz#8da2599beb4a86194a3b24df6c085931d9ee45ad" - integrity sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w== - dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.23.0", "@babel/generator@^7.27.1", "@babel/generator@^7.7.2": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.1.tgz#862d4fad858f7208edd487c28b58144036b76230" - integrity sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w== - dependencies: - "@babel/parser" "^7.27.1" - "@babel/types" "^7.27.1" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/helper-compilation-targets@^7.27.1": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" - integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== - dependencies: - "@babel/compat-data" "^7.27.2" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-environment-visitor@^7.22.20": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" - integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-function-name@^7.23.0": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" - integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== - dependencies: - "@babel/template" "^7.24.7" - "@babel/types" "^7.24.7" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" - integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-module-imports@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" - integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-module-transforms@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz#e1663b8b71d2de948da5c4fb2a20ca4f3ec27a6f" - integrity sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" - integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" - integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== - dependencies: - "@babel/types" "^7.24.7" - -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== - -"@babel/helper-validator-identifier@^7.16.7", "@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== - -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== - -"@babel/helpers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.1.tgz#ffc27013038607cdba3288e692c3611c06a18aa4" - integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== - dependencies: - "@babel/template" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.5", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.27.1", "@babel/parser@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.2.tgz#577518bedb17a2ce4212afd052e01f7df0941127" - integrity sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw== - dependencies: - "@babel/types" "^7.27.1" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07" - integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.7.2": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" - integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18" - integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/template@^7.24.7", "@babel/template@^7.27.1", "@babel/template@^7.3.3": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" - integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" - "@babel/types" "^7.27.1" - -"@babel/traverse@7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" - integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.1" - "@babel/parser" "^7.27.1" - "@babel/template" "^7.27.1" - "@babel/types" "^7.27.1" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.0.0", "@babel/types@^7.17.0", "@babel/types@^7.20.7", "@babel/types@^7.23.0", "@babel/types@^7.24.7", "@babel/types@^7.27.1", "@babel/types@^7.3.3": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.1.tgz#9defc53c16fc899e46941fc6901a9eea1c9d8560" - integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@eslint-community/eslint-utils@^4.2.0": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz#607084630c6c033992a082de6e6fbc1a8b52175a" - integrity sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== - dependencies: - eslint-visitor-keys "^3.4.3" - -"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.6.1": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" - integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== - -"@eslint/config-array@^0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.0.tgz#7a1232e82376712d3340012a2f561a2764d1988f" - integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ== - dependencies: - "@eslint/object-schema" "^2.1.6" - debug "^4.3.1" - minimatch "^3.1.2" - -"@eslint/config-helpers@^0.2.1": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.2.tgz#3779f76b894de3a8ec4763b79660e6d54d5b1010" - integrity sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg== - -"@eslint/core@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c" - integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/eslintrc@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" - integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^10.0.1" - globals "^14.0.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.1": - version "8.57.1" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" - integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== - -"@eslint/js@9.26.0", "@eslint/js@^9.26.0": - version "9.26.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.26.0.tgz#1e13126b67a3db15111d2dcc61f69a2acff70bd5" - integrity sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ== - -"@eslint/object-schema@^2.1.6": - version "2.1.6" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" - integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== - -"@eslint/plugin-kit@^0.2.8": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8" - integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== - dependencies: - "@eslint/core" "^0.13.0" - levn "^0.4.1" - -"@faker-js/faker@^9.7.0": - version "9.7.0" - resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-9.7.0.tgz#1cf1fecfcad5e2da2332140bf3b5f23cc1c2a7f4" - integrity sha512-aozo5vqjCmDoXLNUJarFZx2IN/GgGaogY4TMJ6so/WLZOWpSV7fvj2dmrV6sEAnUm1O7aCrhTibjpzeDFgNqbg== - -"@formkit/tempo@^0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@formkit/tempo/-/tempo-0.1.2.tgz#85ff615dddc6cc55ab9f9ca83cf9a41cfdf778fc" - integrity sha512-jNPPbjL8oj7hK3eHX++CwbR6X4GKQt+x00/q4yeXkwynXHGKL27dylYhpEgwrmediPP4y7s0XtN1if/M/JYujg== - -"@humanfs/core@^0.19.1": - version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" - integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== - -"@humanfs/node@^0.16.6": - version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" - integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== - dependencies: - "@humanfs/core" "^0.19.1" - "@humanwhocodes/retry" "^0.3.0" - -"@humanwhocodes/config-array@^0.13.0": - version "0.13.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" - integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== - dependencies: - "@humanwhocodes/object-schema" "^2.0.3" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@humanwhocodes/retry@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" - integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== - -"@humanwhocodes/retry@^0.4.2": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" - integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== - -"@inquirer/checkbox@^4.1.6": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.1.6.tgz#bd62673a187a011b633dc982c3aab2df19f538b6" - integrity sha512-62u896rWCtKKE43soodq5e/QcRsA22I+7/4Ov7LESWnKRO6BVo2A1DFLDmXL9e28TB0CfHc3YtkbPm7iwajqkg== - dependencies: - "@inquirer/core" "^10.1.11" - "@inquirer/figures" "^1.0.11" - "@inquirer/type" "^3.0.6" - ansi-escapes "^4.3.2" - yoctocolors-cjs "^2.1.2" - -"@inquirer/confirm@^5.1.10": - version "5.1.10" - resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.10.tgz#de3732cb7ae9333bd3e354afee6a6ef8cf28d951" - integrity sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g== - dependencies: - "@inquirer/core" "^10.1.11" - "@inquirer/type" "^3.0.6" - -"@inquirer/core@^10.1.11": - version "10.1.11" - resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.1.11.tgz#4022032b5b6b35970e1c3fcfc522bc250ef8810d" - integrity sha512-BXwI/MCqdtAhzNQlBEFE7CEflhPkl/BqvAuV/aK6lW3DClIfYVDWPP/kXuXHtBWC7/EEbNqd/1BGq2BGBBnuxw== - dependencies: - "@inquirer/figures" "^1.0.11" - "@inquirer/type" "^3.0.6" - ansi-escapes "^4.3.2" - cli-width "^4.1.0" - mute-stream "^2.0.0" - signal-exit "^4.1.0" - wrap-ansi "^6.2.0" - yoctocolors-cjs "^2.1.2" - -"@inquirer/editor@^4.2.11": - version "4.2.11" - resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.11.tgz#71cee5d50bbcebcbc5e6e8c513b6a5cb7292d990" - integrity sha512-YoZr0lBnnLFPpfPSNsQ8IZyKxU47zPyVi9NLjCWtna52//M/xuL0PGPAxHxxYhdOhnvY2oBafoM+BI5w/JK7jw== - dependencies: - "@inquirer/core" "^10.1.11" - "@inquirer/type" "^3.0.6" - external-editor "^3.1.0" - -"@inquirer/expand@^4.0.13": - version "4.0.13" - resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.13.tgz#2f018c28464683a1a4a450713a810248d48f4762" - integrity sha512-HgYNWuZLHX6q5y4hqKhwyytqAghmx35xikOGY3TcgNiElqXGPas24+UzNPOwGUZa5Dn32y25xJqVeUcGlTv+QQ== - dependencies: - "@inquirer/core" "^10.1.11" - "@inquirer/type" "^3.0.6" - yoctocolors-cjs "^2.1.2" - -"@inquirer/figures@^1.0.11": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.11.tgz#4744e6db95288fea1dead779554859710a959a21" - integrity sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw== - -"@inquirer/input@^4.1.10": - version "4.1.10" - resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.1.10.tgz#e3eafb903a2f4251f8bd21d0fe598fe61a237ffc" - integrity sha512-kV3BVne3wJ+j6reYQUZi/UN9NZGZLxgc/tfyjeK3mrx1QI7RXPxGp21IUTv+iVHcbP4ytZALF8vCHoxyNSC6qg== - dependencies: - "@inquirer/core" "^10.1.11" - "@inquirer/type" "^3.0.6" - -"@inquirer/number@^3.0.13": - version "3.0.13" - resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.13.tgz#7bef02085be742ede6771c5fb036201ee3eb6df7" - integrity sha512-IrLezcg/GWKS8zpKDvnJ/YTflNJdG0qSFlUM/zNFsdi4UKW/CO+gaJpbMgQ20Q58vNKDJbEzC6IebdkprwL6ew== - dependencies: - "@inquirer/core" "^10.1.11" - "@inquirer/type" "^3.0.6" - -"@inquirer/password@^4.0.13": - version "4.0.13" - resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.13.tgz#17793bbc91704ca37850de440b7d4f2a94fc99c2" - integrity sha512-NN0S/SmdhakqOTJhDwOpeBEEr8VdcYsjmZHDb0rblSh2FcbXQOr+2IApP7JG4WE3sxIdKytDn4ed3XYwtHxmJQ== - dependencies: - "@inquirer/core" "^10.1.11" - "@inquirer/type" "^3.0.6" - ansi-escapes "^4.3.2" - -"@inquirer/prompts@^7.5.1": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.5.1.tgz#44e70dacfe20314d233c61410618ceef29a8482f" - integrity sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg== - dependencies: - "@inquirer/checkbox" "^4.1.6" - "@inquirer/confirm" "^5.1.10" - "@inquirer/editor" "^4.2.11" - "@inquirer/expand" "^4.0.13" - "@inquirer/input" "^4.1.10" - "@inquirer/number" "^3.0.13" - "@inquirer/password" "^4.0.13" - "@inquirer/rawlist" "^4.1.1" - "@inquirer/search" "^3.0.13" - "@inquirer/select" "^4.2.1" - -"@inquirer/rawlist@^4.1.1": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.1.1.tgz#ce9f925a5001f0c5fa5cd2b846a04f8ef942acab" - integrity sha512-VBUC0jPN2oaOq8+krwpo/mf3n/UryDUkKog3zi+oIi8/e5hykvdntgHUB9nhDM78RubiyR1ldIOfm5ue+2DeaQ== - dependencies: - "@inquirer/core" "^10.1.11" - "@inquirer/type" "^3.0.6" - yoctocolors-cjs "^2.1.2" - -"@inquirer/search@^3.0.13": - version "3.0.13" - resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.0.13.tgz#465a5786f3302be39ff94e23512fde51fa3cf062" - integrity sha512-9g89d2c5Izok/Gw/U7KPC3f9kfe5rA1AJ24xxNZG0st+vWekSk7tB9oE+dJv5JXd0ZSijomvW0KPMoBd8qbN4g== - dependencies: - "@inquirer/core" "^10.1.11" - "@inquirer/figures" "^1.0.11" - "@inquirer/type" "^3.0.6" - yoctocolors-cjs "^2.1.2" - -"@inquirer/select@^4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.2.1.tgz#1be785ef4cd7dccd67fa4b77ff9dc8460cbc554b" - integrity sha512-gt1Kd5XZm+/ddemcT3m23IP8aD8rC9drRckWoP/1f7OL46Yy2FGi8DSmNjEjQKtPl6SV96Kmjbl6p713KXJ/Jg== - dependencies: - "@inquirer/core" "^10.1.11" - "@inquirer/figures" "^1.0.11" - "@inquirer/type" "^3.0.6" - ansi-escapes "^4.3.2" - yoctocolors-cjs "^2.1.2" - -"@inquirer/type@^3.0.6": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.6.tgz#2500e435fc2014c5250eec3279f42b70b64089bd" - integrity sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - 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" - -"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" - integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - -"@jest/core@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" - integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== - dependencies: - "@jest/console" "^29.7.0" - "@jest/reporters" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - ci-info "^3.2.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^29.7.0" - jest-config "^29.7.0" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-resolve-dependencies "^29.7.0" - jest-runner "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - jest-watcher "^29.7.0" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" - integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== - dependencies: - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - -"@jest/expect-utils@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" - integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== - dependencies: - jest-get-type "^29.6.3" - -"@jest/expect@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" - integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== - dependencies: - expect "^29.7.0" - jest-snapshot "^29.7.0" - -"@jest/fake-timers@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" - integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== - dependencies: - "@jest/types" "^29.6.3" - "@sinonjs/fake-timers" "^10.0.2" - "@types/node" "*" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -"@jest/globals@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" - integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/types" "^29.6.3" - jest-mock "^29.7.0" - -"@jest/reporters@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" - integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^6.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - jest-worker "^29.7.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - v8-to-istanbul "^9.0.1" - -"@jest/schemas@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" - integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/source-map@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" - integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.18" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" - integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== - dependencies: - "@jest/console" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" - integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== - dependencies: - "@jest/test-result" "^29.7.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - slash "^3.0.0" - -"@jest/transform@^29.7.0": - version "29.7.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" - integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.6.3" - "@jridgewell/trace-mapping" "^0.3.18" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.2" - -"@jest/types@^29.6.3": - version "29.6.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" - integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== - dependencies: - "@jest/schemas" "^29.6.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jsdevtools/ono@^7.1.3": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" - integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== - -"@modelcontextprotocol/sdk@^1.8.0": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz#c7f4a1432872ef10130f5d9b0072060c17a3946b" - integrity sha512-9LfmxKTb1v+vUS1/emSk1f5ePmTLkb9Le9AxOB5T0XM59EUumwcS45z05h7aiZx3GI0Bl7mjb3FMEglYj+acuQ== - dependencies: - content-type "^1.0.5" - cors "^2.8.5" - cross-spawn "^7.0.3" - eventsource "^3.0.2" - express "^5.0.1" - express-rate-limit "^7.5.0" - pkce-challenge "^5.0.0" - raw-body "^3.0.0" - zod "^3.23.8" - zod-to-json-schema "^3.24.1" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@phc/format@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@phc/format/-/format-1.0.0.tgz#b5627003b3216dc4362125b13f48a4daa76680e4" - integrity sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ== - -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - -"@scarf/scarf@=1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.4.0.tgz#3bbb984085dbd6d982494538b523be1ce6562972" - integrity sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sinonjs/commons@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" - integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^10.0.2": - version "10.3.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" - integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== - dependencies: - "@sinonjs/commons" "^3.0.0" - -"@trivago/prettier-plugin-sort-imports@^4.3.0": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.3.0.tgz#725f411646b3942193a37041c84e0b2116339789" - integrity sha512-r3n0onD3BTOVUNPhR4lhVK4/pABGpbA7bW3eumZnYdKaHkf1qEC+Mag6DPbGNuuh0eG8AaYj+YqmVHSiGslaTQ== - dependencies: - "@babel/generator" "7.17.7" - "@babel/parser" "^7.20.5" - "@babel/traverse" "7.23.2" - "@babel/types" "7.17.0" - javascript-natural-sort "0.7.1" - lodash "^4.17.21" - -"@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" - integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.7.tgz#968cdc2366ec3da159f61166428ee40f370e56c2" - integrity sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng== - dependencies: - "@babel/types" "^7.20.7" - -"@types/estree@^1.0.6": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== - -"@types/graceful-fs@^4.1.3": - version "4.1.9" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.6": - version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/node@*": - version "22.15.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.17.tgz#355ccec95f705b664e4332bb64a7f07db30b7055" - integrity sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw== - dependencies: - undici-types "~6.21.0" - -"@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^17.0.8": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== - dependencies: - "@types/yargs-parser" "*" - -"@ungap/structured-clone@^1.2.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" - integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== - -accepts@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-2.0.0.tgz#bbcf4ba5075467f3f2131eab3cffc73c2f5d7895" - integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== - dependencies: - mime-types "^3.0.0" - negotiator "^1.0.0" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.14.0: - version "8.14.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" - integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== - -acorn@^8.9.0: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -agent-base@^7.1.2: - version "7.1.3" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" - integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argon2@^0.41.1: - version "0.41.1" - resolved "https://registry.yarnpkg.com/argon2/-/argon2-0.41.1.tgz#30ce6b013e273bc7e92c558d40e66d35e5e8c63b" - integrity sha512-dqCW8kJXke8Ik+McUcMDltrbuAWETPyU6iq+4AhxqKphWi7pChB/Zgd/Tp/o8xRLbg8ksMj46F/vph9wnxpTzQ== - dependencies: - "@phc/format" "^1.0.0" - node-addon-api "^8.1.0" - node-gyp-build "^4.8.1" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" - integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== - dependencies: - call-bound "^1.0.3" - is-array-buffer "^3.0.5" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-includes@^3.1.6, array-includes@^3.1.8, array-includes@^3.1.9: - version "3.1.9" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" - integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.24.0" - es-object-atoms "^1.1.1" - get-intrinsic "^1.3.0" - is-string "^1.1.1" - math-intrinsics "^1.1.0" - -array.prototype.findlast@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" - integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-shim-unscopables "^1.1.0" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" - integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.flatmap@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" - integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.tosorted@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" - integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - es-errors "^1.3.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" - integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - is-array-buffer "^3.0.4" - -async-function@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" - integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -aws-ssl-profiles@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz#157dd77e9f19b1d123678e93f120e6f193022641" - integrity sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g== - -babel-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" - integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== - dependencies: - "@jest/transform" "^29.7.0" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.6.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" - integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" - integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== - 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" - -babel-preset-jest@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" - integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== - dependencies: - babel-plugin-jest-hoist "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-js@^1.3.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -basic-auth@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== - dependencies: - safe-buffer "5.1.2" - -bignumber.js@^9.0.0: - version "9.3.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.0.tgz#bdba7e2a4c1a2eba08290e8dcad4f36393c92acd" - integrity sha512-EM7aMFTXbptt/wZdMlBv2t8IViwQL+h6SLHosp8Yf0dqJMTnY6iL32opnAB6kAdL0SZPuvcAzFr31o0c/R3/RA== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -body-parser@1.20.3: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -body-parser@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa" - integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== - dependencies: - bytes "^3.1.2" - content-type "^1.0.5" - debug "^4.4.0" - http-errors "^2.0.0" - iconv-lite "^0.6.3" - on-finished "^2.4.1" - qs "^6.14.0" - raw-body "^3.0.0" - type-is "^2.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0: - version "4.24.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.5.tgz#aa0f5b8560fe81fde84c6dcb38f759bafba0e11b" - integrity sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw== - dependencies: - caniuse-lite "^1.0.30001716" - electron-to-chromium "^1.5.149" - node-releases "^2.0.19" - update-browserslist-db "^1.1.3" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-equal-constant-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" - integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -builtins@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.1.0.tgz#6d85eeb360c4ebc166c3fdef922a15aa7316a5e8" - integrity sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg== - dependencies: - semver "^7.0.0" - -bytes@3.1.2, bytes@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.7, call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -call-me-maybe@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" - integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001716: - version "1.0.30001717" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz#5d9fec5ce09796a1893013825510678928aca129" - integrity sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw== - -chalk@^4.0.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chokidar@^3.5.2: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - 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" - optionalDependencies: - fsevents "~2.3.2" - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" - integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== - -cli-width@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" - integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" - integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concurrently@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-9.2.0.tgz#233e3892ceb0b5db9fd49e9c8c739737a7b638b5" - integrity sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ== - dependencies: - chalk "^4.1.2" - lodash "^4.17.21" - rxjs "^7.8.1" - shell-quote "^1.8.1" - supports-color "^8.1.1" - tree-kill "^1.2.2" - yargs "^17.7.2" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-disposition@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-1.0.0.tgz#844426cb398f934caefcbb172200126bc7ceace2" - integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== - dependencies: - safe-buffer "5.2.1" - -content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie-signature@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793" - integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== - -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== - -cookie@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" - integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== - -cors@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -create-jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" - integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-config "^29.7.0" - jest-util "^29.7.0" - prompts "^2.0.1" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -data-view-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" - integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" - integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-offset@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" - integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.5, debug@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4: - version "4.4.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -dedent@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.6.0.tgz#79d52d6389b1ffa67d2bcef59ba51847a9d503b2" - integrity sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -denque@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/denque/-/denque-2.1.0.tgz#e93e1a6569fb5e66f16a3c2a2964617d349d6ab1" - integrity sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw== - -depd@2.0.0, depd@^2.0.0, depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -diff-sequences@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" - integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== - -doctrine@3.0.0, doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -dotenv@^16.5.0: - version "16.5.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.5.0.tgz#092b49f25f808f020050051d1ff258e404c78692" - integrity sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg== - -dunder-proto@^1.0.0, dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: - version "1.0.11" - resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" - integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== - dependencies: - safe-buffer "^5.0.1" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.5.149: - version "1.5.151" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.151.tgz#5edd6c17e1b2f14b4662c41b9379f96cc8c2bb7c" - integrity sha512-Rl6uugut2l9sLojjS4H4SAr3A4IgACMLgpuEMPYCVcKydzfyPrn5absNRju38IhQOf/NwjJY8OGWjlteqYeBCA== - -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@^2.0.0, encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encoding@^0.1.12: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0: - version "1.24.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328" - integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== - dependencies: - array-buffer-byte-length "^1.0.2" - arraybuffer.prototype.slice "^1.0.4" - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - data-view-buffer "^1.0.2" - data-view-byte-length "^1.0.2" - data-view-byte-offset "^1.0.1" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-set-tostringtag "^2.1.0" - es-to-primitive "^1.3.0" - function.prototype.name "^1.1.8" - get-intrinsic "^1.3.0" - get-proto "^1.0.1" - get-symbol-description "^1.1.0" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - internal-slot "^1.1.0" - is-array-buffer "^3.0.5" - is-callable "^1.2.7" - is-data-view "^1.0.2" - is-negative-zero "^2.0.3" - is-regex "^1.2.1" - is-set "^2.0.3" - is-shared-array-buffer "^1.0.4" - is-string "^1.1.1" - is-typed-array "^1.1.15" - is-weakref "^1.1.1" - math-intrinsics "^1.1.0" - object-inspect "^1.13.4" - object-keys "^1.1.1" - object.assign "^4.1.7" - own-keys "^1.0.1" - regexp.prototype.flags "^1.5.4" - safe-array-concat "^1.1.3" - safe-push-apply "^1.0.0" - safe-regex-test "^1.1.0" - set-proto "^1.0.0" - stop-iteration-iterator "^1.1.0" - string.prototype.trim "^1.2.10" - string.prototype.trimend "^1.0.9" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.3" - typed-array-byte-length "^1.0.3" - typed-array-byte-offset "^1.0.4" - typed-array-length "^1.0.7" - unbox-primitive "^1.1.0" - which-typed-array "^1.1.19" - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-iterator-helpers@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz#d1dd0f58129054c0ad922e6a9a1e65eef435fe75" - integrity sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-abstract "^1.23.6" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.6" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - internal-slot "^1.1.0" - iterator.prototype "^1.1.4" - safe-array-concat "^1.1.3" - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3, es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" - integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== - dependencies: - hasown "^2.0.2" - -es-to-primitive@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" - integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== - dependencies: - is-callable "^1.2.7" - is-date-object "^1.0.5" - is-symbol "^1.0.4" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-html@^1.0.3, escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-standard-jsx@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz#70852d395731a96704a592be5b0bfaccfeded239" - integrity sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ== - -eslint-config-standard@17.1.0: - version "17.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz#40ffb8595d47a6b242e07cbfd49dc211ed128975" - integrity sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q== - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz#f76d3220bfb83c057651359295ab5854eaad75ff" - integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== - dependencies: - debug "^3.2.7" - -eslint-plugin-es@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" - integrity sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ== - dependencies: - eslint-utils "^2.0.0" - regexpp "^3.0.0" - -eslint-plugin-import@^2.27.5: - version "2.32.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" - integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.9" - array.prototype.findlastindex "^1.2.6" - array.prototype.flat "^1.3.3" - array.prototype.flatmap "^1.3.3" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.12.1" - hasown "^2.0.2" - is-core-module "^2.16.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.1" - semver "^6.3.1" - string.prototype.trimend "^1.0.9" - tsconfig-paths "^3.15.0" - -eslint-plugin-n@^15.7.0: - version "15.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz#e29221d8f5174f84d18f2eb94765f2eeea033b90" - integrity sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q== - dependencies: - builtins "^5.0.1" - eslint-plugin-es "^4.1.0" - eslint-utils "^3.0.0" - ignore "^5.1.1" - is-core-module "^2.11.0" - minimatch "^3.1.2" - resolve "^1.22.1" - semver "^7.3.8" - -eslint-plugin-promise@^6.1.1: - version "6.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz#acd3fd7d55cead7a10f92cf698f36c0aafcd717a" - integrity sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ== - -eslint-plugin-react@^7.36.1: - version "7.37.5" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" - integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== - dependencies: - array-includes "^3.1.8" - array.prototype.findlast "^1.2.5" - array.prototype.flatmap "^1.3.3" - array.prototype.tosorted "^1.1.4" - doctrine "^2.1.0" - es-iterator-helpers "^1.2.1" - estraverse "^5.3.0" - hasown "^2.0.2" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.9" - object.fromentries "^2.0.8" - object.values "^1.2.1" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.12" - string.prototype.repeat "^1.0.0" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-scope@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" - integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint-visitor-keys@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" - integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== - -eslint@^8.41.0: - version "8.57.1" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" - integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.1" - "@humanwhocodes/config-array" "^0.13.0" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -eslint@^9.26.0: - version "9.26.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.26.0.tgz#978fe029adc2aceed28ab437bca876e83461c3b4" - integrity sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.20.0" - "@eslint/config-helpers" "^0.2.1" - "@eslint/core" "^0.13.0" - "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.26.0" - "@eslint/plugin-kit" "^0.2.8" - "@humanfs/node" "^0.16.6" - "@humanwhocodes/module-importer" "^1.0.1" - "@humanwhocodes/retry" "^0.4.2" - "@modelcontextprotocol/sdk" "^1.8.0" - "@types/estree" "^1.0.6" - "@types/json-schema" "^7.0.15" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.6" - debug "^4.3.2" - escape-string-regexp "^4.0.0" - eslint-scope "^8.3.0" - eslint-visitor-keys "^4.2.0" - espree "^10.3.0" - esquery "^1.5.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^8.0.0" - find-up "^5.0.0" - glob-parent "^6.0.2" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - json-stable-stringify-without-jsonify "^1.0.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - zod "^3.24.2" - -espree@^10.0.1, espree@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" - integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== - dependencies: - acorn "^8.14.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^4.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.2, esquery@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@^1.8.1, etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eventsource-parser@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/eventsource-parser/-/eventsource-parser-3.0.1.tgz#5e358dba9a55ba64ca90da883c4ca35bd82467bd" - integrity sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA== - -eventsource@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-3.0.7.tgz#1157622e2f5377bb6aef2114372728ba0c156989" - integrity sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA== - dependencies: - eventsource-parser "^3.0.1" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - 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" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expect@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" - integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== - dependencies: - "@jest/expect-utils" "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - -express-rate-limit@^7.5.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-7.5.0.tgz#6a67990a724b4fbbc69119419feef50c51e8b28f" - integrity sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg== - -express@^4.21.0: - version "4.21.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" - integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.12" - proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -express@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/express/-/express-5.1.0.tgz#d31beaf715a0016f0d53f47d3b4d7acf28c75cc9" - integrity sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA== - dependencies: - accepts "^2.0.0" - body-parser "^2.2.0" - content-disposition "^1.0.0" - content-type "^1.0.5" - cookie "^0.7.1" - cookie-signature "^1.2.1" - debug "^4.4.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" - -extend@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.19.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" - integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-entry-cache@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" - integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== - dependencies: - flat-cache "^4.0.0" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -finalhandler@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-2.1.0.tgz#72306373aa89d05a8242ed569ed86a1bff7c561f" - integrity sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q== - 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" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flat-cache@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" - integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.4" - -flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -for-each@^0.3.3, for-each@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -form-data@^2.2.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.3.tgz#f9bcf87418ce748513c0c3494bb48ec270c97acc" - integrity sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" - mime-types "^2.1.35" - safe-buffer "^5.2.1" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-2.0.0.tgz#8dd7df6a1b3a1b3a5cf186c05a5dd267622635a4" - integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== - -frisby@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/frisby/-/frisby-2.1.3.tgz#c3947dd98711853220314b4ff7df6f657380c65a" - integrity sha512-b1HAqx10Ofxj5u9vZbWJRmQNKtYp8sNZuGNqPtUpHIFdwJcS7mzUjjNyEw/miYrILXOah3KbX40h0awjsuXgQg== - dependencies: - encoding "^0.1.12" - form-data "^2.2.0" - joi "^13.0.0" - lodash "^4.17.15" - node-fetch "^2.1.2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" - integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - functions-have-names "^1.2.3" - hasown "^2.0.2" - is-callable "^1.2.7" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gaxios@^6.0.0, gaxios@^6.1.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.7.1.tgz#ebd9f7093ede3ba502685e73390248bb5b7f71fb" - integrity sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ== - dependencies: - extend "^3.0.2" - https-proxy-agent "^7.0.1" - is-stream "^2.0.0" - node-fetch "^2.6.9" - uuid "^9.0.1" - -gcp-metadata@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.1.tgz#f65aa69f546bc56e116061d137d3f5f90bdec494" - integrity sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A== - dependencies: - gaxios "^6.1.1" - google-logging-utils "^0.0.2" - json-bigint "^1.0.0" - -generate-function@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" - integrity sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ== - dependencies: - is-property "^1.0.2" - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - 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" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-proto@^1.0.0, get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stdin@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" - integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" - integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3, glob@^7.1.4: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - 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" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globals@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" - integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== - -globals@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-16.1.0.tgz#ee6ab147d41c64e9f2beaaaf66572d18df8e1e60" - integrity sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g== - -globalthis@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -google-auth-library@^9.15.1: - version "9.15.1" - resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.15.1.tgz#0c5d84ed1890b2375f1cd74f03ac7b806b392928" - integrity sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng== - dependencies: - base64-js "^1.3.0" - ecdsa-sig-formatter "^1.0.11" - gaxios "^6.1.1" - gcp-metadata "^6.1.0" - gtoken "^7.0.0" - jws "^4.0.0" - -google-logging-utils@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/google-logging-utils/-/google-logging-utils-0.0.2.tgz#5fd837e06fa334da450433b9e3e1870c1594466a" - integrity sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ== - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.15, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -gtoken@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.1.0.tgz#d61b4ebd10132222817f7222b1e6064bd463fc26" - integrity sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw== - dependencies: - gaxios "^6.0.0" - jws "^4.0.0" - -has-bigints@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" - integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" - integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== - dependencies: - dunder-proto "^1.0.0" - -has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -helmet@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/helmet/-/helmet-8.1.0.tgz#f96d23fedc89e9476ecb5198181009c804b8b38c" - integrity sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg== - -hoek@5.x.x: - version "5.0.4" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-5.0.4.tgz#0f7fa270a1cafeb364a4b2ddfaa33f864e4157da" - integrity sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w== - -hoek@6.x.x: - version "6.1.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.3.tgz#73b7d33952e01fe27a38b0457294b79dd8da242c" - integrity sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ== - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -http-errors@2.0.0, http-errors@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -https-proxy-agent@^7.0.1: - version "7.0.6" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" - integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== - dependencies: - agent-base "^7.1.2" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -husky@^9.1.7: - version "9.1.7" - resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" - integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== - -ignore@^5.1.1, ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -import-fresh@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-local@^3.0.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inquirer@^12.6.1: - version "12.6.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-12.6.1.tgz#fe272e222b9307cec40bd68104e1d651cfdd7878" - integrity sha512-MGFnzHVS3l3oM3cy+LWkyR7UUtVEn3D5U41CZbEY34szToWoJAvaVtCTz1mxsEzZFk/HXWyCArn0HDgloTXMDw== - dependencies: - "@inquirer/core" "^10.1.11" - "@inquirer/prompts" "^7.5.1" - "@inquirer/type" "^3.0.6" - ansi-escapes "^4.3.2" - mute-stream "^2.0.0" - run-async "^3.0.0" - rxjs "^7.8.2" - -internal-slot@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" - integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.2" - side-channel "^1.1.0" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" - integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-async-function@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" - integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== - dependencies: - async-function "^1.0.0" - call-bound "^1.0.3" - get-proto "^1.0.1" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-bigint@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" - integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== - dependencies: - has-bigints "^1.0.2" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" - integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.16.0, is-core-module@^2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1, is-data-view@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" - integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== - dependencies: - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - is-typed-array "^1.1.13" - -is-date-object@^1.0.5, is-date-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" - integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" - integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== - dependencies: - call-bound "^1.0.3" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-generator-function@^1.0.10: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca" - integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== - dependencies: - call-bound "^1.0.3" - get-proto "^1.0.0" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" - integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-promise@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" - integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== - -is-property@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - integrity sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g== - -is-regex@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" - integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== - dependencies: - call-bound "^1.0.2" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" - integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== - dependencies: - call-bound "^1.0.3" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" - integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-symbol@^1.0.4, is-symbol@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" - integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== - dependencies: - call-bound "^1.0.2" - has-symbols "^1.1.0" - safe-regex-test "^1.1.0" - -is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2, is-weakref@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" - integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== - dependencies: - call-bound "^1.0.3" - -is-weakset@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" - integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== - dependencies: - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isemail@3.x.x: - version "3.2.0" - resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" - integrity sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg== - dependencies: - punycode "2.x.x" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-instrument@^5.0.4: - version "5.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-instrument@^6.0.0: - version "6.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" - integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== - 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" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -iterator.prototype@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" - integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== - dependencies: - define-data-property "^1.1.4" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.6" - get-proto "^1.0.0" - has-symbols "^1.1.0" - set-function-name "^2.0.2" - -javascript-natural-sort@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" - integrity sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== - -jest-changed-files@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" - integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== - dependencies: - execa "^5.0.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - -jest-circus@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" - integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/expect" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^1.0.0" - is-generator-fn "^2.0.0" - jest-each "^29.7.0" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-runtime "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - p-limit "^3.1.0" - pretty-format "^29.7.0" - pure-rand "^6.0.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-cli@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" - integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== - dependencies: - "@jest/core" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - chalk "^4.0.0" - create-jest "^29.7.0" - exit "^0.1.2" - import-local "^3.0.2" - jest-config "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - yargs "^17.3.1" - -jest-config@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" - integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== - dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.7.0" - "@jest/types" "^29.6.3" - babel-jest "^29.7.0" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.7.0" - jest-environment-node "^29.7.0" - jest-get-type "^29.6.3" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-runner "^29.7.0" - jest-util "^29.7.0" - jest-validate "^29.7.0" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.7.0" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" - integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.6.3" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-docblock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" - integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" - integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== - dependencies: - "@jest/types" "^29.6.3" - chalk "^4.0.0" - jest-get-type "^29.6.3" - jest-util "^29.7.0" - pretty-format "^29.7.0" - -jest-environment-node@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" - integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-mock "^29.7.0" - jest-util "^29.7.0" - -jest-get-type@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" - integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== - -jest-haste-map@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" - integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== - dependencies: - "@jest/types" "^29.6.3" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.6.3" - jest-util "^29.7.0" - jest-worker "^29.7.0" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - -jest-leak-detector@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" - integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== - dependencies: - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-matcher-utils@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" - integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== - dependencies: - chalk "^4.0.0" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - pretty-format "^29.7.0" - -jest-message-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" - integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.6.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.7.0" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" - integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - jest-util "^29.7.0" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" - integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== - -jest-resolve-dependencies@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" - integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== - dependencies: - jest-regex-util "^29.6.3" - jest-snapshot "^29.7.0" - -jest-resolve@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" - integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-pnp-resolver "^1.2.2" - jest-util "^29.7.0" - jest-validate "^29.7.0" - resolve "^1.20.0" - resolve.exports "^2.0.0" - slash "^3.0.0" - -jest-runner@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" - integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== - dependencies: - "@jest/console" "^29.7.0" - "@jest/environment" "^29.7.0" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.7.0" - jest-environment-node "^29.7.0" - jest-haste-map "^29.7.0" - jest-leak-detector "^29.7.0" - jest-message-util "^29.7.0" - jest-resolve "^29.7.0" - jest-runtime "^29.7.0" - jest-util "^29.7.0" - jest-watcher "^29.7.0" - jest-worker "^29.7.0" - p-limit "^3.1.0" - source-map-support "0.5.13" - -jest-runtime@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" - integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== - dependencies: - "@jest/environment" "^29.7.0" - "@jest/fake-timers" "^29.7.0" - "@jest/globals" "^29.7.0" - "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.7.0" - jest-message-util "^29.7.0" - jest-mock "^29.7.0" - jest-regex-util "^29.6.3" - jest-resolve "^29.7.0" - jest-snapshot "^29.7.0" - jest-util "^29.7.0" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" - integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.7.0" - "@jest/transform" "^29.7.0" - "@jest/types" "^29.6.3" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^29.7.0" - graceful-fs "^4.2.9" - jest-diff "^29.7.0" - jest-get-type "^29.6.3" - jest-matcher-utils "^29.7.0" - jest-message-util "^29.7.0" - jest-util "^29.7.0" - natural-compare "^1.4.0" - pretty-format "^29.7.0" - semver "^7.5.3" - -jest-util@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" - integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== - dependencies: - "@jest/types" "^29.6.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" - integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== - dependencies: - "@jest/types" "^29.6.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.6.3" - leven "^3.1.0" - pretty-format "^29.7.0" - -jest-watcher@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" - integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== - dependencies: - "@jest/test-result" "^29.7.0" - "@jest/types" "^29.6.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.7.0" - string-length "^4.0.1" - -jest-worker@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" - integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== - dependencies: - "@types/node" "*" - jest-util "^29.7.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" - integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== - dependencies: - "@jest/core" "^29.7.0" - "@jest/types" "^29.6.3" - import-local "^3.0.2" - jest-cli "^29.7.0" - -joi@^13.0.0: - version "13.7.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-13.7.0.tgz#cfd85ebfe67e8a1900432400b4d03bbd93fb879f" - integrity sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q== - dependencies: - hoek "5.x.x" - isemail "3.x.x" - topo "3.x.x" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json-bigint@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" - integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== - dependencies: - bignumber.js "^9.0.0" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonwebtoken@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" - integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== - dependencies: - jws "^3.2.2" - lodash.includes "^4.3.0" - lodash.isboolean "^3.0.3" - lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" - lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^7.5.4" - -"jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -jwa@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9" - integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== - dependencies: - buffer-equal-constant-time "^1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jwa@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804" - integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg== - dependencies: - buffer-equal-constant-time "^1.0.1" - ecdsa-sig-formatter "1.0.11" - safe-buffer "^5.0.1" - -jws@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" - integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== - dependencies: - jwa "^1.4.1" - safe-buffer "^5.0.1" - -jws@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" - integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== - dependencies: - jwa "^2.0.0" - safe-buffer "^5.0.1" - -keyv@^4.5.3, keyv@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -load-json-file@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.3.0.tgz#4d3c1e01fa1c03ea78a60ac7af932c9ce53403f3" - integrity sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw== - dependencies: - graceful-fs "^4.1.15" - parse-json "^4.0.0" - pify "^4.0.1" - strip-bom "^3.0.0" - type-fest "^0.3.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.includes@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" - integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== - -lodash.isboolean@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" - integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.isinteger@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" - integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== - -lodash.isnumber@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" - integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.mergewith@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" - integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== - -lodash.once@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== - -lodash@^4.17.15, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -long@^5.2.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" - integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== - -loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^7.14.1: - version "7.18.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -lru.min@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/lru.min/-/lru.min-1.1.2.tgz#01ce1d72cc50c7faf8bd1f809ebf05d4331021eb" - integrity sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg== - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -media-typer@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" - integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -merge-descriptors@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-2.0.0.tgz#ea922f660635a2249ee565e0449f951e6b603808" - integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.4: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@^1.54.0: - version "1.54.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" - integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== - -mime-types@^2.1.35, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime-types@^3.0.0, mime-types@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" - integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== - dependencies: - mime-db "^1.54.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -morgan@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" - integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== - dependencies: - basic-auth "~2.0.1" - debug "2.6.9" - depd "~2.0.0" - on-finished "~2.3.0" - on-headers "~1.0.2" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.3, ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" - integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== - -mysql2@^3.11.3: - version "3.14.1" - resolved "https://registry.yarnpkg.com/mysql2/-/mysql2-3.14.1.tgz#7786160abf086fd279e0253e16e34c05b4ab3b3e" - integrity sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w== - dependencies: - aws-ssl-profiles "^1.1.1" - denque "^2.1.0" - generate-function "^2.3.1" - iconv-lite "^0.6.3" - long "^5.2.1" - lru.min "^1.0.0" - named-placeholders "^1.1.3" - seq-queue "^0.0.5" - sqlstring "^2.3.2" - -named-placeholders@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/named-placeholders/-/named-placeholders-1.1.3.tgz#df595799a36654da55dda6152ba7a137ad1d9351" - integrity sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w== - dependencies: - lru-cache "^7.14.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -negotiator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" - integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== - -node-addon-api@^8.1.0: - version "8.3.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-8.3.1.tgz#53bc8a4f8dbde3de787b9828059da94ba9fd4eed" - integrity sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA== - -node-fetch@^2.1.2, node-fetch@^2.6.9: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build@^4.8.1: - version "4.8.4" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" - integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -nodemon@^3.1.10: - version "3.1.10" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.10.tgz#5015c5eb4fffcb24d98cf9454df14f4fecec9bc1" - integrity sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw== - dependencies: - chokidar "^3.5.2" - debug "^4" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - 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" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -object-assign@^4, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.13.3, object-inspect@^1.13.4: - version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.7: - version "4.1.7" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" - integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - has-symbols "^1.1.0" - object-keys "^1.1.1" - -object.entries@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" - integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-object-atoms "^1.1.1" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.1.6, object.values@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" - integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -on-finished@2.4.1, on-finished@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -own-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" - integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== - dependencies: - get-intrinsic "^1.2.6" - object-keys "^1.1.1" - safe-push-apply "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2, p-limit@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - 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" - -parseurl@^1.3.3, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" - integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== - -path-to-regexp@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz#73990cc29e57a3ff2a0d914095156df5db79e8b4" - integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" - integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== - -pkce-challenge@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pkce-challenge/-/pkce-challenge-5.0.0.tgz#c3a405cb49e272094a38e890a2b51da0228c4d97" - integrity sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ== - -pkg-conf@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-conf/-/pkg-conf-3.1.0.tgz#d9f9c75ea1bae0e77938cde045b276dac7cc69ae" - integrity sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ== - dependencies: - find-up "^3.0.0" - load-json-file "^5.2.0" - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" - integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== - -pretty-format@^29.7.0: - version "29.7.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" - integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== - dependencies: - "@jest/schemas" "^29.6.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -proxy-addr@^2.0.7, proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -punycode@2.x.x, punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -pure-rand@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" - integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== - -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - -qs@^6.14.0: - version "6.14.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" - integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== - dependencies: - side-channel "^1.1.0" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-body@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.0.tgz#25b3476f07a51600619dae3fe82ddc28a36e5e0f" - integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.6.3" - unpipe "1.0.0" - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" - integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.7" - get-proto "^1.0.1" - which-builtin-type "^1.2.1" - -regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" - integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-errors "^1.3.0" - get-proto "^1.0.1" - gopd "^1.2.0" - set-function-name "^2.0.2" - -regexpp@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve.exports@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" - integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== - -resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.4: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -router@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/router/-/router-2.2.0.tgz#019be620b711c87641167cc79b99090f00b146ef" - integrity sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== - dependencies: - debug "^4.4.0" - depd "^2.0.0" - is-promise "^4.0.0" - parseurl "^1.3.3" - path-to-regexp "^8.0.0" - -run-async@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" - integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.8.1, rxjs@^7.8.2: - version "7.8.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b" - integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== - dependencies: - tslib "^2.1.0" - -safe-array-concat@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" - integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - has-symbols "^1.1.0" - isarray "^2.0.5" - -safe-buffer@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-push-apply@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" - integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== - dependencies: - es-errors "^1.3.0" - isarray "^2.0.5" - -safe-regex-test@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" - integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-regex "^1.2.1" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.0.0, semver@^7.3.8: - version "7.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -semver@^7.5.3, semver@^7.5.4: - version "7.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== - -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -send@^1.1.0, send@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/send/-/send-1.2.0.tgz#32a7554fb777b831dfa828370f773a3808d37212" - integrity sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw== - dependencies: - debug "^4.3.5" - encodeurl "^2.0.0" - escape-html "^1.0.3" - etag "^1.8.1" - fresh "^2.0.0" - http-errors "^2.0.0" - mime-types "^3.0.1" - ms "^2.1.3" - on-finished "^2.4.1" - range-parser "^1.2.1" - statuses "^2.0.1" - -seq-queue@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/seq-queue/-/seq-queue-0.0.5.tgz#d56812e1c017a6e4e7c3e3a37a1da6d78dd3c93e" - integrity sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q== - -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.0" - -serve-static@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-2.2.0.tgz#9c02564ee259bdd2251b82d659a2e7e1938d66f9" - integrity sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ== - dependencies: - encodeurl "^2.0.0" - escape-html "^1.0.3" - parseurl "^1.3.3" - send "^1.2.0" - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -set-proto@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" - integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== - dependencies: - dunder-proto "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.8.1: - version "1.8.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" - integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== - -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - 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" - -side-channel@^1.0.6, side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - 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" - -signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-update-notifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" - integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== - dependencies: - semver "^7.5.3" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-support@0.5.13: - version "0.5.13" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" - integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sqlstring@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" - integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -standard-engine@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/standard-engine/-/standard-engine-15.1.0.tgz#717409a002edd13cd57f6554fdd3464d9a22a774" - integrity sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw== - dependencies: - get-stdin "^8.0.0" - minimist "^1.2.6" - pkg-conf "^3.1.0" - xdg-basedir "^4.0.0" - -standard@^17.1.2: - version "17.1.2" - resolved "https://registry.yarnpkg.com/standard/-/standard-17.1.2.tgz#fc7e365e401569fee2a840d2a3862d218ef78092" - integrity sha512-WLm12WoXveKkvnPnPnaFUUHuOB2cUdAsJ4AiGHL2G0UNMrcRAWY2WriQaV8IQ3oRmYr0AWUbLNr94ekYFAHOrA== - dependencies: - eslint "^8.41.0" - eslint-config-standard "17.1.0" - eslint-config-standard-jsx "^11.0.0" - eslint-plugin-import "^2.27.5" - eslint-plugin-n "^15.7.0" - eslint-plugin-promise "^6.1.1" - eslint-plugin-react "^7.36.1" - standard-engine "^15.1.0" - version-guard "^1.1.1" - -statuses@2.0.1, statuses@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -stop-iteration-iterator@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" - integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== - dependencies: - es-errors "^1.3.0" - internal-slot "^1.1.0" - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.matchall@^4.0.12: - version "4.0.12" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" - integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-abstract "^1.23.6" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.6" - gopd "^1.2.0" - has-symbols "^1.1.0" - internal-slot "^1.1.0" - regexp.prototype.flags "^1.5.3" - set-function-name "^2.0.2" - side-channel "^1.1.0" - -string.prototype.repeat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" - integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.trim@^1.2.10: - version "1.2.10" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" - integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-data-property "^1.1.4" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-object-atoms "^1.0.0" - has-property-descriptors "^1.0.2" - -string.prototype.trimend@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" - integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0, supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -swagger-jsdoc@^6.2.8: - version "6.2.8" - resolved "https://registry.yarnpkg.com/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz#6d33d9fb07ff4a7c1564379c52c08989ec7d0256" - integrity sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ== - dependencies: - commander "6.2.0" - doctrine "3.0.0" - glob "7.1.6" - lodash.mergewith "^4.6.2" - swagger-parser "^10.0.3" - yaml "2.0.0-1" - -swagger-parser@^10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-10.0.3.tgz#04cb01c18c3ac192b41161c77f81e79309135d03" - integrity sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg== - dependencies: - "@apidevtools/swagger-parser" "10.0.3" - -swagger-themes@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/swagger-themes/-/swagger-themes-1.4.3.tgz#b2a0abddffe9a41ccc7e40f0cf9ea8a4b1b50a48" - integrity sha512-1G0CqJC1IBbNxkAOyJoREd9hfwXH1R6+3GOFxLhQho2w2i+AbaJqkF4mTJhkce4yhaEMUXvv4KKu1YO/qpe6nQ== - -swagger-ui-dist@>=5.0.0: - version "5.21.0" - resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-5.21.0.tgz#aed230fe6e294c9470217e67697d601e3bb8eb9d" - integrity sha512-E0K3AB6HvQd8yQNSMR7eE5bk+323AUxjtCz/4ZNKiahOlPhPJxqn3UPIGs00cyY/dhrTDJ61L7C/a8u6zhGrZg== - dependencies: - "@scarf/scarf" "=1.4.0" - -swagger-ui-express@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz#fb8c1b781d2793a6bd2f8a205a3f4bd6fa020dd8" - integrity sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA== - dependencies: - swagger-ui-dist ">=5.0.0" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -topo@3.x.x: - version "3.0.3" - resolved "https://registry.yarnpkg.com/topo/-/topo-3.0.3.tgz#d5a67fb2e69307ebeeb08402ec2a2a6f5f7ad95c" - integrity sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ== - dependencies: - hoek "6.x.x" - -touch@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.1.tgz#097a23d7b161476435e5c1344a95c0f75b4a5694" - integrity sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.1.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== - -type-is@^2.0.0, type-is@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" - integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== - dependencies: - content-type "^1.0.5" - media-typer "^1.1.0" - mime-types "^3.0.0" - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" - -typed-array-byte-length@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" - integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== - dependencies: - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.14" - -typed-array-byte-offset@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" - integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.15" - reflect.getprototypeof "^1.0.9" - -typed-array-length@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" - integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - reflect.getprototypeof "^1.0.6" - -unbox-primitive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" - integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== - dependencies: - call-bound "^1.0.3" - has-bigints "^1.0.2" - has-symbols "^1.1.0" - which-boxed-primitive "^1.1.1" - -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -undici-types@~6.21.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" - integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -v8-to-istanbul@^9.0.1: - version "9.3.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" - integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.12" - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^2.0.0" - -validator@^13.7.0: - version "13.15.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-13.15.0.tgz#2dc7ce057e7513a55585109eec29b2c8e8c1aefd" - integrity sha512-36B2ryl4+oL5QxZ3AzD0t5SsMNGvTtQHpjgFO5tbNxfXbMFkY822ktCDe1MnlqV3301QQI9SLHDNJokDI+Z9pA== - -vary@^1, vary@^1.1.2, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -version-guard@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/version-guard/-/version-guard-1.1.3.tgz#5a39b9d195f94cb10d469553aa9951e1917da5d2" - integrity sha512-JwPr6erhX53EWH/HCSzfy1tTFrtPXUe927wdM1jqBBeYp1OM+qPHjWbsvv6pIBduqdgxxS+ScfG7S28pzyr2DQ== - -walker@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" - integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== - dependencies: - is-bigint "^1.1.0" - is-boolean-object "^1.2.1" - is-number-object "^1.1.1" - is-string "^1.1.1" - is-symbol "^1.1.1" - -which-builtin-type@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" - integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== - dependencies: - call-bound "^1.0.2" - function.prototype.name "^1.1.6" - has-tostringtag "^1.0.2" - is-async-function "^2.0.0" - is-date-object "^1.1.0" - is-finalizationregistry "^1.1.0" - is-generator-function "^1.0.10" - is-regex "^1.2.1" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.1.0" - which-collection "^1.0.2" - which-typed-array "^1.1.16" - -which-collection@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.16, which-typed-array@^1.1.19: - version "1.1.19" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" - integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yaml@2.0.0-1: - version "2.0.0-1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.0.0-1.tgz#8c3029b3ee2028306d5bcf396980623115ff8d18" - integrity sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.3.1, yargs@^17.7.2: - version "17.7.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - 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" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yoctocolors-cjs@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" - integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== - -z-schema@^5.0.1: - version "5.0.6" - resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-5.0.6.tgz#46d6a687b15e4a4369e18d6cb1c7b8618fc256c5" - integrity sha512-+XR1GhnWklYdfr8YaZv/iu+vY+ux7V5DS5zH1DQf6bO5ufrt/5cgNhVO5qyhsjFXvsqQb/f08DWE9b6uPscyAg== - dependencies: - lodash.get "^4.4.2" - lodash.isequal "^4.5.0" - validator "^13.7.0" - optionalDependencies: - commander "^10.0.0" - -zod-to-json-schema@^3.24.1: - version "3.24.5" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3" - integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g== - -zod@^3.23.8, zod@^3.24.2: - version "3.24.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.4.tgz#e2e2cca5faaa012d76e527d0d36622e0a90c315f" - integrity sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg== From 2576d1415a72a6c26c0eb1f4e1e6340d63fe3a58 Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Mon, 7 Jul 2025 04:17:40 -0600 Subject: [PATCH 02/20] ci(overrides): Dependency review y Node.js CI Build correcion --- .github/workflows/node.js.yml | 14 ++++++++++---- package.json | 5 +++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 2898e1c..d396057 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: node-version: [22.x] - # Puedes agregar más versiones si quieres testear compatibilidad, por ejemplo: [18.x, 20.x, 22.x] + # Agrega más versiones si deseas: [18.x, 20.x, 22.x] steps: - name: 🔄 Checkout del código @@ -27,9 +27,15 @@ jobs: node-version: ${{ matrix.node-version }} cache: "pnpm" + - name: 💿 Instalar pnpm + run: npm install -g pnpm + - name: 📦 Instalar dependencias run: pnpm install - - name: 🚀 Iniciar aplicación en background (opcional) - run: pnpm start & - # Usa esto solo si necesitas levantar el servidor para tests e2e, de lo contrario, puedes omitirlo + # 🔽 Descomenta este paso solo si necesitas levantar el servidor antes de correr tests + # - name: 🚀 Iniciar aplicación en background (opcional) + # run: pnpm start & + + - name: ✅ Ejecutar pruebas + run: pnpm test diff --git a/package.json b/package.json index 3206e16..43b949a 100644 --- a/package.json +++ b/package.json @@ -59,5 +59,10 @@ "jest": "^29.7.0", "nodemon": "^3.1.10", "prettier": "^3.5.3" + }, + "pnpm": { + "overrides": { + "hoek": "^6.1.3" + } } } From a37e0bf082b7f81d88adfd52bbe06ac588d3aecb Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Mon, 7 Jul 2025 04:20:49 -0600 Subject: [PATCH 03/20] ci(delete): Eliminacion de workflows, para las dependecy reviews y Node CI --- .github/workflows/dependency-review.yml | 39 ----------------------- .github/workflows/node.js.yml | 41 ------------------------- 2 files changed, 80 deletions(-) delete mode 100644 .github/workflows/dependency-review.yml delete mode 100644 .github/workflows/node.js.yml diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml deleted file mode 100644 index 9214f0e..0000000 --- a/.github/workflows/dependency-review.yml +++ /dev/null @@ -1,39 +0,0 @@ -# Dependency Review Action -# -# This Action will scan dependency manifest files that change as part of a Pull Request, -# surfacing known-vulnerable versions of the packages declared or updated in the PR. -# Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable -# packages will be blocked from merging. -# -# Source repository: https://github.com/actions/dependency-review-action -# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement -name: "Dependency review" -on: - pull_request: - branches: ["main", "dev"] - -# If using a dependency submission action in this workflow this permission will need to be set to: -# -# permissions: -# contents: write -# -# https://docs.github.com/en/enterprise-cloud@latest/code-security/supply-chain-security/understanding-your-software-supply-chain/using-the-dependency-submission-api -permissions: - contents: read - # Write permissions for pull-requests are required for using the `comment-summary-in-pr` option, comment out if you aren't using this option - pull-requests: write - -jobs: - dependency-review: - runs-on: ubuntu-latest - steps: - - name: "Checkout repository" - uses: actions/checkout@v4 - - name: "Dependency Review" - uses: actions/dependency-review-action@v4 - # Commonly enabled options, see https://github.com/actions/dependency-review-action#configuration-options for all available options. - with: - comment-summary-in-pr: always - # fail-on-severity: moderate - # deny-licenses: GPL-1.0-or-later, LGPL-2.0-or-later - # retry-on-snapshot-warnings: true diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml deleted file mode 100644 index d396057..0000000 --- a/.github/workflows/node.js.yml +++ /dev/null @@ -1,41 +0,0 @@ -# .github/workflows/nodejs.yml - -name: Node.js CI - -on: - push: - branches: ["main"] - pull_request: - branches: ["main", "dev"] - -jobs: - build: - runs-on: ubuntu-latest - - strategy: - matrix: - node-version: [22.x] - # Agrega más versiones si deseas: [18.x, 20.x, 22.x] - - steps: - - name: 🔄 Checkout del código - uses: actions/checkout@v4 - - - name: 🟢 Usar Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v4 - with: - node-version: ${{ matrix.node-version }} - cache: "pnpm" - - - name: 💿 Instalar pnpm - run: npm install -g pnpm - - - name: 📦 Instalar dependencias - run: pnpm install - - # 🔽 Descomenta este paso solo si necesitas levantar el servidor antes de correr tests - # - name: 🚀 Iniciar aplicación en background (opcional) - # run: pnpm start & - - - name: ✅ Ejecutar pruebas - run: pnpm test From 168a31d3fba962eaa0e3ecc0f46b4b5042bedb48 Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Tue, 8 Jul 2025 04:46:24 -0600 Subject: [PATCH 04/20] refactor(assets): Se organiza mejor la logica de los endpoints de el catalogo de activos --- .../assets/functions/assets.controllers.js | 44 +++ src/controllers/assets/index.js | 2 + src/controllers/catAssetsControllers.js | 182 --------- src/helpers/rateLimit/assets.rateLimit.js | 46 +++ .../users.rateLimit.js} | 0 src/middleware/errorHandler.middleware.js | 1 - src/middleware/rateLimitRequest.middleware.js | 2 +- src/models/assets/functions/delete.models.js | 12 + src/models/assets/functions/insert.models.js | 26 ++ src/models/assets/functions/list.models.js | 6 + src/models/assets/functions/update.models.js | 31 ++ src/models/assets/functions/vault.models.js | 7 + src/models/assets/index.js | 6 + src/routes/catAssets.routes.js | 374 ++++++++++++++++++ src/routes/catAssetsRouter.js | 340 ---------------- src/routes/index.js | 3 +- src/routes/users.routes.js | 2 +- src/server/serverMethods.js | 10 +- .../assets/functions/delete.services.js | 59 +++ .../assets/functions/insert.services.js | 33 ++ .../assets/functions/list.services.js | 54 +++ .../assets/functions/search.services.js | 31 ++ .../assets/functions/update.services.js | 5 + .../assets/functions/vault.services.js | 5 + src/services/assets/index.js | 7 + 25 files changed, 758 insertions(+), 530 deletions(-) create mode 100644 src/controllers/assets/functions/assets.controllers.js create mode 100644 src/controllers/assets/index.js delete mode 100644 src/controllers/catAssetsControllers.js create mode 100644 src/helpers/rateLimit/assets.rateLimit.js rename src/helpers/{usersHelpers/rateLimitRequestUsers.js => rateLimit/users.rateLimit.js} (100%) create mode 100644 src/models/assets/functions/delete.models.js create mode 100644 src/models/assets/functions/insert.models.js create mode 100644 src/models/assets/functions/list.models.js create mode 100644 src/models/assets/functions/update.models.js create mode 100644 src/models/assets/functions/vault.models.js create mode 100644 src/models/assets/index.js create mode 100644 src/routes/catAssets.routes.js delete mode 100644 src/routes/catAssetsRouter.js create mode 100644 src/services/assets/functions/delete.services.js create mode 100644 src/services/assets/functions/insert.services.js create mode 100644 src/services/assets/functions/list.services.js create mode 100644 src/services/assets/functions/search.services.js create mode 100644 src/services/assets/functions/update.services.js create mode 100644 src/services/assets/functions/vault.services.js create mode 100644 src/services/assets/index.js diff --git a/src/controllers/assets/functions/assets.controllers.js b/src/controllers/assets/functions/assets.controllers.js new file mode 100644 index 0000000..5a55608 --- /dev/null +++ b/src/controllers/assets/functions/assets.controllers.js @@ -0,0 +1,44 @@ +import { + deleteAssetService, + deleteAssetsBulkService, + insertAssetsService, + listAssetsService, + moveVaultAssetService, + searchAssetsService, + updateAssetsService, +} from "../../../services/assets/index.js"; + +export const GetAllAssets = async (listAssets) => { + const listGetAllAssets = await listAssetsService(listAssets); + return listGetAllAssets; +}; + +export const SearchOfAssets = async (name) => { + const searchOfAssets = await searchAssetsService(name); + return searchOfAssets; +}; + +export const InsertAssets = async (user) => { + const insertAssets = await insertAssetsService(user); + return insertAssets; +}; + +export const UpdateAssets = async (assetsId, assetsData) => { + const updateAssets = await updateAssetsService(assetsId, assetsData); + return updateAssets; +}; + +export const MoveToVaultAssetDeleted = async (assetId) => { + const moveVaultAsset = await moveVaultAssetService(assetId); + return moveVaultAsset; +}; + +export const DeleteAsset = async (assetId) => { + const deleteAsset = await deleteAssetService(assetId); + return deleteAsset; +}; + +export const DeleteAssetsBulk = async (ids) => { + const deleteAssetsBulk = await deleteAssetsBulkService(ids); + return deleteAssetsBulk; +}; diff --git a/src/controllers/assets/index.js b/src/controllers/assets/index.js new file mode 100644 index 0000000..9ca2939 --- /dev/null +++ b/src/controllers/assets/index.js @@ -0,0 +1,2 @@ +export * from "./functions/assets.controllers.js"; +export * from "./index.js"; diff --git a/src/controllers/catAssetsControllers.js b/src/controllers/catAssetsControllers.js deleted file mode 100644 index e3e1ae9..0000000 --- a/src/controllers/catAssetsControllers.js +++ /dev/null @@ -1,182 +0,0 @@ -import { connectionQuery } from "../helpers/connection.helpers.js"; -import { - methodCreated, - methodError, - methodIncorrect, - methodNotFound, - methodOK, -} from "../server/serverMethods.js"; - -const ObtenerTodosLosActivos = async (req, res) => { - try { - const result = await connectionQuery( - `SELECT * FROM catassets WHERE Status = "Activo"`, - ); - - if (result.length === 0) return methodNotFound(req, res); - - methodOK(req, res, result); - } catch (error) { - methodError(req, res, error); - } -}; - -const ObtenerTodosLosActivosDesuso = async (req, res) => { - try { - const result = await connectionQuery( - `SELECT * FROM catassets WHERE Status = "Inactivo"`, - ); - - if (result.length === 0) return methodNotFound(req, res); - - methodOK(req, res, result); - } catch (error) { - methodError(req, res, error); - } -}; - -const InsertarActivo = async (req, res) => { - try { - const { - name, - description, - purchaseDate, - cost, - location, - condition, - lastMaintenanceDate, - warrantyEndDate, - } = req.body; - - if ( - !name || - !description || - !purchaseDate || - !cost || - !location || - !condition || - !lastMaintenanceDate || - !warrantyEndDate - ) { - return methodIncorrect(req, res); - } - - const queryInsert = `INSERT INTO catassets(ID, Name, Description, PurchaseDate, Cost, Location, \`Condition\`, LastMaintenanceDate, WarrantyEndDate) - VALUES (UUID(), ?, ?, ?, ?, ?, ?, ?, ?);`; - - const queryParamsInsert = [ - name, - description, - purchaseDate, - cost, - location, - condition, - lastMaintenanceDate, - warrantyEndDate, - ]; - - const result = await connectionQuery(queryInsert, queryParamsInsert); - - if (result.affectedRows > 0) - return methodCreated(req, res, queryParamsInsert); - } catch (error) { - methodError(req, res, error); - } -}; - -const EditarActivo = async (req, res) => { - try { - const { - name, - description, - purchaseDate, - cost, - location, - condition, - status, - lastMaintenanceDate, - warrantyEndDate, - id, - } = req.body; - - const queryUpdate = `UPDATE catassets SET Name = ?, Description = ?, PurchaseDate = ?, Cost = ?, Location = ?, \`Condition\` = ?, Status = ?, LastMaintenanceDate = ?, WarrantyEndDate = ? WHERE ID = ?`; - const queryUpdateParams = [ - name, - description, - purchaseDate, - cost, - location, - condition, - status, - lastMaintenanceDate, - warrantyEndDate, - id, - ]; - - const result = await connectionQuery(queryUpdate, queryUpdateParams); - - if (result.affectedRows > 0) { - methodOK(req, res, { - message: "El recurso fue actualizado correctamente.", - }); - } else { - methodNotFound(req, res, { - message: "No se encontró el recurso para actualizar.", - }); - } - } catch (error) { - methodError(req, res, error); - } -}; - -const MoverABovedaEliminados = async (req, res) => { - try { - const { id } = req.params; - - if (!id) return methodIncorrect(req, res); - - const queryDelete = `UPDATE catassets SET Status = 'Inactivo' WHERE ID = ?`; - const queryParamsDelete = [id]; - const result = await connectionQuery(queryDelete, queryParamsDelete); - - if (result.affectedRows > 0) { - methodOK(req, res, { - message: "El recurso fue mandado a la boveda correctamente.", - }); - } else { - methodNotFound(req, res); - } - } catch (error) { - methodError(req, res, error); - } -}; - -const EliminarActivo = async (req, res) => { - try { - const { id } = req.params; - - if (!id) return methodIncorrect(req, res); - - const queryDeleteSupplier = `DELETE FROM catassets WHERE ID = ?`; - const result = await connectionQuery(queryDeleteSupplier, [id]); - - if (result.affectedRows > 0) { - methodOK(req, res, { - message: "El recurso fue eliminado correctamente.", - }); - } else { - methodNotFound(req, res); - } - } catch (error) { - methodError(req, res, error); - } -}; - -export default { - ObtenerTodosLosActivos, - ObtenerTodosLosActivosDesuso, - InsertarActivo, - EditarActivo, - MoverABovedaEliminados, - EliminarActivo, -}; diff --git a/src/helpers/rateLimit/assets.rateLimit.js b/src/helpers/rateLimit/assets.rateLimit.js new file mode 100644 index 0000000..5a21c04 --- /dev/null +++ b/src/helpers/rateLimit/assets.rateLimit.js @@ -0,0 +1,46 @@ +import { rateLimitRequest } from "../../middleware/rateLimitRequest.middleware.js"; + +// Example +// rateLimitRequest(time to try again, limit each IP request per windows, messageRequest response) + +export const listAssetsRateLimiter = rateLimitRequest( + 60, + 1000, + "Demasiadas peticiones para traer la lista de activos,", +); + +export const searchAssetsRateLimiter = rateLimitRequest( + 15, + 300, + "Demasiadas búsquedas de activos desde esta IP, ", +); + +export const createAssetsRateLimiter = rateLimitRequest( + 60, + 50, + "Límite de creación de activos alcanzado, ", +); + +export const updateAssetsRateLimiter = rateLimitRequest( + 60, + 100, + "Demasiadas actualizaciones de activos desde esta IP, ", +); + +export const moveToVaultAssetDeletedRateLimit = rateLimitRequest( + 60, + 100, + "Demasiadas peticiones para el envio a la boveda, ", +); + +export const deleteAssetsRateLimiter = rateLimitRequest( + 60, + 50, + "Límite de eliminación de activos alcanzado, ", +); + +export const bulkDeleteAssetsRateLimiter = rateLimitRequest( + 60, + 10, + "Demasiadas eliminaciones masivas en corto tiempo, ", +); diff --git a/src/helpers/usersHelpers/rateLimitRequestUsers.js b/src/helpers/rateLimit/users.rateLimit.js similarity index 100% rename from src/helpers/usersHelpers/rateLimitRequestUsers.js rename to src/helpers/rateLimit/users.rateLimit.js diff --git a/src/middleware/errorHandler.middleware.js b/src/middleware/errorHandler.middleware.js index 8cdb7f1..971deba 100644 --- a/src/middleware/errorHandler.middleware.js +++ b/src/middleware/errorHandler.middleware.js @@ -4,7 +4,6 @@ export const errorHandler = (err, request, response, next) => { const status = err.statusCode || 500; const timestamp = new Date().toISOString(); const errorId = crypto.randomUUID(); - console.log(request); response.status(status).json({ success: false, error: { diff --git a/src/middleware/rateLimitRequest.middleware.js b/src/middleware/rateLimitRequest.middleware.js index 03c84aa..cf3d7e6 100644 --- a/src/middleware/rateLimitRequest.middleware.js +++ b/src/middleware/rateLimitRequest.middleware.js @@ -8,7 +8,7 @@ export const rateLimitRequest = (time, limit, messageRequest) => { handler: (request, response, next) => { next({ statusCode: 429, - message: `${messageRequest}. Inténtelo nuevamente después de ${time} minuto(s).`, + message: `${messageRequest} Inténtelo nuevamente después de ${time} minuto(s).`, code: "TOO_MANY_REQUESTS", details: "Has excedido el número máximo de solicitudes permitidas.", }); diff --git a/src/models/assets/functions/delete.models.js b/src/models/assets/functions/delete.models.js new file mode 100644 index 0000000..03763cf --- /dev/null +++ b/src/models/assets/functions/delete.models.js @@ -0,0 +1,12 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const deleteAssetModel = async (assetId) => { + const query = `DELETE FROM catassets WHERE ID = ?`; + const params = [assetId]; + return await connectionQuery(query, params); +}; + +export const deleteAssetBulk = async (placeholders, batch) => { + const query = `DELETE FROM catassets WHERE ID IN (${placeholders})`; + return await connectionQuery(query, batch); +}; diff --git a/src/models/assets/functions/insert.models.js b/src/models/assets/functions/insert.models.js new file mode 100644 index 0000000..02725e9 --- /dev/null +++ b/src/models/assets/functions/insert.models.js @@ -0,0 +1,26 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const insertAssetsModel = async ({ + name, + description, + purchaseDate, + cost, + location, + condition, + lastMaintenanceDate, + warrantyEndDate, +}) => { + const query = `INSERT INTO catassets(ID, Name, Description, PurchaseDate, Cost, Location, \`Condition\`, LastMaintenanceDate, WarrantyEndDate) + VALUES (UUID(), ?, ?, ?, ?, ?, ?, ?, ?);`; + const params = [ + name, + description, + purchaseDate, + cost, + location, + condition, + lastMaintenanceDate, + warrantyEndDate, + ]; + return await connectionQuery(query, params); +}; diff --git a/src/models/assets/functions/list.models.js b/src/models/assets/functions/list.models.js new file mode 100644 index 0000000..840efa8 --- /dev/null +++ b/src/models/assets/functions/list.models.js @@ -0,0 +1,6 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const listAssetsModel = async (query, params) => { + const result = await connectionQuery(query, params); + return result; +}; diff --git a/src/models/assets/functions/update.models.js b/src/models/assets/functions/update.models.js new file mode 100644 index 0000000..7e31294 --- /dev/null +++ b/src/models/assets/functions/update.models.js @@ -0,0 +1,31 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const updateAssetsModel = async ( + assetsId, + { + name, + description, + purchaseDate, + cost, + location, + condition, + status, + lastMaintenanceDate, + warrantyEndDate, + }, +) => { + const query = `UPDATE catassets SET Name = ?, Description = ?, PurchaseDate = ?, Cost = ?, Location = ?, \`Condition\` = ?, Status = ?, LastMaintenanceDate = ?, WarrantyEndDate = ? WHERE ID = ?`; + const params = [ + name, + description, + purchaseDate, + cost, + location, + condition, + status, + lastMaintenanceDate, + warrantyEndDate, + assetsId, + ]; + return await connectionQuery(query, params); +}; diff --git a/src/models/assets/functions/vault.models.js b/src/models/assets/functions/vault.models.js new file mode 100644 index 0000000..5ee7ed0 --- /dev/null +++ b/src/models/assets/functions/vault.models.js @@ -0,0 +1,7 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const vaultAssetsModel = async (assetId) => { + const query = `UPDATE catassets SET Status = 'Inactivo' WHERE ID = ?`; + const params = [assetId]; + await connectionQuery(query, params); +}; diff --git a/src/models/assets/index.js b/src/models/assets/index.js new file mode 100644 index 0000000..421b316 --- /dev/null +++ b/src/models/assets/index.js @@ -0,0 +1,6 @@ +export * from "./functions/delete.models.js"; +export * from "./functions/insert.models.js"; +export * from "./functions/list.models.js"; +export * from "./functions/update.models.js"; +export * from "./functions/vault.models.js"; +export * from "./index.js"; diff --git a/src/routes/catAssets.routes.js b/src/routes/catAssets.routes.js new file mode 100644 index 0000000..2ba0356 --- /dev/null +++ b/src/routes/catAssets.routes.js @@ -0,0 +1,374 @@ +import express from "express"; + +import { + DeleteAsset, + DeleteAssetsBulk, + GetAllAssets, + InsertAssets, + MoveToVaultAssetDeleted, + SearchOfAssets, + UpdateAssets, +} from "../controllers/assets/index.js"; +import { + bulkDeleteAssetsRateLimiter, + createAssetsRateLimiter, + deleteAssetsRateLimiter, + listAssetsRateLimiter, + moveToVaultAssetDeletedRateLimit, + searchAssetsRateLimiter, + updateAssetsRateLimiter, +} from "../helpers/rateLimit/assets.rateLimit.js"; +import { verificarToken } from "../middleware/verificarToken.middleware.js"; +import { methodCreated, methodOK } from "../server/serverMethods.js"; + +const apiCatAssets = express.Router(); + +/** + * @swagger + * /assets?: + * get: + * summary: Obtener todos los activos según filtros opcionales + * description: Retorna una lista de activos filtrados por costo, límite de costo, ubicación, condición y estatus. Si algún filtro tiene el valor "All", no se aplica. + * tags: + * - Catálogo Activos + * security: + * - BearerAuth: [] + * parameters: + * - in: query + * name: cost + * required: false + * schema: + * type: number + * example: 950.00 + * description: Costo mínimo del activo o costo exacto si no se proporciona `limitCost` + * - in: query + * name: limitCost + * required: false + * schema: + * type: number + * example: 6000 + * description: Costo máximo del activo (usado junto con `cost` para un rango) + * - in: query + * name: location + * required: false + * schema: + * type: string + * example: Aula 4 + * description: Ubicación del activo (ej. "Aula 4", "Laboratorio") + * - in: query + * name: condition + * required: false + * schema: + * type: string + * example: Regular + * description: Condición del activo (ej. "Nuevo", "Regular", "Dañado") + * - in: query + * name: status + * required: false + * schema: + * type: string + * example: Activo + * description: Estado del activo (ej. "Activo", "Inactivo", "All") + * responses: + * 200: + * description: Lista de activos encontrada exitosamente + * content: + * application/json: + * schema: + * type: object + * properties: + * success: + * type: boolean + * example: true + * data: + * type: array + * items: + * type: object + * properties: + * ID: + * type: string + * format: uuid + * Name: + * type: string + * Description: + * type: string + * PurchaseDate: + * type: string + * format: date-time + * Cost: + * type: string + * example: "950.00" + * Location: + * type: string + * Condition: + * type: string + * Status: + * type: string + * LastMaintenanceDate: + * type: string + * format: date-time + * WarrantyEndDate: + * type: string + * format: date-time + * Created: + * type: string + * format: date-time + * Updated: + * type: string + * format: date-time + * message: + * type: string + * example: Consulta realizada correctamente + * metadata: + * type: object + * properties: + * timestamp: + * type: string + * format: date-time + * requestId: + * type: string + * format: uuid + * dataCount: + * type: string + * example: "1" + * 404: + * description: No se encontraron activos con los filtros proporcionados + * 500: + * description: Error interno del servidor + */ + +// GET /api/assets/list_of_assets +apiCatAssets.get( + "/", + verificarToken, + listAssetsRateLimiter, + async (request, response, next) => { + try { + const listAssets = request.query; + const result = await GetAllAssets(listAssets); + methodOK(request, response, result); + } catch (error) { + next(error); + } + }, +); + +/** + * @swagger + * /assets/search?: + * get: + * summary: Buscar un activo por su nombre + * description: Retorna la información de uno o varios activos que coincidan parcialmente con el nombre proporcionado. + * tags: + * - Catálogo Activos + * security: + * - BearerAuth: [] + * parameters: + * - in: query + * name: name + * required: true + * schema: + * type: string + * example: Comoda + * description: Nombre (o parte del nombre) del activo a buscar + * responses: + * 200: + * description: Busqueda realizada correctamente + * content: + * application/json: + * schema: + * type: object + * properties: + * success: + * type: boolean + * example: true + * message: + * type: string + * example: Busqueda realizada correctamente + * data: + * type: array + * items: + * type: object + * properties: + * ID: + * type: string + * format: uuid + * example: 11d1b03c-5bbb-11f0-ac03-d843ae0db894 + * Name: + * type: string + * example: Comoda + * Description: + * type: string + * example: Comoda de madera de tres cajones + * PurchaseDate: + * type: string + * format: date-time + * example: 2024-05-10T06:00:00.000Z + * Cost: + * type: string + * example: "50.00" + * Location: + * type: string + * example: Aula 1 + * Condition: + * type: string + * example: Bueno + * Status: + * type: string + * example: Inactivo + * LastMaintenanceDate: + * type: string + * format: date-time + * example: 2024-07-10T06:00:00.000Z + * WarrantyEndDate: + * type: string + * format: date-time + * example: 2026-05-10T06:00:00.000Z + * Created: + * type: string + * format: date-time + * example: 2025-07-08T05:19:06.000Z + * Updated: + * type: string + * format: date-time + * example: 2025-07-08T08:47:13.000Z + * metadata: + * type: object + * properties: + * timestamp: + * type: string + * format: date-time + * requestId: + * type: string + * format: uuid + * dataCount: + * type: string + * example: "1" + * 400: + * description: Debe proporcionar un nombre del activo para buscar + * 404: + * description: No se encontró ningún activo con el nombre proporcionado + * 500: + * description: Error interno del servidor + */ + +// GET /api/assets/search +apiCatAssets.get( + "/search", + verificarToken, + searchAssetsRateLimiter, + async (request, response, next) => { + try { + const { name } = request.query; + const result = await SearchOfAssets(name); + methodOK(request, response, result, "Busqueda realizada correctamente"); + } catch (error) { + next(error); + } + }, +); + +// POST /api/assets/create +apiCatAssets.post( + "/", + verificarToken, + createAssetsRateLimiter, + async (request, response, next) => { + try { + const insertAssets = request.body; + const result = await InsertAssets(insertAssets); + methodCreated( + request, + response, + result, + "Se inserto correctamente el activo", + ); + } catch (error) { + next(error); + } + }, +); + +// PUT /api/assets/update/:id +apiCatAssets.put( + "/:id", + verificarToken, + updateAssetsRateLimiter, + async (request, response, next) => { + try { + const assetId = request.params.id; + const assetsData = request.body; + const result = await UpdateAssets(assetId, assetsData); + methodOK( + request, + response, + result, + "El activo se actualizo correctamente", + ); + } catch (error) { + next(error); + } + }, +); + +// PUT /api/assets/vault/:id +apiCatAssets.put( + "/vault/:id", + verificarToken, + moveToVaultAssetDeletedRateLimit, + async (request, response, next) => { + try { + const assetId = request.params.id; + const result = await MoveToVaultAssetDeleted(assetId); + methodOK( + request, + response, + result, + "El activo se mando a la boveda de eliminados", + ); + } catch (error) { + next(error); + } + }, +); + +//DELETE /api/assets/bulk-delete-assets +apiCatAssets.delete( + "/bulk", + verificarToken, + bulkDeleteAssetsRateLimiter, + async (request, response, next) => { + try { + const { ids } = request.body; + await DeleteAssetsBulk(ids); + methodOK(request, response, { + message: `Se eliminaron ${request.body.ids.length} activos correctamente`, + }); + } catch (error) { + next(error); + } + }, +); + +//DELETE /api/assets/delete/:id +apiCatAssets.delete( + "/:id", + verificarToken, + deleteAssetsRateLimiter, + async (request, response, next) => { + try { + const assetId = request.params.id; + const result = await DeleteAsset(assetId); + methodOK( + request, + response, + result, + "El activo fue eliminado correctamente", + ); + } catch (error) { + next(error); + } + }, +); + +export { apiCatAssets }; diff --git a/src/routes/catAssetsRouter.js b/src/routes/catAssetsRouter.js deleted file mode 100644 index 5f011a1..0000000 --- a/src/routes/catAssetsRouter.js +++ /dev/null @@ -1,340 +0,0 @@ -import express from "express"; - -import CatActivosControllers from "../controllers/catAssetsControllers.js"; -import { verificarToken } from "../middleware/verificarToken.middleware.js"; - -const apiCatActivos = express.Router(); - -/** - * @swagger - * /lista-activos: - * get: - * summary: Obtener activos activos - * description: Recupera una lista de todos los activos que están marcados como activos en la base de datos. - * tags: - * - Catálogo de Activos - * responses: - * 200: - * description: Lista de activos activos recuperada correctamente. - * content: - * application/json: - * schema: - * type: array - * items: - * type: object - * properties: - * id: - * type: integer - * description: ID del activo. - * name: - * type: string - * description: Nombre del activo. - * description: - * type: string - * description: Descripción del activo. - * purchaseDate: - * type: string - * format: date - * description: Fecha de compra del activo. - * cost: - * type: number - * description: Costo del activo. - * location: - * type: string - * description: Ubicación del activo. - * condition: - * type: string - * description: Condición del activo. - * status: - * type: string - * description: Estado del activo. - * lastMaintenanceDate: - * type: string - * format: date - * description: Fecha de la última mantenimiento del activo. - * warrantyEndDate: - * type: string - * format: date - * description: Fecha de finalización de la garantía del activo. - * 404: - * description: No se encontraron activos activos. - * 500: - * description: Error interno del servidor. - */ -apiCatActivos.get( - "/lista-activos", - verificarToken, - CatActivosControllers.ObtenerTodosLosActivos, -); - -/** - * @swagger - * /lista-activos-desuso: - * get: - * summary: Obtener activos en desuso - * description: Recupera una lista de todos los activos que están marcados como inactivos en la base de datos. - * tags: - * - Catálogo de Activos - * responses: - * 200: - * description: Lista de activos inactivos recuperada correctamente. - * content: - * application/json: - * schema: - * type: array - * items: - * type: object - * properties: - * id: - * type: integer - * description: ID del activo. - * name: - * type: string - * description: Nombre del activo. - * description: - * type: string - * description: Descripción del activo. - * purchaseDate: - * type: string - * format: date - * description: Fecha de compra del activo. - * cost: - * type: number - * description: Costo del activo. - * location: - * type: string - * description: Ubicación del activo. - * condition: - * type: string - * description: Condición del activo. - * status: - * type: string - * description: Estado del activo. - * lastMaintenanceDate: - * type: string - * format: date - * description: Fecha de la última mantenimiento del activo. - * warrantyEndDate: - * type: string - * format: date - * description: Fecha de finalización de la garantía del activo. - * 404: - * description: No se encontraron activos en desuso. - * 500: - * description: Error interno del servidor. - */ - -apiCatActivos.get( - "/lista-activos-desuso", - verificarToken, - CatActivosControllers.ObtenerTodosLosActivosDesuso, -); - -/** - * @swagger - * /agregar-activo: - * post: - * summary: Agregar un nuevo activo - * description: Inserta un nuevo activo en la base de datos con la información proporcionada. - * tags: - * - Catálogo de Activos - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * name: - * type: string - * description: Nombre del activo. - * description: - * type: string - * description: Descripción del activo. - * purchaseDate: - * type: string - * format: date - * description: Fecha de compra del activo. - * cost: - * type: number - * description: Costo del activo. - * location: - * type: string - * description: Ubicación del activo. - * condition: - * type: string - * description: Condición del activo. - * lastMaintenanceDate: - * type: string - * format: date - * description: Fecha de la última mantenimiento del activo. - * warrantyEndDate: - * type: string - * format: date - * description: Fecha de finalización de la garantía del activo. - * responses: - * 201: - * description: El recurso fue creado correctamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: 'Activo agregado correctamente.' - * 400: - * description: Se produjo un error en la solicitud. Verifique que todos los campos sean válidos. - * 500: - * description: Error interno del servidor. - */ - -apiCatActivos.post( - "/agregar-activo", - verificarToken, - CatActivosControllers.InsertarActivo, -); - -/** - * @swagger - * /actualizar-activo: - * put: - * summary: Actualizar un activo - * description: Actualiza la información de un activo en la base de datos utilizando el ID y otros datos. - * tags: - * - Catálogo de Activos - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * name: - * type: string - * description: - * type: string - * purchaseDate: - * type: string - * format: date - * cost: - * type: number - * location: - * type: string - * condition: - * type: string - * status: - * type: string - * lastMaintenanceDate: - * type: string - * format: date - * warrantyEndDate: - * type: string - * format: date - * id: - * type: integer - * responses: - * 200: - * description: El recurso fue actualizado correctamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: 'El recurso fue actualizado correctamente.' - * 404: - * description: No se encontró el recurso para actualizar. - * 400: - * description: Se produjo un error en la solicitud. - * 500: - * description: Error interno del servidor. - */ - -apiCatActivos.put( - "/actualizar-activo", - verificarToken, - CatActivosControllers.EditarActivo, -); - -/** - * @swagger - * /borrar-activo-boveda/{id}: - * put: - * summary: Mover un activo a la bóveda de eliminados - * description: Actualiza el estado de un activo a 'Inactivo', moviéndolo a la bóveda de eliminados. - * tags: - * - Catálogo de Activos - * parameters: - * - name: id - * in: path - * required: true - * description: ID del activo que se desea mover a la bóveda de eliminados. - * schema: - * type: integer - * responses: - * 200: - * description: El recurso fue mandado a la boveda correctamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: 'El recurso fue mandado a la boveda correctamente.' - * 404: - * description: El activo no fue encontrado. - * 400: - * description: Se produjo un error en la solicitud. - * 500: - * description: Error interno del servidor. - */ - -apiCatActivos.put( - "/borrar-activo-boveda/:id", - verificarToken, - CatActivosControllers.MoverABovedaEliminados, -); - -/** - * @swagger - * /eliminar-activo/{id}: - * delete: - * summary: Eliminar un activo - * description: Elimina un activo de la base de datos utilizando su ID. - * tags: - * - Catálogo de Activos - * parameters: - * - name: id - * in: path - * required: true - * description: ID del activo que se desea eliminar. - * schema: - * type: integer - * responses: - * 200: - * description: El recurso fue eliminado correctamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: 'El recurso fue eliminado correctamente.' - * 404: - * description: El activo no fue encontrado. - * 400: - * description: Se produjo un error en la solicitud. - * 500: - * description: Error interno del servidor. - */ -apiCatActivos.delete( - "/eliminar-activo/:id", - verificarToken, - CatActivosControllers.EliminarActivo, -); - -export { apiCatActivos }; diff --git a/src/routes/index.js b/src/routes/index.js index 4071923..8b9dcf3 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -1,6 +1,6 @@ import express from "express"; -import { apiCatActivos } from "./catAssetsRouter.js"; +import { apiCatAssets } from "./catAssets.routes.js"; import { apiCatInventario } from "./catInventarioRouter.js"; import { apiCatInsumos } from "./catSuppliesRouter.js"; import { apiGoogle } from "./google.route.js"; @@ -25,5 +25,6 @@ const router = express.Router(); router.use("/api/v1/users", apiUsuarios, apiGoogle); router.use("/api/v1/token", apiToken); +router.use("/api/v1/assets", apiCatAssets); export { router }; diff --git a/src/routes/users.routes.js b/src/routes/users.routes.js index de920da..bfb6e89 100644 --- a/src/routes/users.routes.js +++ b/src/routes/users.routes.js @@ -20,7 +20,7 @@ import { registerUserRateLimiter, searchUsersRateLimiter, updateUserRateLimiter, -} from "../helpers/usersHelpers/rateLimitRequestUsers.js"; +} from "../helpers/rateLimit/users.rateLimit.js"; import { verificarToken } from "../middleware/verificarToken.middleware.js"; import { methodCreated, methodOK } from "../server/serverMethods.js"; diff --git a/src/server/serverMethods.js b/src/server/serverMethods.js index 393ceca..4ec43c4 100644 --- a/src/server/serverMethods.js +++ b/src/server/serverMethods.js @@ -1,6 +1,6 @@ import crypto from "node:crypto"; -export const methodOK = (request, response, result) => { +export const methodOK = (request, response, result, message) => { const timestamp = new Date().toISOString(); const requestId = crypto.randomUUID(); const totalDataCount = Array.isArray(result) ? result.length : result ? 1 : 0; @@ -9,7 +9,7 @@ export const methodOK = (request, response, result) => { response.status(200).json({ success: true, data: result || {}, - message: "Consulta realizada correctamente", + message: message || "Consulta realizada correctamente", metadata: { timestamp: timestamp, requestId: requestId, @@ -18,14 +18,14 @@ export const methodOK = (request, response, result) => { }); }; -export const methodCreated = (request, response, result) => { +export const methodCreated = (request, response, result, message) => { const timestamp = new Date().toISOString(); const requestId = crypto.randomUUID(); response.status(201).json({ success: true, data: result, - message: "Recurso creado exitosamente", + message: message || "Recurso creado exitosamente", metadata: { timestamp: timestamp, requestId: requestId, @@ -34,6 +34,8 @@ export const methodCreated = (request, response, result) => { }); }; +// De aqui para abajo se puede eliminar todos estos metodos + export const methodIncorrect = (request, response, message) => { const timestamp = new Date().toISOString(); const requestId = crypto.randomUUID(); diff --git a/src/services/assets/functions/delete.services.js b/src/services/assets/functions/delete.services.js new file mode 100644 index 0000000..ce7e9b0 --- /dev/null +++ b/src/services/assets/functions/delete.services.js @@ -0,0 +1,59 @@ +import { + deleteAssetBulk, + deleteAssetModel, +} from "../../../models/assets/index.js"; + +export const deleteAssetService = async (assetId) => { + if (!assetId) { + throw { + statusCode: 400, + message: "Debe de proporcionar todos los campos", + code: "FIELDS_REQUIRED", + details: "Todos los campos son obligatorios para eliminar un activo", + }; + } + + const result = await deleteAssetModel(assetId); + + if (result.affectedRows === 0) { + throw { + statusCode: 500, + message: "No se pudo eliminar el activo", + code: "ASSETS_DELETE_FAILED", + dettails: + "Hubo un error al intentar borrar el activo en la base de datos", + }; + } +}; + +export const deleteAssetsBulkService = async (ids) => { + const MAX_IDS = 600; + + if (!Array.isArray(ids) || ids.length === 0) { + throw { + status: 413, + message: `No se pueden eliminar más de ${MAX_IDS} activos en una sola solicitud`, + code: "OVERLOAD_REQUEST", + details: + "Debe proporcionar un array de IDs de activos menor para que la solicitud sea válida", + }; + } + + if (ids.length > MAX_IDS) { + throw { + statusCode: 400, + message: "Debe de proporcionar todos los campos", + code: "TOO_MANY_IDS", + details: "Todos los campos son obligatorios para eliminar un activo", + }; + } + + const batchSize = 100; + const totalBatches = Math.ceil(ids.length / batchSize); + + for (let i = 0; i < totalBatches; i++) { + const batch = ids.slice(i * batchSize, (i + 1) * batchSize); + const placeholders = batch.map(() => "?").join(","); + await deleteAssetBulk(placeholders, batch); + } +}; diff --git a/src/services/assets/functions/insert.services.js b/src/services/assets/functions/insert.services.js new file mode 100644 index 0000000..aeb4380 --- /dev/null +++ b/src/services/assets/functions/insert.services.js @@ -0,0 +1,33 @@ +import { insertAssetsModel } from "../../../models/assets/index.js"; + +export const insertAssetsService = async (user) => { + if ( + !user.name || + !user.description || + !user.purchaseDate || + !user.cost || + !user.location || + !user.condition || + !user.lastMaintenanceDate || + !user.warrantyEndDate + ) { + throw { + statusCode: 400, + message: "Debe de proporcionar todos los campos", + code: "FIELDS_REQUIRED", + details: "Todos los campos son obligatorios para crear un activo", + }; + } + + const result = await insertAssetsModel(user); + + if (!result.affectedRows > 0) { + throw { + statusCode: 500, + message: "No se pudo crear el activo", + code: "ASSETS_CREATION_FAILED", + dettails: + "Hubo un error al intentar insertar el activo en la base de datos", + }; + } +}; diff --git a/src/services/assets/functions/list.services.js b/src/services/assets/functions/list.services.js new file mode 100644 index 0000000..b141807 --- /dev/null +++ b/src/services/assets/functions/list.services.js @@ -0,0 +1,54 @@ +import { listAssetsModel } from "../../../models/assets/index.js"; + +export const listAssetsService = async ({ + cost, + limitCost, + location, + condition, + status, +}) => { + let where = "WHERE 1=1"; + const values = []; + + if (cost && cost !== "All" && !limitCost) { + where += " AND Cost = ?"; + values.push(cost); + } else if (cost && limitCost) { + where += " AND Cost BETWEEN ? AND ?"; + values.push(cost, limitCost); + } + + if (location && location !== "All") { + where += " AND Location = ?"; + values.push(location); + } + + if (condition && condition !== "All") { + where += " AND `Condition` = ?"; + values.push(condition); + } + + if (status && status !== "All") { + where += " AND Status = ?"; + values.push(status); + } + + const queryString = ` + SELECT * FROM catassets ${where} ORDER BY Name ASC + `; + + const resultList = await listAssetsModel(queryString, values); + + if (resultList.length === 0) { + throw { + statusCode: 404, + message: "No se encontraron activos con los filtros proporcionados", + code: "ASSETS_NOT_FOUND", + details: `No se encontraron activos con los filtros proporcionados: ${JSON.stringify( + { cost, limitCost, location, condition, status }, + )}`, + }; + } + + return resultList; +}; diff --git a/src/services/assets/functions/search.services.js b/src/services/assets/functions/search.services.js new file mode 100644 index 0000000..fb05c6c --- /dev/null +++ b/src/services/assets/functions/search.services.js @@ -0,0 +1,31 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const searchAssetsService = async (name) => { + let query = `SELECT * FROM catassets WHERE 1=1`; + const params = []; + + if (name) { + query += ` AND Name LIKE ?`; + params.push(`%${name}%`); + } else { + throw { + statusCode: 400, + message: "Debe proporcionar un nombre del activo para buscar", + code: "NAME_REQUIRED", + details: "El campo de nombre es obligatorio para realizar busquedas", + }; + } + + const result = await connectionQuery(query, params); + + if (result.length === 0) { + throw { + statusCode: 404, + message: `No se encontro el nombre ${name}`, + code: "ASSET_NOT_FOUND", + details: `No se encontraron activos con el nombre proporcionado: ${name}`, + }; + } + + return result; +}; diff --git a/src/services/assets/functions/update.services.js b/src/services/assets/functions/update.services.js new file mode 100644 index 0000000..0e65422 --- /dev/null +++ b/src/services/assets/functions/update.services.js @@ -0,0 +1,5 @@ +import { updateAssetsModel } from "../../../models/assets/index.js"; + +export const updateAssetsService = async (assetsId, assetsData) => { + await updateAssetsModel(assetsId, assetsData); +}; diff --git a/src/services/assets/functions/vault.services.js b/src/services/assets/functions/vault.services.js new file mode 100644 index 0000000..5348b63 --- /dev/null +++ b/src/services/assets/functions/vault.services.js @@ -0,0 +1,5 @@ +import { vaultAssetsModel } from "../../../models/assets/index.js"; + +export const moveVaultAssetService = async (assetId) => { + await vaultAssetsModel(assetId); +}; diff --git a/src/services/assets/index.js b/src/services/assets/index.js new file mode 100644 index 0000000..e21d6e3 --- /dev/null +++ b/src/services/assets/index.js @@ -0,0 +1,7 @@ +export * from "./functions/delete.services.js"; +export * from "./functions/insert.services.js"; +export * from "./functions/list.services.js"; +export * from "./functions/search.services.js"; +export * from "./functions/update.services.js"; +export * from "./functions/vault.services.js"; +export * from "./index.js"; From de0600ae2b5172155fa771c3a8d7fa412102953b Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Sat, 12 Jul 2025 01:27:34 -0600 Subject: [PATCH 05/20] refactor: Mejora en el endpint de catalogo de activos --- package.json | 3 +- pnpm-lock.yaml | 24 +- server.js | 13 +- src/config/swaggerConfig.js | 8 +- src/docs/index.yaml | 1900 +++++++++++++++++ src/helpers/rateLimit/assets.rateLimit.js | 92 +- src/middleware/rateLimitRequest.middleware.js | 41 +- src/routes/catAssets.routes.js | 370 +--- 8 files changed, 2072 insertions(+), 379 deletions(-) create mode 100644 src/docs/index.yaml diff --git a/package.json b/package.json index 43b949a..dddad90 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,8 @@ "standard": "^17.1.2", "swagger-jsdoc": "^6.2.8", "swagger-themes": "^1.4.3", - "swagger-ui-express": "^5.0.1" + "swagger-ui-express": "^5.0.1", + "yamljs": "^0.3.0" }, "devDependencies": { "@eslint/js": "^9.26.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0b84689..2279508 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + hoek: ^6.1.3 + importers: .: @@ -56,6 +59,9 @@ importers: swagger-ui-express: specifier: ^5.0.1 version: 5.0.1(express@4.21.2) + yamljs: + specifier: ^0.3.0 + version: 0.3.0 devDependencies: '@eslint/js': specifier: ^9.26.0 @@ -1445,11 +1451,6 @@ packages: resolution: {integrity: sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==} engines: {node: '>=18.0.0'} - hoek@5.0.4: - resolution: {integrity: sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==} - engines: {node: '>=8.9.0'} - deprecated: This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial). - hoek@6.1.3: resolution: {integrity: sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==} deprecated: This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues. @@ -2766,6 +2767,10 @@ packages: resolution: {integrity: sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==} engines: {node: '>= 6'} + yamljs@0.3.0: + resolution: {integrity: sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -4562,8 +4567,6 @@ snapshots: helmet@8.1.0: {} - hoek@5.0.4: {} - hoek@6.1.3: {} html-escaper@2.0.2: {} @@ -5119,7 +5122,7 @@ snapshots: joi@13.7.0: dependencies: - hoek: 5.0.4 + hoek: 6.1.3 isemail: 3.2.0 topo: 3.0.3 @@ -6133,6 +6136,11 @@ snapshots: yaml@2.0.0-1: {} + yamljs@0.3.0: + dependencies: + argparse: 1.0.10 + glob: 7.2.3 + yargs-parser@21.1.1: {} yargs@17.7.2: diff --git a/server.js b/server.js index b5e41a2..8ffbf9e 100644 --- a/server.js +++ b/server.js @@ -7,6 +7,10 @@ import { createServer } from "node:http"; import { setupSwagger } from "./src/config/swaggerConfig.js"; import { corsOptions } from "./src/middleware/cors.middleware.js"; import { errorHandler } from "./src/middleware/errorHandler.middleware.js"; +import { + burstProtectionLimiter, + normalLimiter, +} from "./src/middleware/rateLimitRequest.middleware.js"; import { router } from "./src/routes/index.js"; // Datos del proyecto @@ -23,14 +27,14 @@ const app = express(); // Configuracion de Swagger setupSwagger(app); -// Middleware +// ✅ 1. Middlewares básicos primero app.use(cors(corsOptions)); app.use(express.json({ limit: "10mb" })); app.use(express.urlencoded({ extended: true, limit: "10mb" })); app.use(morgan("dev")); app.use(helmet()); -// ✅ Ruta raíz: información del proyecto +// ✅ 2. Ruta raíz app.get("/", (request, response) => { response.status(200).json({ description: projectInfo.description, @@ -45,9 +49,10 @@ app.get("/", (request, response) => { }); }); -app.use(router); +// ✅ 3. Rutas de la API (ya con rate limiting aplicado) +app.use(burstProtectionLimiter, normalLimiter, router); -// ✅ Middleware global de errores profesional +// ✅ 4. Middleware de errores AL FINAL app.use(errorHandler); // Crear y arrancar el servidor diff --git a/src/config/swaggerConfig.js b/src/config/swaggerConfig.js index e0bc127..06a841b 100644 --- a/src/config/swaggerConfig.js +++ b/src/config/swaggerConfig.js @@ -4,6 +4,7 @@ import { fileURLToPath } from "node:url"; import swaggerJsdoc from "swagger-jsdoc"; import { SwaggerTheme, SwaggerThemeNameEnum } from "swagger-themes"; import swaggerUi from "swagger-ui-express"; +import YAML from "yamljs"; dotenv.config(); @@ -40,12 +41,7 @@ const swaggerDefinition = { ], }; -const options = { - swaggerDefinition, - apis: [resolve(__dirname, "../routes/*.js")], -}; - -export const swaggerDocument = swaggerJsdoc(options); +const swaggerDocument = YAML.load(resolve(__dirname, "../docs/index.yaml")); export const setupSwagger = (app) => { const theme = new SwaggerTheme(); diff --git a/src/docs/index.yaml b/src/docs/index.yaml new file mode 100644 index 0000000..4df9917 --- /dev/null +++ b/src/docs/index.yaml @@ -0,0 +1,1900 @@ +openapi: 3.0.0 +info: + title: API Gestion y Administracion de una escuela + description: >- + **AKT** es una plataforma CRM construida para administrar eficientemente la + información de un jardín de niños, incluyendo usuarios, maestros, padres, + alumnos, insumos y más. Esta solución cuenta con una robusta **API RESTful** + desarrollada en **Node.js**, conectada a una base de datos **MySQL**, y un + **frontend moderno en React** que facilita la gestión desde cualquier + navegador.EndFragment + version: 1.0.0 +servers: + - url: http://localhost:3000/api/v1 +components: + securitySchemes: + BearerAuth: + type: http + scheme: bearer + bearerFormat: JWT +security: + - BearerAuth: [] +tags: + - name: API Maestros + - name: API Usuarios + - name: API Padres + - name: Catálogo Inventario + - name: Catálogo Insumos + - name: Catálogo Activos + - name: API Estudiantes +paths: + /api/v1/lista-de-maestros: + get: + tags: + - API Maestros + summary: Traer lista de maestros + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/lista-de-maestros-eliminados: + get: + tags: + - API Maestros + summary: Traer maestros eliminados + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/buscar-maestro: + post: + tags: + - API Maestros + summary: Buscar maestro + requestBody: + content: + application/json: + schema: + type: object + example: + email: muke7881@gmail.com + firstName: '' + lastName: '' + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/agregar-maestro: + post: + tags: + - API Maestros + summary: Agregar maestro + requestBody: + content: + application/json: + schema: + type: object + example: + teacherID: bcd3df3c-8157-11ef-a62a-00e04c360195 + firstName: Erick Miguel + lastName: Gonzalez Rivera + dateOfBirth: '2000-12-29' + nameSchool: Jardin de niños Estrellitas + levelStudies: Licenciatura en Educación Preescolar + studentsInCharge: 30 + grade: Primero + group: B + cct: 15EJN0089P + schoolZone: E30 + workShift: Matutino + curp: GORE001229HMCNVRB3 + email: mukes@gmail.com + phone: '5511909105' + age: 100 + address: Calle Estrella, 123, Colonia Centro, CDMX + emergencyContact: Carmen Rivera Cornejo + emergencyPhone: '5512345678' + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjAyNGIwZjQ2LTgwOTItMTFlZi1iZjRkLWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoibGF1cmVuIiwiZW1haWwiOiJwZXRpdGUubWFyeTA1QGdtYWlsLmNvbSIsInJvbGUiOiJhZG1pbiIsImxhc3RMb2dpbiI6IjIwMjQtMTAtMDNUMDc6MTg6MDguMDAwWiIsImFjY291bnRTdGF0dXMiOiJBY3Rpdm8iLCJpYXQiOjE3Mjc5NDAwMTMsImV4cCI6MTcyODAyNjQxM30.p5IAIlD3Rimt8uVMqAtO3jnMEYA0ojTg1i2ef2bmnRs + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/actualizar-maestro: + put: + tags: + - API Maestros + summary: Actualizar maestro + requestBody: + content: + application/json: + schema: + type: object + example: + firstName: Erick Miguel + lastName: '' + dateOfBirth: '2000-12-29' + nameSchool: '' + levelStudies: '' + studentsInCharge: 0 + grade: '' + group: '' + cct: '' + schoolZone: '' + workShift: '' + curp: '' + email: '' + phone: '' + age: 0 + address: '' + emergencyContact: '' + emergencyPhone: '' + status: Activo + id: d176c3b6-86c5-11ef-8a8b-00e04c360195 + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/borrar-maestro-boveda/f0bf974d-8167-11ef-a62a-00e04c36019: + put: + tags: + - API Maestros + summary: Mover a la boveda de Eliminados + requestBody: + content: {} + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjAyNGIwZjQ2LTgwOTItMTFlZi1iZjRkLWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoibGF1cmVuIiwiZW1haWwiOiJwZXRpdGUubWFyeTA1QGdtYWlsLmNvbSIsInJvbGUiOiJhZG1pbiIsImxhc3RMb2dpbiI6IjIwMjQtMTAtMDNUMDc6MjA6MTMuMDAwWiIsImFjY291bnRTdGF0dXMiOiJBY3Rpdm8iLCJpYXQiOjE3Mjc5NDIyMjAsImV4cCI6MTcyODAyODYyMH0.OfgO7x9plre5ZcnQu47b9MmzzqEbe7gpURoTQURR07g + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/borrar-maestro-def/c953aa29-976d-11ef-a763-00e04c360195: + delete: + tags: + - API Maestros + summary: Borrar definitivamente maestro + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjAyNGIwZjQ2LTgwOTItMTFlZi1iZjRkLWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoibGF1cmVuIiwiZW1haWwiOiJwZXRpdGUubWFyeTA1QGdtYWlsLmNvbSIsInJvbGUiOiJhZG1pbiIsImxhc3RMb2dpbiI6IjIwMjQtMTAtMDNUMDc6MjA6MTMuMDAwWiIsImFjY291bnRTdGF0dXMiOiJBY3Rpdm8iLCJpYXQiOjE3Mjc5NDIyMjAsImV4cCI6MTcyODAyODYyMH0.OfgO7x9plre5ZcnQu47b9MmzzqEbe7gpURoTQURR07g + responses: + '200': + description: Successful response + content: + application/json: {} + /users: + get: + tags: + - API Usuarios + summary: Lista usuarios + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA3LTA4VDAyOjMzOjE4LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUxOTUxODUwLCJleHAiOjE3NTE5OTUwNTB9.H9UDvt4GRmZZIztWhdrAZJofAsQNsQP8M9oAFCkO338 + - name: status + in: query + schema: + type: string + example: Activo + - name: correo + in: query + schema: + type: string + example: normal + - name: rol + in: query + schema: + type: string + example: admin + responses: + '200': + description: Successful response + content: + application/json: {} + post: + tags: + - API Usuarios + summary: Crear un usuario + requestBody: + content: + application/json: + schema: + type: object + example: + nameUser: '{{$randomUserName}}' + email: '{{$randomEmail}}' + password: '{{$randomPassword}}' + accountStatus: Inactivo + role: user + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA2LTI5VDA2OjI1OjE1LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUxMzQxNjc3LCJleHAiOjE3NTEzODQ4Nzd9.ifGLfMW-S4eTx8u_wPoGq-XmaPATOgXo7EWH40Vbe8Q + responses: + '200': + description: Successful response + content: + application/json: {} + /users/search: + get: + tags: + - API Usuarios + summary: Busqueda de usuario + security: + - noauthAuth: [] + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA2LTI5VDA2OjI1OjE1LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUxMzQxNjc3LCJleHAiOjE3NTEzODQ4Nzd9.ifGLfMW-S4eTx8u_wPoGq-XmaPATOgXo7EWH40Vbe8Q + - name: email + in: query + schema: + type: string + example: muke7881@gmail.com + responses: + '200': + description: Successful response + content: + application/json: {} + /users/auth/login: + post: + tags: + - API Usuarios + summary: Login + requestBody: + content: + application/json: + schema: + type: object + example: + email: petite.mary05@gmail.com + password: '123456' + responses: + '200': + description: Successful response + content: + application/json: {} + /users/auth/google: + post: + tags: + - API Usuarios + summary: Login Google + requestBody: + content: + application/json: + schema: + type: object + example: + credential: >- + eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg4MjUwM2E1ZmQ1NmU5ZjczNGRmYmE1YzUwZDdiZjQ4ZGIyODRhZTkiLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiJodHRwczovL2FjY291bnRzLmdvb2dsZS5jb20iLCJhenAiOiIxNjg2MDI3NTY1MC1qODFkcm9scmwxNG41N2M3a3FmZDdqNWdyMnNrZnJzdi5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbSIsImF1ZCI6IjE2ODYwMjc1NjUwLWo4MWRyb2xybDE0bjU3YzdrcWZkN2o1Z3Iyc2tmcnN2LmFwcHMuZ29vZ2xldXNlcmNvbnRlbnQuY29tIiwic3ViIjoiMTA3NTUyNTE4NTQ4OTM3Mzg5NjkyIiwiZW1haWwiOiJtdWtlNzg4MUBnbWFpbC5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwibmJmIjoxNzUxNTMyNzUyLCJuYW1lIjoiRXJpY2sgR29uemFsZXoiLCJwaWN0dXJlIjoiaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EvQUNnOG9jSmZmd3BJMVNIemxvZUtyRnlJQ0QzTVQ5R1o1bEtHTkFvbEVKLXd1R3A5am1Fbkt6czNmZz1zOTYtYyIsImdpdmVuX25hbWUiOiJFcmljayIsImZhbWlseV9uYW1lIjoiR29uemFsZXoiLCJpYXQiOjE3NTE1MzMwNTIsImV4cCI6MTc1MTUzNjY1MiwianRpIjoiMzZlOTZkMWFjNjM5NTFmMDBlNWVjZDAzZDAwMzEyNzc0ZmVkMDk0OCJ9.lFhmKkkv1hxGsec5m-iJ_JrhtycnG7zAw1BJfHpG8phEYkuIX4_srkb8vHcDCa2OeJj8jf_pvluORgXfwiRY-QLVw5XJcO_hyQ5qi-N_WFrXUR939y8o0SW3UppP7muU9VqDIzCYlSf--Re5uj2Vg3pJ5hs8QAEhPv5eubPyDHEblTQHI4MdNUaulNazuQbSHE5zVojkWGVWaYaTOli9URetkJ4nLKW-ii_GnaDKUVOSFe3xPXXgTZA3ZNEJu76GlzgpO9SpJNKs12lT4kNx2wbCcve82SI6S765KYSY8WM2oLScDx0KAa_rufOKp-xtLhPv3b8u-EMGrZPee6VlvA + security: + - noauthAuth: [] + responses: + '200': + description: Successful response + content: + application/json: {} + /token/refresh: + post: + tags: + - API Usuarios + summary: Refresco de token + requestBody: + content: + application/json: + schema: + type: object + example: + token: >- + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA3LTA0VDA4OjUyOjI2LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUxNjE5MzEyLCJleHAiOjE3NTE2NjI1MTJ9.YKjjyZkbkFkPe0YQG2yOOigu-7nL3Vs5phRZXmoiDD4 + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA3LTA0VDA4OjUyOjI2LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUxNjE5MzEyLCJleHAiOjE3NTE2NjI1MTJ9.YKjjyZkbkFkPe0YQG2yOOigu-7nL3Vs5phRZXmoiDD4 + responses: + '200': + description: Successful response + content: + application/json: {} + /users/auth/register: + post: + tags: + - API Usuarios + summary: Registrar un usuario + requestBody: + content: + application/json: + schema: + type: object + example: + nameUser: '{{$randomUserName}}' + email: '{{$randomEmail}}' + password: '{{$randomPassword}}' + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA1LTEyVDAxOjQ4OjI2LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzQ3MDE0NTA4LCJleHAiOjE3NDcwNTc3MDh9.jd-mjnPFN3_dXWW1to2BxCbcHrvqIu3YBPfzTwXWZtY + responses: + '200': + description: Successful response + content: + application/json: {} + /users/bulk: + post: + tags: + - API Usuarios + summary: Crear usuarios masivo + requestBody: + content: + application/json: + schema: + type: object + example: + countInsert: 10 + security: + - noauthAuth: [] + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA2LTI5VDA2OjI1OjE1LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUxMzQxNjc3LCJleHAiOjE3NTEzODQ4Nzd9.ifGLfMW-S4eTx8u_wPoGq-XmaPATOgXo7EWH40Vbe8Q + responses: + '200': + description: Successful response + content: + application/json: {} + delete: + tags: + - API Usuarios + summary: Eliminacion masiva + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA2LTI5VDA2OjI1OjE1LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUxMzQxNjc3LCJleHAiOjE3NTEzODQ4Nzd9.ifGLfMW-S4eTx8u_wPoGq-XmaPATOgXo7EWH40Vbe8Q + responses: + '200': + description: Successful response + content: + application/json: {} + /users/4901398e-2672-11f0-b8d7-d843ae0db894: + put: + tags: + - API Usuarios + summary: Editar usuario + requestBody: + content: + application/json: + schema: + type: object + example: + nameUser: La pecas + email: daires2509@gmail.com + password: '123456' + role: admin + accountStatus: Activo + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA2LTI5VDA2OjI1OjE1LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUxMzQxNjc3LCJleHAiOjE3NTEzODQ4Nzd9.ifGLfMW-S4eTx8u_wPoGq-XmaPATOgXo7EWH40Vbe8Q + responses: + '200': + description: Successful response + content: + application/json: {} + /users/1b48a265-2f05-11f0-9a7d-d843ae0db894: + delete: + tags: + - API Usuarios + summary: Eliminar usuario + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA2LTI5VDA2OjI1OjE1LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUxMzQxNjc3LCJleHAiOjE3NTEzODQ4Nzd9.ifGLfMW-S4eTx8u_wPoGq-XmaPATOgXo7EWH40Vbe8Q + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/lista-de-padres: + get: + tags: + - API Padres + summary: Lista de padres + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/lista-de-padres-eliminados: + get: + tags: + - API Padres + summary: Traer padres eliminados + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/lista-padres-maestro/d17851a7-86b3-11ef-8a8b-00e04c360195: + post: + tags: + - API Padres + summary: Lista de padres por maestro + requestBody: + content: {} + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/busqueda-padres: + post: + tags: + - API Padres + summary: Buscar papas + requestBody: + content: + application/json: + schema: + type: object + example: + email: '' + firstName: Juan + lastName: '' + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/insertar-padres: + post: + tags: + - API Padres + summary: Insertar padres + requestBody: + content: + application/json: + schema: + type: object + example: + teacherID: d17851a7-86b3-11ef-8a8b-00e04c360195 + firstName: Jose + lastName: Antonio Salazar + dateOfBirth: '1950-02-10' + ocupation: Obrero + gender: Masculino + curp: asdasdnaklsd0 + email: jose20@gmail.com + phone: '5511909105' + age: 50 + address: Ecatepec + emergencyContact: Miguel Gonzalez + emergencyPhone: '5511909105' + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/actualizar-padres: + put: + tags: + - API Padres + summary: Actualizar padres + requestBody: + content: + application/json: + schema: + type: object + example: + teacherID: d17851a7-86b3-11ef-8a8b-00e04c360195 + firstName: '' + lastName: '' + dateOfBirth: '1975-04-15' + ocupation: '' + gender: Masculino + curp: JMLA750415HDFRZR01 + email: juan.martinez75@gmail.com + phone: 5540981234 + age: 49 + address: Avenida Central 123, Ciudad de México + emergencyContact: María López + emergencyPhone: '5543998765' + status: Activo + id: 67baa960-9766-11ef-a763-00e04c360195 + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/borrar-padres-boveda/67baa960-9766-11ef-a763-00e04c360195: + put: + tags: + - API Padres + summary: Mover a la boveda de eliminados + requestBody: + content: {} + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/borrar-padres-def/57ab2953-9048-11ef-a763-00e04c360195: + delete: + tags: + - API Padres + summary: Borrar def + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/lista-inventario: + get: + tags: + - Catálogo Inventario + summary: Lista de inventario + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/lista-inventario-desuso: + get: + tags: + - Catálogo Inventario + summary: Lista inventario desuso + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/agregar-inventario: + post: + tags: + - Catálogo Inventario + summary: Insertar inventario + requestBody: + content: + application/json: + schema: + type: object + example: + itemCode: ESCUADRA10980 + name: Silla + description: Silla de color verde + quantity: 200 + weight: 2.3 + width: 50 + height: 40 + location: Salon 2 + condition: Nuevo + purchaseDate: '2024-11-22' + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/actualizar-inventario: + put: + tags: + - Catálogo Inventario + summary: Actualizar inventario + requestBody: + content: + application/json: + schema: + type: object + example: + itemCode: asdasdasd + name: asd + description: asdasdasd + quantity: 200 + weight: 2.3 + width: 50 + height: 40 + location: asdasdasd + condition: asdasdasdasd + purchaseDate: '2024-11-22' + status: Activo + id: 758f76f0-975b-11ef-a763-00e04c360195 + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/borrar-inventario-boveda/758f76f0-975b-11ef-a763-00e04c360195: + put: + tags: + - Catálogo Inventario + summary: Mover a la boveda de eliminados + requestBody: + content: {} + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/eliminar-inventario/758f76f0-975b-11ef-a763-00e04c360195: + delete: + tags: + - Catálogo Inventario + summary: Borrar inventario + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/lista-insumos: + get: + tags: + - Catálogo Insumos + summary: Lista insumos + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/lista-insumos-desuso: + get: + tags: + - Catálogo Insumos + summary: Lista insumos desuso + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/agregar-insumo: + post: + tags: + - Catálogo Insumos + summary: Insertar insumo + requestBody: + content: + application/json: + schema: + type: object + example: + name: Plumas + description: Caja con 7 plumas + quantity: 50 + unit: Cajas + supplier: SNTE + purchaseDate: '2024-08-15' + expiryDate: null + cost: 15.5 + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/actualizar-insumo: + put: + tags: + - Catálogo Insumos + summary: Actualizar insumo + requestBody: + content: + application/json: + schema: + type: object + example: + name: Pizarones + description: Pizarrones de color verde + quantity: 40 + unit: Paquetes + supplier: Donacion + purchaseDate: '2024-08-15' + expiryDate: '2040-07-15' + cost: 10006324.5 + status: Activo + id: 2f7ee65d-973c-11ef-a763-00e04c360195 + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/mover-insumo-boveda/2f7ee65d-973c-11ef-a763-00e04c360195: + put: + tags: + - Catálogo Insumos + summary: Mover a la boveda de eliminados + requestBody: + content: {} + responses: + '200': + description: Successful response + content: + application/json: {} + /api/v1/eliminar-insumo/2f7ee65d-973c-11ef-a763-00e04c360195: + delete: + tags: + - Catálogo Insumos + summary: Borrar insumo + responses: + '200': + description: Successful response + content: + application/json: {} + /assets: + get: + tags: + - Catálogo Activos + summary: Lista activos + parameters: + - name: cost + in: query + schema: + type: number + example: '950.00' + - name: limitCost + in: query + schema: + type: integer + example: '6000' + - name: location + in: query + schema: + type: string + example: Aula 4 + - name: condition + in: query + schema: + type: string + example: Regular + - name: status + in: query + schema: + type: string + example: Inactivo + responses: + '200': + description: OK + headers: + Vary: + schema: + type: string + example: Origin + Access-Control-Allow-Credentials: + schema: + type: boolean + example: 'true' + Content-Security-Policy: + schema: + type: string + example: >- + default-src 'self';base-uri 'self';font-src 'self' https: + data:;form-action 'self';frame-ancestors 'self';img-src 'self' + data:;object-src 'none';script-src 'self';script-src-attr + 'none';style-src 'self' https: + 'unsafe-inline';upgrade-insecure-requests + Cross-Origin-Opener-Policy: + schema: + type: string + example: same-origin + Cross-Origin-Resource-Policy: + schema: + type: string + example: same-origin + Origin-Agent-Cluster: + schema: + type: string + example: '?1' + Referrer-Policy: + schema: + type: string + example: no-referrer + Strict-Transport-Security: + schema: + type: string + example: max-age=31536000; includeSubDomains + X-Content-Type-Options: + schema: + type: string + example: nosniff + X-DNS-Prefetch-Control: + schema: + type: string + example: 'off' + X-Download-Options: + schema: + type: string + example: noopen + X-Frame-Options: + schema: + type: string + example: SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + schema: + type: string + example: none + X-XSS-Protection: + schema: + type: integer + example: '0' + RateLimit-Policy: + schema: + type: string + example: 1000;w=3600 + RateLimit-Limit: + schema: + type: integer + example: '1000' + RateLimit-Remaining: + schema: + type: integer + example: '998' + RateLimit-Reset: + schema: + type: integer + example: '3445' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Content-Length: + schema: + type: integer + example: '627' + ETag: + schema: + type: string + example: W/"273-NC+DVv0TJmIsrbR51HxU4qSafdI" + Date: + schema: + type: string + example: Fri, 11 Jul 2025 11:51:00 GMT + Connection: + schema: + type: string + example: keep-alive + Keep-Alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + success: true + data: + - ID: 6c178066-5bbb-11f0-ac03-d843ae0db894 + Name: Pizarrón Blanco Magnético + Description: Pizarrón blanco de 2x1.5m con superficie magnética + PurchaseDate: '2021-06-30T05:00:00.000Z' + Cost: '950.00' + Location: Aula 4 + Condition: Regular + Status: Activo + LastMaintenanceDate: '2024-05-12T06:00:00.000Z' + WarrantyEndDate: '2023-06-30T06:00:00.000Z' + Created: '2025-07-08T05:21:37.000Z' + Updated: '2025-07-08T05:21:37.000Z' + message: Consulta realizada correctamente + metadata: + timestamp: '2025-07-11T11:51:00.483Z' + requestId: 3fe395a8-768a-4c16-a2f4-6e18dfa7f468 + dataCount: '1' + '404': + description: Not Found + headers: + Vary: + schema: + type: string + example: Origin + Access-Control-Allow-Credentials: + schema: + type: boolean + example: 'true' + Content-Security-Policy: + schema: + type: string + example: >- + default-src 'self';base-uri 'self';font-src 'self' https: + data:;form-action 'self';frame-ancestors 'self';img-src 'self' + data:;object-src 'none';script-src 'self';script-src-attr + 'none';style-src 'self' https: + 'unsafe-inline';upgrade-insecure-requests + Cross-Origin-Opener-Policy: + schema: + type: string + example: same-origin + Cross-Origin-Resource-Policy: + schema: + type: string + example: same-origin + Origin-Agent-Cluster: + schema: + type: string + example: '?1' + Referrer-Policy: + schema: + type: string + example: no-referrer + Strict-Transport-Security: + schema: + type: string + example: max-age=31536000; includeSubDomains + X-Content-Type-Options: + schema: + type: string + example: nosniff + X-DNS-Prefetch-Control: + schema: + type: string + example: 'off' + X-Download-Options: + schema: + type: string + example: noopen + X-Frame-Options: + schema: + type: string + example: SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + schema: + type: string + example: none + X-XSS-Protection: + schema: + type: integer + example: '0' + RateLimit-Policy: + schema: + type: string + example: 1000;w=3600 + RateLimit-Limit: + schema: + type: integer + example: '1000' + RateLimit-Remaining: + schema: + type: integer + example: '997' + RateLimit-Reset: + schema: + type: integer + example: '3420' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Content-Length: + schema: + type: integer + example: '624' + ETag: + schema: + type: string + example: W/"270-ARw8quF1j9o1Bhft0e19+y7QmbM" + Date: + schema: + type: string + example: Fri, 11 Jul 2025 11:51:25 GMT + Connection: + schema: + type: string + example: keep-alive + Keep-Alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + success: false + error: + message: No se encontraron activos con los filtros proporcionados + code: ASSETS_NOT_FOUND + details: >- + No se encontraron activos con los filtros proporcionados: + {"cost":"950.00","limitCost":"6000","location":"Aula + 4","condition":"Regular","status":"Inactivo"} + timestamp: '2025-07-11T11:51:25.610Z' + errorId: b3f3adee-e68b-49d5-8c41-dcebb8b8b0bb + path: >- + /api/v1/assets?cost=950.00&limitCost=6000&location=Aula%204&condition=Regular&status=Inactivo + method: GET + query: + cost: '950.00' + limitCost: '6000' + location: Aula 4 + condition: Regular + status: Inactivo + post: + tags: + - Catálogo Activos + summary: Insertar activo + requestBody: + content: + application/json: + schema: + type: object + example: + name: Ventilador de Piso + description: Ventilador con control remoto para aulas grandes + purchaseDate: '2022-05-05' + cost: 1000 + location: Aula 5 + condition: Regular + lastMaintenanceDate: '2024-07-02' + warrantyEndDate: '2023-05-05' + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA3LTA4VDA5OjU1OjI4LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUyMjI2OTg1LCJleHAiOjE3NTIyNzAxODV9.OMGKI9JJ6KTTS5zEOwP8ZzamUVryRBLdOT9uAXNxJDU + responses: + '201': + description: Created + headers: + Vary: + schema: + type: string + example: Origin + Access-Control-Allow-Credentials: + schema: + type: boolean + example: 'true' + Content-Security-Policy: + schema: + type: string + example: >- + default-src 'self';base-uri 'self';font-src 'self' https: + data:;form-action 'self';frame-ancestors 'self';img-src 'self' + data:;object-src 'none';script-src 'self';script-src-attr + 'none';style-src 'self' https: + 'unsafe-inline';upgrade-insecure-requests + Cross-Origin-Opener-Policy: + schema: + type: string + example: same-origin + Cross-Origin-Resource-Policy: + schema: + type: string + example: same-origin + Origin-Agent-Cluster: + schema: + type: string + example: '?1' + Referrer-Policy: + schema: + type: string + example: no-referrer + Strict-Transport-Security: + schema: + type: string + example: max-age=31536000; includeSubDomains + X-Content-Type-Options: + schema: + type: string + example: nosniff + X-DNS-Prefetch-Control: + schema: + type: string + example: 'off' + X-Download-Options: + schema: + type: string + example: noopen + X-Frame-Options: + schema: + type: string + example: SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + schema: + type: string + example: none + X-XSS-Protection: + schema: + type: integer + example: '0' + RateLimit-Policy: + schema: + type: string + example: 50;w=3600 + RateLimit-Limit: + schema: + type: integer + example: '50' + RateLimit-Remaining: + schema: + type: integer + example: '49' + RateLimit-Reset: + schema: + type: integer + example: '3600' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Content-Length: + schema: + type: integer + example: '180' + ETag: + schema: + type: string + example: W/"b4-YPimIJZ3A+k2ZJTqHm3Wte0vCEE" + Date: + schema: + type: string + example: Fri, 11 Jul 2025 10:19:00 GMT + Connection: + schema: + type: string + example: keep-alive + Keep-Alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + success: true + message: Se inserto correctamente el activo + metadata: + timestamp: '2025-07-11T10:19:00.662Z' + requestId: 383f8fb2-b672-4623-a0c9-676ca7ac4c12 + dataCount: 0 + /assets/search: + get: + tags: + - Catálogo Activos + summary: Busqueda de activos + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA3LTA4VDA5OjU1OjI4LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUyMjI2OTg1LCJleHAiOjE3NTIyNzAxODV9.OMGKI9JJ6KTTS5zEOwP8ZzamUVryRBLdOT9uAXNxJDU + - name: name + in: query + schema: + type: string + example: Comoda + responses: + '200': + description: OK + headers: + Vary: + schema: + type: string + example: Origin + Access-Control-Allow-Credentials: + schema: + type: boolean + example: 'true' + Content-Security-Policy: + schema: + type: string + example: >- + default-src 'self';base-uri 'self';font-src 'self' https: + data:;form-action 'self';frame-ancestors 'self';img-src 'self' + data:;object-src 'none';script-src 'self';script-src-attr + 'none';style-src 'self' https: + 'unsafe-inline';upgrade-insecure-requests + Cross-Origin-Opener-Policy: + schema: + type: string + example: same-origin + Cross-Origin-Resource-Policy: + schema: + type: string + example: same-origin + Origin-Agent-Cluster: + schema: + type: string + example: '?1' + Referrer-Policy: + schema: + type: string + example: no-referrer + Strict-Transport-Security: + schema: + type: string + example: max-age=31536000; includeSubDomains + X-Content-Type-Options: + schema: + type: string + example: nosniff + X-DNS-Prefetch-Control: + schema: + type: string + example: 'off' + X-Download-Options: + schema: + type: string + example: noopen + X-Frame-Options: + schema: + type: string + example: SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + schema: + type: string + example: none + X-XSS-Protection: + schema: + type: integer + example: '0' + RateLimit-Policy: + schema: + type: string + example: 300;w=900 + RateLimit-Limit: + schema: + type: integer + example: '300' + RateLimit-Remaining: + schema: + type: integer + example: '299' + RateLimit-Reset: + schema: + type: integer + example: '900' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Content-Length: + schema: + type: integer + example: '559' + ETag: + schema: + type: string + example: W/"22f-99FNnZmynp0f3J6QWv3QM0C5KQU" + Date: + schema: + type: string + example: Fri, 11 Jul 2025 10:18:48 GMT + Connection: + schema: + type: string + example: keep-alive + Keep-Alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + success: true + data: + - ID: 11d1b03c-5bbb-11f0-ac03-d843ae0db894 + Name: Comoda + Description: Comoda + PurchaseDate: '2024-05-10T06:00:00.000Z' + Cost: '50.00' + Location: Aula 1 + Condition: Bueno + Status: Inactivo + LastMaintenanceDate: '2024-07-10T06:00:00.000Z' + WarrantyEndDate: '2026-05-10T06:00:00.000Z' + Created: '2025-07-08T05:19:06.000Z' + Updated: '2025-07-08T08:47:13.000Z' + message: Busqueda realizada correctamente + metadata: + timestamp: '2025-07-11T10:18:48.855Z' + requestId: 0147823c-e700-493d-b127-10116bf33172 + dataCount: '1' + /assets/11d1b03c-5bbb-11f0-ac03-d843ae0db894: + put: + tags: + - Catálogo Activos + summary: Actualizar activo + requestBody: + content: + application/json: + schema: + type: object + example: + name: Comoda + description: Comoda + purchaseDate: '2024-05-10' + cost: 50 + location: Aula 1 + condition: Bueno + status: Inactivo + lastMaintenanceDate: '2024-07-10' + warrantyEndDate: '2026-05-10' + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA3LTA4VDA5OjU1OjI4LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUyMjI2OTg1LCJleHAiOjE3NTIyNzAxODV9.OMGKI9JJ6KTTS5zEOwP8ZzamUVryRBLdOT9uAXNxJDU + responses: + '200': + description: OK + headers: + Vary: + schema: + type: string + example: Origin + Access-Control-Allow-Credentials: + schema: + type: boolean + example: 'true' + Content-Security-Policy: + schema: + type: string + example: >- + default-src 'self';base-uri 'self';font-src 'self' https: + data:;form-action 'self';frame-ancestors 'self';img-src 'self' + data:;object-src 'none';script-src 'self';script-src-attr + 'none';style-src 'self' https: + 'unsafe-inline';upgrade-insecure-requests + Cross-Origin-Opener-Policy: + schema: + type: string + example: same-origin + Cross-Origin-Resource-Policy: + schema: + type: string + example: same-origin + Origin-Agent-Cluster: + schema: + type: string + example: '?1' + Referrer-Policy: + schema: + type: string + example: no-referrer + Strict-Transport-Security: + schema: + type: string + example: max-age=31536000; includeSubDomains + X-Content-Type-Options: + schema: + type: string + example: nosniff + X-DNS-Prefetch-Control: + schema: + type: string + example: 'off' + X-Download-Options: + schema: + type: string + example: noopen + X-Frame-Options: + schema: + type: string + example: SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + schema: + type: string + example: none + X-XSS-Protection: + schema: + type: integer + example: '0' + RateLimit-Policy: + schema: + type: string + example: 100;w=3600 + RateLimit-Limit: + schema: + type: integer + example: '100' + RateLimit-Remaining: + schema: + type: integer + example: '99' + RateLimit-Reset: + schema: + type: integer + example: '3600' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Content-Length: + schema: + type: integer + example: '194' + ETag: + schema: + type: string + example: W/"c2-zC1/gez5D02MueL+6ytFOCmDIUU" + Date: + schema: + type: string + example: Fri, 11 Jul 2025 10:19:08 GMT + Connection: + schema: + type: string + example: keep-alive + Keep-Alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + success: true + data: {} + message: El activo se actualizo correctamente + metadata: + timestamp: '2025-07-11T10:19:08.714Z' + requestId: 5852001c-d80e-4e83-a917-17e66a887a6d + dataCount: '0' + /assets/vault/e41c74b4-5bba-11f0-ac03-d843ae0db894: + put: + tags: + - Catálogo Activos + summary: Mover a la boveda de eliminados + requestBody: + content: {} + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA3LTA4VDA5OjU1OjI4LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUyMjI2OTg1LCJleHAiOjE3NTIyNzAxODV9.OMGKI9JJ6KTTS5zEOwP8ZzamUVryRBLdOT9uAXNxJDU + responses: + '200': + description: OK + headers: + Vary: + schema: + type: string + example: Origin + Access-Control-Allow-Credentials: + schema: + type: boolean + example: 'true' + Content-Security-Policy: + schema: + type: string + example: >- + default-src 'self';base-uri 'self';font-src 'self' https: + data:;form-action 'self';frame-ancestors 'self';img-src 'self' + data:;object-src 'none';script-src 'self';script-src-attr + 'none';style-src 'self' https: + 'unsafe-inline';upgrade-insecure-requests + Cross-Origin-Opener-Policy: + schema: + type: string + example: same-origin + Cross-Origin-Resource-Policy: + schema: + type: string + example: same-origin + Origin-Agent-Cluster: + schema: + type: string + example: '?1' + Referrer-Policy: + schema: + type: string + example: no-referrer + Strict-Transport-Security: + schema: + type: string + example: max-age=31536000; includeSubDomains + X-Content-Type-Options: + schema: + type: string + example: nosniff + X-DNS-Prefetch-Control: + schema: + type: string + example: 'off' + X-Download-Options: + schema: + type: string + example: noopen + X-Frame-Options: + schema: + type: string + example: SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + schema: + type: string + example: none + X-XSS-Protection: + schema: + type: integer + example: '0' + RateLimit-Policy: + schema: + type: string + example: 100;w=3600 + RateLimit-Limit: + schema: + type: integer + example: '100' + RateLimit-Remaining: + schema: + type: integer + example: '99' + RateLimit-Reset: + schema: + type: integer + example: '3600' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Content-Length: + schema: + type: integer + example: '202' + ETag: + schema: + type: string + example: W/"ca-jqGgkvLYUGab3YyJtBKHQVMwp90" + Date: + schema: + type: string + example: Fri, 11 Jul 2025 10:19:15 GMT + Connection: + schema: + type: string + example: keep-alive + Keep-Alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + success: true + data: {} + message: El activo se mando a la boveda de eliminados + metadata: + timestamp: '2025-07-11T10:19:15.560Z' + requestId: 45405cdf-75b8-4d33-8534-ecc9ecafcc53 + dataCount: '0' + /assets/59bfc5a7-5bbb-11f0-ac03-d843ae0db894: + delete: + tags: + - Catálogo Activos + summary: Borrar activo + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA3LTA4VDA5OjU1OjI4LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUyMjI2OTg1LCJleHAiOjE3NTIyNzAxODV9.OMGKI9JJ6KTTS5zEOwP8ZzamUVryRBLdOT9uAXNxJDU + responses: + '200': + description: OK + headers: + Vary: + schema: + type: string + example: Origin + Access-Control-Allow-Credentials: + schema: + type: boolean + example: 'true' + Content-Security-Policy: + schema: + type: string + example: >- + default-src 'self';base-uri 'self';font-src 'self' https: + data:;form-action 'self';frame-ancestors 'self';img-src 'self' + data:;object-src 'none';script-src 'self';script-src-attr + 'none';style-src 'self' https: + 'unsafe-inline';upgrade-insecure-requests + Cross-Origin-Opener-Policy: + schema: + type: string + example: same-origin + Cross-Origin-Resource-Policy: + schema: + type: string + example: same-origin + Origin-Agent-Cluster: + schema: + type: string + example: '?1' + Referrer-Policy: + schema: + type: string + example: no-referrer + Strict-Transport-Security: + schema: + type: string + example: max-age=31536000; includeSubDomains + X-Content-Type-Options: + schema: + type: string + example: nosniff + X-DNS-Prefetch-Control: + schema: + type: string + example: 'off' + X-Download-Options: + schema: + type: string + example: noopen + X-Frame-Options: + schema: + type: string + example: SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + schema: + type: string + example: none + X-XSS-Protection: + schema: + type: integer + example: '0' + RateLimit-Policy: + schema: + type: string + example: 50;w=3600 + RateLimit-Limit: + schema: + type: integer + example: '50' + RateLimit-Remaining: + schema: + type: integer + example: '49' + RateLimit-Reset: + schema: + type: integer + example: '3600' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Content-Length: + schema: + type: integer + example: '195' + ETag: + schema: + type: string + example: W/"c3-Y2KOHAMgbNojJsCVnthhkeOb1AQ" + Date: + schema: + type: string + example: Fri, 11 Jul 2025 10:19:40 GMT + Connection: + schema: + type: string + example: keep-alive + Keep-Alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + success: true + data: {} + message: El activo fue eliminado correctamente + metadata: + timestamp: '2025-07-11T10:19:40.288Z' + requestId: 3bde13c2-b995-4c03-aaaa-1b1d78e119c8 + dataCount: '0' + /assets/bulk: + delete: + tags: + - Catálogo Activos + summary: Eliminacion masiva + parameters: + - name: Authorization + in: header + schema: + type: string + example: >- + Bearer + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjIyYWVkNmVkLTI2NzItMTFmMC1iOGQ3LWQ4NDNhZTBkYjg5NCIsIm5hbWVVc2VyIjoiTWFyaWEgSm9zZSIsImVtYWlsIjoicGV0aXRlLm1hcnkwNUBnbWFpbC5jb20iLCJwcm9maWxlUGljdHVyZSI6Imh0dHBzOi8vaS5waW5pbWcuY29tLzczNngvZGEvZjMvZmIvZGFmM2ZiOTgxZTIyODIyMGU5MDE2ODJjNTVjYzQyNzkuanBnIiwicm9sZSI6ImFkbWluIiwiYWNjb3VudFR5cGUiOiJub3JtYWwiLCJsYXN0TG9naW4iOiIyMDI1LTA3LTA4VDA5OjU1OjI4LjAwMFoiLCJhY2NvdW50U3RhdHVzIjoiQWN0aXZvIiwiaWF0IjoxNzUyMjI2OTg1LCJleHAiOjE3NTIyNzAxODV9.OMGKI9JJ6KTTS5zEOwP8ZzamUVryRBLdOT9uAXNxJDU + responses: + '200': + description: OK + headers: + Vary: + schema: + type: string + example: Origin + Access-Control-Allow-Credentials: + schema: + type: boolean + example: 'true' + Content-Security-Policy: + schema: + type: string + example: >- + default-src 'self';base-uri 'self';font-src 'self' https: + data:;form-action 'self';frame-ancestors 'self';img-src 'self' + data:;object-src 'none';script-src 'self';script-src-attr + 'none';style-src 'self' https: + 'unsafe-inline';upgrade-insecure-requests + Cross-Origin-Opener-Policy: + schema: + type: string + example: same-origin + Cross-Origin-Resource-Policy: + schema: + type: string + example: same-origin + Origin-Agent-Cluster: + schema: + type: string + example: '?1' + Referrer-Policy: + schema: + type: string + example: no-referrer + Strict-Transport-Security: + schema: + type: string + example: max-age=31536000; includeSubDomains + X-Content-Type-Options: + schema: + type: string + example: nosniff + X-DNS-Prefetch-Control: + schema: + type: string + example: 'off' + X-Download-Options: + schema: + type: string + example: noopen + X-Frame-Options: + schema: + type: string + example: SAMEORIGIN + X-Permitted-Cross-Domain-Policies: + schema: + type: string + example: none + X-XSS-Protection: + schema: + type: integer + example: '0' + RateLimit-Policy: + schema: + type: string + example: 10;w=3600 + RateLimit-Limit: + schema: + type: integer + example: '10' + RateLimit-Remaining: + schema: + type: integer + example: '9' + RateLimit-Reset: + schema: + type: integer + example: '3600' + Content-Type: + schema: + type: string + example: application/json; charset=utf-8 + Content-Length: + schema: + type: integer + example: '239' + ETag: + schema: + type: string + example: W/"ef-aAeoL8qD0DZeJbnLBISf5cN7jjE" + Date: + schema: + type: string + example: Fri, 11 Jul 2025 10:21:27 GMT + Connection: + schema: + type: string + example: keep-alive + Keep-Alive: + schema: + type: string + example: timeout=5 + content: + application/json: + schema: + type: object + example: + success: true + data: + message: Se eliminaron 2 activos correctamente + message: Consulta realizada correctamente + metadata: + timestamp: '2025-07-11T10:21:27.063Z' + requestId: acdd7136-b5d6-4c0f-97ae-5590c4853f2e + dataCount: '1' + /api/v1/lista-estudiantes: + get: + tags: + - API Estudiantes + summary: Lista estudiantes + responses: + '200': + description: Successful response + content: + application/json: {} \ No newline at end of file diff --git a/src/helpers/rateLimit/assets.rateLimit.js b/src/helpers/rateLimit/assets.rateLimit.js index 5a21c04..6c71650 100644 --- a/src/helpers/rateLimit/assets.rateLimit.js +++ b/src/helpers/rateLimit/assets.rateLimit.js @@ -1,46 +1,46 @@ -import { rateLimitRequest } from "../../middleware/rateLimitRequest.middleware.js"; - -// Example -// rateLimitRequest(time to try again, limit each IP request per windows, messageRequest response) - -export const listAssetsRateLimiter = rateLimitRequest( - 60, - 1000, - "Demasiadas peticiones para traer la lista de activos,", -); - -export const searchAssetsRateLimiter = rateLimitRequest( - 15, - 300, - "Demasiadas búsquedas de activos desde esta IP, ", -); - -export const createAssetsRateLimiter = rateLimitRequest( - 60, - 50, - "Límite de creación de activos alcanzado, ", -); - -export const updateAssetsRateLimiter = rateLimitRequest( - 60, - 100, - "Demasiadas actualizaciones de activos desde esta IP, ", -); - -export const moveToVaultAssetDeletedRateLimit = rateLimitRequest( - 60, - 100, - "Demasiadas peticiones para el envio a la boveda, ", -); - -export const deleteAssetsRateLimiter = rateLimitRequest( - 60, - 50, - "Límite de eliminación de activos alcanzado, ", -); - -export const bulkDeleteAssetsRateLimiter = rateLimitRequest( - 60, - 10, - "Demasiadas eliminaciones masivas en corto tiempo, ", -); +// import { rateLimitRequest } from "../../middleware/rateLimitRequest.middleware.js"; + +// // Example +// // rateLimitRequest(time to try again, limit each IP request per windows, messageRequest response) + +// export const listAssetsRateLimiter = rateLimitRequest( +// 60, +// 1000, +// "Demasiadas peticiones para traer la lista de activos,", +// ); + +// export const searchAssetsRateLimiter = rateLimitRequest( +// 15, +// 300, +// "Demasiadas búsquedas de activos desde esta IP, ", +// ); + +// export const createAssetsRateLimiter = rateLimitRequest( +// 60, +// 50, +// "Límite de creación de activos alcanzado, ", +// ); + +// export const updateAssetsRateLimiter = rateLimitRequest( +// 60, +// 100, +// "Demasiadas actualizaciones de activos desde esta IP, ", +// ); + +// export const moveToVaultAssetDeletedRateLimit = rateLimitRequest( +// 60, +// 100, +// "Demasiadas peticiones para el envio a la boveda, ", +// ); + +// export const deleteAssetsRateLimiter = rateLimitRequest( +// 60, +// 50, +// "Límite de eliminación de activos alcanzado, ", +// ); + +// export const bulkDeleteAssetsRateLimiter = rateLimitRequest( +// 60, +// 10, +// "Demasiadas eliminaciones masivas en corto tiempo, ", +// ); diff --git a/src/middleware/rateLimitRequest.middleware.js b/src/middleware/rateLimitRequest.middleware.js index cf3d7e6..237059a 100644 --- a/src/middleware/rateLimitRequest.middleware.js +++ b/src/middleware/rateLimitRequest.middleware.js @@ -1,6 +1,43 @@ -import { request, response } from "express"; import { rateLimit } from "express-rate-limit"; +// Bloqueo burst - más restrictivo para prevenir spam +export const burstProtectionLimiter = rateLimit({ + windowMs: 7 * 60 * 1000, // 7 minutos + limit: 20, // 20 requests en 7 minutos (más restrictivo) + handler: (request, response, next) => { + next({ + statusCode: 429, + message: + "Demasiadas solicitudes en poco tiempo. Intenta de nuevo en 7 minutos", + code: "TOO_MANY_REQUESTS", + details: "Has sido temporalmente bloqueado por actividad sospechosa.", + }); + }, + standardHeaders: true, + legacyHeaders: false, + skipSuccessfulRequests: false, + keyGenerator: (req) => req.ip, +}); + +// Control normal - más permisivo para uso regular +export const normalLimiter = rateLimit({ + windowMs: 60 * 60 * 1000, // 60 minutos + limit: 1000, + handler: (request, response, next) => { + next({ + statusCode: 429, + message: + "Demasiadas solicitudes en poco tiempo. Intenta de nuevo en 1 hora", + code: "TOO_MANY_REQUESTS", + details: "Has excedido el número máximo de solicitudes permitidas.", + }); + }, + standardHeaders: true, + legacyHeaders: false, + keyGenerator: (req) => req.ip, +}); + +// Se va a eliminar export const rateLimitRequest = (time, limit, messageRequest) => { return rateLimit({ windowMs: time * 60 * 1000, @@ -8,7 +45,7 @@ export const rateLimitRequest = (time, limit, messageRequest) => { handler: (request, response, next) => { next({ statusCode: 429, - message: `${messageRequest} Inténtelo nuevamente después de ${time} minuto(s).`, + message: `${messageRequest}. Inténtelo nuevamente después de ${time} minuto(s).`, code: "TOO_MANY_REQUESTS", details: "Has excedido el número máximo de solicitudes permitidas.", }); diff --git a/src/routes/catAssets.routes.js b/src/routes/catAssets.routes.js index 2ba0356..a22c4fc 100644 --- a/src/routes/catAssets.routes.js +++ b/src/routes/catAssets.routes.js @@ -9,313 +9,53 @@ import { SearchOfAssets, UpdateAssets, } from "../controllers/assets/index.js"; -import { - bulkDeleteAssetsRateLimiter, - createAssetsRateLimiter, - deleteAssetsRateLimiter, - listAssetsRateLimiter, - moveToVaultAssetDeletedRateLimit, - searchAssetsRateLimiter, - updateAssetsRateLimiter, -} from "../helpers/rateLimit/assets.rateLimit.js"; import { verificarToken } from "../middleware/verificarToken.middleware.js"; import { methodCreated, methodOK } from "../server/serverMethods.js"; const apiCatAssets = express.Router(); -/** - * @swagger - * /assets?: - * get: - * summary: Obtener todos los activos según filtros opcionales - * description: Retorna una lista de activos filtrados por costo, límite de costo, ubicación, condición y estatus. Si algún filtro tiene el valor "All", no se aplica. - * tags: - * - Catálogo Activos - * security: - * - BearerAuth: [] - * parameters: - * - in: query - * name: cost - * required: false - * schema: - * type: number - * example: 950.00 - * description: Costo mínimo del activo o costo exacto si no se proporciona `limitCost` - * - in: query - * name: limitCost - * required: false - * schema: - * type: number - * example: 6000 - * description: Costo máximo del activo (usado junto con `cost` para un rango) - * - in: query - * name: location - * required: false - * schema: - * type: string - * example: Aula 4 - * description: Ubicación del activo (ej. "Aula 4", "Laboratorio") - * - in: query - * name: condition - * required: false - * schema: - * type: string - * example: Regular - * description: Condición del activo (ej. "Nuevo", "Regular", "Dañado") - * - in: query - * name: status - * required: false - * schema: - * type: string - * example: Activo - * description: Estado del activo (ej. "Activo", "Inactivo", "All") - * responses: - * 200: - * description: Lista de activos encontrada exitosamente - * content: - * application/json: - * schema: - * type: object - * properties: - * success: - * type: boolean - * example: true - * data: - * type: array - * items: - * type: object - * properties: - * ID: - * type: string - * format: uuid - * Name: - * type: string - * Description: - * type: string - * PurchaseDate: - * type: string - * format: date-time - * Cost: - * type: string - * example: "950.00" - * Location: - * type: string - * Condition: - * type: string - * Status: - * type: string - * LastMaintenanceDate: - * type: string - * format: date-time - * WarrantyEndDate: - * type: string - * format: date-time - * Created: - * type: string - * format: date-time - * Updated: - * type: string - * format: date-time - * message: - * type: string - * example: Consulta realizada correctamente - * metadata: - * type: object - * properties: - * timestamp: - * type: string - * format: date-time - * requestId: - * type: string - * format: uuid - * dataCount: - * type: string - * example: "1" - * 404: - * description: No se encontraron activos con los filtros proporcionados - * 500: - * description: Error interno del servidor - */ - // GET /api/assets/list_of_assets -apiCatAssets.get( - "/", - verificarToken, - listAssetsRateLimiter, - async (request, response, next) => { - try { - const listAssets = request.query; - const result = await GetAllAssets(listAssets); - methodOK(request, response, result); - } catch (error) { - next(error); - } - }, -); - -/** - * @swagger - * /assets/search?: - * get: - * summary: Buscar un activo por su nombre - * description: Retorna la información de uno o varios activos que coincidan parcialmente con el nombre proporcionado. - * tags: - * - Catálogo Activos - * security: - * - BearerAuth: [] - * parameters: - * - in: query - * name: name - * required: true - * schema: - * type: string - * example: Comoda - * description: Nombre (o parte del nombre) del activo a buscar - * responses: - * 200: - * description: Busqueda realizada correctamente - * content: - * application/json: - * schema: - * type: object - * properties: - * success: - * type: boolean - * example: true - * message: - * type: string - * example: Busqueda realizada correctamente - * data: - * type: array - * items: - * type: object - * properties: - * ID: - * type: string - * format: uuid - * example: 11d1b03c-5bbb-11f0-ac03-d843ae0db894 - * Name: - * type: string - * example: Comoda - * Description: - * type: string - * example: Comoda de madera de tres cajones - * PurchaseDate: - * type: string - * format: date-time - * example: 2024-05-10T06:00:00.000Z - * Cost: - * type: string - * example: "50.00" - * Location: - * type: string - * example: Aula 1 - * Condition: - * type: string - * example: Bueno - * Status: - * type: string - * example: Inactivo - * LastMaintenanceDate: - * type: string - * format: date-time - * example: 2024-07-10T06:00:00.000Z - * WarrantyEndDate: - * type: string - * format: date-time - * example: 2026-05-10T06:00:00.000Z - * Created: - * type: string - * format: date-time - * example: 2025-07-08T05:19:06.000Z - * Updated: - * type: string - * format: date-time - * example: 2025-07-08T08:47:13.000Z - * metadata: - * type: object - * properties: - * timestamp: - * type: string - * format: date-time - * requestId: - * type: string - * format: uuid - * dataCount: - * type: string - * example: "1" - * 400: - * description: Debe proporcionar un nombre del activo para buscar - * 404: - * description: No se encontró ningún activo con el nombre proporcionado - * 500: - * description: Error interno del servidor - */ +apiCatAssets.get("/", verificarToken, async (request, response, next) => { + try { + const listAssets = request.query; + const result = await GetAllAssets(listAssets); + methodOK(request, response, result); + } catch (error) { + next(error); + } +}); // GET /api/assets/search -apiCatAssets.get( - "/search", - verificarToken, - searchAssetsRateLimiter, - async (request, response, next) => { - try { - const { name } = request.query; - const result = await SearchOfAssets(name); - methodOK(request, response, result, "Busqueda realizada correctamente"); - } catch (error) { - next(error); - } - }, -); +apiCatAssets.get("/search", verificarToken, async (request, response, next) => { + try { + const { name } = request.query; + const result = await SearchOfAssets(name); + methodOK(request, response, result, "Busqueda realizada correctamente"); + } catch (error) { + next(error); + } +}); // POST /api/assets/create -apiCatAssets.post( - "/", - verificarToken, - createAssetsRateLimiter, - async (request, response, next) => { - try { - const insertAssets = request.body; - const result = await InsertAssets(insertAssets); - methodCreated( - request, - response, - result, - "Se inserto correctamente el activo", - ); - } catch (error) { - next(error); - } - }, -); - -// PUT /api/assets/update/:id -apiCatAssets.put( - "/:id", - verificarToken, - updateAssetsRateLimiter, - async (request, response, next) => { - try { - const assetId = request.params.id; - const assetsData = request.body; - const result = await UpdateAssets(assetId, assetsData); - methodOK( - request, - response, - result, - "El activo se actualizo correctamente", - ); - } catch (error) { - next(error); - } - }, -); +apiCatAssets.post("/", verificarToken, async (request, response, next) => { + try { + const insertAssets = request.body; + const result = await InsertAssets(insertAssets); + methodCreated( + request, + response, + result, + "Se inserto correctamente el activo", + ); + } catch (error) { + next(error); + } +}); // PUT /api/assets/vault/:id apiCatAssets.put( "/vault/:id", verificarToken, - moveToVaultAssetDeletedRateLimit, async (request, response, next) => { try { const assetId = request.params.id; @@ -332,11 +72,22 @@ apiCatAssets.put( }, ); +// PUT /api/assets/update/:id +apiCatAssets.put("/:id", verificarToken, async (request, response, next) => { + try { + const assetId = request.params.id; + const assetsData = request.body; + const result = await UpdateAssets(assetId, assetsData); + methodOK(request, response, result, "El activo se actualizo correctamente"); + } catch (error) { + next(error); + } +}); + //DELETE /api/assets/bulk-delete-assets apiCatAssets.delete( "/bulk", verificarToken, - bulkDeleteAssetsRateLimiter, async (request, response, next) => { try { const { ids } = request.body; @@ -351,24 +102,19 @@ apiCatAssets.delete( ); //DELETE /api/assets/delete/:id -apiCatAssets.delete( - "/:id", - verificarToken, - deleteAssetsRateLimiter, - async (request, response, next) => { - try { - const assetId = request.params.id; - const result = await DeleteAsset(assetId); - methodOK( - request, - response, - result, - "El activo fue eliminado correctamente", - ); - } catch (error) { - next(error); - } - }, -); +apiCatAssets.delete("/:id", verificarToken, async (request, response, next) => { + try { + const assetId = request.params.id; + const result = await DeleteAsset(assetId); + methodOK( + request, + response, + result, + "El activo fue eliminado correctamente", + ); + } catch (error) { + next(error); + } +}); export { apiCatAssets }; From 04fa71afb6ae8407720e6617063472f50020b7b5 Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Sat, 12 Jul 2025 04:16:28 -0600 Subject: [PATCH 06/20] refactor: Mejora en el endpoint de usuarios se estandarizan funciones --- .../users/functions/deleteUser.controllers.js | 14 - .../users/functions/editUser.controllers.js | 6 - .../functions/insertUsers.controllers.js | 14 - .../users/functions/listUsers.controllers.js | 6 - .../users/functions/login.controllers.js | 6 - .../functions/loginGoogle.controllers.js | 6 - .../functions/registerUser.controllers.js | 6 - .../users/functions/searchUser.controllers.js | 6 - .../users/functions/users.controllers.js | 62 ++ src/controllers/users/index.js | 9 +- src/middleware/rateLimitRequest.middleware.js | 18 - src/models/prueba.js | 0 src/routes/google.route.js | 4 +- src/routes/index.js | 4 +- src/routes/users.routes.js | 876 +++--------------- src/services/users/functions/auth.services.js | 8 +- .../users/functions/delete.services.js | 6 +- .../users/functions/register.services.js | 4 +- .../users/functions/update.services.js | 4 +- 19 files changed, 193 insertions(+), 866 deletions(-) delete mode 100644 src/controllers/users/functions/deleteUser.controllers.js delete mode 100644 src/controllers/users/functions/editUser.controllers.js delete mode 100644 src/controllers/users/functions/insertUsers.controllers.js delete mode 100644 src/controllers/users/functions/listUsers.controllers.js delete mode 100644 src/controllers/users/functions/login.controllers.js delete mode 100644 src/controllers/users/functions/loginGoogle.controllers.js delete mode 100644 src/controllers/users/functions/registerUser.controllers.js delete mode 100644 src/controllers/users/functions/searchUser.controllers.js create mode 100644 src/controllers/users/functions/users.controllers.js delete mode 100644 src/models/prueba.js diff --git a/src/controllers/users/functions/deleteUser.controllers.js b/src/controllers/users/functions/deleteUser.controllers.js deleted file mode 100644 index 08c94fe..0000000 --- a/src/controllers/users/functions/deleteUser.controllers.js +++ /dev/null @@ -1,14 +0,0 @@ -import { - deleteUserBulkService, - deleteUserService, -} from "../../../services/users/index.js"; - -export const EliminarUsuario = async (userId) => { - const deletedUser = await deleteUserService(userId); - return deletedUser; -}; - -export const DeleteUserBulk = async (ids) => { - const deleteUserBulk = await deleteUserBulkService(ids); - return deleteUserBulk; -}; diff --git a/src/controllers/users/functions/editUser.controllers.js b/src/controllers/users/functions/editUser.controllers.js deleted file mode 100644 index 38aad60..0000000 --- a/src/controllers/users/functions/editUser.controllers.js +++ /dev/null @@ -1,6 +0,0 @@ -import { updateUserService } from "../../../services/users/index.js"; - -export const EditarUsuario = async (userId, userData) => { - const actualizado = await updateUserService(userId, userData); - return actualizado; -}; diff --git a/src/controllers/users/functions/insertUsers.controllers.js b/src/controllers/users/functions/insertUsers.controllers.js deleted file mode 100644 index 8b7bacb..0000000 --- a/src/controllers/users/functions/insertUsers.controllers.js +++ /dev/null @@ -1,14 +0,0 @@ -import { - insertUserMasiveService, - insertUserService, -} from "../../../services/users/index.js"; - -export const InsertarUsario = async (user) => { - const newuser = await insertUserService(user); - return newuser; -}; - -export const InsertarUsuariosRunnerMasive = async (countInsert) => { - const newUserMasive = await insertUserMasiveService(countInsert); - return newUserMasive; -}; diff --git a/src/controllers/users/functions/listUsers.controllers.js b/src/controllers/users/functions/listUsers.controllers.js deleted file mode 100644 index 3dd50e7..0000000 --- a/src/controllers/users/functions/listUsers.controllers.js +++ /dev/null @@ -1,6 +0,0 @@ -import { listUsersService } from "../../../services/users/index.js"; - -export const ObtenerTodosLosUsuarios = async (listUsers) => { - const result = await listUsersService(listUsers); - return result; -}; diff --git a/src/controllers/users/functions/login.controllers.js b/src/controllers/users/functions/login.controllers.js deleted file mode 100644 index 6d41d51..0000000 --- a/src/controllers/users/functions/login.controllers.js +++ /dev/null @@ -1,6 +0,0 @@ -import { loginService } from "../../../services/users/index.js"; - -export const Login = async (userData) => { - const token = await loginService(userData); - return token; -}; diff --git a/src/controllers/users/functions/loginGoogle.controllers.js b/src/controllers/users/functions/loginGoogle.controllers.js deleted file mode 100644 index 01d3e8a..0000000 --- a/src/controllers/users/functions/loginGoogle.controllers.js +++ /dev/null @@ -1,6 +0,0 @@ -import { loginGoogleService } from "../../../services/users/index.js"; - -export const loginFromGoogle = async (credential) => { - const { responseData, isNewUser } = await loginGoogleService(credential); - return { responseData, isNewUser }; -}; diff --git a/src/controllers/users/functions/registerUser.controllers.js b/src/controllers/users/functions/registerUser.controllers.js deleted file mode 100644 index c0cddce..0000000 --- a/src/controllers/users/functions/registerUser.controllers.js +++ /dev/null @@ -1,6 +0,0 @@ -import { registerUserService } from "../../../services/users/index.js"; - -export const RegistrarUsuario = async (register) => { - const newUser = await registerUserService(register); - return newUser; -}; diff --git a/src/controllers/users/functions/searchUser.controllers.js b/src/controllers/users/functions/searchUser.controllers.js deleted file mode 100644 index d5dbec6..0000000 --- a/src/controllers/users/functions/searchUser.controllers.js +++ /dev/null @@ -1,6 +0,0 @@ -import { searchUserService } from "../../../services/users/index.js"; - -export const BusquedaDeUsuarios = async (email) => { - const resultSearch = await searchUserService(email); - return resultSearch; -}; diff --git a/src/controllers/users/functions/users.controllers.js b/src/controllers/users/functions/users.controllers.js new file mode 100644 index 0000000..7a1703e --- /dev/null +++ b/src/controllers/users/functions/users.controllers.js @@ -0,0 +1,62 @@ +import { + deleteUserBulkService, + deleteUserService, + insertUserMasiveService, + insertUserService, + listUsersService, + loginGoogleService, + loginService, + registerUserService, + searchUserService, + updateUserService, +} from "../../../services/users/index.js"; + +export const GetAllUsers = async (listUsers) => { + const listGetAllUsers = await listUsersService(listUsers); + return listGetAllUsers; +}; + +export const SearchOfUsers = async (email) => { + const searchOfUsers = await searchUserService(email); + return searchOfUsers; +}; + +export const InsertUsers = async (user) => { + const insertUsers = await insertUserService(user); + return insertUsers; +}; + +export const Login = async (userData) => { + const login = await loginService(userData); + return login; +}; + +export const LoginFromGoogle = async (credential) => { + const { responseData, isNewUser } = await loginGoogleService(credential); + return { responseData, isNewUser }; +}; + +export const RegisterUser = async (register) => { + const registerUser = await registerUserService(register); + return registerUser; +}; + +export const InsertUsersMasive = async (countInsert) => { + const insertUserMasive = await insertUserMasiveService(countInsert); + return insertUserMasive; +}; + +export const UpdateUser = async (userId, userData) => { + const updateUser = await updateUserService(userId, userData); + return updateUser; +}; + +export const DeleteUser = async (userId) => { + const deleteUser = await deleteUserService(userId); + return deleteUser; +}; + +export const DeleteUserBulk = async (ids) => { + const deleteUserBulk = await deleteUserBulkService(ids); + return deleteUserBulk; +}; diff --git a/src/controllers/users/index.js b/src/controllers/users/index.js index c73f8fe..ec82edd 100644 --- a/src/controllers/users/index.js +++ b/src/controllers/users/index.js @@ -1,9 +1,2 @@ -export * from "./functions/deleteUser.controllers.js"; -export * from "./functions/editUser.controllers.js"; -export * from "./functions/insertUsers.controllers.js"; -export * from "./functions/listUsers.controllers.js"; -export * from "./functions/login.controllers.js"; -export * from "./functions/loginGoogle.controllers.js"; -export * from "./functions/registerUser.controllers.js"; -export * from "./functions/searchUser.controllers.js"; +export * from "./functions/users.controllers.js"; export * from "./index.js"; diff --git a/src/middleware/rateLimitRequest.middleware.js b/src/middleware/rateLimitRequest.middleware.js index 237059a..51b05df 100644 --- a/src/middleware/rateLimitRequest.middleware.js +++ b/src/middleware/rateLimitRequest.middleware.js @@ -36,21 +36,3 @@ export const normalLimiter = rateLimit({ legacyHeaders: false, keyGenerator: (req) => req.ip, }); - -// Se va a eliminar -export const rateLimitRequest = (time, limit, messageRequest) => { - return rateLimit({ - windowMs: time * 60 * 1000, - limit: limit, - handler: (request, response, next) => { - next({ - statusCode: 429, - message: `${messageRequest}. Inténtelo nuevamente después de ${time} minuto(s).`, - code: "TOO_MANY_REQUESTS", - details: "Has excedido el número máximo de solicitudes permitidas.", - }); - }, - standardHeaders: true, - legacyHeaders: false, - }); -}; diff --git a/src/models/prueba.js b/src/models/prueba.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/routes/google.route.js b/src/routes/google.route.js index da45f0d..506b81c 100644 --- a/src/routes/google.route.js +++ b/src/routes/google.route.js @@ -1,6 +1,6 @@ import express from "express"; -import { loginFromGoogle } from "../controllers/users/index.js"; +import { LoginFromGoogle } from "../controllers/users/index.js"; import { methodCreated, methodOK } from "../server/serverMethods.js"; const apiGoogle = express.Router(); @@ -9,7 +9,7 @@ apiGoogle.post("/auth/google", async (request, response, next) => { try { const { credential } = request.body; - const { responseData, isNewUser } = await loginFromGoogle(credential); + const { responseData, isNewUser } = await LoginFromGoogle(credential); if (isNewUser) { methodCreated(request, response, responseData); } else { diff --git a/src/routes/index.js b/src/routes/index.js index 8b9dcf3..1762c89 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -8,7 +8,7 @@ import { apiMaestros } from "./maestrosRouter.js"; import { apiPadres } from "./padresRouter.js"; import { apiEstudiantes } from "./studentsRouter.js"; import { apiToken } from "./token.routes.js"; -import { apiUsuarios } from "./users.routes.js"; +import { apiUsers } from "./users.routes.js"; const router = express.Router(); @@ -23,7 +23,7 @@ const router = express.Router(); // apiEstudiantes, // ); -router.use("/api/v1/users", apiUsuarios, apiGoogle); +router.use("/api/v1/users", apiUsers, apiGoogle); router.use("/api/v1/token", apiToken); router.use("/api/v1/assets", apiCatAssets); diff --git a/src/routes/users.routes.js b/src/routes/users.routes.js index bfb6e89..c6b955b 100644 --- a/src/routes/users.routes.js +++ b/src/routes/users.routes.js @@ -1,342 +1,64 @@ import express from "express"; import { - BusquedaDeUsuarios, + DeleteUser, DeleteUserBulk, - EditarUsuario, - EliminarUsuario, - InsertarUsario, - InsertarUsuariosRunnerMasive, + GetAllUsers, + InsertUsers, + InsertUsersMasive, Login, - ObtenerTodosLosUsuarios, - RegistrarUsuario, + RegisterUser, + SearchOfUsers, + UpdateUser, } from "../controllers/users/index.js"; -import { - bulkDeleteUserRateLimiter, - createUserRateLimiter, - deleteUserRateLimiter, - listUsersRateLimiter, - loginRateLimiter, - registerUserRateLimiter, - searchUsersRateLimiter, - updateUserRateLimiter, -} from "../helpers/rateLimit/users.rateLimit.js"; import { verificarToken } from "../middleware/verificarToken.middleware.js"; import { methodCreated, methodOK } from "../server/serverMethods.js"; -const apiUsuarios = express.Router(); - -/** - * @swagger - * /users?: - * get: - * summary: Obtener todos los usuarios según filtros opcionales - * description: Retorna una lista de usuarios filtrados por estado, tipo de cuenta y rol. Si algún filtro tiene el valor "All", no se aplica. - * tags: - * - Usuarios - * security: - * - BearerAuth: [] - * parameters: - * - in: query - * name: status - * required: false - * schema: - * type: string - * example: Activo - * description: Estado de la cuenta del usuario (ej. "Activo", "Inactivo", "All") - * - in: query - * name: correo - * required: false - * schema: - * type: string - * example: normal - * description: Tipo de cuenta del usuario (ej. "normal", "google") - * - in: query - * name: rol - * required: false - * schema: - * type: string - * example: admin - * description: Rol del usuario (ej. "user", "admin") - * responses: - * 200: - * description: Lista de usuarios encontrada exitosamente - * content: - * application/json: - * schema: - * type: object - * properties: - * success: - * type: boolean - * example: true - * message: - * type: string - * example: Consulta realizada correctamente - * data: - * type: array - * items: - * type: object - * properties: - * ID: - * type: string - * format: uuid - * NameUser: - * type: string - * Email: - * type: string - * Password: - * type: string - * ProfilePicture: - * type: string - * format: uri - * Role: - * type: string - * AccountType: - * type: string - * LastLogin: - * type: - * format: date-time - * AccountStatus: - * type: string - * Created: - * type: string - * format: date-time - * Updated: - * type: string - * format: date-time - * metadata: - * type: object - * properties: - * timestamp: - * type: string - * format: date-time - * requestId: - * type: string - * format: uuid - * dataCount: - * type: number - * 404: - * description: No se encontraron usuarios con los filtros proporcionados - * 500: - * description: Error interno del servidor - */ - -// GET /api/usuarios/lista de usuarios -apiUsuarios.get( - "/", - verificarToken, - listUsersRateLimiter, - async (request, response, next) => { - try { - const listUsers = request.query; - - const result = await ObtenerTodosLosUsuarios(listUsers); - methodOK(request, response, result); - } catch (error) { - next(error); - } - }, -); +const apiUsers = express.Router(); -/** - * @swagger - * /users/search?: - * get: - * summary: Buscar un usuario por su correo electrónico - * description: Retorna la información de un usuario que coincida parcialmente con el correo proporcionado. - * tags: - * - Usuarios - * security: - * - BearerAuth: [] - * parameters: - * - in: path - * name: email - * required: true - * schema: - * type: string - * example: ejemplo@correo.com - * description: Correo (o parte de él) del usuario a buscar - * responses: - * 200: - * description: Lista de usuarios encontrada exitosamente - * content: - * application/json: - * schema: - * type: object - * properties: - * success: - * type: boolean - * example: true - * message: - * type: string - * example: Consulta realizada correctamente - * data: - * type: array - * items: - * type: object - * properties: - * ID: - * type: string - * format: uuid - * NameUser: - * type: string - * Email: - * type: string - * Password: - * type: string - * ProfilePicture: - * type: string - * format: uri - * Role: - * type: string - * AccountType: - * type: string - * LastLogin: - * type: - * format: date-time - * AccountStatus: - * type: string - * Created: - * type: string - * format: date-time - * Updated: - * type: string - * format: date-time - * metadata: - * type: object - * properties: - * timestamp: - * type: string - * format: date-time - * requestId: - * type: string - * format: uuid - * dataCount: - * type: number - * 400: - * description: El campo de correo es obligatorio para realizar busquedas - * 404: - * description: No se encontraron usuarios con el correo proporcionado - * 500: - * description: Error interno del servidor - */ - -// GET /api/usuarios/buscar -apiUsuarios.get( - "/search", - verificarToken, - searchUsersRateLimiter, - async (request, response, next) => { - try { - const { email } = request.query; - const result = await BusquedaDeUsuarios(email); - methodOK(request, response, result); - } catch (error) { - next(error); - } - }, -); +// GET /api/users/list_of_users +apiUsers.get("/", verificarToken, async (request, response, next) => { + try { + const listUsers = request.query; + const result = await GetAllUsers(listUsers); + methodOK(request, response, result); + } catch (error) { + next(error); + } +}); -/** - * @swagger - * /users: - * post: - * summary: Crear un nuevo usuario - * description: Registra un nuevo usuario con los datos proporcionados. El correo debe ser único. - * tags: - * - Usuarios - * security: - * - BearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - nameUser - * - email - * - password - * - accountStatus - * - role - * properties: - * nameUser: - * type: string - * email: - * type: string - * password: - * type: string - * accountStatus: - * type: string - * role: - * type: string - * responses: - * 201: - * description: Usuario creado exitosamente - * content: - * application/json: - * schema: - * type: object - * properties: - * success: - * type: boolean - * example: true - * message: - * type: string - * example: Recurso creado exitosamente - * data: - * type: array - * items: - * type: object - * properties: - * NameUser: - * type: string - * Email: - * type: string - * Role: - * type: string - * AccountStatus: - * type: string - * metadata: - * type: object - * properties: - * timestamp: - * type: string - * format: date-time - * requestId: - * type: string - * format: uuid - * dataCount: - * type: number - * 400: - * description: Debe de proporcionar todos los campos - * 409: - * description: El correo ya se encuentra registrado - * 500: - * description: Error interno del servidor - */ +// GET /api/users/search +apiUsers.get("/search", verificarToken, async (request, response, next) => { + try { + const { email } = request.query; + const result = await SearchOfUsers(email); + methodOK(request, response, result, "Busqueda realizada correctamente"); + } catch (error) { + next(error); + } +}); -//POST /api/usuarios/crear -apiUsuarios.post( - "/", - verificarToken, - createUserRateLimiter, - async (request, response, next) => { - try { - const user = request.body; - const result = await InsertarUsario(user); - methodCreated(request, response, result); - } catch (error) { - next(error); - } - }, -); +//POST /api/users/create +apiUsers.post("/", verificarToken, async (request, response, next) => { + try { + const insertUser = request.body; + const result = await InsertUsers(insertUser); + methodCreated( + request, + response, + result, + "Se inserto correctamente el usuario", + ); + } catch (error) { + next(error); + } +}); -//POST /api/usuarios/masivo -apiUsuarios.post("/bulk", verificarToken, async (request, response, next) => { +//POST /api/users/masive +apiUsers.post("/bulk", verificarToken, async (request, response, next) => { try { const { countInsert } = request.body; - const result = await InsertarUsuariosRunnerMasive(countInsert); + const result = await InsertUsersMasive(countInsert); methodCreated( request, response, @@ -347,445 +69,77 @@ apiUsuarios.post("/bulk", verificarToken, async (request, response, next) => { } }); -/** - * @swagger - * users/auth/register: - * post: - * summary: Registro de nuevo usuario sin autenticación previa - * description: Registra un nuevo usuario con rol definido. El usuario se crea con estado "Inactivo" y tipo de cuenta "normal". - * tags: - * - Usuarios - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - nameUser - * - email - * - password - * - accountStatus - * - role - * properties: - * nameUser: - * type: string - * email: - * type: string - * password: - * type: string - * accountStatus: - * type: string - * role: - * type: string - * responses: - * 201: - * description: Usuario registrado exitosamente - * content: - * application/json: - * schema: - * type: object - * properties: - * success: - * type: boolean - * example: true - * message: - * type: string - * example: Recurso creado exitosamente - * data: - * type: array - * items: - * type: object - * properties: - * NameUser: - * type: string - * Email: - * type: string - * Role: - * type: string - * AccountStatus: - * type: string - * metadata: - * type: object - * properties: - * timestamp: - * type: string - * format: date-time - * requestId: - * type: string - * format: uuid - * dataCount: - * type: number - * 400: - * description: Debe de proporcionar todos los campos - * 409: - * description: El correo ya se encuentra registrado - * 500: - * description: Error interno del servidor - */ - -//POST /api/usuarios/registro -apiUsuarios.post( - "/auth/register", - registerUserRateLimiter, - async (request, response, next) => { - try { - const register = request.body; - const result = await RegistrarUsuario(register); - methodCreated(request, response, result); - } catch (error) { - next(error); - } - }, -); - -/** - * @swagger - * /auth/login: - * post: - * summary: Iniciar sesión de usuario - * description: Permite a los usuarios iniciar sesión proporcionando su correo electrónico y contraseña. Si las credenciales son correctas, se genera un token de autenticación. Si el usuario está inactivo, se devuelve un error de prohibición. - * tags: - * - Usuarios - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - email - * - password - * properties: - * email: - * type: string - * format: email - * example: usuario@example.com - * description: Correo electrónico del usuario - * password: - * type: string - * format: password - * example: password123 - * description: Contraseña del usuario - * responses: - * 200: - * description: Token generado con éxito, sesión iniciada - * content: - * application/json: - * schema: - * type: object - * properties: - * success: - * type: boolean - * example: true - * data: - * type: string - * description: El token de autenticación JWT - * example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... - * message: - * type: string - * example: Consulta realizada correctamente - * metadata: - * type: object - * properties: - * timestamp: - * type: string - * format: date-time - * requestId: - * type: string - * format: uuid - * dataCount: - * type: string - * example: "1" - * 400: - * description: El correo electrónico o la contraseña no son correctos - * 409: - * description: El correo ya está registrado con Google - * 404: - * description: El usuario no ha podido ser encontrado - * 403: - * description: El usuario está inactivo, pida la reactivación a un administrador - * 500: - * description: Error interno del servidor - */ - -//POST /api/usuarios/auth/login -apiUsuarios.post( - "/auth/login", - loginRateLimiter, - async (request, response, next) => { - try { - const userData = request.body; - const token = await Login(userData); - methodOK(request, response, token); - } catch (error) { - next(error); - } - }, -); - -/** - * @swagger - * /users/{id}: - * put: - * summary: Actualizar datos de un usuario - * description: Actualiza los datos de un usuario existente. Si se proporciona una nueva contraseña, será hasheada y actualizada. Se requiere token de autenticación. - * tags: - * - Usuarios - * security: - * - BearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * format: uuid - * description: ID del usuario a actualizar - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - nameUser - * - email - * - role - * - accountStatus - * properties: - * nameUser: - * type: string - * example: Nmbre de usuario - * email: - * type: string - * format: email - * example: alguienexample@gmail.com - * password: - * type: string - * example: 123456 - * description: Opcional. Si no se envía, la contraseña no se actualiza. - * role: - * type: string - * example: admin - * accountStatus: - * type: string - * example: Activo - * responses: - * 200: - * description: Usuario actualizado exitosamente - * content: - * application/json: - * schema: - * type: object - * properties: - * success: - * type: boolean - * example: true - * message: - * type: string - * example: Consulta realizada correctamente - * data: - * type: boolean - * example: true - * metadata: - * type: object - * properties: - * timestamp: - * type: string - * format: date-time - * requestId: - * type: string - * format: uuid - * dataCount: - * type: number - * 404: - * description: No se proporcionó un ID válido o el usuario no existe - * 409: - * description: El correo ya se encuentra registrado - * 500: - * description: Error interno del servidor - */ - -//PUT /api/usuarios/actualizar/:id -apiUsuarios.put( - "/:id", - verificarToken, - updateUserRateLimiter, - async (request, response, next) => { - try { - const userId = request.params.id; - const userData = request.body; - const result = await EditarUsuario(userId, userData); - methodOK(request, response, result); - } catch (error) { - next(error); - } - }, -); +//POST /api/users/register +apiUsers.post("/auth/register", async (request, response, next) => { + try { + const registerUser = request.body; + const result = await RegisterUser(registerUser); + methodCreated( + request, + response, + result, + "Se registro correctamente el usuario", + ); + } catch (error) { + next(error); + } +}); -/** - * @swagger - * /users/bulk: - * delete: - * summary: Eliminar múltiples usuarios en una sola solicitud - * description: Permite eliminar hasta 600 usuarios en una sola solicitud. Los IDs de los usuarios deben enviarse en un array en el cuerpo de la solicitud. La eliminación se realiza en lotes de 100 usuarios por vez. - * tags: - * - Usuarios - * security: - * - BearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - ids - * properties: - * ids: - * type: array - * description: Lista de IDs de usuarios a eliminar - * items: - * type: string - * format: uuid - * example: - * - 1aa52951-2f05-11f0-9a7d-d843ae0db894 - * - 1ac07b59-2f05-11f0-9a7d-d843ae0db894 - * - 1b30dec6-2f05-11f0-9a7d-d843ae0db894 - * responses: - * 200: - * description: Usuarios eliminados correctamente - * content: - * application/json: - * schema: - * type: object - * properties: - * success: - * type: boolean - * example: true - * message: - * type: string - * example: Consulta realizada correctamente - * data: - * type: object - * properties: - * message: - * type: string - * example: Se eliminaron 3 usuarios correctamente - * metadata: - * type: object - * properties: - * timestamp: - * type: string - * format: date-time - * requestId: - * type: string - * format: uuid - * dataCount: - * type: string - * example: "3" - * 400: - * description: Solicitud inválida. Puede deberse a falta de campos o exceso de IDs - * 413: - * description: El número de IDs enviados supera el límite permitido de 600 - * 500: - * description: Error interno del servidor - */ +//POST /api/users/auth/login +apiUsers.post("/auth/login", async (request, response, next) => { + try { + const userData = request.body; + const token = await Login(userData); + methodOK(request, response, token, "Sesion iniciada correctamente"); + } catch (error) { + next(error); + } +}); -//DELETE /api/usuarios/bulk-delete-users -apiUsuarios.delete( - "/bulk", - verificarToken, - bulkDeleteUserRateLimiter, - async (request, response, next) => { - try { - const { ids } = request.body; - await DeleteUserBulk(ids); - methodOK(request, response, { - message: `Se eliminaron ${request.body.ids.length} usuarios correctamente`, - }); - } catch (error) { - next(error); - } - }, -); +//PUT /api/users/update/:id +apiUsers.put("/:id", verificarToken, async (request, response, next) => { + try { + const userId = request.params.id; + const userData = request.body; + const result = await UpdateUser(userId, userData); + methodOK( + request, + response, + result, + "El usuario se actualizo correctamente", + ); + } catch (error) { + next(error); + } +}); -/** - * @swagger - * /users/{id}: - * delete: - * summary: Eliminar un usuario - * description: Elimina un usuario de la base de datos. Se requiere el ID del usuario como parámetro en la URL. El usuario será eliminado junto con sus registros asociados si existen. - * tags: - * - Usuarios - * security: - * - BearerAuth: [] - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * format: uuid - * example: 5f9c2f4e-1b2a-4c3d-a5b6-7c8d9e0f1a2b - * description: ID del usuario que se desea eliminar. - * responses: - * 200: - * description: Usuario eliminado correctamente - * content: - * application/json: - * schema: - * type: object - * properties: - * success: - * type: boolean - * example: true - * message: - * type: string - * example: Consulta realizada correctamente - * data: - * type: object - * properties: - * message: - * type: string - * example: El usuario Glenna_Cartwright fue eliminado correctamente - * metadata: - * type: object - * properties: - * timestamp: - * type: string - * format: date-time - * requestId: - * type: string - * format: uuid - * dataCount: - * type: string - * example: "1" - * 400: - * description: Debe de proporcionar todos los campos - * 404: - * description: No se proporcionó un ID válido o el usuario no existe - * 500: - * description: Error interno del servidor - */ +//DELETE /api/users/bulk_delete_users +apiUsers.delete("/bulk", verificarToken, async (request, response, next) => { + try { + const { ids } = request.body; + await DeleteUserBulk(ids); + methodOK(request, response, { + message: `Se eliminaron ${request.body.ids.length} usuarios correctamente`, + }); + } catch (error) { + next(error); + } +}); -//DELETE /api/usuarios/eliminar/:id -apiUsuarios.delete( - "/:id", - verificarToken, - deleteUserRateLimiter, - async (request, response, next) => { - try { - const userId = request.params.id; - const result = await EliminarUsuario(userId); - methodOK(request, response, { - message: `El usuario ${result.NameUser} fue eliminado correctamente`, - }); - } catch (error) { - next(error); - } - }, -); +//DELETE /api/users/delete/:id +apiUsers.delete("/:id", verificarToken, async (request, response, next) => { + try { + const userId = request.params.id; + const result = await DeleteUser(userId); + methodOK( + request, + response, + undefined, + `El usuario ${result.NameUser} fue eliminado correctamente`, + ); + } catch (error) { + next(error); + } +}); -export { apiUsuarios }; +export { apiUsers }; diff --git a/src/services/users/functions/auth.services.js b/src/services/users/functions/auth.services.js index 424d5c0..cba47fd 100644 --- a/src/services/users/functions/auth.services.js +++ b/src/services/users/functions/auth.services.js @@ -9,7 +9,7 @@ export const loginService = async ({ email, password }) => { if (!user) { throw { - status: 404, + statusCode: 404, message: "El usuario no ha podidio ser encontrado", code: "USER_NOT_FOUND", details: "No se encontró un usuario con ese correo electrónico", @@ -18,7 +18,7 @@ export const loginService = async ({ email, password }) => { if (user.AccountType === "google") { throw { - status: 409, + statusCode: 409, message: "El correo ya esta registrado con google", code: "GOOGLE_ACCOUNT", details: "El usuario ya se ha registrado con una cuenta de Google", @@ -29,7 +29,7 @@ export const loginService = async ({ email, password }) => { if (!isPasswordValid) { throw { - status: 400, + statusCode: 400, message: "La contraseña es incorrecta o está mal escrita", code: "INCORRECT_PASSWORD", details: "La contraseña proporcionada no coincide con la registrada", @@ -38,7 +38,7 @@ export const loginService = async ({ email, password }) => { if (user.AccountStatus === "Inactivo") { throw { - status: 403, + statusCode: 403, message: "El usuario está inactivo, pida la reactivación a un administrador", code: "USER_INACTIVE", diff --git a/src/services/users/functions/delete.services.js b/src/services/users/functions/delete.services.js index 2375c63..a8167fe 100644 --- a/src/services/users/functions/delete.services.js +++ b/src/services/users/functions/delete.services.js @@ -17,7 +17,7 @@ export const deleteUserService = async (userId) => { const foundUserToEliminated = await validateFoundUserToEliminated(userId); if (foundUserToEliminated.length === 0) { throw { - status: 404, + statusCode: 404, message: "No se proporcionó un ID válido o el usuario no existe", code: "USER_NOT_FOUND", details: "El usuario con el ID proporcionado no fue encontrado", @@ -26,7 +26,7 @@ export const deleteUserService = async (userId) => { const deleteUserFromID = await deleteUser(userId); if (deleteUserFromID.affectedRows === 0) { - throw { status: 500 }; + throw { statusCode: 500 }; } return foundUserToEliminated[0]; @@ -37,7 +37,7 @@ export const deleteUserBulkService = async (ids) => { if (!Array.isArray(ids) || ids.length === 0) { throw { - status: 413, + statusCode: 413, message: `No se pueden eliminar más de ${MAX_IDS} usuarios en una sola solicitud`, code: "OVERLOAD_REQUEST", details: diff --git a/src/services/users/functions/register.services.js b/src/services/users/functions/register.services.js index 8a27901..5e0e220 100644 --- a/src/services/users/functions/register.services.js +++ b/src/services/users/functions/register.services.js @@ -19,7 +19,7 @@ export const registerUserService = async ({ nameUser, email, password }) => { if (existingUser) { throw { - status: 409, + statusCode: 409, message: "El correo ya se encuentra registrado", code: "EMAIL_CONFLICT", details: "El correo proporcionado ya está en uso por otro usuario", @@ -34,7 +34,7 @@ export const registerUserService = async ({ nameUser, email, password }) => { return newUser; } else { throw { - status: 500, + statusCode: 500, message: "Error al registrar el usuario", code: "REGISTRATION_ERROR", details: "No se pudo completar el registro del usuario", diff --git a/src/services/users/functions/update.services.js b/src/services/users/functions/update.services.js index d2c25e5..1483015 100644 --- a/src/services/users/functions/update.services.js +++ b/src/services/users/functions/update.services.js @@ -15,7 +15,7 @@ export const updateUserService = async ( const emailConflict = await findEmailInOtherUser(email, userId); if (emailConflict) { throw { - status: 409, + statusCode: 409, message: "El correo ya se encuentra registrado", code: "EMAIL_CONFLICT", details: "El correo proporcionado ya está en uso por otro usuario", @@ -26,7 +26,7 @@ export const updateUserService = async ( const existingUser = await findUserById(userId); if (!existingUser) { throw { - status: 404, + statusCode: 404, message: "No se proporcionó un ID válido o el usuario no existe", code: "USER_NOT_FOUND", details: "El usuario con el ID proporcionado no fue encontrado", From 88dc5d97f3a1b64933cdc29b606329b9df0304ad Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Sat, 12 Jul 2025 04:53:01 -0600 Subject: [PATCH 07/20] refactor: Cambio de configuraciones para los proccess env --- package.json | 1 - pnpm-lock.yaml | 12 +---- src/__tests__/users/apiCreateUser.test.js | 6 +-- src/__tests__/users/apiDeleteUser.test.js | 6 +-- src/__tests__/users/apiListUsers.test.js | 6 +-- src/__tests__/users/apiRegisterUser.test.js | 6 +-- src/__tests__/users/apiSearchUser.test.js | 6 +-- src/__tests__/users/apiUpdateUser.test.js | 21 ++++---- src/config/config.js | 53 ++++++++++--------- src/config/swaggerConfig.js | 5 +- src/helpers/apiCreateToken.helpers.js | 6 +-- src/helpers/connection.helpers.js | 2 +- src/helpers/jwt.helpers.js | 31 +++-------- src/helpers/jwtGoogle.helpers.js | 20 ++----- src/lib/clientGoogle.lib.js | 9 ++-- src/lib/db.js | 24 +++++++++ src/middleware/errorHandler.middleware.js | 4 +- src/middleware/verificarToken.middleware.js | 6 +-- .../users/functions/authGoogle.services.js | 6 +-- 19 files changed, 102 insertions(+), 128 deletions(-) create mode 100644 src/lib/db.js diff --git a/package.json b/package.json index dddad90..34541e2 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,6 @@ "node": ">=v22.11.0" }, "dependencies": { - "@formkit/tempo": "^0.1.2", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "argon2": "^0.41.1", "cors": "^2.8.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2279508..8c42e19 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,9 +11,6 @@ importers: .: dependencies: - '@formkit/tempo': - specifier: ^0.1.2 - version: 0.1.2 '@trivago/prettier-plugin-sort-imports': specifier: ^4.3.0 version: 4.3.0(prettier@3.6.2) @@ -362,9 +359,6 @@ packages: resolution: {integrity: sha512-OEl393iCOoo/z8bMezRlJu+GlRGlsKbUAN7jKB6LhnKoqKve5DXRpalbItIIcwnCjs1k/FOPjFzcA6Qn+H+YbA==} engines: {node: '>=18.0.0', npm: '>=9.0.0'} - '@formkit/tempo@0.1.2': - resolution: {integrity: sha512-jNPPbjL8oj7hK3eHX++CwbR6X4GKQt+x00/q4yeXkwynXHGKL27dylYhpEgwrmediPP4y7s0XtN1if/M/JYujg==} - '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -3119,8 +3113,6 @@ snapshots: '@faker-js/faker@9.9.0': {} - '@formkit/tempo@0.1.2': {} - '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -4005,7 +3997,7 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.37.5(eslint@9.30.1))(eslint@8.57.1): + eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.37.5(eslint@8.57.1))(eslint@8.57.1): dependencies: eslint: 8.57.1 eslint-plugin-react: 7.37.5(eslint@8.57.1) @@ -5802,7 +5794,7 @@ snapshots: dependencies: eslint: 8.57.1 eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(eslint@9.30.1))(eslint-plugin-n@15.7.0(eslint@9.30.1))(eslint-plugin-promise@6.6.0(eslint@9.30.1))(eslint@8.57.1) - eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.37.5(eslint@9.30.1))(eslint@8.57.1) + eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.37.5(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-import: 2.32.0(eslint@8.57.1) eslint-plugin-n: 15.7.0(eslint@8.57.1) eslint-plugin-promise: 6.6.0(eslint@8.57.1) diff --git a/src/__tests__/users/apiCreateUser.test.js b/src/__tests__/users/apiCreateUser.test.js index 387a9b0..6b21411 100644 --- a/src/__tests__/users/apiCreateUser.test.js +++ b/src/__tests__/users/apiCreateUser.test.js @@ -1,8 +1,6 @@ -require("dotenv").config(); const frisby = require("frisby"); const { createTokenTesting } = require("../../helpers/apiCreateToken.helpers"); - -const BASE_URL = process.env.BASE_URL; +const { config } = require("../../config/config"); describe("✅ Prueba para crear a un nuevo usuario", () => { it("📦 Debe de retornar una respuesta exitosa con los datos del usuario creado con un status 201", async () => { @@ -16,7 +14,7 @@ describe("✅ Prueba para crear a un nuevo usuario", () => { }, }, }) - .post(`${BASE_URL}/users`, { + .post(`${config.docs.baseUrl}/users`, { nameUser: "apiTESTCreate", email: uniqueEmail, password: "123456788u02kljfLK", diff --git a/src/__tests__/users/apiDeleteUser.test.js b/src/__tests__/users/apiDeleteUser.test.js index b1e1860..04ac815 100644 --- a/src/__tests__/users/apiDeleteUser.test.js +++ b/src/__tests__/users/apiDeleteUser.test.js @@ -1,9 +1,7 @@ -require("dotenv").config(); const frisby = require("frisby"); const { createTokenTesting } = require("../../helpers/apiCreateToken.helpers"); const { randomUUID } = require("node:crypto"); - -const BASE_URL = process.env.BASE_URL; +const { config } = require("../../config/config"); describe("✅ Prueba para eliminar un usuario por su id", () => { it("📦 Debe de retornar el mensaje de que el usuario fue eliminado correctamente con un status 200", async () => { @@ -17,7 +15,7 @@ describe("✅ Prueba para eliminar un usuario por su id", () => { }, }, }) - .del(`${BASE_URL}/users/${id}`) + .del(`${config.docs.baseUrl}/users/${id}`) .then((res) => { // console.log("🔎 STATUS:", res.status); // console.log("🔎 RESPONSE:", res.json); diff --git a/src/__tests__/users/apiListUsers.test.js b/src/__tests__/users/apiListUsers.test.js index bd54c04..fc80b87 100644 --- a/src/__tests__/users/apiListUsers.test.js +++ b/src/__tests__/users/apiListUsers.test.js @@ -1,9 +1,7 @@ -require("dotenv").config(); const frisby = require("frisby"); const { createTokenTesting } = require("../../helpers/apiCreateToken.helpers"); const Joi = frisby.Joi; - -const BASE_URL = process.env.BASE_URL; +const { config } = require("../../config/config"); describe("✅ Prueba para la lista de usuarios", () => { it("📦 Debe retornar usuarios activos con un status 200", async () => { @@ -16,7 +14,7 @@ describe("✅ Prueba para la lista de usuarios", () => { }, }, }) - .get(`${BASE_URL}/users?status=Activo&correo=normal&rol=admin`) + .get(`${config.docs.baseUrl}/users?status=Activo&correo=normal&rol=admin`) .then((res) => { // console.log("🔎 STATUS:", res.status); // console.log("🔎 RESPONSE:", res.json); diff --git a/src/__tests__/users/apiRegisterUser.test.js b/src/__tests__/users/apiRegisterUser.test.js index 5c5d594..62001a4 100644 --- a/src/__tests__/users/apiRegisterUser.test.js +++ b/src/__tests__/users/apiRegisterUser.test.js @@ -1,8 +1,6 @@ -require("dotenv").config(); const frisby = require("frisby"); const { createTokenTesting } = require("../../helpers/apiCreateToken.helpers"); - -const BASE_URL = process.env.BASE_URL; +const { config } = require("../../config/config"); describe("✅ Prueba para registrar un usuario", () => { it("📦 Debe de retornar el usuario creado con su cuenta desactivada, retornar el usuario y un status 201", async () => { @@ -16,7 +14,7 @@ describe("✅ Prueba para registrar un usuario", () => { }, }, }) - .post(`${BASE_URL}/users/auth/register`, { + .post(`${config.docs.baseUrl}/users/auth/register`, { nameUser: "apiTESTRegister", email: uniqueEmail, password: "123456788u02kljfLK", diff --git a/src/__tests__/users/apiSearchUser.test.js b/src/__tests__/users/apiSearchUser.test.js index faf3362..2c2f576 100644 --- a/src/__tests__/users/apiSearchUser.test.js +++ b/src/__tests__/users/apiSearchUser.test.js @@ -1,9 +1,7 @@ -require("dotenv").config(); const frisby = require("frisby"); const { createTokenTesting } = require("../../helpers/apiCreateToken.helpers"); const Joi = frisby.Joi; - -const BASE_URL = process.env.BASE_URL; +const { config } = require("../../config/config"); describe("✅ Prueba para buscar un usuario", () => { it("🔡 Debe de retornar el o los objetos encontrados de la busqueda, con un status 200", async () => { @@ -16,7 +14,7 @@ describe("✅ Prueba para buscar un usuario", () => { }, }, }) - .get(`${BASE_URL}/users/search?email=muke7881@gmail.com`) + .get(`${config.docs.baseUrl}/users/search?email=muke7881@gmail.com`) .then((res) => { // console.log("🔎 STATUS:", res.status); // console.log("🔎 RESPONSE:", res.json); diff --git a/src/__tests__/users/apiUpdateUser.test.js b/src/__tests__/users/apiUpdateUser.test.js index 55f46dc..6666113 100644 --- a/src/__tests__/users/apiUpdateUser.test.js +++ b/src/__tests__/users/apiUpdateUser.test.js @@ -1,8 +1,6 @@ -require("dotenv").config(); const frisby = require("frisby"); const { createTokenTesting } = require("../../helpers/apiCreateToken.helpers"); - -const BASE_URL = process.env.BASE_URL; +const { config } = require("../../config/config"); describe("✅ Prueba para actualizar un usuario", () => { it("📦 Debe de retornar un mensaje de exito al actualizar un usuario, con un status 200", async () => { @@ -16,13 +14,16 @@ describe("✅ Prueba para actualizar un usuario", () => { }, }, }) - .put(`${BASE_URL}/users/4901398e-2672-11f0-b8d7-d843ae0db894`, { - nameUser: "Roberta_Rath-Hoppe-Furth", - email: uniqueEmail, - password: "129sdnKLMF@asfd11", - role: "user", - accountStatus: "Inactivo", - }) + .put( + `${config.docs.baseUrl}/users/4901398e-2672-11f0-b8d7-d843ae0db894`, + { + nameUser: "Roberta_Rath-Hoppe-Furth", + email: uniqueEmail, + password: "129sdnKLMF@asfd11", + role: "user", + accountStatus: "Inactivo", + }, + ) .then((res) => { // console.log("🔎 STATUS:", res.status); // console.log("🔎 RESPONSE:", res.json); diff --git a/src/config/config.js b/src/config/config.js index f042dcd..b6054b5 100644 --- a/src/config/config.js +++ b/src/config/config.js @@ -1,31 +1,32 @@ import dotenv from "dotenv"; -import mysql from "mysql2"; dotenv.config(); -// process.loadEnvFile(); - -// Configuracion de la conexion a la base de datos -const dbConnection = { - host: process.env.DB_HOST, - user: process.env.DB_USER, - password: process.env.DB_PASS, - database: process.env.DB_NAME, - connectTimeout: 30000, - waitForConnections: true, - connectionLimit: 100, - queueLimit: 0, +export const config = { + port: process.env.PORT || 4000, + nodeEnv: process.env.NODE_ENV, + db: { + host: process.env.DB_HOST || localhost, + user: process.env.DB_USER, + password: process.env.DB_PASS, + database: process.env.DB_NAME, + runtime: process.env.RUNTIME, + connectTimeout: 30000, + waitForConnections: true, + connectionLimit: 100, + queueLimit: 0, + }, + jwt: { + secret: process.env.JWT_SECRET, + expiresIn: process.env.EXP_TOKEN || "12h", + }, + docs: { + urlDocs: process.env.ENDPOINT_SWAGGER, + baseUrl: process.env.BASE_URL, + }, + authGoogle: { + client: process.env.CLIENT_ID, + secret: process.env.CLIENT_SECRET, + client_google: process.env.CLIENT_ID_GOOGLE, + }, }; - -const pool = mysql.createPool(dbConnection); - -pool.on("connection", (connection) => { - console.log("Conexion exitosa a la basde de datos"); - connection.query("SET SESSION wait_timeout = 28800"); -}); - -pool.on("error", (err) => { - console.error("Error a la conexion de la base de datos", err); -}); - -export { pool }; diff --git a/src/config/swaggerConfig.js b/src/config/swaggerConfig.js index 06a841b..b90e9d5 100644 --- a/src/config/swaggerConfig.js +++ b/src/config/swaggerConfig.js @@ -1,4 +1,3 @@ -import dotenv from "dotenv"; import { dirname, resolve } from "node:path"; import { fileURLToPath } from "node:url"; import swaggerJsdoc from "swagger-jsdoc"; @@ -6,7 +5,7 @@ import { SwaggerTheme, SwaggerThemeNameEnum } from "swagger-themes"; import swaggerUi from "swagger-ui-express"; import YAML from "yamljs"; -dotenv.config(); +import { config } from "../config/config.js"; // Obtener __dirname equivalente en ESM const __filename = fileURLToPath(import.meta.url); @@ -35,7 +34,7 @@ const swaggerDefinition = { ], servers: [ { - url: `${process.env.ENDPOINT_SWAGGER}`, + url: `${config.docs.urlDocs}`, description: "Servidor de desarrollo", }, ], diff --git a/src/helpers/apiCreateToken.helpers.js b/src/helpers/apiCreateToken.helpers.js index 49fd94f..f8cc4c1 100644 --- a/src/helpers/apiCreateToken.helpers.js +++ b/src/helpers/apiCreateToken.helpers.js @@ -1,7 +1,5 @@ -require("dotenv").config(); const jwt = require("jsonwebtoken"); - -const secret = process.env.JWT_SECRET; +const { config } = require("../config/config"); const payload = { id: "4383b114-2672-11f0-b8d7-d843ae0db894", @@ -17,7 +15,7 @@ const payload = { // Token válido por solo 1 minutos const createTokenTesting = () => { - return jwt.sign(payload, secret, { expiresIn: "1h" }); + return jwt.sign(payload, config.jwt.secret, { expiresIn: "1h" }); }; module.exports = { createTokenTesting }; diff --git a/src/helpers/connection.helpers.js b/src/helpers/connection.helpers.js index 76fd95e..b431607 100644 --- a/src/helpers/connection.helpers.js +++ b/src/helpers/connection.helpers.js @@ -1,4 +1,4 @@ -import { pool } from "../config/config.js"; +import { pool } from "../lib/db.js"; export const connectionQuery = (sql, params) => { return new Promise((resolve, reject) => { diff --git a/src/helpers/jwt.helpers.js b/src/helpers/jwt.helpers.js index 4271afb..e6d34ad 100644 --- a/src/helpers/jwt.helpers.js +++ b/src/helpers/jwt.helpers.js @@ -1,19 +1,8 @@ -import { addDay, addHour } from "@formkit/tempo"; -import dotenv from "dotenv"; import jwt from "jsonwebtoken"; -dotenv.config(); - -const secret = process.env.JWT_SECRET; +import { config } from "../config/config.js"; export const createToken = (user) => { - // Duracion de 2 minutos para probar que el toke se expire correctamente - // const expirationDate = addMinute(new Date(), 2); - - const expirationDate = addHour(new Date(), 12); - - const expirationTime = Math.floor(expirationDate.getTime() / 1000); - const payload = { id: user.id, nameUser: user.nameUser, @@ -23,14 +12,14 @@ export const createToken = (user) => { accountType: user.accountType, lastLogin: user.lastLogin, accountStatus: user.accountStatus, - iat: Math.floor(Date.now() / 1000), - exp: expirationTime, }; - return jwt.sign(payload, secret); + return jwt.sign(payload, config.jwt.secret, { + expiresIn: config.jwt.expiresIn, + }); }; export const refreshToken = (token) => { - const decoded = jwt.verify(token, secret); + const decoded = jwt.verify(token, config.jwt.secret); if (decoded.accountStatus === "Inactivo") { throw { @@ -42,10 +31,6 @@ export const refreshToken = (token) => { }; } - const expirationDate = addDay(new Date(), 20); - - const expirationTime = Math.floor(expirationDate.getTime() / 1000); - const payload = { id: decoded.id, nameUser: decoded.nameUser, @@ -55,8 +40,8 @@ export const refreshToken = (token) => { accountType: decoded.accountType, lastLogin: decoded.lastLogin, accountStatus: decoded.accountStatus, - iat: Math.floor(Date.now() / 1000), - exp: expirationTime, }; - return jwt.sign(payload, secret); + return jwt.sign(payload, config.jwt.secret, { + expiresIn: config.jwt.expiresIn, + }); }; diff --git a/src/helpers/jwtGoogle.helpers.js b/src/helpers/jwtGoogle.helpers.js index 301124d..0609685 100644 --- a/src/helpers/jwtGoogle.helpers.js +++ b/src/helpers/jwtGoogle.helpers.js @@ -1,19 +1,8 @@ -import { addHour } from "@formkit/tempo"; -import dotenv from "dotenv"; import jwt from "jsonwebtoken"; -dotenv.config(); - -const secret = process.env.JWT_SECRET; +import { config } from "../config/config.js"; export const createTokenGoogle = (user) => { - // Duracion de 2 minutos para probar que el toke se expire correctamente - // const expirationDate = addMinute(new Date(), 2); - - const expirationDate = addHour(new Date(), 12); - - const expirationTime = Math.floor(expirationDate.getTime() / 1000); - const payload = { id: user.ID, nameUser: user.NameUser, @@ -23,8 +12,9 @@ export const createTokenGoogle = (user) => { accountType: user.AccountType, lastLogin: user.LastLogin, accountStatus: user.AccountStatus, - iat: Math.floor(Date.now() / 1000), - exp: expirationTime, }; - return jwt.sign(payload, secret); + + return jwt.sign(payload, config.jwt.secret, { + expiresIn: config.jwt.expiresIn, + }); }; diff --git a/src/lib/clientGoogle.lib.js b/src/lib/clientGoogle.lib.js index b80e3f9..c184c3d 100644 --- a/src/lib/clientGoogle.lib.js +++ b/src/lib/clientGoogle.lib.js @@ -1,14 +1,11 @@ -import dotenv from "dotenv"; import { OAuth2Client } from "google-auth-library"; -dotenv.config(); +import { config } from "../config/config.js"; -const CLIENT_ID = process.env.CLIENT_ID_GOOGLE; - -if (!CLIENT_ID) { +if (!config.authGoogle.client_google) { console.error("FATAL ERROR: GOOGLE_CLIENT_ID is not defined."); process.exit(1); } // Instanciar el cliente de OAuth de Google -export const googleClient = new OAuth2Client(CLIENT_ID); +export const googleClient = new OAuth2Client(config.authGoogle.client_google); diff --git a/src/lib/db.js b/src/lib/db.js new file mode 100644 index 0000000..532b679 --- /dev/null +++ b/src/lib/db.js @@ -0,0 +1,24 @@ +import mysql from "mysql2"; + +import { config } from "../config/config.js"; + +// Configuracion de la conexion a la base de datos +export const pool = mysql.createPool({ + host: config.db.host, + user: config.db.user, + password: config.db.password, + database: config.db.database, + connectTimeout: config.db.connectTimeout, + waitForConnections: config.db.waitForConnections, + connectionLimit: config.db.connectionLimit, + queueLimit: config.db.queueLimit, +}); + +pool.on("connection", (connection) => { + console.log("Conexion exitosa a la basde de datos"); + connection.query("SET SESSION wait_timeout = 28800"); +}); + +pool.on("error", (err) => { + console.error("Error a la conexion de la base de datos", err); +}); diff --git a/src/middleware/errorHandler.middleware.js b/src/middleware/errorHandler.middleware.js index 971deba..1ecbe9e 100644 --- a/src/middleware/errorHandler.middleware.js +++ b/src/middleware/errorHandler.middleware.js @@ -1,5 +1,7 @@ import crypto from "node:crypto"; +import { config } from "../config/config.js"; + export const errorHandler = (err, request, response, next) => { const status = err.statusCode || 500; const timestamp = new Date().toISOString(); @@ -14,7 +16,7 @@ export const errorHandler = (err, request, response, next) => { "Ocurrió un problema en el servidor. Por favor, intenta más tarde.", timestamp, errorId, - stack: process.env.NODE_ENV === "production" ? undefined : err.stack, + stack: config.nodeEnv === "production" ? undefined : err.stack, path: request.originalUrl, method: request.method, query: request.query, diff --git a/src/middleware/verificarToken.middleware.js b/src/middleware/verificarToken.middleware.js index 7314698..da69d38 100644 --- a/src/middleware/verificarToken.middleware.js +++ b/src/middleware/verificarToken.middleware.js @@ -1,7 +1,6 @@ -import dotenv from "dotenv"; import jwt from "jsonwebtoken"; -dotenv.config(); +import { config } from "../config/config.js"; export const verificarToken = (request, response, next) => { const token = request.header("Authorization"); @@ -28,8 +27,7 @@ export const verificarToken = (request, response, next) => { } try { - const secretKey = process.env.JWT_SECRET; - const decoded = jwt.verify(bearerToken, secretKey); + const decoded = jwt.verify(bearerToken, config.jwt.secret); request.usuario = decoded; next(); } catch (error) { diff --git a/src/services/users/functions/authGoogle.services.js b/src/services/users/functions/authGoogle.services.js index 33d5ff6..8b63c57 100644 --- a/src/services/users/functions/authGoogle.services.js +++ b/src/services/users/functions/authGoogle.services.js @@ -1,6 +1,6 @@ -import dotenv from "dotenv"; import crypto from "node:crypto"; +import { config } from "../../../config/config.js"; import { createTokenGoogle } from "../../../helpers/jwtGoogle.helpers.js"; import { lastLogin } from "../../../helpers/userLastLogin.helpers.js"; import { googleClient } from "../../../lib/clientGoogle.lib.js"; @@ -10,8 +10,6 @@ import { getRecoveryUserById, } from "../../../models/users/index.js"; -dotenv.config(); - export const loginGoogleService = async (credential) => { if (!credential) { throw { @@ -24,7 +22,7 @@ export const loginGoogleService = async (credential) => { const ticket = await googleClient.verifyIdToken({ idToken: credential, - audience: process.env.CLIENT_ID_GOOGLE, + audience: config.authGoogle.client_google, }); const payload = ticket.getPayload(); From 773fa5aef7814db12759667481919b561146a0da Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Sat, 12 Jul 2025 05:01:10 -0600 Subject: [PATCH 08/20] fix: Cambio de lowerCase a UpperCase para el query de eliminar usuarios --- src/models/users/functions/delete.models.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/models/users/functions/delete.models.js b/src/models/users/functions/delete.models.js index d071f75..9b374de 100644 --- a/src/models/users/functions/delete.models.js +++ b/src/models/users/functions/delete.models.js @@ -1,18 +1,18 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const validateFoundUserToEliminated = async (userId) => { - const query = `SELECT NameUser FROM users WHERE id = ?`; + const query = `SELECT NameUser FROM users WHERE ID = ?`; const params = [userId]; return await connectionQuery(query, params); }; export const deleteUser = async (userId) => { - const query = `DELETE FROM users WHERE id = ?`; + const query = `DELETE FROM users WHERE ID = ?`; const params = [userId]; return await connectionQuery(query, params); }; export const deleteUserBulk = async (placeholders, batch) => { - const query = `DELETE FROM users WHERE id IN (${placeholders})`; + const query = `DELETE FROM users WHERE ID IN (${placeholders})`; return await connectionQuery(query, batch); }; From 7a722c5684c3a4704bb5558724827d51b71b3160 Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Sat, 12 Jul 2025 05:11:52 -0600 Subject: [PATCH 09/20] docs(simplify): Se asignan tareas y se quita docuemntacion inecesaria --- NOTES.md | 10 ++++-- src/routes/token.routes.js | 65 ++------------------------------------ 2 files changed, 10 insertions(+), 65 deletions(-) diff --git a/NOTES.md b/NOTES.md index b535dec..9bb46a5 100644 --- a/NOTES.md +++ b/NOTES.md @@ -2,9 +2,15 @@ ## Cambios importantes -- Hacer la modularizacion de los usuairos para que trabaje con services y models y controllers +- Hacer el cambio para el catalgo de inventarios por medio de la modularizacionm de funciones +- Hacer el cambio para el catalogo de insumos por medio de la modularizacionm de funciones +- Verificar las funciones de la carpeta helpers para poder reutilizar unas funciones +(sobre todo la de cuando se elimina un registro como el de usuarios en su modelo, esto aplica para todas las tablas) +- Verificar testeos del catalogo de activos y de usuarios juntos y hacerlos +- Busar una forma mas segura de pasarle el token a los test +- Probar la funcion de token para el refresco del mismo, y hacer la docuemntacion en postman +- Excluir por aparte el controlador de google para el login, y tenerlo aparte (Sacarlo de los usuario y que tenga su propio espacio) ## Cambios que se puedan ir haciendo -- Hacer la documentacion en postman para posteriormente publicarla - Ir adecuando el codigo poco a poco el codigo en ingles diff --git a/src/routes/token.routes.js b/src/routes/token.routes.js index 81bf9f6..902cfa6 100644 --- a/src/routes/token.routes.js +++ b/src/routes/token.routes.js @@ -6,73 +6,12 @@ import { methodOK } from "../server/serverMethods.js"; const apiToken = express.Router(); -/** - * @swagger - * /token/refresh: - * post: - * summary: Refresca el token de sesión - * description: Genera un nuevo token de acceso si el token anterior es válido y aún no ha expirado. Se recomienda usar este endpoint desde el frontend cuando el token está por expirar. - * tags: - * - Token - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - token - * properties: - * token: - * type: string - * description: Token de acceso actual que está por expirar. - * example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... - * responses: - * 200: - * description: Token actualizado exitosamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * success: - * type: boolean - * example: true - * message: - * type: string - * example: Consulta realizada correctamente - * data: - * type: string - * description: Nuevo token generado - * example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... - * metadata: - * type: object - * properties: - * timestamp: - * type: string - * format: date-time - * example: 2025-07-04T08:06:58.280Z - * requestId: - * type: string - * format: uuid - * example: baeea511-fa16-437a-a122-b99a35f76bd8 - * dataCount: - * type: string - * example: "1" - * 403: - * description: El usuario está inactivo. Por favor contacte al administrador. - * 500: - * description: Error interno del servidor. - */ - //POST /api/token/refresh apiToken.post("/refresh", verificarToken, async (request, response, next) => { try { const { token } = request.body; - console.log(token); - const newToken = await RefreshToken(token); - console.log(newToken); - methodOK(request, response, newToken); + const refreshToken = await RefreshToken(token); + methodOK(request, response, refreshToken); } catch (error) { next(error); } From 383ce27ce4b82552cbba9bf7503762ddd1f85d7e Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Sun, 13 Jul 2025 05:20:16 -0600 Subject: [PATCH 10/20] feat(inventories): Se modulariza el endpoint completo de inventarios --- NOTES.md | 3 +- .../functions/inventory.controllers.js | 47 ++ src/controllers/inventory/index.js | 2 + src/helpers/jwt.helpers.js | 4 +- src/helpers/rateLimit/assets.rateLimit.js | 46 -- src/helpers/rateLimit/users.rateLimit.js | 46 -- .../inventory/functions/delete.models.js | 12 + .../inventory/functions/insert.models.js | 32 ++ src/models/inventory/functions/list.models.js | 6 + .../inventory/functions/update.models.js | 35 ++ .../inventory/functions/vault.models.js | 7 + src/models/inventory/index.js | 6 + src/routes/catInventarioRouter.js | 501 ------------------ src/routes/catInventory.routes.js | 133 +++++ src/routes/index.js | 14 +- .../inventory/functions/delete.services.js | 59 +++ .../inventory/functions/insert.services.js | 35 ++ .../inventory/functions/list.services.js | 56 ++ .../inventory/functions/search.services.js | 31 ++ .../inventory/functions/update.services.js | 5 + .../inventory/functions/vault.services.js | 5 + src/services/inventory/index.js | 7 + src/services/prueba.js | 0 23 files changed, 484 insertions(+), 608 deletions(-) create mode 100644 src/controllers/inventory/functions/inventory.controllers.js create mode 100644 src/controllers/inventory/index.js delete mode 100644 src/helpers/rateLimit/assets.rateLimit.js delete mode 100644 src/helpers/rateLimit/users.rateLimit.js create mode 100644 src/models/inventory/functions/delete.models.js create mode 100644 src/models/inventory/functions/insert.models.js create mode 100644 src/models/inventory/functions/list.models.js create mode 100644 src/models/inventory/functions/update.models.js create mode 100644 src/models/inventory/functions/vault.models.js create mode 100644 src/models/inventory/index.js delete mode 100644 src/routes/catInventarioRouter.js create mode 100644 src/routes/catInventory.routes.js create mode 100644 src/services/inventory/functions/delete.services.js create mode 100644 src/services/inventory/functions/insert.services.js create mode 100644 src/services/inventory/functions/list.services.js create mode 100644 src/services/inventory/functions/search.services.js create mode 100644 src/services/inventory/functions/update.services.js create mode 100644 src/services/inventory/functions/vault.services.js create mode 100644 src/services/inventory/index.js delete mode 100644 src/services/prueba.js diff --git a/NOTES.md b/NOTES.md index 9bb46a5..61d0070 100644 --- a/NOTES.md +++ b/NOTES.md @@ -2,8 +2,9 @@ ## Cambios importantes -- Hacer el cambio para el catalgo de inventarios por medio de la modularizacionm de funciones - Hacer el cambio para el catalogo de insumos por medio de la modularizacionm de funciones +- Hacer un catalogo de Aulas +- Hacer un catalogo de condicion (Bueno, Regular, Excelente, Nuevo para reutilizar registros en vez de crear neuevos o con id referenciarlos) - Verificar las funciones de la carpeta helpers para poder reutilizar unas funciones (sobre todo la de cuando se elimina un registro como el de usuarios en su modelo, esto aplica para todas las tablas) - Verificar testeos del catalogo de activos y de usuarios juntos y hacerlos diff --git a/src/controllers/inventory/functions/inventory.controllers.js b/src/controllers/inventory/functions/inventory.controllers.js new file mode 100644 index 0000000..330c5a1 --- /dev/null +++ b/src/controllers/inventory/functions/inventory.controllers.js @@ -0,0 +1,47 @@ +import { + deleteInventoryBulkService, + deleteInventoryService, + insertInventoryService, + listInventoryService, + moveVaulInventoryService, + searchInventoryService, + updateInventoryService, +} from "../../../services/inventory/index.js"; + +export const GetAllInventories = async (listInventories) => { + const listGetAllInvetories = await listInventoryService(listInventories); + return listGetAllInvetories; +}; + +export const SearchOfInventories = async (name) => { + const searchOfInventories = await searchInventoryService(name); + return searchOfInventories; +}; + +export const InsertInventories = async (inventory) => { + const insertInventories = await insertInventoryService(inventory); + return insertInventories; +}; + +export const UpdateInventories = async (inventoryId, inventoryData) => { + const updateInventories = await updateInventoryService( + inventoryId, + inventoryData, + ); + return updateInventories; +}; + +export const MoveToVaultInventoryDeleted = async (inventoryId) => { + const moveToVaultInventory = await moveVaulInventoryService(inventoryId); + return moveToVaultInventory; +}; + +export const DeleteInventory = async (inventoryId) => { + const deleteInventory = await deleteInventoryService(inventoryId); + return deleteInventory; +}; + +export const DeleteInventoriesBulk = async (ids) => { + const deleteInventoriesBulk = await deleteInventoryBulkService(ids); + return deleteInventoriesBulk; +}; diff --git a/src/controllers/inventory/index.js b/src/controllers/inventory/index.js new file mode 100644 index 0000000..d4e68d3 --- /dev/null +++ b/src/controllers/inventory/index.js @@ -0,0 +1,2 @@ +export * from "./functions/inventory.controllers.js"; +export * from "./index.js"; diff --git a/src/helpers/jwt.helpers.js b/src/helpers/jwt.helpers.js index e6d34ad..9589fc2 100644 --- a/src/helpers/jwt.helpers.js +++ b/src/helpers/jwt.helpers.js @@ -14,7 +14,7 @@ export const createToken = (user) => { accountStatus: user.accountStatus, }; return jwt.sign(payload, config.jwt.secret, { - expiresIn: config.jwt.expiresIn, + expiresIn: `${config.jwt.expiresIn}h`, }); }; @@ -42,6 +42,6 @@ export const refreshToken = (token) => { accountStatus: decoded.accountStatus, }; return jwt.sign(payload, config.jwt.secret, { - expiresIn: config.jwt.expiresIn, + expiresIn: `${config.jwt.expiresIn}h`, }); }; diff --git a/src/helpers/rateLimit/assets.rateLimit.js b/src/helpers/rateLimit/assets.rateLimit.js deleted file mode 100644 index 6c71650..0000000 --- a/src/helpers/rateLimit/assets.rateLimit.js +++ /dev/null @@ -1,46 +0,0 @@ -// import { rateLimitRequest } from "../../middleware/rateLimitRequest.middleware.js"; - -// // Example -// // rateLimitRequest(time to try again, limit each IP request per windows, messageRequest response) - -// export const listAssetsRateLimiter = rateLimitRequest( -// 60, -// 1000, -// "Demasiadas peticiones para traer la lista de activos,", -// ); - -// export const searchAssetsRateLimiter = rateLimitRequest( -// 15, -// 300, -// "Demasiadas búsquedas de activos desde esta IP, ", -// ); - -// export const createAssetsRateLimiter = rateLimitRequest( -// 60, -// 50, -// "Límite de creación de activos alcanzado, ", -// ); - -// export const updateAssetsRateLimiter = rateLimitRequest( -// 60, -// 100, -// "Demasiadas actualizaciones de activos desde esta IP, ", -// ); - -// export const moveToVaultAssetDeletedRateLimit = rateLimitRequest( -// 60, -// 100, -// "Demasiadas peticiones para el envio a la boveda, ", -// ); - -// export const deleteAssetsRateLimiter = rateLimitRequest( -// 60, -// 50, -// "Límite de eliminación de activos alcanzado, ", -// ); - -// export const bulkDeleteAssetsRateLimiter = rateLimitRequest( -// 60, -// 10, -// "Demasiadas eliminaciones masivas en corto tiempo, ", -// ); diff --git a/src/helpers/rateLimit/users.rateLimit.js b/src/helpers/rateLimit/users.rateLimit.js deleted file mode 100644 index 4388d1c..0000000 --- a/src/helpers/rateLimit/users.rateLimit.js +++ /dev/null @@ -1,46 +0,0 @@ -import { rateLimitRequest } from "../../middleware/rateLimitRequest.middleware.js"; - -// Example -// rateLimitRequest(time to try again, limit each IP request per windows, messageRequest response) - -export const loginRateLimiter = rateLimitRequest( - 5, - 5, - "Demasiados intentos de inicio de sesión desde esta IP,", -); - -export const listUsersRateLimiter = rateLimitRequest( - 60, - 1000, - "Demasiadas peticiones para traer la lista de usuarios,", -); -export const searchUsersRateLimiter = rateLimitRequest( - 15, - 300, - "Demasiadas búsquedas de usuarios desde esta IP, ", -); -export const createUserRateLimiter = rateLimitRequest( - 60, - 50, - "Límite de creación de usuarios alcanzado, ", -); -export const registerUserRateLimiter = rateLimitRequest( - 60, - 3, - "Demasiadas solicitudes de registro desde esta IP, ", -); -export const updateUserRateLimiter = rateLimitRequest( - 60, - 100, - "Demasiadas actualizaciones de usuarios desde esta IP, ", -); -export const deleteUserRateLimiter = rateLimitRequest( - 60, - 50, - "Límite de eliminación de usuarios alcanzado, ", -); -export const bulkDeleteUserRateLimiter = rateLimitRequest( - 60, - 10, - "Demasiadas eliminaciones masivas en corto tiempo, ", -); diff --git a/src/models/inventory/functions/delete.models.js b/src/models/inventory/functions/delete.models.js new file mode 100644 index 0000000..a9bf064 --- /dev/null +++ b/src/models/inventory/functions/delete.models.js @@ -0,0 +1,12 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const deleteInventoryModel = async (inventoryId) => { + const query = `DELETE FROM catinventory WHERE ID = ?`; + const params = [inventoryId]; + return await connectionQuery(query, params); +}; + +export const deleteInventoryBulk = async (placeholders, batch) => { + const query = `DELETE FROM catinventory WHERE ID IN (${placeholders})`; + return await connectionQuery(query, batch); +}; diff --git a/src/models/inventory/functions/insert.models.js b/src/models/inventory/functions/insert.models.js new file mode 100644 index 0000000..6b60aa5 --- /dev/null +++ b/src/models/inventory/functions/insert.models.js @@ -0,0 +1,32 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const insertInventoryModel = async ({ + itemCode, + name, + description, + quantity, + weight, + width, + height, + location, + condition, + purchaseDate, +}) => { + const query = `INSERT INTO catinventory (ID, ItemCode, Name, Description, Quantity, Weight, Width, Height, Location, \`Condition\`, PurchaseDate) + VALUES (UUID(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);`; + + const params = [ + itemCode, + name, + description, + quantity, + weight, + width, + height, + location, + condition, + purchaseDate, + ]; + + return await connectionQuery(query, params); +}; diff --git a/src/models/inventory/functions/list.models.js b/src/models/inventory/functions/list.models.js new file mode 100644 index 0000000..b98f0a0 --- /dev/null +++ b/src/models/inventory/functions/list.models.js @@ -0,0 +1,6 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const listInventoryModel = async (query, params) => { + const result = await connectionQuery(query, params); + return result; +}; diff --git a/src/models/inventory/functions/update.models.js b/src/models/inventory/functions/update.models.js new file mode 100644 index 0000000..55aed4c --- /dev/null +++ b/src/models/inventory/functions/update.models.js @@ -0,0 +1,35 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const updateInventoryModel = async ( + inventoryId, + { + itemCode, + name, + description, + quantity, + weight, + width, + height, + location, + condition, + purchaseDate, + status, + }, +) => { + const query = `UPDATE catinventory SET ItemCode = ?, Name = ?, Description = ?, Quantity = ?, Weight = ?, Width = ?, Height = ?, Location = ?, \`Condition\` = ?, PurchaseDate = ?, Status = ? WHERE ID = ?`; + const params = [ + itemCode, + name, + description, + quantity, + weight, + width, + height, + location, + condition, + purchaseDate, + status, + inventoryId, + ]; + return await connectionQuery(query, params); +}; diff --git a/src/models/inventory/functions/vault.models.js b/src/models/inventory/functions/vault.models.js new file mode 100644 index 0000000..6ba822f --- /dev/null +++ b/src/models/inventory/functions/vault.models.js @@ -0,0 +1,7 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const vaultInventoryModel = async (inventoryId) => { + const query = `UPDATE catinventory SET Status = 'Inactivo' WHERE ID = ?`; + const params = [inventoryId]; + await connectionQuery(query, params); +}; diff --git a/src/models/inventory/index.js b/src/models/inventory/index.js new file mode 100644 index 0000000..421b316 --- /dev/null +++ b/src/models/inventory/index.js @@ -0,0 +1,6 @@ +export * from "./functions/delete.models.js"; +export * from "./functions/insert.models.js"; +export * from "./functions/list.models.js"; +export * from "./functions/update.models.js"; +export * from "./functions/vault.models.js"; +export * from "./index.js"; diff --git a/src/routes/catInventarioRouter.js b/src/routes/catInventarioRouter.js deleted file mode 100644 index bb24775..0000000 --- a/src/routes/catInventarioRouter.js +++ /dev/null @@ -1,501 +0,0 @@ -import express from "express"; - -import CatInventarioControllers from "../controllers/catInventarioControllers.js"; -import { verificarToken } from "../middleware/verificarToken.middleware.js"; - -const apiCatInventario = express.Router(); - -/** - * @swagger - * /lista-inventario: - * get: - * summary: Obtiene la lista completa del inventario activo - * description: Recupera todos los elementos en el inventario cuyo estado es "Activo". - * tags: - * - Catálogo Inventario - * responses: - * 200: - * description: Lista completa del inventario activo obtenida exitosamente. - * content: - * application/json: - * schema: - * type: array - * items: - * type: object - * properties: - * ID: - * type: string - * example: "123e4567-e89b-12d3-a456-426614174000" - * itemCode: - * type: string - * example: "A1001" - * name: - * type: string - * example: "Laptop Dell" - * description: - * type: string - * example: "Laptop de 15 pulgadas" - * quantity: - * type: integer - * example: 10 - * weight: - * type: number - * format: float - * example: 2.5 - * width: - * type: number - * format: float - * example: 35.0 - * height: - * type: number - * format: float - * example: 24.0 - * location: - * type: string - * example: "Depósito principal" - * condition: - * type: string - * example: "Nuevo" - * purchaseDate: - * type: string - * format: date - * example: "2022-05-15" - * status: - * type: string - * example: "Activo" - * 404: - * description: No se encontró inventario activo. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "No se encontró inventario activo." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInventario.get( - "/lista-inventario", - verificarToken, - CatInventarioControllers.ObtenerTodoElInnventario, -); - -/** - * @swagger - * /lista-inventario-desuso: - * get: - * summary: Obtiene la lista de inventario en desuso - * description: Recupera todos los elementos en el inventario cuyo estado es "Inactivo". - * tags: - * - Catálogo Inventario - * responses: - * 200: - * description: Lista de inventario en desuso obtenida exitosamente. - * content: - * application/json: - * schema: - * type: array - * items: - * type: object - * properties: - * ID: - * type: string - * example: "123e4567-e89b-12d3-a456-426614174000" - * itemCode: - * type: string - * example: "B2002" - * name: - * type: string - * example: "Monitor Samsung" - * description: - * type: string - * example: "Monitor de 24 pulgadas" - * quantity: - * type: integer - * example: 5 - * weight: - * type: number - * format: float - * example: 3.2 - * width: - * type: number - * format: float - * example: 54.6 - * height: - * type: number - * format: float - * example: 32.1 - * location: - * type: string - * example: "Oficina 3" - * condition: - * type: string - * example: "Usado" - * purchaseDate: - * type: string - * format: date - * example: "2021-08-10" - * status: - * type: string - * example: "Inactivo" - * 404: - * description: No se encontró inventario en desuso. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "No se encontró inventario en desuso." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInventario.get( - "/lista-inventario-desuso", - verificarToken, - CatInventarioControllers.ObtenerInventarioDesuso, -); - -/** - * @swagger - * /agregar-inventario: - * post: - * summary: Agrega un nuevo registro al inventario - * description: Crea un nuevo activo en el inventario con los datos proporcionados en el cuerpo de la solicitud. - * tags: - * - Catálogo Inventario - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * itemCode: - * type: string - * example: "B2002" - * name: - * type: string - * example: "Monitor Samsung" - * description: - * type: string - * example: "Monitor de 24 pulgadas" - * quantity: - * type: integer - * example: 5 - * weight: - * type: number - * format: float - * example: 3.2 - * width: - * type: number - * format: float - * example: 54.6 - * height: - * type: number - * format: float - * example: 32.1 - * location: - * type: string - * example: "Oficina 3" - * condition: - * type: string - * example: "Nuevo" - * purchaseDate: - * type: string - * format: date - * example: "2023-08-10" - * responses: - * 201: - * description: Recurso creado exitosamente en el inventario. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "El recurso fue agregado al inventario correctamente." - * 400: - * description: Datos faltantes o incorrectos en la solicitud. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Método incorrecto." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInventario.post( - "/agregar-inventario", - verificarToken, - CatInventarioControllers.InsertarInventario, -); - -/** - * @swagger - * /actualizar-inventario: - * put: - * summary: Actualiza un registro de inventario existente - * description: Modifica la información de un activo en el inventario especificado por su ID en el cuerpo de la solicitud. - * tags: - * - Catálogo Inventario - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * itemCode: - * type: string - * example: "A1001" - * name: - * type: string - * example: "Laptop Dell" - * description: - * type: string - * example: "Laptop para oficina" - * quantity: - * type: integer - * example: 10 - * weight: - * type: number - * format: float - * example: 2.5 - * width: - * type: number - * format: float - * example: 35.6 - * height: - * type: number - * format: float - * example: 23.4 - * location: - * type: string - * example: "Almacén A" - * condition: - * type: string - * example: "Nuevo" - * purchaseDate: - * type: string - * format: date - * example: "2023-05-15" - * status: - * type: string - * example: "Activo" - * id: - * type: integer - * example: 1 - * responses: - * 200: - * description: Recurso actualizado correctamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "El recurso fue actualizado correctamente." - * 404: - * description: Recurso no encontrado para actualizar. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "No se encontró el recurso para actualizar." - * 400: - * description: Solicitud incorrecta, datos incompletos o incorrectos. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Método incorrecto." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInventario.put( - "/actualizar-inventario", - verificarToken, - CatInventarioControllers.EditarInventario, -); - -/** - * @swagger - * /borrar-inventario-boveda/{id}: - * put: - * summary: Mueve un activo a la bóveda de eliminados - * description: Cambia el estado de un activo en `catinventory` a "Inactivo" utilizando su `ID`. - * tags: - * - Catálogo Inventario - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: integer - * example: 1 - * description: ID del activo que se desea mover a la bóveda. - * responses: - * 200: - * description: Recurso movido a la bóveda correctamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "El recurso fue mandado a la boveda correctamente." - * 404: - * description: Activo no encontrado. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Recurso no encontrado." - * 400: - * description: Solicitud incorrecta, falta el ID. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Método incorrecto." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInventario.put( - "/borrar-inventario-boveda/:id", - verificarToken, - CatInventarioControllers.MoverABovedaEliminados, -); - -/** - * @swagger - * /eliminar-inventario/{id}: - * delete: - * summary: Elimina un elemento del inventario - * description: Elimina un elemento específico del inventario mediante su ID. - * tags: - * - Catálogo Inventario - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: ID del elemento de inventario a eliminar - * responses: - * 200: - * description: El recurso fue eliminado correctamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "El recurso fue eliminado correctamente." - * 404: - * description: No se encontró el recurso para eliminar. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "No se encontró el recurso para eliminar." - * 400: - * description: ID no válido o faltante en la solicitud. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "ID inválido o no proporcionado." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInventario.delete( - "/eliminar-inventario/:id", - verificarToken, - CatInventarioControllers.EliminarInventario, -); - -export { apiCatInventario }; diff --git a/src/routes/catInventory.routes.js b/src/routes/catInventory.routes.js new file mode 100644 index 0000000..85f1b33 --- /dev/null +++ b/src/routes/catInventory.routes.js @@ -0,0 +1,133 @@ +import express from "express"; + +import { + DeleteInventoriesBulk, + DeleteInventory, + GetAllInventories, + InsertInventories, + MoveToVaultInventoryDeleted, + SearchOfInventories, + UpdateInventories, +} from "../controllers/inventory/index.js"; +import { verificarToken } from "../middleware/verificarToken.middleware.js"; +import { methodCreated, methodOK } from "../server/serverMethods.js"; + +const apiCatInventory = express.Router(); + +// GET /api/inventories/list_of_inventories +apiCatInventory.get("/", verificarToken, async (request, response, next) => { + try { + const listInventories = request.query; + const result = await GetAllInventories(listInventories); + methodOK(request, response, result); + } catch (error) { + next(error); + } +}); + +// GET /api/inventories/search +apiCatInventory.get( + "/search", + verificarToken, + async (request, response, next) => { + try { + const { name } = request.query; + const result = await SearchOfInventories(name); + methodOK(request, response, result, "Busqueda realizada correctamente"); + } catch (error) { + next(error); + } + }, +); + +// POST /api/inventories/create +apiCatInventory.post("/", verificarToken, async (request, response, next) => { + try { + const insertInventories = request.body; + const result = await InsertInventories(insertInventories); + methodCreated( + request, + response, + result, + "Se inserto correctamente el inventario", + ); + } catch (error) { + next(error); + } +}); + +// PUT /api/inventories/vault/:id +apiCatInventory.put( + "/vault/:id", + verificarToken, + async (request, response, next) => { + try { + const inventoryId = request.params.id; + const result = await MoveToVaultInventoryDeleted(inventoryId); + methodOK( + request, + response, + result, + "El inventario se mando a la boveda de eliminados", + ); + } catch (error) { + next(error); + } + }, +); + +// PUT /api/inventories/update/:id +apiCatInventory.put("/:id", verificarToken, async (request, response, next) => { + try { + const inventoryId = request.params.id; + const inventoryData = request.body; + const result = await UpdateInventories(inventoryId, inventoryData); + methodOK( + request, + response, + result, + "El inventario se actualizo correctamente", + ); + } catch (error) { + next(error); + } +}); + +//DELETE /api/inventories/bulk-delete-inventories +apiCatInventory.delete( + "/bulk", + verificarToken, + async (request, response, next) => { + try { + const { ids } = request.body; + await DeleteInventoriesBulk(ids); + methodOK(request, response, { + message: `Se eliminaron ${request.body.ids.length} inventarios correctamente`, + }); + } catch (error) { + next(error); + } + }, +); + +//DELETE /api/inventories/delete/:id +apiCatInventory.delete( + "/:id", + verificarToken, + async (request, response, next) => { + try { + const inventoryId = request.params.id; + const result = await DeleteInventory(inventoryId); + methodOK( + request, + response, + result, + "El inventario fue eliminado correctamente", + ); + } catch (error) { + next(error); + } + }, +); + +export { apiCatInventory }; diff --git a/src/routes/index.js b/src/routes/index.js index 1762c89..7ab457c 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -1,7 +1,7 @@ import express from "express"; import { apiCatAssets } from "./catAssets.routes.js"; -import { apiCatInventario } from "./catInventarioRouter.js"; +import { apiCatInventory } from "./catInventory.routes.js"; import { apiCatInsumos } from "./catSuppliesRouter.js"; import { apiGoogle } from "./google.route.js"; import { apiMaestros } from "./maestrosRouter.js"; @@ -12,19 +12,9 @@ import { apiUsers } from "./users.routes.js"; const router = express.Router(); -// router.use( -// "/api/v1", -// apiMaestros, -// apiGoogle, -// apiPadres, -// apiCatInventario, -// apiCatInsumos, -// apiCatActivos, -// apiEstudiantes, -// ); - router.use("/api/v1/users", apiUsers, apiGoogle); router.use("/api/v1/token", apiToken); router.use("/api/v1/assets", apiCatAssets); +router.use("/api/v1/inventory", apiCatInventory); export { router }; diff --git a/src/services/inventory/functions/delete.services.js b/src/services/inventory/functions/delete.services.js new file mode 100644 index 0000000..f427fa3 --- /dev/null +++ b/src/services/inventory/functions/delete.services.js @@ -0,0 +1,59 @@ +import { + deleteInventoryBulk, + deleteInventoryModel, +} from "../../../models/inventory/index.js"; + +export const deleteInventoryService = async (inventoryId) => { + if (!inventoryId) { + throw { + statusCode: 400, + message: "Debe de proporcionar todos los campos", + code: "FIELDS_REQUIRED", + details: "Todos los campos son obligatorios para eliminar un inventario", + }; + } + + const result = await deleteInventoryModel(inventoryId); + + if (result.affectedRows === 0) { + throw { + statusCode: 500, + message: "No se pudo eliminar el inventario", + code: "INVENTORY_DELETE_FAILED", + dettails: + "Hubo un error al intentar borrar el inventario en la base de datos", + }; + } +}; + +export const deleteInventoryBulkService = async (ids) => { + const MAX_IDS = 600; + + if (!Array.isArray(ids) || ids.length === 0) { + throw { + status: 413, + message: `No se pueden eliminar más de ${MAX_IDS} inventarios en una sola solicitud`, + code: "OVERLOAD_REQUEST", + details: + "Debe proporcionar un array de IDs de inventarios menor para que la solicitud sea válida", + }; + } + + if (ids.length > MAX_IDS) { + throw { + statusCode: 400, + message: "Debe de proporcionar todos los campos", + code: "TOO_MANY_IDS", + details: "Todos los campos son obligatorios para eliminar un inventario", + }; + } + + const batchSize = 100; + const totalBatches = Math.ceil(ids.length / batchSize); + + for (let i = 0; i < totalBatches; i++) { + const batch = ids.slice(i * batchSize, (i + 1) * batchSize); + const placeholders = batch.map(() => "?").join(","); + await deleteInventoryBulk(placeholders, batch); + } +}; diff --git a/src/services/inventory/functions/insert.services.js b/src/services/inventory/functions/insert.services.js new file mode 100644 index 0000000..0480ecb --- /dev/null +++ b/src/services/inventory/functions/insert.services.js @@ -0,0 +1,35 @@ +import { insertInventoryModel } from "../../../models/inventory/index.js"; + +export const insertInventoryService = async (inventory) => { + if ( + !inventory.itemCode || + !inventory.name || + !inventory.description || + !inventory.quantity || + !inventory.weight || + !inventory.width || + !inventory.height || + !inventory.location || + !inventory.condition || + !inventory.purchaseDate + ) { + throw { + statusCode: 400, + message: "Debe de proporcionar todos los campos", + code: "FIELDS_REQUIRED", + details: "Todos los campos son obligatorios para crear un inventario", + }; + } + + const result = await insertInventoryModel(inventory); + + if (!result.affectedRows > 0) { + throw { + statusCode: 500, + message: "No se pudo crear el inventario", + code: "INVENTORY_CREATION_FAILED", + dettails: + "Hubo un error al intentar insertar el inventario en la base de datos", + }; + } +}; diff --git a/src/services/inventory/functions/list.services.js b/src/services/inventory/functions/list.services.js new file mode 100644 index 0000000..1c3c944 --- /dev/null +++ b/src/services/inventory/functions/list.services.js @@ -0,0 +1,56 @@ +import { listInventoryModel } from "../../../models/inventory/index.js"; + +export const listInventoryService = async ({ + name, + weight, + location, + condition, + status, +}) => { + let where = "WHERE 1=1"; + const values = []; + + if (name && name !== "All") { + where += " AND Name = ?"; + values.push(name); + } + + if (weight && weight !== "All") { + where += " AND Weight = ?"; + values.push(weight); + } + + if (location && location !== "All") { + where += " AND Location = ?"; + values.push(location); + } + + if (condition && condition !== "All") { + where += " AND `Condition` = ?"; + values.push(condition); + } + + if (status && status !== "All") { + where += " AND Status = ?"; + values.push(status); + } + + const queryString = ` + SELECT * FROM catinventory ${where} ORDER BY Name ASC + `; + + const resultList = await listInventoryModel(queryString, values); + + if (resultList.length === 0) { + throw { + statusCode: 404, + message: "No se encontraron inventarios con los filtros proporcionados", + code: "INVENTORY_NOT_FOUND", + details: `No se encontraron inventarios con los filtros proporcionados: ${JSON.stringify( + { name, weight, location, condition, status }, + )}`, + }; + } + + return resultList; +}; diff --git a/src/services/inventory/functions/search.services.js b/src/services/inventory/functions/search.services.js new file mode 100644 index 0000000..2adabce --- /dev/null +++ b/src/services/inventory/functions/search.services.js @@ -0,0 +1,31 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const searchInventoryService = async (name) => { + let query = `SELECT * FROM catinventory WHERE 1=1`; + const params = []; + + if (name) { + query += ` AND Name LIKE ?`; + params.push(`%${name}%`); + } else { + throw { + statusCode: 400, + message: "Debe proporcionar un nombre del inventario para buscar", + code: "NAME_REQUIRED", + details: "El campo de nombre es obligatorio para realizar busquedas", + }; + } + + const result = await connectionQuery(query, params); + + if (result.length === 0) { + throw { + statusCode: 404, + message: `No se encontro el nombre ${name}`, + code: "INVENTORY_NOT_FOUND", + details: `No se encontraron inventarios con el nombre proporcionado: ${name}`, + }; + } + + return result; +}; diff --git a/src/services/inventory/functions/update.services.js b/src/services/inventory/functions/update.services.js new file mode 100644 index 0000000..0bd407a --- /dev/null +++ b/src/services/inventory/functions/update.services.js @@ -0,0 +1,5 @@ +import { updateInventoryModel } from "../../../models/inventory/index.js"; + +export const updateInventoryService = async (inventoryId, inventoryData) => { + await updateInventoryModel(inventoryId, inventoryData); +}; diff --git a/src/services/inventory/functions/vault.services.js b/src/services/inventory/functions/vault.services.js new file mode 100644 index 0000000..3cc807c --- /dev/null +++ b/src/services/inventory/functions/vault.services.js @@ -0,0 +1,5 @@ +import { vaultInventoryModel } from "../../../models/inventory/index.js"; + +export const moveVaulInventoryService = async (inventoryId) => { + await vaultInventoryModel(inventoryId); +}; diff --git a/src/services/inventory/index.js b/src/services/inventory/index.js new file mode 100644 index 0000000..e21d6e3 --- /dev/null +++ b/src/services/inventory/index.js @@ -0,0 +1,7 @@ +export * from "./functions/delete.services.js"; +export * from "./functions/insert.services.js"; +export * from "./functions/list.services.js"; +export * from "./functions/search.services.js"; +export * from "./functions/update.services.js"; +export * from "./functions/vault.services.js"; +export * from "./index.js"; diff --git a/src/services/prueba.js b/src/services/prueba.js deleted file mode 100644 index e69de29..0000000 From e12e6054e343f93f14978c39d1f91057cf69894c Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Mon, 14 Jul 2025 04:25:06 -0600 Subject: [PATCH 11/20] refactor(supplies): Se modulariza el endpoint completo de suministros --- NOTES.md | 12 +- package.json | 5 - src/controllers/catInventarioControllers.js | 190 ------- src/controllers/catSuppliesControllers.js | 180 ------- .../functions/inventory.controllers.js | 4 +- .../supply/functions/supply.controllers.js | 44 ++ src/controllers/supply/index.js | 2 + src/models/supply/functions/delete.models.js | 12 + src/models/supply/functions/insert.models.js | 28 ++ src/models/supply/functions/list.models.js | 6 + src/models/supply/functions/update.models.js | 32 ++ src/models/supply/functions/vault.models.js | 7 + src/models/supply/index.js | 6 + src/routes/catSupplies.routes.js | 126 +++++ src/routes/catSuppliesRouter.js | 468 ------------------ src/routes/index.js | 3 +- .../inventory/functions/vault.services.js | 2 +- .../supply/functions/delete.services.js | 59 +++ .../supply/functions/insert.service.js | 32 ++ .../supply/functions/list.services.js | 60 +++ .../supply/functions/search.services.js | 31 ++ .../supply/functions/update.services.js | 5 + .../supply/functions/vault.services.js | 5 + src/services/supply/index.js | 7 + 24 files changed, 478 insertions(+), 848 deletions(-) delete mode 100644 src/controllers/catInventarioControllers.js delete mode 100644 src/controllers/catSuppliesControllers.js create mode 100644 src/controllers/supply/functions/supply.controllers.js create mode 100644 src/controllers/supply/index.js create mode 100644 src/models/supply/functions/delete.models.js create mode 100644 src/models/supply/functions/insert.models.js create mode 100644 src/models/supply/functions/list.models.js create mode 100644 src/models/supply/functions/update.models.js create mode 100644 src/models/supply/functions/vault.models.js create mode 100644 src/models/supply/index.js create mode 100644 src/routes/catSupplies.routes.js delete mode 100644 src/routes/catSuppliesRouter.js create mode 100644 src/services/supply/functions/delete.services.js create mode 100644 src/services/supply/functions/insert.service.js create mode 100644 src/services/supply/functions/list.services.js create mode 100644 src/services/supply/functions/search.services.js create mode 100644 src/services/supply/functions/update.services.js create mode 100644 src/services/supply/functions/vault.services.js create mode 100644 src/services/supply/index.js diff --git a/NOTES.md b/NOTES.md index 61d0070..6b1c11f 100644 --- a/NOTES.md +++ b/NOTES.md @@ -4,7 +4,15 @@ - Hacer el cambio para el catalogo de insumos por medio de la modularizacionm de funciones - Hacer un catalogo de Aulas -- Hacer un catalogo de condicion (Bueno, Regular, Excelente, Nuevo para reutilizar registros en vez de crear neuevos o con id referenciarlos) + +- Hacer dos nuevas tablas una llamada asset_conditions y supply_units para administrar esos catalogos de forma mejor eficiente a la hora de quererlos incluir como listas para insercion o como selectores de busqueda + +- Hacer un catalogo de proveedores que seria el campo de supplier en catsupplies + +- asset_conditions va ser para la condicion del activo condition_id + +- supply_units va ser para la unidades de los suministros unit_id + - Verificar las funciones de la carpeta helpers para poder reutilizar unas funciones (sobre todo la de cuando se elimina un registro como el de usuarios en su modelo, esto aplica para todas las tablas) - Verificar testeos del catalogo de activos y de usuarios juntos y hacerlos @@ -12,6 +20,8 @@ - Probar la funcion de token para el refresco del mismo, y hacer la docuemntacion en postman - Excluir por aparte el controlador de google para el login, y tenerlo aparte (Sacarlo de los usuario y que tenga su propio espacio) +- + ## Cambios que se puedan ir haciendo - Ir adecuando el codigo poco a poco el codigo en ingles diff --git a/package.json b/package.json index 34541e2..3ffd8d3 100644 --- a/package.json +++ b/package.json @@ -59,10 +59,5 @@ "jest": "^29.7.0", "nodemon": "^3.1.10", "prettier": "^3.5.3" - }, - "pnpm": { - "overrides": { - "hoek": "^6.1.3" - } } } diff --git a/src/controllers/catInventarioControllers.js b/src/controllers/catInventarioControllers.js deleted file mode 100644 index d3ee599..0000000 --- a/src/controllers/catInventarioControllers.js +++ /dev/null @@ -1,190 +0,0 @@ -import { connectionQuery } from "../helpers/connection.helpers.js"; -import { - methodCreated, - methodError, - methodIncorrect, - methodNotFound, - methodOK, -} from "../server/serverMethods.js"; - -const ObtenerTodoElInnventario = async (req, res) => { - try { - const result = await connectionQuery( - 'SELECT * FROM catinventory WHERE Status = "Activo"', - ); - - if (result.length === 0) return methodNotFound(req, res); - - methodOK(req, res, result); - } catch (error) { - methodError(req, res, error); - } -}; - -const ObtenerInventarioDesuso = async (req, res) => { - try { - const result = await connectionQuery( - 'SELECT * FROM catinventory WHERE Status = "Inactivo"', - ); - if (result.length === 0) return methodNotFound(req, res); - - methodOK(req, res, result); - } catch (error) { - methodError(req, res, error); - } -}; - -const InsertarInventario = async (req, res) => { - try { - const { - itemCode, - name, - description, - quantity, - weight, - width, - height, - location, - condition, - purchaseDate, - } = req.body; - - if ( - !itemCode || - !name || - !description || - !quantity || - !weight || - !width || - !height || - !location || - !condition || - !purchaseDate - ) { - return methodIncorrect(req, res); - } - - const queryInsert = `INSERT INTO catinventory (ID, ItemCode, Name, Description, Quantity, Weight, Width, Height, Location, \`Condition\`, PurchaseDate) - VALUES (UUID(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);`; - - const queryParamsInsert = [ - itemCode, - name, - description, - quantity, - weight, - width, - height, - location, - condition, - purchaseDate, - ]; - - const result = await connectionQuery(queryInsert, queryParamsInsert); - - if (result.affectedRows > 0) - return methodCreated(req, res, queryParamsInsert); - } catch (error) { - methodError(req, res, error); - } -}; - -const EditarInventario = async (req, res) => { - try { - const { - itemCode, - name, - description, - quantity, - weight, - width, - height, - location, - condition, - purchaseDate, - status, - id, - } = req.body; - - const queryUpdate = `UPDATE catinventory SET ItemCode = ?, Name = ?, Description = ?, Quantity = ?, Weight = ?, Width = ?, Height = ?, Location = ?, \`Condition\` = ?, PurchaseDate = ?, Status = ? WHERE ID = ?`; - const queryParamsUpdate = [ - itemCode, - name, - description, - quantity, - weight, - width, - height, - location, - condition, - purchaseDate, - status, - id, - ]; - const result = await connectionQuery(queryUpdate, queryParamsUpdate); - - if (result.affectedRows > 0) { - methodOK(req, res, { - message: "El recurso fue actualizado correctamente.", - }); - } else { - methodNotFound(req, res, { - message: "No se encontró el recurso para actualizar.", - }); - } - } catch (error) { - methodError(req, res, error); - } -}; - -const MoverABovedaEliminados = async (req, res) => { - try { - const { id } = req.params; - - if (!id) return methodIncorrect(req, res); - - const queryDelete = `UPDATE catinventory SET Status = 'Inactivo' WHERE ID = ?`; - const queryParamsDelete = [id]; - const result = await connectionQuery(queryDelete, queryParamsDelete); - - if (result.affectedRows > 0) { - methodOK(req, res, { - message: "El recurso fue mandado a la boveda correctamente.", - }); - } else { - methodNotFound(req, res); - } - } catch (error) { - methodError(req, res, error); - } -}; - -const EliminarInventario = async (req, res) => { - try { - const { id } = req.params; - - if (!id) return methodIncorrect(req, res); - - const queryDeleteInventory = `DELETE FROM catinventory WHERE ID = ?`; - const result = await connectionQuery(queryDeleteInventory, [id]); - - if (result.affectedRows > 0) { - methodOK(req, res, { - message: "El recurso fue eliminado correctamente.", - }); - } else { - methodNotFound(req, res); - } - } catch (error) { - methodError(req, res, error); - } -}; - -export default { - ObtenerTodoElInnventario, - ObtenerInventarioDesuso, - InsertarInventario, - EditarInventario, - MoverABovedaEliminados, - EliminarInventario, -}; diff --git a/src/controllers/catSuppliesControllers.js b/src/controllers/catSuppliesControllers.js deleted file mode 100644 index 3acb6ed..0000000 --- a/src/controllers/catSuppliesControllers.js +++ /dev/null @@ -1,180 +0,0 @@ -import { connectionQuery } from "../helpers/connection.helpers.js"; -import { - methodCreated, - methodError, - methodIncorrect, - methodNotFound, - methodOK, -} from "../server/serverMethods.js"; - -const ObtenerTodosLosInsumos = async (req, res) => { - try { - const result = await connectionQuery( - `SELECT * FROM catsupplies WHERE Status = "Activo"`, - ); - - if (result.length === 0) return methodNotFound(req, res); - - methodOK(req, res, result); - } catch (error) { - methodError(req, res, error); - } -}; - -const ObtenerTodosLosInsumosDesuso = async (req, res) => { - try { - const result = await connectionQuery( - `SELECT * FROM catsupplies WHERE Status = "Inactivo"`, - ); - - if (result.length === 0) return methodNotFound(req, res); - - methodOK(req, res, result); - } catch (error) { - methodError(req, res, error); - } -}; - -const InsertarInsumo = async (req, res) => { - try { - const { - name, - description, - quantity, - unit, - supplier, - purchaseDate, - expiryDate, - cost, - } = req.body; - - if ( - !name || - !description || - !quantity || - !unit || - !supplier || - !purchaseDate || - !cost - ) { - return methodIncorrect(req, res); - } - - const queryInsert = `INSERT INTO catsupplies (ID, Name, Description, Quantity, Unit, Supplier, PurchaseDate, ExpiryDate, Cost) - VALUES (UUID(),? ,? ,? ,? ,? ,? ,? ,? );`; - - const queryParamsInsert = [ - name, - description, - quantity, - unit, - supplier, - purchaseDate, - expiryDate, - cost, - ]; - - const result = await connectionQuery(queryInsert, queryParamsInsert); - - if (result.affectedRows > 0) - return methodCreated(req, res, queryParamsInsert); - } catch (error) { - methodError(req, res, error); - } -}; - -const EditarInsumo = async (req, res) => { - try { - const { - name, - description, - quantity, - unit, - supplier, - purchaseDate, - expiryDate, - cost, - status, - id, - } = req.body; - - const queryUpdate = `UPDATE catsupplies SET Name = ?, Description = ?, Quantity = ?, Unit = ?, Supplier = ?, PurchaseDate = ?, ExpiryDate = ?, Cost = ?, Status = ? WHERE ID = ?`; - const queryUpdateParams = [ - name, - description, - quantity, - unit, - supplier, - purchaseDate, - expiryDate, - cost, - status, - id, - ]; - - const result = await connectionQuery(queryUpdate, queryUpdateParams); - if (result.affectedRows > 0) { - methodOK(req, res, { - message: "El recurso fue actualizado correctamente.", - }); - } else { - methodNotFound(req, res, { - message: "No se encontró el recurso para actualizar.", - }); - } - } catch (error) { - methodError(req, res, error); - } -}; - -const MoverABovedaEliminados = async (req, res) => { - try { - const { id } = req.params; - - if (!id) return methodIncorrect(req, res); - - const queryDelete = `UPDATE catsupplies SET Status = 'Inactivo' WHERE ID = ?`; - const queryParamsDelete = [id]; - const result = await connectionQuery(queryDelete, queryParamsDelete); - - if (result.affectedRows > 0) { - methodOK(req, res, { - message: "El recurso fue mandado a la boveda correctamente.", - }); - } else { - methodNotFound(req, res); - } - } catch (error) { - methodError(req, res, error); - } -}; - -const EliminarInsumo = async (req, res) => { - try { - const { id } = req.params; - - if (!id) return methodIncorrect(req, res); - - const queryDeleteSupplier = `DELETE FROM catsupplies WHERE ID = ?`; - const result = await connectionQuery(queryDeleteSupplier, [id]); - - if (result.affectedRows > 0) { - methodOK(req, res, { - message: "El recurso fue eliminado correctamente.", - }); - } else { - methodNotFound(req, res); - } - } catch (error) { - methodError(req, res, error); - } -}; - -export default { - ObtenerTodosLosInsumos, - ObtenerTodosLosInsumosDesuso, - InsertarInsumo, - EditarInsumo, - MoverABovedaEliminados, - EliminarInsumo, -}; diff --git a/src/controllers/inventory/functions/inventory.controllers.js b/src/controllers/inventory/functions/inventory.controllers.js index 330c5a1..3c607ef 100644 --- a/src/controllers/inventory/functions/inventory.controllers.js +++ b/src/controllers/inventory/functions/inventory.controllers.js @@ -3,7 +3,7 @@ import { deleteInventoryService, insertInventoryService, listInventoryService, - moveVaulInventoryService, + moveVaultInventoryService, searchInventoryService, updateInventoryService, } from "../../../services/inventory/index.js"; @@ -32,7 +32,7 @@ export const UpdateInventories = async (inventoryId, inventoryData) => { }; export const MoveToVaultInventoryDeleted = async (inventoryId) => { - const moveToVaultInventory = await moveVaulInventoryService(inventoryId); + const moveToVaultInventory = await moveVaultInventoryService(inventoryId); return moveToVaultInventory; }; diff --git a/src/controllers/supply/functions/supply.controllers.js b/src/controllers/supply/functions/supply.controllers.js new file mode 100644 index 0000000..474f788 --- /dev/null +++ b/src/controllers/supply/functions/supply.controllers.js @@ -0,0 +1,44 @@ +import { + deleteSupplyBulkService, + deleteSupplyService, + insertSupplyService, + listSupplyService, + moveVaultSupplyService, + searchSupplyService, + updateSupplyService, +} from "../../../services/supply/index.js"; + +export const GetAllSupplies = async (listSupplies) => { + const listGetAllSupplies = await listSupplyService(listSupplies); + return listGetAllSupplies; +}; + +export const SearchOfSupplies = async (name) => { + const searchOfSupplies = await searchSupplyService(name); + return searchOfSupplies; +}; + +export const InsertSupplies = async (supply) => { + const insertSupplies = await insertSupplyService(supply); + return insertSupplies; +}; + +export const UpdateSupplies = async (supplyId, supplyData) => { + const updateSupplies = await updateSupplyService(supplyId, supplyData); + return updateSupplies; +}; + +export const MoveToVaultSupplyDeleted = async (supplyId) => { + const moveToVaultSupplyDeleted = await moveVaultSupplyService(supplyId); + return moveToVaultSupplyDeleted; +}; + +export const DeleteSupply = async (supplyId) => { + const deleteSupply = await deleteSupplyService(supplyId); + return deleteSupply; +}; + +export const DeleteSuppliesBulk = async (ids) => { + const deleteSuppliesBulk = await deleteSupplyBulkService(ids); + return deleteSuppliesBulk; +}; diff --git a/src/controllers/supply/index.js b/src/controllers/supply/index.js new file mode 100644 index 0000000..90c2e25 --- /dev/null +++ b/src/controllers/supply/index.js @@ -0,0 +1,2 @@ +export * from "./functions/supply.controllers.js"; +export * from "./index.js"; diff --git a/src/models/supply/functions/delete.models.js b/src/models/supply/functions/delete.models.js new file mode 100644 index 0000000..c897a7b --- /dev/null +++ b/src/models/supply/functions/delete.models.js @@ -0,0 +1,12 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const deleteSupplyModel = async (supplyId) => { + const query = `DELETE FROM catsupplies WHERE ID = ?`; + const params = [supplyId]; + return await connectionQuery(query, params); +}; + +export const deleteSupplyBulk = async (placeholders, batch) => { + const query = `DELETE FROM catsupplies WHERE ID IN (${placeholders})`; + return await connectionQuery(query, batch); +}; diff --git a/src/models/supply/functions/insert.models.js b/src/models/supply/functions/insert.models.js new file mode 100644 index 0000000..3f69ffc --- /dev/null +++ b/src/models/supply/functions/insert.models.js @@ -0,0 +1,28 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const insertSupplyModel = async ({ + name, + description, + quantity, + unit, + supplier, + purchaseDate, + expiryDate, + cost, +}) => { + const query = `INSERT INTO catsupplies (ID, Name, Description, Quantity, Unit, Supplier, PurchaseDate, ExpiryDate, Cost) + VALUES (UUID(),? ,? ,? ,? ,? ,? ,? ,? );`; + + const params = [ + name, + description, + quantity, + unit, + supplier, + purchaseDate, + expiryDate, + cost, + ]; + + return await connectionQuery(query, params); +}; diff --git a/src/models/supply/functions/list.models.js b/src/models/supply/functions/list.models.js new file mode 100644 index 0000000..6d76b29 --- /dev/null +++ b/src/models/supply/functions/list.models.js @@ -0,0 +1,6 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const listSupplyModel = async (query, params) => { + const result = await connectionQuery(query, params); + return result; +}; diff --git a/src/models/supply/functions/update.models.js b/src/models/supply/functions/update.models.js new file mode 100644 index 0000000..a711767 --- /dev/null +++ b/src/models/supply/functions/update.models.js @@ -0,0 +1,32 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const updateSupplyModel = async ( + supplyId, + { + name, + description, + quantity, + unit, + supplier, + purchaseDate, + expiryDate, + cost, + status, + }, +) => { + const query = `UPDATE catsupplies SET Name = ?, Description = ?, Quantity = ?, Unit = ?, Supplier = ?, PurchaseDate = ?, ExpiryDate = ?, Cost = ?, Status = ? WHERE ID = ?`; + const params = [ + name, + description, + quantity, + unit, + supplier, + purchaseDate, + expiryDate, + cost, + status, + supplyId, + ]; + + return await connectionQuery(query, params); +}; diff --git a/src/models/supply/functions/vault.models.js b/src/models/supply/functions/vault.models.js new file mode 100644 index 0000000..9a2d9bf --- /dev/null +++ b/src/models/supply/functions/vault.models.js @@ -0,0 +1,7 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const vaultSupplyModel = async (supplyId) => { + const query = `UPDATE catsupplies SET Status = 'Inactivo' WHERE ID = ?`; + const params = [supplyId]; + await connectionQuery(query, params); +}; diff --git a/src/models/supply/index.js b/src/models/supply/index.js new file mode 100644 index 0000000..421b316 --- /dev/null +++ b/src/models/supply/index.js @@ -0,0 +1,6 @@ +export * from "./functions/delete.models.js"; +export * from "./functions/insert.models.js"; +export * from "./functions/list.models.js"; +export * from "./functions/update.models.js"; +export * from "./functions/vault.models.js"; +export * from "./index.js"; diff --git a/src/routes/catSupplies.routes.js b/src/routes/catSupplies.routes.js new file mode 100644 index 0000000..f5fd897 --- /dev/null +++ b/src/routes/catSupplies.routes.js @@ -0,0 +1,126 @@ +import express from "express"; + +import { + DeleteSuppliesBulk, + DeleteSupply, + GetAllSupplies, + InsertSupplies, + MoveToVaultSupplyDeleted, + SearchOfSupplies, + UpdateSupplies, +} from "../controllers/supply/index.js"; +import { verificarToken } from "../middleware/verificarToken.middleware.js"; +import { methodCreated, methodOK } from "../server/serverMethods.js"; + +const apiCatSupply = express.Router(); + +// GET /api/supplies/list_of_supplies +apiCatSupply.get("/", verificarToken, async (request, response, next) => { + try { + const listSupplies = request.query; + const result = await GetAllSupplies(listSupplies); + methodOK(request, response, result); + } catch (error) { + next(error); + } +}); + +// GET /api/supplies/search + +apiCatSupply.get("/search", verificarToken, async (request, response, next) => { + try { + const { name } = request.query; + const result = await SearchOfSupplies(name); + methodOK(request, response, result, "Busqueda realizada correctamnete"); + } catch (error) { + next(error); + } +}); + +// POST /api/supplies/create +apiCatSupply.post("/", verificarToken, async (request, response, next) => { + try { + const insertSupplies = request.body; + const result = await InsertSupplies(insertSupplies); + methodCreated( + request, + response, + result, + "Se inserto correctamnete el suministro", + ); + } catch (error) { + next(error); + } +}); + +// PUT /api/supplies/vault/:id +apiCatSupply.put( + "/vault/:id", + verificarToken, + async (request, response, next) => { + try { + const supplyId = request.params.id; + const result = await MoveToVaultSupplyDeleted(supplyId); + methodOK( + request, + response, + result, + "El sumistro se mando a la boveda de eliminados", + ); + } catch (error) { + next(error); + } + }, +); + +// PUT /api/supplies/update/:id +apiCatSupply.put("/:id", verificarToken, async (request, response, next) => { + try { + const supplyId = request.params.id; + const supplyData = request.body; + const result = await UpdateSupplies(supplyId, supplyData); + methodOK( + request, + response, + result, + "El suministro se actualizo correctamente", + ); + } catch (error) { + next(error); + } +}); + +//DELETE /api/supplies/bulk-delete-supplies +apiCatSupply.delete( + "/bulk", + verificarToken, + async (request, response, next) => { + try { + const { ids } = request.body; + await DeleteSuppliesBulk(ids); + methodOK(request, response, { + message: `Se eliminaron ${request.body.ids.length} suministros correctamente`, + }); + } catch (error) { + next(error); + } + }, +); + +//DELETE /api/supplies/delete/:id +apiCatSupply.delete("/:id", verificarToken, async (request, response, next) => { + try { + const supplyId = request.params.id; + const result = await DeleteSupply(supplyId); + methodOK( + request, + response, + result, + "El suministro fue eliminado correctamente", + ); + } catch (error) { + next(error); + } +}); + +export { apiCatSupply }; diff --git a/src/routes/catSuppliesRouter.js b/src/routes/catSuppliesRouter.js deleted file mode 100644 index 42973bd..0000000 --- a/src/routes/catSuppliesRouter.js +++ /dev/null @@ -1,468 +0,0 @@ -import express from "express"; - -import CatInsumosControllers from "../controllers/catSuppliesControllers.js"; -import { verificarToken } from "../middleware/verificarToken.middleware.js"; - -const apiCatInsumos = express.Router(); - -/** - * @swagger - * /lista-insumos: - * get: - * summary: Obtiene la lista completa de insumos activos - * description: Recupera todos los insumos cuyo estado es "Activo" en la base de datos. - * tags: - * - Catálogo Insumos - * responses: - * 200: - * description: Lista completa de insumos activos obtenida exitosamente. - * content: - * application/json: - * schema: - * type: array - * items: - * type: object - * properties: - * ID: - * type: string - * example: "123e4567-e89b-12d3-a456-426614174000" - * itemCode: - * type: string - * example: "S1001" - * name: - * type: string - * example: "Papel para impresora" - * description: - * type: string - * example: "Paquete de 500 hojas" - * quantity: - * type: integer - * example: 50 - * supplier: - * type: string - * example: "Office Supplies Co." - * location: - * type: string - * example: "Almacén A" - * condition: - * type: string - * example: "Nuevo" - * purchaseDate: - * type: string - * format: date - * example: "2023-07-10" - * status: - * type: string - * example: "Activo" - * 404: - * description: No se encontraron insumos activos. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "No se encontraron insumos activos." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInsumos.get( - "/lista-insumos", - verificarToken, - CatInsumosControllers.ObtenerTodosLosInsumos, -); - -/** - * @swagger - * /lista-insumos-desuso: - * get: - * summary: Obtiene la lista completa de insumos en desuso - * description: Recupera todos los insumos cuyo estado es "Inactivo" en la base de datos. - * tags: - * - Catálogo Insumos - * responses: - * 200: - * description: Lista completa de insumos en desuso obtenida exitosamente. - * content: - * application/json: - * schema: - * type: array - * items: - * type: object - * properties: - * ID: - * type: string - * example: "123e4567-e89b-12d3-a456-426614174000" - * itemCode: - * type: string - * example: "S1002" - * name: - * type: string - * example: "Toner de impresora" - * description: - * type: string - * example: "Toner compatible para impresoras HP" - * quantity: - * type: integer - * example: 0 - * supplier: - * type: string - * example: "Toner Supplies Inc." - * location: - * type: string - * example: "Almacén B" - * condition: - * type: string - * example: "Usado" - * purchaseDate: - * type: string - * format: date - * example: "2022-05-15" - * status: - * type: string - * example: "Inactivo" - * 404: - * description: No se encontraron insumos en desuso. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "No se encontraron insumos en desuso." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInsumos.get( - "/lista-insumos-desuso", - verificarToken, - CatInsumosControllers.ObtenerTodosLosInsumosDesuso, -); - -/** - * @swagger - * /agregar-insumo: - * post: - * summary: Agrega un nuevo insumo - * description: Crea un nuevo insumo en la base de datos con los detalles proporcionados. - * tags: - * - Catálogo Insumos - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * name: - * type: string - * example: "Toner de impresora" - * description: - * type: string - * example: "Toner compatible para impresoras HP" - * quantity: - * type: integer - * example: 10 - * unit: - * type: string - * example: "Unidad" - * supplier: - * type: string - * example: "Toner Supplies Inc." - * purchaseDate: - * type: string - * format: date - * example: "2022-05-15" - * expiryDate: - * type: string - * format: date - * example: "2023-05-15" - * cost: - * type: number - * format: float - * example: 29.99 - * responses: - * 201: - * description: Insumo agregado exitosamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "El insumo fue agregado correctamente." - * 400: - * description: Petición incorrecta, falta información necesaria. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Faltan campos obligatorios." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInsumos.post( - "/agregar-insumo", - verificarToken, - CatInsumosControllers.InsertarInsumo, -); - -/** - * @swagger - * /actualizar-insumo: - * put: - * summary: Actualiza un insumo existente - * description: Modifica los detalles de un insumo en la base de datos. - * tags: - * - Catálogo Insumos - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * id: - * type: string - * example: "uuid-insumo-a-actualizar" - * name: - * type: string - * example: "Toner de impresora" - * description: - * type: string - * example: "Toner compatible para impresoras HP" - * quantity: - * type: integer - * example: 10 - * unit: - * type: string - * example: "Unidad" - * supplier: - * type: string - * example: "Toner Supplies Inc." - * purchaseDate: - * type: string - * format: date - * example: "2022-05-15" - * expiryDate: - * type: string - * format: date - * example: "2023-05-15" - * cost: - * type: number - * format: float - * example: 29.99 - * status: - * type: string - * example: "Activo" - * responses: - * 200: - * description: Insumo actualizado exitosamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "El recurso fue actualizado correctamente." - * 404: - * description: No se encontró el recurso para actualizar. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "No se encontró el recurso para actualizar." - * 400: - * description: Petición incorrecta, falta información necesaria. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Faltan campos obligatorios." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInsumos.put( - "/actualizar-insumo", - verificarToken, - CatInsumosControllers.EditarInsumo, -); - -/** - * @swagger - * /mover-insumo-boveda/{id}: - * put: - * summary: Mueve un insumo a la bóveda de eliminados - * description: Cambia el estado de un insumo a "Inactivo" para moverlo a la bóveda de eliminados. - * tags: - * - Catálogo Insumos - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: ID único del insumo que se desea mover a la bóveda - * responses: - * 200: - * description: Insumo movido a la bóveda exitosamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "El recurso fue mandado a la boveda correctamente." - * 404: - * description: No se encontró el recurso para mover a la bóveda. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "No se encontró el recurso para mover a la bóveda." - * 400: - * description: Petición incorrecta, falta información necesaria. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Falta el ID del insumo." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInsumos.put( - "/mover-insumo-boveda/:id", - verificarToken, - CatInsumosControllers.MoverABovedaEliminados, -); - -/** - * @swagger - * /eliminar-insumo/{id}: - * delete: - * summary: Elimina un insumo permanentemente - * description: Elimina un insumo de la base de datos usando su ID único. - * tags: - * - Catálogo Insumos - * parameters: - * - in: path - * name: id - * required: true - * schema: - * type: string - * description: ID único del insumo que se desea eliminar - * responses: - * 200: - * description: Insumo eliminado exitosamente. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "El recurso fue eliminado correctamente." - * 404: - * description: No se encontró el insumo para eliminar. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "No se encontró el recurso para eliminar." - * 400: - * description: Petición incorrecta, falta información necesaria. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Falta el ID del insumo." - * 500: - * description: Error del servidor. - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Error al procesar la solicitud." - */ - -apiCatInsumos.delete( - "/eliminar-insumo/:id", - verificarToken, - CatInsumosControllers.EliminarInsumo, -); - -export { apiCatInsumos }; diff --git a/src/routes/index.js b/src/routes/index.js index 7ab457c..d54ec05 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -2,7 +2,7 @@ import express from "express"; import { apiCatAssets } from "./catAssets.routes.js"; import { apiCatInventory } from "./catInventory.routes.js"; -import { apiCatInsumos } from "./catSuppliesRouter.js"; +import { apiCatSupply } from "./catSupplies.routes.js"; import { apiGoogle } from "./google.route.js"; import { apiMaestros } from "./maestrosRouter.js"; import { apiPadres } from "./padresRouter.js"; @@ -16,5 +16,6 @@ router.use("/api/v1/users", apiUsers, apiGoogle); router.use("/api/v1/token", apiToken); router.use("/api/v1/assets", apiCatAssets); router.use("/api/v1/inventory", apiCatInventory); +router.use("/api/v1/supply", apiCatSupply); export { router }; diff --git a/src/services/inventory/functions/vault.services.js b/src/services/inventory/functions/vault.services.js index 3cc807c..1a80719 100644 --- a/src/services/inventory/functions/vault.services.js +++ b/src/services/inventory/functions/vault.services.js @@ -1,5 +1,5 @@ import { vaultInventoryModel } from "../../../models/inventory/index.js"; -export const moveVaulInventoryService = async (inventoryId) => { +export const moveVaultInventoryService = async (inventoryId) => { await vaultInventoryModel(inventoryId); }; diff --git a/src/services/supply/functions/delete.services.js b/src/services/supply/functions/delete.services.js new file mode 100644 index 0000000..de0b642 --- /dev/null +++ b/src/services/supply/functions/delete.services.js @@ -0,0 +1,59 @@ +import { + deleteSupplyBulk, + deleteSupplyModel, +} from "../../../models/supply/index.js"; + +export const deleteSupplyService = async (supplyId) => { + if (!supplyId) { + throw { + statusCode: 400, + message: "Debe de proporcionar todos los campos", + code: "FIELDS_REQUIRED", + details: "Todos los campos son obligatorios para eliminar un suministro", + }; + } + + const result = await deleteSupplyModel(supplyId); + + if (result.affectedRows === 0) { + throw { + statusCode: 500, + message: "No se pudo eliminar el suministro", + code: "SUPPLY_DELETE_FAILED", + dettails: + "Hubo un error al intentar borrar el suministro en la base de datos", + }; + } +}; + +export const deleteSupplyBulkService = async (ids) => { + const MAX_IDS = 600; + + if (!Array.isArray(ids) || ids.length === 0) { + throw { + status: 413, + message: `No se pueden eliminar más de ${MAX_IDS} suministros en una sola solicitud`, + code: "OVERLOAD_REQUEST", + details: + "Debe proporcionar un array de IDs de suministros menor para que la solicitud sea válida", + }; + } + + if (ids.length > MAX_IDS) { + throw { + statusCode: 400, + message: "Debe de proporcionar todos los campos", + code: "TOO_MANY_IDS", + details: "Todos los campos son obligatorios para eliminar un suministro", + }; + } + + const batchSize = 100; + const totalBatches = Math.ceil(ids.length / batchSize); + + for (let i = 0; i < totalBatches; i++) { + const batch = ids.slice(i * batchSize, (i + 1) * batchSize); + const placeholders = batch.map(() => "?").join(","); + await deleteSupplyBulk(placeholders, batch); + } +}; diff --git a/src/services/supply/functions/insert.service.js b/src/services/supply/functions/insert.service.js new file mode 100644 index 0000000..78020f5 --- /dev/null +++ b/src/services/supply/functions/insert.service.js @@ -0,0 +1,32 @@ +import { insertSupplyModel } from "../../../models/supply/index.js"; + +export const insertSupplyService = async (supply) => { + if ( + !supply.name || + !supply.description || + !supply.quantity || + !supply.unit || + !supply.supplier || + !supply.purchaseDate || + !supply.cost + ) { + throw { + statusCode: 400, + message: "Debe de proporcionar todos los campos", + code: "FIELDS_REQUIRED", + details: "Todos los campos son obligatorios para crear un suministro", + }; + } + + const result = await insertSupplyModel(supply); + + if (!result.affectedRows > 0) { + throw { + statusCode: 500, + message: "No se pudo crear el suministro", + code: "SUPPLY_CREATION_FAILED", + dettails: + "Hubo un error al intentar insertar el suministro en la base de datos", + }; + } +}; diff --git a/src/services/supply/functions/list.services.js b/src/services/supply/functions/list.services.js new file mode 100644 index 0000000..4805eb1 --- /dev/null +++ b/src/services/supply/functions/list.services.js @@ -0,0 +1,60 @@ +import { listSupplyModel } from "../../../models/supply/index.js"; + +export const listSupplyService = async ({ + name, + unit, + supplier, + cost, + limitCost, + status, +}) => { + let where = "WHERE 1=1"; + const values = []; + + if (name && name !== "All") { + where += " AND Name = ?"; + values.push(name); + } + + if (unit && unit !== "All") { + where += " AND Unit = ?"; + values.push(unit); + } + + if (supplier && supplier !== "All") { + where += " AND Supplier = ?"; + values.push(supplier); + } + + if (cost && cost !== "All" && !limitCost) { + where += " AND Cost = ?"; + values.push(cost); + } else if (cost && limitCost) { + where += " AND Cost BETWEEN ? AND ?"; + values.push(cost, limitCost); + } + + if (status && status !== "All") { + where += " AND Status = ?"; + values.push(status); + } + + const queryString = ` + SELECT * FROM catsupplies ${where} ORDER BY Name ASC + `; + + const resultList = await listSupplyModel(queryString, values); + + if (resultList.length === 0) { + throw { + statusCode: 404, + message: "No se encontraron suministros con los filtros proporcionados", + code: "INVENTORY_NOT_FOUND", + details: `No se encontraron suministros con los filtros proporcionados: ${JSON.stringify( + { name, unit, supplier, cost, costLimit, status }, + )}`, + }; + } + + return resultList; +}; diff --git a/src/services/supply/functions/search.services.js b/src/services/supply/functions/search.services.js new file mode 100644 index 0000000..551266b --- /dev/null +++ b/src/services/supply/functions/search.services.js @@ -0,0 +1,31 @@ +import { connectionQuery } from "../../../helpers/connection.helpers.js"; + +export const searchSupplyService = async (name) => { + let query = `SELECT * FROM catsupplies WHERE 1=1`; + const params = []; + + if (name) { + query += ` AND Name LIKE ?`; + params.push(`%${name}%`); + } else { + throw { + statusCode: 400, + message: "Debe proporcionar un nombre del suministro para buscar", + code: "NAME_REQUIRED", + details: "El campo de nombre es obligatorio para realizar busquedas", + }; + } + + const result = await connectionQuery(query, params); + + if (result.length === 0) { + throw { + statusCode: 404, + message: `No se encontro el nombre ${name}`, + code: "SUPPLY_NOT_FOUND", + details: `No se encontraron suministros con el nombre proporcionado: ${name}`, + }; + } + + return result; +}; diff --git a/src/services/supply/functions/update.services.js b/src/services/supply/functions/update.services.js new file mode 100644 index 0000000..3a6231c --- /dev/null +++ b/src/services/supply/functions/update.services.js @@ -0,0 +1,5 @@ +import { updateSupplyModel } from "../../../models/supply/index.js"; + +export const updateSupplyService = async (supplyId, supplyData) => { + await updateSupplyModel(supplyId, supplyData); +}; diff --git a/src/services/supply/functions/vault.services.js b/src/services/supply/functions/vault.services.js new file mode 100644 index 0000000..d256cd7 --- /dev/null +++ b/src/services/supply/functions/vault.services.js @@ -0,0 +1,5 @@ +import { vaultSupplyModel } from "../../../models/supply/index.js"; + +export const moveVaultSupplyService = async (supplyId) => { + await vaultSupplyModel(supplyId); +}; diff --git a/src/services/supply/index.js b/src/services/supply/index.js new file mode 100644 index 0000000..46aea5c --- /dev/null +++ b/src/services/supply/index.js @@ -0,0 +1,7 @@ +export * from "./functions/delete.services.js"; +export * from "./functions/insert.service.js"; +export * from "./functions/list.services.js"; +export * from "./functions/search.services.js"; +export * from "./functions/update.services.js"; +export * from "./functions/vault.services.js"; +export * from "./index.js"; From ad1574714401a49943fc0e9a8a37c8d756502113 Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Mon, 14 Jul 2025 20:59:08 -0600 Subject: [PATCH 12/20] fix(status): Se corrigen estatus para los catalogos correspondientes para la respuesta 413 --- src/services/assets/functions/delete.services.js | 2 +- src/services/inventory/functions/delete.services.js | 2 +- src/services/supply/functions/delete.services.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/assets/functions/delete.services.js b/src/services/assets/functions/delete.services.js index ce7e9b0..1b62d48 100644 --- a/src/services/assets/functions/delete.services.js +++ b/src/services/assets/functions/delete.services.js @@ -31,7 +31,7 @@ export const deleteAssetsBulkService = async (ids) => { if (!Array.isArray(ids) || ids.length === 0) { throw { - status: 413, + statusCode: 413, message: `No se pueden eliminar más de ${MAX_IDS} activos en una sola solicitud`, code: "OVERLOAD_REQUEST", details: diff --git a/src/services/inventory/functions/delete.services.js b/src/services/inventory/functions/delete.services.js index f427fa3..91c4f8d 100644 --- a/src/services/inventory/functions/delete.services.js +++ b/src/services/inventory/functions/delete.services.js @@ -31,7 +31,7 @@ export const deleteInventoryBulkService = async (ids) => { if (!Array.isArray(ids) || ids.length === 0) { throw { - status: 413, + statusCode: 413, message: `No se pueden eliminar más de ${MAX_IDS} inventarios en una sola solicitud`, code: "OVERLOAD_REQUEST", details: diff --git a/src/services/supply/functions/delete.services.js b/src/services/supply/functions/delete.services.js index de0b642..aa8e665 100644 --- a/src/services/supply/functions/delete.services.js +++ b/src/services/supply/functions/delete.services.js @@ -31,7 +31,7 @@ export const deleteSupplyBulkService = async (ids) => { if (!Array.isArray(ids) || ids.length === 0) { throw { - status: 413, + statusCode: 413, message: `No se pueden eliminar más de ${MAX_IDS} suministros en una sola solicitud`, code: "OVERLOAD_REQUEST", details: From 68d7ad4ac81a357253248c9d8466690759e35045 Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Tue, 15 Jul 2025 02:53:50 -0600 Subject: [PATCH 13/20] fix:(schemas): Nuevo script de base de datos y docuemntacion en svg de el diagrama --- LICENSE | 2 +- README.md | 2 +- ...inistracion de jardin de ni\303\261os.png" | Bin 316082 -> 0 bytes ...inistracion de jardin de ni\303\261os.svg" | 20 + database.sql | 711 +++++++++--------- 5 files changed, 394 insertions(+), 341 deletions(-) delete mode 100644 "assets/Administracion de jardin de ni\303\261os.png" create mode 100644 "assets/Administracion de jardin de ni\303\261os.svg" diff --git a/LICENSE b/LICENSE index 7d3ebe3..3faf989 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2024 Erick Miguel Gonzalez Rivera +Copyright (c) 2025 Erick Miguel Gonzalez Rivera Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/README.md b/README.md index 1976e95..d6f29b6 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ Tecnologías y herramientas utilizadas en el backend de este proyecto: ## Modelo relacional de la Base de Datos 🗄️ -![Administracion de jardin de niños](/assets/Administracion%20de%20jardin%20de%20niños.png) +![Administracion de jardin de niños](/assets/Administracion%20de%20jardin%20de%20niños.svg) --- diff --git "a/assets/Administracion de jardin de ni\303\261os.png" "b/assets/Administracion de jardin de ni\303\261os.png" deleted file mode 100644 index bc666e8777d527680fc854f6a438a38aade7f1cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316082 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

G 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

|Z+@Y6rQ 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 #55o|k-R$_|v1mixsqY&r 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 diff --git "a/assets/Administracion de jardin de ni\303\261os.svg" "b/assets/Administracion de jardin de ni\303\261os.svg" new file mode 100644 index 0000000..9e0e319 --- /dev/null +++ "b/assets/Administracion de jardin de ni\303\261os.svg" @@ -0,0 +1,20 @@ +0..1*1*1*1*1*1*1*1*1*1*1*1*1**1*1*1*1*1*11*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*usersuser_iduuidrole_idvarchar(50)name_uservarchar(100)emailvarchar(100)passwordvarchar(100)last_logindatetimecreateddatetimeupdateddatetimestatus_iduuidteachersteacher_iduuiduser_iduuidlocation_iduuidgender_iduuidlevel_studies_iduuidgrade_group_iduuidwork_shift_iduuidfirst_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdatename_schoolvarchar(150)students_in_chargeintcctvarchar(45)school_zonevarchar(15)curpvarchar(18)emailvarchar(100)phonevarchar(15)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)createddatetimeupdateddatetimestatus_iduuidparentsparents_iduuidgender_iduuidlevel_studies_iduuidgrade_group_iduuidwork_shift_iduuidfirst_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdateocupationvarchar(60)curpvarchar(18)emailvarchar(100)phonevarchar(15)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)createddatetimeupdateddatetimestatus_iduuidstudentsstudent_iduuidteacher_iduuidgender_iduuidgrade_group_iduuidwork_shift_iduuidfirst_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdatecurpvarchar(18)allergiesvarchar(255)medical_conditionsvarchar(255)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)enrollment_datedatecreateddatetimeupdateddatetimestatus_iduuidstudent_parentsstudent_parent_iduuidstudent_iduuidparents_iduuidrelationshipvarchar(30)is_primarybooleancreateddatetimeupdateddatetimestudent_teacher_historyhistory_iduuidstudent_iduuidteacher_iduuidgrade_group_iduuidstart_datedateend_datedatecreateddatetimeupdateddatetimecat_suppliessupplies_iduuidsupplier_iduniqueidentifierunit_iduuidnamevarchar(100)descriptionvarchar(255)quantityintpurchase_datedateexpiry_datedatecostdecimal(10,2)createddatetimeupdateddatetimestatus_iduuidcat_assetsassets_iduuidcondition_iduuidlocation_iduuidnamevarchar(100)descriptionvarchar(255)purchase_datedatecostdecimal(10,2)last_maintenance_datedatewarranty_end_datedatecreateddatetimeupdateddatetimestatus_iduuidcat_inventoryinventory_iduuidcondition_iduuidlocation_iduuiditem_codevarchar(50)namevarchar(100)descriptionvarchar(255)quantityintweightdecimal(10,2)widthdecimal(10,2)heightdecimal(10,2)serial_numbervarchar(100)purchase_datedatecreateddatetimeupdateddatetimestatus_iduuidcat_suppliersupplier_iduuidnamevarchar(100)emailvarchar(100)phonevarchar(15)addressvarchar(255)cat_classroomslocation_iduuidnamevarchar(100)room_typevarchar(50)capacityintcat_gendergender_iduuidnamevarchar(30)cat_statusstatus_iduuidnamevarchar(30)descriptionvarchar(100)rolerole_iduuidnamevarchar(20)descriptionvarchar(100)grade_groupsgrade_group_iduuidgrade_namevarchar(50)group_namevarchar(10)labelvarchar(20)level_education_iduuidcat_educational_levellevel_education_iduuidnamevarchar(50)short_namevarchar(10)cat_work_shiftsshifts_works_iduuidnamevarchar(50)asset_conditionscondition_iduuidnamevarchar(100)descriptionvarchar(255)supply_unitsunit_iduuidnamevarchar(100)symbolvarchar(20)diagnosticdiagnostic_iduuidstudent_iduuidteacher_iduuidgrade_group_iduuidlevel_education_iduuidgender_iduuidfamily_incomedecimal(12,2)number_of_family_membersintnumber_of_siblingsintparents_marital_statusvarchar(50)housing_typevarchar(100)housing_conditionvarchar(100)number_of_roomsintfather_education_levelvarchar(100)mother_education_levelvarchar(100)father_employment_statusvarchar(100)mother_employment_statusvarchar(100)father_occupationvarchar(150)mother_occupationvarchar(150)has_running_waterbooleanhas_electricitybooleanhas_internet_accessbooleaninternet_typevarchar(100)has_study_spacebooleanstudy_space_descriptionvarchar(255)health_issuestexthas_health_insurancebooleantype_of_health_insurancevarchar(100)transport_to_schoolvarchar(100)transport_time_minutesintdevices_availablevarchar(255)extracurricular_activitiesvarchar(255)family_support_for_studiesvarchar(255)additional_notestextcreateddatetimeupdateddatetimepermissionspermissions_iduuidmodule_iduuidaction_iduuidcreateddatetimeupdateddatetimeactionsactions_iduuidnamevarchar(50)createddatetimeupdateddatetimeuser_permissionsuser_permissions_iduuiduser_iduuidpermission_iduuidcreateddatetimeupdateddatetimemodulesmodule_iduuidnamevarchar(100)createddatetimeupdateddatetime \ No newline at end of file diff --git a/database.sql b/database.sql index d38ac96..ccc1cb1 100644 --- a/database.sql +++ b/database.sql @@ -1,342 +1,375 @@ --- MySQL dump 10.13 Distrib 8.0.38, for Win64 (x86_64) --- --- Host: 127.0.0.1 Database: backend --- ------------------------------------------------------ --- Server version 8.0.39 - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!50503 SET NAMES utf8 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - --- --- Table structure for table `actions` --- - -DROP TABLE IF EXISTS `actions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `actions` ( - `ID` char(36) NOT NULL, - `ActionName` varchar(50) NOT NULL, - `Created` datetime DEFAULT CURRENT_TIMESTAMP, - `Updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `catassets` --- - -DROP TABLE IF EXISTS `catassets`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `catassets` ( - `ID` char(36) NOT NULL, - `Name` varchar(100) NOT NULL, - `Description` varchar(255) DEFAULT NULL, - `PurchaseDate` date DEFAULT NULL, - `Cost` decimal(10,2) DEFAULT '0.00', - `Location` varchar(100) DEFAULT NULL, - `Condition` varchar(20) DEFAULT NULL, - `Status` varchar(20) DEFAULT 'Activo', - `LastMaintenanceDate` date DEFAULT NULL, - `WarrantyEndDate` date DEFAULT NULL, - `Created` datetime DEFAULT CURRENT_TIMESTAMP, - `Updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `catinventory` --- - -DROP TABLE IF EXISTS `catinventory`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `catinventory` ( - `ID` char(36) NOT NULL, - `ItemCode` varchar(50) NOT NULL, - `Name` varchar(100) NOT NULL, - `Description` varchar(255) DEFAULT NULL, - `Quantity` int DEFAULT '0', - `Weight` decimal(10,2) NOT NULL, - `Height` decimal(10,2) NOT NULL, - `Width` decimal(10,2) DEFAULT NULL, - `Location` varchar(100) DEFAULT NULL, - `Condition` varchar(20) DEFAULT NULL, - `PurchaseDate` date DEFAULT NULL, - `Status` varchar(20) DEFAULT 'Activo', - `Created` datetime DEFAULT CURRENT_TIMESTAMP, - `Updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `catsupplies` --- - -DROP TABLE IF EXISTS `catsupplies`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `catsupplies` ( - `ID` char(36) NOT NULL, - `Name` varchar(100) NOT NULL, - `Description` varchar(255) DEFAULT NULL, - `Quantity` int DEFAULT '0', - `Unit` varchar(50) DEFAULT NULL, - `Supplier` varchar(100) DEFAULT NULL, - `PurchaseDate` date DEFAULT NULL, - `ExpiryDate` date DEFAULT NULL, - `Cost` decimal(10,2) DEFAULT '0.00', - `Status` varchar(20) DEFAULT 'Activo', - `Created` datetime DEFAULT CURRENT_TIMESTAMP, - `Updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `diagnostic` --- - -DROP TABLE IF EXISTS `diagnostic`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `diagnostic` ( - `ID` char(36) NOT NULL, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `modules` --- - -DROP TABLE IF EXISTS `modules`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `modules` ( - `ID` char(36) NOT NULL, - `ModuleName` varchar(100) NOT NULL, - `Created` datetime DEFAULT CURRENT_TIMESTAMP, - `Updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `parents` --- - -DROP TABLE IF EXISTS `parents`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `user_id` uuid PRIMARY KEY NOT NULL, + `role_id` varchar(50) DEFAULT null, + `name_user` varchar(100) NOT NULL, + `email` varchar(100) UNIQUE NOT NULL, + `password` varchar(100) NOT NULL, + `last_login` datetime DEFAULT null, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), + `status_id` uuid NOT NULL +); + +CREATE TABLE `teachers` ( + `teacher_id` uuid PRIMARY KEY NOT NULL, + `user_id` uuid NOT NULL, + `location_id` uuid NOT NULL, + `gender_id` uuid NOT NULL, + `level_studies_id` uuid NOT NULL, + `grade_group_id` uuid NOT NULL, + `work_shift_id` uuid NOT NULL, + `first_name` varchar(100) NOT NULL, + `paternal_surname` varchar(100) NOT NULL, + `maternal_surname` varchar(100) NOT NULL, + `date_of_birth` date NOT NULL, + `name_school` varchar(150) NOT NULL, + `students_in_charge` int NOT NULL, + `cct` varchar(45) NOT NULL, + `school_zone` varchar(15) NOT NULL, + `curp` varchar(18) NOT NULL, + `email` varchar(100) UNIQUE NOT NULL, + `phone` varchar(15) NOT NULL, + `state` varchar(100) NOT NULL, + `suburb` varchar(100) NOT NULL, + `street` varchar(150) NOT NULL, + `emergency_contact` varchar(100) NOT NULL, + `emergency_phone` varchar(15) DEFAULT null, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), + `status_id` uuid NOT NULL +); + CREATE TABLE `parents` ( - `ID` char(36) NOT NULL, - `TeacherID` char(36) NOT NULL, - `FirstName` varchar(100) NOT NULL, - `LastName` varchar(100) NOT NULL, - `DateOfBirth` date NOT NULL, - `Ocupation` varchar(60) NOT NULL, - `Gender` varchar(10) NOT NULL, - `Curp` varchar(20) NOT NULL, - `Email` varchar(100) NOT NULL, - `Phone` bigint NOT NULL, - `Age` int NOT NULL, - `Address` varchar(200) NOT NULL, - `EmergencyContact` varchar(100) NOT NULL, - `EmergencyPhone` varchar(15) NOT NULL, - `Created` datetime DEFAULT (now()), - `Updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `Status` varchar(20) DEFAULT 'Activo', - PRIMARY KEY (`ID`,`TeacherID`), - KEY `fk_teacher` (`TeacherID`), - CONSTRAINT `fk_teacher` FOREIGN KEY (`TeacherID`) REFERENCES `teachers` (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `permissions` --- - -DROP TABLE IF EXISTS `permissions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `permissions` ( - `ID` char(36) NOT NULL, - `ModuleID` char(36) NOT NULL, - `ActionID` char(36) NOT NULL, - `Created` datetime DEFAULT CURRENT_TIMESTAMP, - `Updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`ID`), - KEY `ModuleID` (`ModuleID`), - KEY `ActionID` (`ActionID`), - CONSTRAINT `permissions_ibfk_1` FOREIGN KEY (`ModuleID`) REFERENCES `modules` (`ID`), - CONSTRAINT `permissions_ibfk_2` FOREIGN KEY (`ActionID`) REFERENCES `actions` (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `student_teacher_history` --- - -DROP TABLE IF EXISTS `student_teacher_history`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `student_teacher_history` ( - `ID` char(36) NOT NULL, - `StudentID` char(36) NOT NULL, - `TeacherID` char(36) NOT NULL, - `Grade` varchar(50) NOT NULL, - `Group` varchar(10) NOT NULL, - `StartDate` date NOT NULL, - `EndDate` date DEFAULT NULL, - PRIMARY KEY (`ID`), - KEY `StudentID` (`StudentID`), - KEY `TeacherID` (`TeacherID`), - CONSTRAINT `student_teacher_history_ibfk_1` FOREIGN KEY (`StudentID`) REFERENCES `students` (`ID`), - CONSTRAINT `student_teacher_history_ibfk_2` FOREIGN KEY (`TeacherID`) REFERENCES `teachers` (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `students` --- - -DROP TABLE IF EXISTS `students`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; + `parents_id` uuid PRIMARY KEY NOT NULL, + `gender_id` uuid NOT NULL, + `level_studies_id` uuid NOT NULL, + `grade_group_id` uuid NOT NULL, + `work_shift_id` uuid NOT NULL, + `first_name` varchar(100) NOT NULL, + `paternal_surname` varchar(100) NOT NULL, + `maternal_surname` varchar(100) NOT NULL, + `date_of_birth` date NOT NULL, + `ocupation` varchar(60) NOT NULL, + `curp` varchar(18) NOT NULL, + `email` varchar(100) UNIQUE NOT NULL, + `phone` varchar(15) NOT NULL, + `state` varchar(100) NOT NULL, + `suburb` varchar(100) NOT NULL, + `street` varchar(150) NOT NULL, + `emergency_contact` varchar(100) NOT NULL, + `emergency_phone` varchar(15) DEFAULT null, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), + `status_id` uuid NOT NULL +); + CREATE TABLE `students` ( - `ID` char(36) NOT NULL, - `IDTeacher` char(36) NOT NULL, - `IDMom` char(36) NOT NULL, - `IDDad` char(36) NOT NULL, - `FirstName` varchar(100) NOT NULL, - `LastName` varchar(100) DEFAULT NULL, - `Grade` varchar(50) NOT NULL, - `Group` varchar(10) NOT NULL, - `AgeStudent` int NOT NULL, - `Curp` varchar(20) NOT NULL, - `DateOfBirth` date NOT NULL, - `Gender` varchar(10) NOT NULL, - `Address` varchar(200) NOT NULL, - `EmergencyContact` varchar(100) NOT NULL, - `EmergencyPhone` varchar(15) NOT NULL, - `Allergies` varchar(255) NOT NULL, - `MedicalConditions` varchar(255) NOT NULL, - `EnrollmentDate` date NOT NULL, - `Status` varchar(20) DEFAULT 'Activo' /*!80023 INVISIBLE */, - `Created` datetime DEFAULT CURRENT_TIMESTAMP, - `Updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`ID`), - KEY `IDMom` (`IDMom`), - KEY `IDDad` (`IDDad`), - KEY `IDTeacher` (`IDTeacher`), - CONSTRAINT `students_ibfk_1` FOREIGN KEY (`IDMom`) REFERENCES `parents` (`ID`), - CONSTRAINT `students_ibfk_2` FOREIGN KEY (`IDMom`) REFERENCES `parents` (`ID`), - CONSTRAINT `students_ibfk_3` FOREIGN KEY (`IDDad`) REFERENCES `parents` (`ID`), - CONSTRAINT `students_ibfk_4` FOREIGN KEY (`IDTeacher`) REFERENCES `parents` (`TeacherID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `teachers` --- - -DROP TABLE IF EXISTS `teachers`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `teachers` ( - `ID` char(36) NOT NULL, - `TeacherID` char(36) NOT NULL, - `FirstName` varchar(100) NOT NULL, - `LastName` varchar(100) NOT NULL, - `DateOfBirth` date DEFAULT NULL, - `NameSchool` varchar(150) NOT NULL, - `LevelStudies` varchar(45) NOT NULL, - `StudentsInCharge` int NOT NULL, - `Grade` varchar(50) NOT NULL, - `Group` varchar(10) NOT NULL, - `CCT` varchar(45) NOT NULL, - `SchoolZone` varchar(15) NOT NULL, - `WorkShift` varchar(45) NOT NULL, - `Curp` varchar(20) NOT NULL, - `Email` varchar(100) NOT NULL, - `Phone` varchar(15) NOT NULL, - `Age` int NOT NULL, - `Address` varchar(255) NOT NULL, - `EmergencyContact` varchar(100) NOT NULL, - `EmergencyPhone` varchar(15) NOT NULL, - `Created` datetime DEFAULT (now()), - `Updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `Status` varchar(20) DEFAULT 'Activo', - PRIMARY KEY (`ID`,`TeacherID`), - KEY `teachers_ibfk_1` (`TeacherID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `user_permissions` --- - -DROP TABLE IF EXISTS `user_permissions`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; + `student_id` uuid PRIMARY KEY NOT NULL, + `teacher_id` uuid NOT NULL, + `gender_id` uuid NOT NULL, + `grade_group_id` uuid NOT NULL, + `work_shift_id` uuid NOT NULL, + `first_name` varchar(100) NOT NULL, + `paternal_surname` varchar(100) NOT NULL, + `maternal_surname` varchar(100) NOT NULL, + `date_of_birth` date NOT NULL, + `curp` varchar(18) NOT NULL, + `allergies` varchar(255) NOT NULL, + `medical_conditions` varchar(255) NOT NULL, + `state` varchar(100) NOT NULL, + `suburb` varchar(100) NOT NULL, + `street` varchar(150) NOT NULL, + `emergency_contact` varchar(100) NOT NULL, + `emergency_phone` varchar(15) DEFAULT null, + `enrollment_date` date NOT NULL, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), + `status_id` uuid NOT NULL +); + +CREATE TABLE `student_parents` ( + `student_parent_id` uuid PRIMARY KEY NOT NULL, + `student_id` uuid NOT NULL, + `parents_id` uuid NOT NULL, + `relationship` varchar(30) NOT NULL, + `is_primary` boolean DEFAULT false, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) +); + +CREATE TABLE `student_teacher_history` ( + `history_id` uuid PRIMARY KEY NOT NULL, + `student_id` uuid NOT NULL, + `teacher_id` uuid NOT NULL, + `grade_group_id` uuid NOT NULL, + `start_date` date NOT NULL, + `end_date` date DEFAULT null, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) +); + +CREATE TABLE `cat_supplies` ( + `supplies_id` uuid PRIMARY KEY NOT NULL, + `supplier_id` uniqueidentifier NOT NULL, + `unit_id` uuid NOT NULL, + `name` varchar(100) NOT NULL, + `description` varchar(255) DEFAULT null, + `quantity` int DEFAULT 0, + `purchase_date` date DEFAULT null, + `expiry_date` date DEFAULT null, + `cost` decimal(10,2) DEFAULT 0, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), + `status_id` uuid NOT NULL +); + +CREATE TABLE `cat_assets` ( + `assets_id` uuid PRIMARY KEY NOT NULL, + `condition_id` uuid NOT NULL, + `location_id` uuid NOT NULL, + `name` varchar(100) NOT NULL, + `description` varchar(255) DEFAULT null, + `purchase_date` date DEFAULT null, + `cost` decimal(10,2) DEFAULT 0, + `last_maintenance_date` date DEFAULT null, + `warranty_end_date` date DEFAULT null, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), + `status_id` uuid NOT NULL +); + +CREATE TABLE `cat_inventory` ( + `inventory_id` uuid PRIMARY KEY NOT NULL, + `condition_id` uuid NOT NULL, + `location_id` uuid NOT NULL, + `item_code` varchar(50) NOT NULL, + `name` varchar(100) NOT NULL, + `description` varchar(255) DEFAULT null, + `quantity` int DEFAULT 0, + `weight` decimal(10,2) DEFAULT null, + `width` decimal(10,2) DEFAULT null, + `height` decimal(10,2) DEFAULT null, + `serial_number` varchar(100), + `purchase_date` date DEFAULT null, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), + `status_id` uuid NOT NULL +); + +CREATE TABLE `cat_supplier` ( + `supplier_id` uuid PRIMARY KEY NOT NULL, + `name` varchar(100) NOT NULL, + `email` varchar(100), + `phone` varchar(15), + `address` varchar(255) +); + +CREATE TABLE `cat_classrooms` ( + `location_id` uuid PRIMARY KEY NOT NULL, + `name` varchar(100) NOT NULL, + `room_type` varchar(50), + `capacity` int +); + +CREATE TABLE `cat_gender` ( + `gender_id` uuid PRIMARY KEY NOT NULL, + `name` varchar(30) NOT NULL +); + +CREATE TABLE `cat_status` ( + `status_id` uuid PRIMARY KEY NOT NULL, + `name` varchar(30) NOT NULL, + `description` varchar(100) +); + +CREATE TABLE `role` ( + `role_id` uuid PRIMARY KEY NOT NULL, + `name` varchar(20) NOT NULL, + `description` varchar(100) +); + +CREATE TABLE `grade_groups` ( + `grade_group_id` uuid PRIMARY KEY NOT NULL, + `grade_name` varchar(50) NOT NULL, + `group_name` varchar(10) NOT NULL, + `label` varchar(20) UNIQUE NOT NULL, + `level_education_id` uuid +); + +CREATE TABLE `cat_educational_level` ( + `level_education_id` uuid PRIMARY KEY NOT NULL, + `name` varchar(50) NOT NULL, + `short_name` varchar(10) +); + +CREATE TABLE `cat_work_shifts` ( + `shifts_works_id` uuid PRIMARY KEY NOT NULL, + `name` varchar(50) NOT NULL +); + +CREATE TABLE `asset_conditions` ( + `condition_id` uuid PRIMARY KEY NOT NULL, + `name` varchar(100) NOT NULL, + `description` varchar(255) +); + +CREATE TABLE `supply_units` ( + `unit_id` uuid PRIMARY KEY NOT NULL, + `name` varchar(100) NOT NULL, + `symbol` varchar(20) +); + +CREATE TABLE `diagnostic` ( + `diagnostic_id` uuid PRIMARY KEY NOT NULL, + `student_id` uuid NOT NULL, + `teacher_id` uuid NOT NULL, + `grade_group_id` uuid NOT NULL, + `level_education_id` uuid NOT NULL, + `gender_id` uuid NOT NULL, + `family_income` decimal(12,2) NOT NULL COMMENT 'Ingreso familiar mensual en moneda local', + `number_of_family_members` int NOT NULL COMMENT 'Número total de integrantes en la familia', + `number_of_siblings` int NOT NULL, + `parents_marital_status` varchar(50) NOT NULL COMMENT 'Estado civil de los padres', + `housing_type` varchar(100) NOT NULL COMMENT 'Tipo de vivienda: propia, rentada, prestada, etc.', + `housing_condition` varchar(100) NOT NULL COMMENT 'Condición de la vivienda: buena, regular, mala', + `number_of_rooms` int NOT NULL COMMENT 'Número de habitaciones en la vivienda', + `father_education_level` varchar(100) NOT NULL, + `mother_education_level` varchar(100) NOT NULL, + `father_employment_status` varchar(100) NOT NULL, + `mother_employment_status` varchar(100) NOT NULL, + `father_occupation` varchar(150) NOT NULL, + `mother_occupation` varchar(150) NOT NULL, + `has_running_water` boolean NOT NULL DEFAULT false, + `has_electricity` boolean NOT NULL DEFAULT false, + `has_internet_access` boolean NOT NULL DEFAULT false, + `internet_type` varchar(100) DEFAULT null COMMENT 'Fibra óptica, móvil, etc.', + `has_study_space` boolean NOT NULL DEFAULT false, + `study_space_description` varchar(255) DEFAULT null, + `health_issues` text DEFAULT null COMMENT 'Enfermedades o condiciones de salud del estudiante o familia', + `has_health_insurance` boolean NOT NULL DEFAULT false, + `type_of_health_insurance` varchar(100) DEFAULT null, + `transport_to_school` varchar(100) NOT NULL COMMENT 'Cómo llega el estudiante a la escuela', + `transport_time_minutes` int DEFAULT null COMMENT 'Tiempo aproximado de traslado en minutos', + `devices_available` varchar(255) DEFAULT null COMMENT 'Dispositivos tecnológicos en casa (PC, tablet, celular)', + `extracurricular_activities` varchar(255) DEFAULT null, + `family_support_for_studies` varchar(255) DEFAULT null COMMENT 'Nivel de apoyo que la familia brinda para estudios', + `additional_notes` text DEFAULT null, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) +); + +CREATE TABLE `permissions` ( + `permissions_id` uuid PRIMARY KEY NOT NULL, + `module_id` uuid NOT NULL, + `action_id` uuid NOT NULL, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) +); + +CREATE TABLE `actions` ( + `actions_id` uuid PRIMARY KEY NOT NULL, + `name` varchar(50) NOT NULL, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) +); + CREATE TABLE `user_permissions` ( - `ID` char(36) NOT NULL, - `UserID` char(36) NOT NULL, - `PermitID` char(36) NOT NULL, - `Created` datetime DEFAULT CURRENT_TIMESTAMP, - `Updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`ID`), - KEY `PermitID` (`PermitID`), - KEY `user_permissions_ibfk_1` (`UserID`), - CONSTRAINT `user_permissions_ibfk_1` FOREIGN KEY (`UserID`) REFERENCES `users` (`ID`) ON DELETE CASCADE, - CONSTRAINT `user_permissions_ibfk_2` FOREIGN KEY (`PermitID`) REFERENCES `permissions` (`ID`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - --- --- Table structure for table `users` --- - -DROP TABLE IF EXISTS `users`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!50503 SET character_set_client = utf8mb4 */; -CREATE TABLE `users` ( - `ID` char(36) NOT NULL, - `NameUser` varchar(100) NOT NULL, - `Email` varchar(100) NOT NULL, - `Password` char(150) DEFAULT NULL, - `ProfilePicture` varchar(500) DEFAULT NULL, - `Role` varchar(50) DEFAULT 'user', - `AccountType` varchar(20) DEFAULT NULL, - `LastLogin` datetime DEFAULT NULL, - `AccountStatus` varchar(20) DEFAULT NULL, - `Created` datetime DEFAULT CURRENT_TIMESTAMP, - `Updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`ID`), - UNIQUE KEY `Email` (`Email`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -/*!40101 SET character_set_client = @saved_cs_client */; -/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; - -/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; -/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; -/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; -/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; - --- Dump completed on 2025-05-11 0:59:29 + `user_permissions_id` uuid PRIMARY KEY NOT NULL, + `user_id` uuid NOT NULL, + `permission_id` uuid NOT NULL, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) +); + +CREATE TABLE `modules` ( + `module_id` uuid PRIMARY KEY NOT NULL, + `name` varchar(100) NOT NULL, + `created` datetime DEFAULT (CURRENT_TIMESTAMP), + `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) +); + +ALTER TABLE `grade_groups` ADD FOREIGN KEY (`level_education_id`) REFERENCES `cat_educational_level` (`level_education_id`); + +ALTER TABLE `diagnostic` ADD FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`); + +ALTER TABLE `diagnostic` ADD FOREIGN KEY (`teacher_id`) REFERENCES `teachers` (`teacher_id`); + +ALTER TABLE `diagnostic` ADD FOREIGN KEY (`grade_group_id`) REFERENCES `grade_groups` (`grade_group_id`); + +ALTER TABLE `diagnostic` ADD FOREIGN KEY (`level_education_id`) REFERENCES `cat_educational_level` (`level_education_id`); + +ALTER TABLE `diagnostic` ADD FOREIGN KEY (`gender_id`) REFERENCES `cat_gender` (`gender_id`); + +ALTER TABLE `teachers` ADD FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`); + +ALTER TABLE `student_teacher_history` ADD FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`); + +ALTER TABLE `student_teacher_history` ADD FOREIGN KEY (`teacher_id`) REFERENCES `teachers` (`teacher_id`); + +ALTER TABLE `user_permissions` ADD FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`); + +ALTER TABLE `modules` ADD FOREIGN KEY (`module_id`) REFERENCES `permissions` (`module_id`); + +ALTER TABLE `permissions` ADD FOREIGN KEY (`permissions_id`) REFERENCES `user_permissions` (`permission_id`); + +ALTER TABLE `actions` ADD FOREIGN KEY (`actions_id`) REFERENCES `permissions` (`action_id`); + +ALTER TABLE `asset_conditions` ADD FOREIGN KEY (`condition_id`) REFERENCES `cat_assets` (`condition_id`); + +ALTER TABLE `supply_units` ADD FOREIGN KEY (`unit_id`) REFERENCES `cat_supplies` (`unit_id`); + +ALTER TABLE `asset_conditions` ADD FOREIGN KEY (`condition_id`) REFERENCES `cat_inventory` (`condition_id`); + +ALTER TABLE `cat_supplier` ADD FOREIGN KEY (`supplier_id`) REFERENCES `cat_supplies` (`supplier_id`); + +ALTER TABLE `cat_classrooms` ADD FOREIGN KEY (`location_id`) REFERENCES `cat_inventory` (`location_id`); + +ALTER TABLE `cat_classrooms` ADD FOREIGN KEY (`location_id`) REFERENCES `cat_assets` (`location_id`); + +ALTER TABLE `cat_classrooms` ADD FOREIGN KEY (`location_id`) REFERENCES `teachers` (`location_id`); + +ALTER TABLE `cat_gender` ADD FOREIGN KEY (`gender_id`) REFERENCES `teachers` (`gender_id`); + +ALTER TABLE `cat_gender` ADD FOREIGN KEY (`gender_id`) REFERENCES `parents` (`gender_id`); + +ALTER TABLE `cat_gender` ADD FOREIGN KEY (`gender_id`) REFERENCES `students` (`gender_id`); + +ALTER TABLE `student_parents` ADD FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`); + +ALTER TABLE `student_parents` ADD FOREIGN KEY (`parents_id`) REFERENCES `parents` (`parents_id`); + +ALTER TABLE `role` ADD FOREIGN KEY (`role_id`) REFERENCES `users` (`role_id`); + +ALTER TABLE `cat_work_shifts` ADD FOREIGN KEY (`shifts_works_id`) REFERENCES `teachers` (`work_shift_id`); + +ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `cat_supplies` (`status_id`); + +ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `cat_assets` (`status_id`); + +ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `teachers` (`status_id`); + +ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `users` (`status_id`); + +ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `cat_inventory` (`status_id`); + +ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `parents` (`status_id`); + +ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `students` (`status_id`); + +ALTER TABLE `students` ADD FOREIGN KEY (`work_shift_id`) REFERENCES `cat_work_shifts` (`shifts_works_id`); + +ALTER TABLE `parents` ADD FOREIGN KEY (`work_shift_id`) REFERENCES `cat_work_shifts` (`shifts_works_id`); + +ALTER TABLE `parents` ADD FOREIGN KEY (`grade_group_id`) REFERENCES `grade_groups` (`grade_group_id`); + +ALTER TABLE `grade_groups` ADD FOREIGN KEY (`grade_group_id`) REFERENCES `students` (`grade_group_id`); + +ALTER TABLE `grade_groups` ADD FOREIGN KEY (`grade_group_id`) REFERENCES `teachers` (`grade_group_id`); + +ALTER TABLE `grade_groups` ADD FOREIGN KEY (`grade_group_id`) REFERENCES `student_teacher_history` (`grade_group_id`); + +ALTER TABLE `cat_educational_level` ADD FOREIGN KEY (`level_education_id`) REFERENCES `teachers` (`level_studies_id`); + +ALTER TABLE `cat_educational_level` ADD FOREIGN KEY (`level_education_id`) REFERENCES `parents` (`level_studies_id`); + +ALTER TABLE `teachers` ADD FOREIGN KEY (`teacher_id`) REFERENCES `students` (`teacher_id`); From 8bd673219c498394b50ef2297f6893a38d65dc5e Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Tue, 15 Jul 2025 03:10:38 -0600 Subject: [PATCH 14/20] fix:(change): Se cambia y se pulen datos nulos en la base de datos, cambio de imagen de documentacion y script --- ...inistracion de jardin de ni\303\261os.svg" | 4 +-- database.sql | 32 ++++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git "a/assets/Administracion de jardin de ni\303\261os.svg" "b/assets/Administracion de jardin de ni\303\261os.svg" index 9e0e319..fe8b1e2 100644 --- "a/assets/Administracion de jardin de ni\303\261os.svg" +++ "b/assets/Administracion de jardin de ni\303\261os.svg" @@ -1,4 +1,4 @@ -1*1*1*1*1*1*1*1*1*1*1*1*1**1*1*1*1*1*11*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*usersuser_iduuidrole_idvarchar(50)name_uservarchar(100)emailvarchar(100)passwordvarchar(100)profile_picturevarchar(500)account_typevarchar(20)last_logindatetimecreateddatetimeupdateddatetimestatus_iduuidteachersteacher_iduuiduser_iduuidlocation_iduuidgender_iduuidlevel_studies_iduuidgrade_group_iduuidwork_shift_iduuidfirst_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdatename_schoolvarchar(150)students_in_chargeintcctvarchar(45)school_zonevarchar(15)curpvarchar(18)emailvarchar(100)phonevarchar(15)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)createddatetimeupdateddatetimestatus_iduuidparentsparents_iduuidgender_iduuidlevel_studies_iduuidgrade_group_iduuidwork_shift_iduuidfirst_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdateocupationvarchar(60)curpvarchar(18)emailvarchar(100)phonevarchar(15)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)createddatetimeupdateddatetimestatus_iduuidstudentsstudent_iduuidteacher_iduuidgender_iduuidgrade_group_iduuidwork_shift_iduuidfirst_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdatecurpvarchar(18)allergiesvarchar(255)medical_conditionsvarchar(255)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)enrollment_datedatecreateddatetimeupdateddatetimestatus_iduuidstudent_parentsstudent_parent_iduuidstudent_iduuidparents_iduuidrelationshipvarchar(30)is_primarybooleancreateddatetimeupdateddatetimestudent_teacher_historyhistory_iduuidstudent_iduuidteacher_iduuidgrade_group_iduuidstart_datedateend_datedatecreateddatetimeupdateddatetimecat_suppliessupplies_iduuidsupplier_iduniqueidentifierunit_iduuidnamevarchar(100)descriptionvarchar(255)quantityintpurchase_datedateexpiry_datedatecostdecimal(10,2)createddatetimeupdateddatetimestatus_iduuidcat_assetsassets_iduuidcondition_iduuidlocation_iduuidnamevarchar(100)descriptionvarchar(255)purchase_datedatecostdecimal(10,2)last_maintenance_datedatewarranty_end_datedatecreateddatetimeupdateddatetimestatus_iduuidcat_inventoryinventory_iduuidcondition_iduuidlocation_iduuiditem_codevarchar(50)serial_numbervarchar(100)namevarchar(100)descriptionvarchar(255)quantityintweightdecimal(10,2)widthdecimal(10,2)heightdecimal(10,2)purchase_datedatecreateddatetimeupdateddatetimestatus_iduuidcat_suppliersupplier_iduuidnamevarchar(100)emailvarchar(100)phonevarchar(15)addressvarchar(255)cat_classroomslocation_iduuidnamevarchar(100)room_typevarchar(50)capacityintcat_gendergender_iduuidnamevarchar(30)cat_statusstatus_iduuidnamevarchar(30)descriptionvarchar(100)rolerole_iduuidnamevarchar(20)descriptionvarchar(100)grade_groupsgrade_group_iduuidlevel_education_iduuidgrade_namevarchar(50)group_namevarchar(10)labelvarchar(20)cat_educational_levellevel_education_iduuidnamevarchar(50)short_namevarchar(10)cat_work_shiftsshifts_works_iduuidnamevarchar(50)asset_conditionscondition_iduuidnamevarchar(100)descriptionvarchar(255)supply_unitsunit_iduuidnamevarchar(100)symbolvarchar(20)diagnosticdiagnostic_iduuidstudent_iduuidteacher_iduuidgrade_group_iduuidlevel_education_iduuidgender_iduuidfamily_incomedecimal(12,2)number_of_family_membersintnumber_of_siblingsintparents_marital_statusvarchar(50)housing_typevarchar(100)housing_conditionvarchar(100)number_of_roomsintfather_education_levelvarchar(100)mother_education_levelvarchar(100)father_employment_statusvarchar(100)mother_employment_statusvarchar(100)father_occupationvarchar(150)mother_occupationvarchar(150)has_running_waterbooleanhas_electricitybooleanhas_internet_accessbooleaninternet_typevarchar(100)has_study_spacebooleanstudy_space_descriptionvarchar(255)health_issuestexthas_health_insurancebooleantype_of_health_insurancevarchar(100)transport_to_schoolvarchar(100)transport_time_minutesintdevices_availablevarchar(255)extracurricular_activitiesvarchar(255)family_support_for_studiesvarchar(255)additional_notestextcreateddatetimeupdateddatetimepermissionspermissions_iduuidmodule_iduuidaction_iduuidcreateddatetimeupdateddatetimeactionsactions_iduuidnamevarchar(50)createddatetimeupdateddatetimeuser_permissionsuser_permissions_iduuiduser_iduuidpermission_iduuidcreateddatetimeupdateddatetimemodulesmodule_iduuidnamevarchar(100)createddatetimeupdateddatetime \ No newline at end of file diff --git a/database.sql b/database.sql index ccc1cb1..b478c6d 100644 --- a/database.sql +++ b/database.sql @@ -4,6 +4,8 @@ CREATE TABLE `users` ( `name_user` varchar(100) NOT NULL, `email` varchar(100) UNIQUE NOT NULL, `password` varchar(100) NOT NULL, + `profile_picture` varchar(500) DEFAULT null, + `account_type` varchar(20) NOT NULL, `last_login` datetime DEFAULT null, `created` datetime DEFAULT (CURRENT_TIMESTAMP), `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), @@ -23,7 +25,7 @@ CREATE TABLE `teachers` ( `maternal_surname` varchar(100) NOT NULL, `date_of_birth` date NOT NULL, `name_school` varchar(150) NOT NULL, - `students_in_charge` int NOT NULL, + `students_in_charge` int DEFAULT 0, `cct` varchar(45) NOT NULL, `school_zone` varchar(15) NOT NULL, `curp` varchar(18) NOT NULL, @@ -74,8 +76,8 @@ CREATE TABLE `students` ( `maternal_surname` varchar(100) NOT NULL, `date_of_birth` date NOT NULL, `curp` varchar(18) NOT NULL, - `allergies` varchar(255) NOT NULL, - `medical_conditions` varchar(255) NOT NULL, + `allergies` varchar(255) DEFAULT null, + `medical_conditions` varchar(255) DEFAULT null, `state` varchar(100) NOT NULL, `suburb` varchar(100) NOT NULL, `street` varchar(150) NOT NULL, @@ -143,13 +145,13 @@ CREATE TABLE `cat_inventory` ( `condition_id` uuid NOT NULL, `location_id` uuid NOT NULL, `item_code` varchar(50) NOT NULL, + `serial_number` varchar(100) NOT NULL, `name` varchar(100) NOT NULL, `description` varchar(255) DEFAULT null, `quantity` int DEFAULT 0, `weight` decimal(10,2) DEFAULT null, `width` decimal(10,2) DEFAULT null, `height` decimal(10,2) DEFAULT null, - `serial_number` varchar(100), `purchase_date` date DEFAULT null, `created` datetime DEFAULT (CURRENT_TIMESTAMP), `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), @@ -159,16 +161,16 @@ CREATE TABLE `cat_inventory` ( CREATE TABLE `cat_supplier` ( `supplier_id` uuid PRIMARY KEY NOT NULL, `name` varchar(100) NOT NULL, - `email` varchar(100), - `phone` varchar(15), - `address` varchar(255) + `email` varchar(100) UNIQUE DEFAULT null, + `phone` varchar(15) DEFAULT null, + `address` varchar(255) DEFAULT null ); CREATE TABLE `cat_classrooms` ( `location_id` uuid PRIMARY KEY NOT NULL, `name` varchar(100) NOT NULL, - `room_type` varchar(50), - `capacity` int + `room_type` varchar(50) NOT NULL, + `capacity` int DEFAULT null ); CREATE TABLE `cat_gender` ( @@ -179,21 +181,21 @@ CREATE TABLE `cat_gender` ( CREATE TABLE `cat_status` ( `status_id` uuid PRIMARY KEY NOT NULL, `name` varchar(30) NOT NULL, - `description` varchar(100) + `description` varchar(100) DEFAULT null ); CREATE TABLE `role` ( `role_id` uuid PRIMARY KEY NOT NULL, `name` varchar(20) NOT NULL, - `description` varchar(100) + `description` varchar(100) DEFAULT null ); CREATE TABLE `grade_groups` ( `grade_group_id` uuid PRIMARY KEY NOT NULL, + `level_education_id` uuid NOT NULL, `grade_name` varchar(50) NOT NULL, `group_name` varchar(10) NOT NULL, - `label` varchar(20) UNIQUE NOT NULL, - `level_education_id` uuid + `label` varchar(20) UNIQUE NOT NULL ); CREATE TABLE `cat_educational_level` ( @@ -210,13 +212,13 @@ CREATE TABLE `cat_work_shifts` ( CREATE TABLE `asset_conditions` ( `condition_id` uuid PRIMARY KEY NOT NULL, `name` varchar(100) NOT NULL, - `description` varchar(255) + `description` varchar(255) DEFAULT null ); CREATE TABLE `supply_units` ( `unit_id` uuid PRIMARY KEY NOT NULL, `name` varchar(100) NOT NULL, - `symbol` varchar(20) + `symbol` varchar(20) DEFAULT null ); CREATE TABLE `diagnostic` ( From eaf77923d969da01c821a86956587c3b23cbfa0b Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Tue, 15 Jul 2025 05:12:37 -0600 Subject: [PATCH 15/20] fix:(restructuring): Cambios de esquemas de la absde de datos pdf y imagen de el diagrama --- ...inistracion de Jardin de ni\303\261os.pdf" | Bin 772740 -> 1780348 bytes ...inistracion de jardin de ni\303\261os.svg" | 4 +- database.sql | 1160 ++++++++++++----- 3 files changed, 814 insertions(+), 350 deletions(-) diff --git "a/Administracion de Jardin de ni\303\261os.pdf" "b/Administracion de Jardin de ni\303\261os.pdf" index 4c82616b7e691fc1ef41035b95edcbcd826dc6dd..9b6188c4312d93bb336468edf604efaa677a3645 100644 GIT binary patch literal 1780348 zcmeFa-Hs(ma_4uSPjPNmkS^x*iSIZ9NnuA?5(|ug9kK;p5DQ|urn-mR>K=Aa6O`Ub zPp~hudKCTs=J8?fZc&xlm6=sFjF{=FQyv!nVQy}2Zf0)wAO6e#@z=jc9N%ySESg`P17Ue!euk{o9AH{`T#k{`jvy zy?OhmOPdP*&$qw-r{DehkN@}OA8r&h_x5(ZG`IP7{jU#S{l_1E_~Xxiy8OdlrIlR1 z`n!Mq=4Wf-H~;j*f4flWo1ZWL&`eEpy^I6j&v*VDuK)G&)vy2f)9>H@lq$dR@BetA zdw+NN>i_!N|D68#pa1al&;RnL|Mjb{e*X;}`R=FReSiI@KYsPU{p-))|6}UuUv4k{ z>5u=Diod7F|N8x3{>$&b{l|a%-Oq1-`u=x6{Wp8@=8r%8%uxUGAOH1-fBN|!fB4<^ zZ~yUsx%|~%@&5+~^S`IJf4cNGa0=i4@O$A)|4w*&`06)rfB5d_KU`);Fij7@{ORYP z-u~|UhugKi-EQr0`L~DL9YLMU4HtGf`qgMfxj{gUVeJ}@a@Bo4`7A&{GZ9v zU+LwW@BJ&@B>XkE2Hf$I5*oW+zAL~|RRE+P&D?`@e$&|BKl}jjkLun?L&I>P66+n4 zy>w#zMFlPMb!S-nGfbCpzD{@lOznlv4EO8kOXqnELEpuoO+Q@+|NXu1F7F=NzP)z7 zc$&J)Q(*7+YwN$i)7yh;=k_{W+O`&*a~d+6yp zPw&G!qwaU4^9#I(qdq`<2z!8ejd=ErHBB!RMdLeyrHX3uL)dUWTL`-GJ!n}xA!Ku( zubqcfU*8;4$>?EK>pMRg@WX32YciVmOva-ro4IJZ>&?@Ih&ZB&cMtcmrppLYL|N8o zgc`kwi2cn&1Q{aoT?iV^PSpKy!b6mVkZ)qf5W*giG6)PPd0l?6I`QF^zwN)oOS_@w zbPZcoHJxdeE3O#A(#-}gdkJ4Qx2f)JGe#>vgoNQj`f)AYbcNIp-gPxaSvUP!Y5Mlk zbhiK}ka#`#2$H^qNR43WYj>|#cH9G)BYlfTk=`(N+P2@q5p~<|5VN$}_~oTtE1s=z zED?c--#0T`^u3KX%9hCtUy0?iIrv!++mC8#BR+#f#r74xVOjV=-r0s=nh|J&bXUQu zX8~ht+P>yt;TW2Byk;GkhxuZN2;VS!!e97~*_@kzfTI?gX%1+$?6o%d1IPdu^ew8D zeJMa&3_4tUj||~LW19TTBkF}Se@Ivx)$!#Oc`RX9zYplj;Np3mx?ndCDPWpv26;qT zY)%z3J)o@iW};ZM9NHVQLWVw8tPM7Nvyf8w?tqj+*l;FOH^WzSu^#OK?KBY<>0Cr- zO*A(l_1OHTbtEd-rO@|ogDj)l-zB_=OhMeh(eI{6s;=666N3a}7 zMf46$%qR79UBTMNLA?1MKyu=6q<6m?BwWUA|(t?;3$*6zlJxa=X<;b7 zB@SB56!L!ssrCz+Z*MGWM7Ii7kdE=()2PPcpx@63FCipMD#Mf@Q~PzTL$PSrTI*(YkTdNUl+DANSTGueJ zY6SqxzV~sk})HpNw~<27_aX$SJ6k&$ISTG1ql8<)4*JSIFrg zy^QtWB=wC`tr!$!J$|us-@cT6BK?3PG-Fr8#)1)Q^Q@;`&(fpLdTL<(nTXuZQcNDe zj&b`)5JRC|NexB=W>=`XrUnZ%nyk~`YuI>d*g+~Z#uMH{g&yHO#ssxrkddt&_L_`1 zIt1vLG+EMF`$N+n5Ih2WRVVF->xLbynw)qo0vWU)t?&qv_8XLXp5Sd6MX=RgW4l7x z(}6QZ$I-hc_=E9BTKgu%DyOeZ07~sgGj)shnuGaAyOpu(M1KWU*{q7Ga}JA0lQVuj z-~)mOHsc%CV7QEKeZaSdXf4K&@d^)NL%vb=G;z3y7lq?L;BcU^l6hjj8BPr%bHzrw zaKfjU!zm%%z)Uq)JORNa@3vs6tj=r^(@B&$`&a0AFf zz|>^J^f=20u!Y!a2YgPQwd_!e!qz@k>#S3@t|Lg=N9j`2Km^;}o2b^}D45Fqpr8{D>BhPM4f+Gqxi6w}-9NQ_AY`DnK)JtHB7ClXy^TM0_wy z`D1L4m_YG76sEyNR!&LopK7Qr>78#FN)u1q=%X_0kS)f$sD zIbDL*9hY4K&GX>tUbuu3}X!X+I+YDpKi7h|dste8)|_&Kd* z?AIg?SXuyC%;_S>GSxLKn#gQcO^zKSO&pyHAR|nnBdsvS_~Gw0OO0UDMp46pfs6u# z0bsScnS__F+8s&l0G>0i3wLrp*&1VClN2N@PKNIGD zoXO{Q%w;FkfiT!PXpm(cG#F_MI8jtmQ4``G9v{>h>oua&54O#GCE9@54{8z)X^$nJ zgsM!a(Wag@fSQEEb8UD|2+y@KWPGj-VM9&;WWb~%?ve(4z@)%iz@#Ex7tTe=KTS3Y zXE^#?6jp2iszA1&@>7c04c?_bi0$Bx0w-$WYu5IN%#hP&t8H)P`1($zT3q%FU z_)87Zp`loiHU1+*aSU0ijFO@F0Jg9M3AXB~t>nm19FM;|<;(D;`H!$#>J9`O&s3?8 zu%3qV9~+8es)`K7F{MU^;+Xy;vyj$bB*asg(TdKuTB$V`D>Y7rsc`*AkhBk1$!fKu zbOb9-Rde!^DacSP{ue+NClED6`*76&w$KjRs3czaRb?j%G>qAzOpuXu5E*~f{uHd$ z2sZ6Gz60z;IDl~A%owP804)37$HA8S-d=BpulE{?dzMGdGvY&VObHQe&j}>!!+Kn1 zk+RBb!7LU=L?$)qMKVo4MBWsUoFsAz>I~1s_yGn}RLXRwMTGP+Dmye3_dwR;kEKtM zUcI45hT>S*i3H;qGCm?7zy?QTK^~lm;{nGZI9(|-Jh$lQgB3EQ| zXef?JGdd#21RozL<8{Ll&CaDdF~@5$Iv2+)Jc86-gD%lCrS)7~ouI3|#&(6Wr#eCR zY-=^aAB>-EC1^i5P{UYrUZ2_z)Rw)xXX`PA2kO2>L+4=={RIbV?e)?N1cu_ijW(A9 zf(N!H_~=00<6u+sE$w*a8SDTuJW$85A>Sx_dT1z)$A7@#Kx4q+g7bAeH6<_B@i?CF z_GzVLfvG zBS^I$QB?#RQ)<~$v;T(le=vSlRZZ0)R^yc#%~T8-&OgdJbTl=!a>R?cMM&8ZEQg^G zwzL*XoC7xO!&6}6KK$Wfz-=nn{&iXQdtOFcHF|)IBWeE_@IDHVgiBOLrjYc&I?tAg z$y@9n6`8(y7@9}`U?|y=5{d>iCRL&Cre@1DL5A%IkhG5gQp-_st;O9KW0UkW8@{C2 z0V%F#s6b{6J=q=xifcI%TxFyunafV29yCA z5hPg@M;hOrjTguohseSiWh~=Gn64LlWHK7408tbtF5jMEBE2atG3$-SW9DvD*8VH? z^4)@)d#?#YQ~dPr^L2I==aTT2mJ zpnWZ|N5O&%VC&hHRzK^3Fd#@@s3oQ=W!V6%uQB8S-RstIDd>qt)Hj<$ypsHrR#s%4 z0dG|Y2L$_?CgHIWO`>71aRH7qTxc=}b}+komW|zL65V%z`(m0G8inTt?FFy{QcyKC zU48S2xfy1-coRSt0>`ojk3vBTb6$kWWa8k$ccw_qASm31#)1?3Jt43)|lcT^+?FbKAqaHYejLI z70SS^o@SGxWu`k7*`AjmBTB(alJ!)WQu}hPRIHV37Dgf}NgT*%+Zsd-mi0p1YT#C6 zwLTh7?oopwaSjC|wgm>kS4}l2EVE8o`z$zfSE)L|01+N*vO)h)BN#DPs0i%Q1Bdtw z-d0HjNrT$OJw+Mkk6^{!LfBwU9l@fWsTxzQ(%ck_C^1dl0gg6ObsVbaWkh>OF}1wG zPVL8;cu#ogEz%mQLGF*s@gzg7Q7~GnpuK{F8IgvzQwbryYYVSsAE3Q}9tOC6Eu{hJ zD@o(ygj4hO2r`jgAm4fM?Pp6(Q%(EmI5Os7R10i{8%f^5 zs1RK}0#f^tT!A2$QK2B!eq=3YzJpprtOm}!P=^sIegM8}(le;R(6gwxsUqhI9bhsn z7;l51t6>Pz7DdK&1WtRpgyOrA5UkUbVk8VuaXnYC+NvtfUeIPu@e!?1}<`t*|t31wUJ`HfR*8)u=>&^{R?gubMjBhuEa5&WViJ=!$)M6?AH( zu_b1+xCk21Mt$-f1A$ajR3C2Hk~504!&MB4^yi6U74)K75g$D0BEChMEku$4GVsxm zAe}9+b^OJ}bJK1k6a}Ly?f@jnLbGOqR!B5*GV#wMXh4iLGmKzG;PtH1(~L6GHj!Ho zQB4qmgYjoXD+xgaUii7KdT8I(n~e%{N=7MZ{DoLxn@@Ztx1izauFE=71O%fhmW@d> z?89DPn?{8lpc<8SY`Ssuk~{{S8LA4H(Rxw_j!PA$8u{>hR4w8nJ9EvUaDT7P z@~luc*$M-SOqI>mih-a91*w^W0Tx%`s?kM(tgmRCG*^Y8#n!Q|WO-O?pY5Qcst^MM zv=a0*#+CFQ?n&GVh_br#1l4V3Y-u7Xho+POg?uzXL)B?MND zDOPn*XE3L?$Jze5y6}#CY&4jl?U?3S^6YKzF zJ*!Mg#_EjzV#vaxx=3>&ETmS|%32BgdITG(#39UJT;XNu;&5T(!crK_K*22}Pl>J= zf}7VprkS5tlak=U6}MFMvuw4Rlon~oLrAS_X3IB~_UEwH!v4A{!~NGuo`bKT*C;jW z%S6JUc`37_|Iqpkk2B?VP1A77no^NaGbv)BRCsm0{!0a;VHDL`wJ6w{b54;UqfjUe z(+|PM4o1TrfKgYlf~?z@bF~LG2{nXdpc(gte?~4wrC86ZPSHLG*Q{G2iw3J) zwgcO&GAY$EZ_3;4hJU6yfP|9$OsP)VhkyduLIN{R$=Xxb3JLjm2}h7L2xG{&pn4qF z8ZsNs3EAhzEDRGCmCX0diO%chuu-DTKF^jmltY4=7k#Sy*k1*6N>?<#3Q zKj;GM`NNB>?p~?+RWC%ah@qa2ZNUIrH;5Q+OSu}$pu2H(9fd(+6?+TKPGS(a#QO?t zfD-0?p;30Jf!ASb;Iv$iw`66@v5Re{-b^r1WCKXGnt~qYmvzlfWK;s~VZm7k7d2&i z$)5qDAiZk8m*2i0XKEorDKn5!?$RJrNNqO+?pjEs5u|udgu@7SKp4t8 zWz-e+6h6Wr4n~NqT1!76-a_sW&P51$Fr_hUL>WM4G+_u2$%`>PnrLC2HQj_ufm20B zB5BbS%PVOW4B^*sr`SbcD#RddW}`eX z{K$+5@HDEH;)p#jfGk8iA?6L^D!5OoHCW&yD&35u*{Dj<%6clVd*4&r8iC9T)5bp{ z0M$zisU$<7MB9-`tcDtH`<%}6rc(Qbxhsj*qg<=&z7~pFiGd@iHW{o!?TFM0@iLO? z6$pk#;&&s9rsjW)(s##BAS1S4H4u-WGz=#}q}UA>%B0C!t}BFlM zYWo8+`+S*gU~BaVuo<^9Y=hIVrvY6=?yl5XK{6Q-R*muqc097dSEJGjs!biZ2Sn7) z8V=eI4$k5swQ`UxryA7(WT8l3@E_KS!l9}ajt3{LdvFX}&uhtb#ahgOz#+9>^IAln z^0jBdqd9t3t4c?|jB!h{;}T8;S+HWspkpLCDB(-iDRD9=26?2WLq=B3?pR7WiIWEF zU_^6~eV+JJ07?5C9Ws(Tge7wS!X!Kv6aQe=jD2MMdtrbaAjMk(ZNNAqM)0bTWQ{#Y zck0_o-3qlABVtFzH7XZbs}*rEU?qj6$Jj$;J(0Xp5i%%5&Z?&nu_v2u&6XhRo|c|I z?}02dhk{J)*R@94D;8bY1GHipxohh_fD8_rf~=QNsZd-P1h5&A*d{N^@{^rrAXn-n z!6i}yC{tw54l;nKeBSH3Bus|XfcLAf=x(ANst2I*_HrCGY%n&_fBYsf&;#=HVs zFHH_i83IMu>T9%}G6%k`Wv!x<_N6Akg4YZ!!q&(DSe{7E5z*6+T4hQvGUP~QH=^9C zhfyl`jp$LC)!w=bk#nvO+6#m`ao?;HX@EI3B~+j{4IqQviphZc2e84pY2-9$n(S(t zwAX;pl7f=$e?(=#yF%wEP3EYBpcjBl1;*s~Su|U}AgLqZJQ_f;AdK=OE-{um5JMod zSg+9#l6@*8uyuS9vf2GIx|45%dYVz3@d#!$qoM>EO*ONc^;9_2_@k9y`ZlO3O;a{^ z)_&epX-6swVd6pw zk%LxExDZagVFFnX5WZvWRd3W@WV8%xfz#BCvFw=%Gs(QjtBf-U*EGl~%En^+4%iAA z64vQ<;c}ZA5clRywH#D`r1)gQszwD#EyX$C3z){f*ej z0s;w4HsW*v(Q$V1Gq@aSN>-(X(nQBEJFJ!4q4l<8tg4yA8vLg2MFcyt2?jj0xItlu zHAu0V2+M2hN47|hkfzJ}fcK3D^9r5@QV!?7N2;HrntKtlv!+%R;a@CRo2Sf-r3f!FD`x z$H1?|1u`%=kbq*MXMLcgjMxPiQ3r%oe5*VRllQL)U@S(^8q0w&aPs z@HMW0b>H92!EoZnsxMqdl_Mqf6lZJWBkQ^6m)LN-C3-AX+$S9 z$iAn1FUVqhkUn%mFYTLJ>I@)hp9;MAatu2aww0}?*_x3law`0DHcVyHCrH{y`pAmY zdf{e*$F$EeW{(EdSxu$a&aMU&8&;@lC4J`vM4}m6C zG2vN{ZNO4WI4mq^45pFXxB2G@i2)?zM;>|PgcmA+ZNf92C7*?f-5~3JYQONPN~Y*3 zbWnk|vITEsT)4d~?HBThEqHe48vjt1=K?p?$@tlsv*IL!7tArWpC1)d`z3AJOce*Q z1+q|9Ec1_~T;m_xe}=$RYksUvY=krXg_OJ5#<9F%qx2$?mV(9`!Ah^{Veyt``_er6 z$xZb>1s1JICIO^8yK%iN1mA@_TY*uMpPj_I8FMBps8-eK7Khj=?68cRyx;&Cq-MzI z7c!zToC8^706V}ygSkDX9d3l$)_q?;3L#R9EMNQF*&uT=q*EQjCj=YcHBz(+GB}rN z;d*wE1}yDD)P7FS?L^EY^DXnRl9?xt2cGhlo(9piC$y)2YPLEvQ{jSe&8?dqZi{iX z3=UkuPKxyEAh+@RPFZ@LshF>&&cax_w9kyWN^k7-nybQ>*vP23u-%Ovn1bLctWGgx zagbUTc?c^llkb&SCyTCdu1r063arJ}JgP{_RX^z>P&Mg0lF%cKV-1;$XZ`KYM50`- z1_IH;#J$*&1`=|%LX=n_^F?Y|%%{R1#Ny?GT-(XnH2tR0%_9Oo+j~u9g_N{FB4qjT zigYF%SUlyW_6l1@a?_je6Yz|@XJ;`QhgBee)wSeH(zYYXbbd`O9Sa~qZy_lzNDE*m zLNWNBZIGUQY%*;yWx0f~NvipHms$fML-My@(}`%{etx#n__>eo3%4os%tNbJJQevr z=xdI^<)n~H6HBedi8Y-RazTGt2*H^~?dR5;#HrvEegI4R`Tc;U*1XV^BdRl4i1|Qo zNyQbz!Y4cdS^Kbp;x=FE!Bb#aTYd^}!j|gI_qD`>W7t1DeEaa*haVr1!o~}SEEdQ0 z^3!+vH~&okUw^&%{$b))rYBmXI=koM*QmIcU<>u89h@0nc2&tZ9sZlyI9AAdQ|ZXD->Iek)F#+T8WVv!O(%DC#`JH-Y5pMYU#|gY_0gTDB4s zWUd7=*2o#U7INM^%+dl~8Uj*eM0amMx&L_BOPN z!KQRDev9!HVliH((agk<;e2cP=Q8lks8b?)wxrYY4=Fiu!A~7;c4awSTQd-@@6bs+MgL|8a6Ctphu%EHqNni zgE}30NL9jsnTL9#XDYMft@13*m|RVVo{2yr9?p{16@)_HfL_r6g2=&Vhz!~CH)$wr z8a-r1EON$;1|;XR1H7=M*J862@MX7WtaEjP&}M~e2B@n(z5)yP6B0srJw7BZMR=*} zEDFWg)IKtadniq6hpYl)g1TqsAmK7-dhm0oC~l4+gC$G*AuKlcy4J9#5Kp#bjH1Hv zON;5dzYti6RYcVaRx?$PAANW>tD?eq{-HwOyh((@e?(PKVZDM9X>t^*s+mIyr{-*d zXmQhExNhLo+1QNp*xHk8mv7KWAuZYH6%E)*kKV=HB5XS3K?eg$tSrP!$PY{8+K56f zdoX3Jxq3$^3Bg!txF3YX749+zB+K4aGoo-Ig!^H*xI)Nim$d^2s^nnz3>G+hatMnq zJXnBPHf52f`!3@F0~eiP?MvWgP^Cmt4y+; za1zc|incwL1ElP=fl1OR&%(yG&@Ow`$5JatY2Q_2Fjyh$@yl_>L#{h$Buh{;9L-sn|hoJzB;ez|K-7II>#CU-VQ-1I5E0J^sS8XK6peD$Csq zGfVr0*1~2AEtBi$B0V0=KkTOF79~{~R;A_g)h7CjC>2daJ^lmw2iEK57W$7?mH4Y` zKaD?JsUc*{EwsVawX!HYsiyT8_EbiE4{Dqu9KRg#OGxc^5mwn4D%iQ0se~yu2489F zX*mBfmSmu271rKdQx#iC#w%p9{Q>8ps-@FpW_)9i)(>tH+~S2V1IoHfKOQff_u2lItE;niM?nO6Ei2&`U7AtiS+0o?CbMKz}RH=fa7kFci0Cv;Z5I|1{)$bo#U1!Bw*x%cRC5grvD~Oq& zu?*e_AwM@<(U6l@**Hm3xolv6^q0T=n;k(6Gp?29X!zulMgBF!KgK9Y9zG{W@y$aUCxD zrLoo+5MF8wu=X;9cEaevY(#VS=3t&9nvjMoDu-62ovmnP!zL8HBetvo&L(OrX^@@d z-SQdVe*a)$?b9q-Wr`sF?&0sumiX1*{9SYT?oTYgUw{4Z)nB8YXUf0+_CXG(ej~Y0 z_siG6Nvl0E3@Q=p=yZeZPK@d)tvBh$E?wkXuPhT6``SIbS+iJBZ z`NfU$U~TO7d*4{%b1%hH296criO#TIZ*Z-__~b`%6suDl1-<@W?ZQt`V&!G;fJ4vI za0_zm;Tk;T$27*F+b0efRcH1ftP~L3=7E&6ue!8i%0j$R{4>k33e_Ua7X94>zuIPyP z;^@_psTMZEro67rmuCcb@wmiwUXu|R3P;qCo`cVv8a|2@Sgo)EUE}o?CuYEUuS!`> z>}I*VU`!raD;FLlNQ@HnY@Vr3v7f#En@&HJrH7BmBIU zxY4$IV=u^Munb*UQJAewvfxm_(!i~4#$RnK#B%%;9uw6Ghv^i}-Bl|qjb@NcTU9Ys zBJYYDiDp-!L(IfJp`-Z+u*6KZo`|tg1DWJe7B35^s4-kW9J9zL+4igSAx>h9q!^aU z5*yL4MDFD;@sOn~_?mAH8+%Mo3z&tE7NxR0sdrUzh|I&eh$at4RgB8!O?)DJ0UuzY zMKrLWDKUx|VJNv06_qt?oMLAbsRr?hXJr#3jyTX<&(+8zjlATs#F+iQVA0raN1#_^ z6I!|$QCQ90dML3NDTR*ZeQJ)9OQ=e?gj8R?Rsx^FB$%(Nlz_rm0a%awxr9TtqN)-1 zz5qwx?;ml93I?H0@r<)CX<;S^F!%Y1KElaML5y<%b_ldA19+H86l>x-ht!Fnk9>CL ztj&3eZi)2xFRM&tkLMK8*L3Hotw(gT04auA;bO%9s7AnuzRjbyGu$3dOfZk2An%Dy zp}0j<&V~^}>);}UdR|d|4@^yAoMRZ4xWbEbitaVfEfuHWu=w)FmSS1s0tF*RmwUzX zgMM_Bp7e=lmas}##emk%)tY91K;|q8$tk`N$A@;~@Z+Ev5ob_Lm)KRS)+5p^zD|@^ z6z;LThz@GgYs#HYTr-->xjZo!` z8=tFG`cDec;1q>WB@}z(%2J=K2V+u|_8bxW8>+2=MDJ3zN$|CIJ*PkqkCwGMI#w`g zk14+t$16Z1p|_VWA2z-l(xNsuOb1Em?O~d(D_VMw-^qfH>CItNdEdis<{(MnEry5b zF&Ok1f*Hel8BK0L2I3k)vD{e#>WH{T@wL?KHNm}};0xt)bKV`0m2cyv4#==o zNhs?AZg7xT+j>Q|Ap@TR?Cy*Cj?waC*oJDzKU&BFt(tJ(&ez6R~N0vj!QNn+h`fA>&nyEM({DiK5DAyd)&>e zH_JIWAKpD2w04gghsQGz%$Rb01d|((fe9NSb#Tk8rj9@kE-Fn5`l2xD=U+t%ZWYPV zvyD5ZwpU{tY_Bgb1#=e(t=7)0FtlUXmuR{zam;B?;~PmH%X@~k+Z3~A5|d~d&yG8l zab%;1zavh0H`?;5~y(XOk9FNcnXR_pB;6?(n1U+t-&nLp;0v zk8n=h)Ix=+a|6yiuOW8e6T?MQ80D&imy!Z!nQKqPjXUv4tS{)8p2R}JT2~fAK$MM# z*l#8p&3fM8vhc`DN{}&vpLDG}ckEbzV*(Xulg>YZK0I|#Jy;B&`1TEY;QZ@kAg@XT z6M2g>&V1t_ce~H>Y_d~R>JY-bLz>EHs2JHYuDFz&)@2Rg=D5LP3}J5z7&A_k!@nB!_709_c&g2{&$P4Y0)UXlpq3!Bn}ahk(%2jhh@z&hXFqoH* zy(At~`3;)=nv(=zX@!?Bl3-F*8|~$yI$XbozU>+Up3OTmK@86ZlDG+;o*6mzfO92b(uW$B#+v6d=iZE6|E2flxg0HrFk_b~lu~;Qp6y+=1$?H5^n6N>v zz%ocL!mv&G4y{ZFqx_D@mAgE;5Mi?VybW3szky?f9V^Bfk1Fr{%5Cye&LwHOiW(OWCaQF0Gq944&Dd|O7hE{*Na(P!nXUYOB>-B%X6z-GM#@ieJ%F*98VcHn&6MSd z&6K6lg6uiGO}Bu}3^?uhF(fu~=b-H{nb-_2505R3K95=ghesWI+^F)-CpJ@liQ>^# zW?c@8a~yt5xFR33zzx`{eqx9i4Q`!*wPxmtsr{o#z8x3hU1`_QS@q zkw^B>KB6?E3$s{f*Uj|8EEXCtnPi2^D-vqp1-hNO zPxFGWR3CpX%;LV3=fH`~IygaHLk{_@%%bJG*1nipE`O~n_}N)SsdmB9d2Q<@^)99S z(959Pq7iURS!a_c@r$t1g=OG-x(X%slYIeCUMG?)r45o$wyEjbrM=@)Zt+1bdMCR? z355F}?4tZOi6docB#tO*UnY*McTyV;b$B9!Zq++pMpB$RoDs?<26R3^tq_5bA>MJ z>4}Ubsusr5aNj-CiXj+_%V1p&%1O+FawpS|8a(Ba4ZT8DPQvz1$>EDH3gXv=s2U2D zBHW-ZhcMM#QE9Y9l_)&ZJ*y$ns63jpE+x(*SuByTmO%Mye;ajpxXu=RN(`kM zs8U=;2pFM|jHM*39?nWQk8t0Ed5`Ht+Lic?D2U5~Uf;S<%8J{>of4LVI*k7W<;IL8 zF)e}(>mb#kvgZ|H2u_hXu{guJs&Pdft$oFQ6PWodM;nxXgG=RYTh7%3|%eXvANG z!w_mCcawWj#cj!9lo#<8v??Vpu*eh>iY-5HsO_GrzAaeH8t`I*kLEQe&pDjpf^u|{ zc#UT(l&fh*`7#n@Tt;5{>7`5-S?Sd{2Z=y*j$N&u(KslVm8%43G=Yvych%c4iS4eH3!p45TAqjkLg7$Cw@b63oZ!O z6t**P&vb%1jO*0pV*0Peb|#`EIq%#T)y`CcjSJ-Qis~6%Ex;`XkHYcJbXP>m=lAALf*HP) zpGwQ6p-T-!FbaQp7SHp%9tI9^m4$(Fm!8pFyWMMDFSbgQcbMB)OIZj%Em}t2p|Jj( z?i{rBm~Ix0FuZEapsYYkg#kb!^d8PmJfDl2cbQv>9%(K&)3d!vTw#3^V9B(&H9nX6 zsC7~EQiV`Txd%?CA!S}Krm2E_)-zJ`s`{8pf_WWJ|5Ad%O&=yMM{81yZQSIkuDS@~ zxuz#oYdRU3wq4CyZpgYEqN-v}L+p?^+3#ysUiRk9DQEZW14R1lBDWxGAX`jj@p2R@ zYK-=L`M%>G!EHRw&$3rZx2X}}9h!A#VcEbv?9!l9#svC%C>6J^hvLD-Z8$n z`E0zXPk+fQP_Aq?s23DGIw<~%10pUV+NvdXv?Pa_xc$1uGJC4>HmDLV(XtQtT15#e zg+N?ei9R&++ce@cV^YK(-LJ(1Gy@N0f(phML|MA%C9C2{Eh#Hm&(?vcVLrjeB1}D4 z4$2DC2J6&^^-oF9OKDgIlJ#+$1r9<@YBjE;o-T`%pjDMdSUsGQU!FT7%VV2e@Z4^WaEN;KB*3@t8a>xQDXp zDxO{S3Ka9y!YONQZ>SBvCp8eR>4TcV`)xL&8LKj@{NVmgj0lq`XQY_D_K0;oDK zV|z2h^+>#6`a(!g^NNsx^fq##A)QhP1caj1-Zf~aNhiC3=iU;F9XSI@PABBL^T-;*OR=c!e@>YEU&dxC1U{1hA4`#EPbnarUr#vb>-aK{Q}e9pLbVBGCdNTg+8?LlJ`Pjuya{>7Dc5Q+PyNs}vX< zEwYMn-Vu*yXRL~$VfZDn8Sph+?i$<$PB~5*xGHgP4v9xs^mM+kcjQDUzX+_AH53a{ zcA4_)g>RI_;lktstLS$r2> zgzusccZ7tDotU-jcvixB#4|9S_K-+S$#FnEirM0+HBm{#UFxcnj8Ro=LdNTyRdA@! zc+5-Q9Ar;L@$Hs-&mQpdLP({8uxky{Zg~B6i}(GLxJ;?ouv*1s*c+M@%u({X{UnY) zCNOUyU5eRnGBbze4$#N^SHK5*Xaz(oaFVh(F_N-0;v*O`GGox{!zKfs?|tGT4V#}w zVcG||Q2qGQu!g8L?7;_pd(5~>n8b0)QtnEL;Z(&~@iKlR=6X1B;Y2UWQ);IEjX*Zl zsmjx7Wg&|Qhe#sml52dY>P%FzpWsPcvw&S>VreFvXTmaL1?;m*F_mRx;2O`e=$~DR zX%viP-LDmZ?B%%&`UWnQO)2a!o;+Y5hJzxaM?$bT6r-Fv^YG9{wz(FYU93m~6yiB3@p|-LxzgL?M zGTOBXRG02Yv!2k>pq5oX*ys0tSkbax^mbV<)lcKCsWhlST{>(p8#gE6e0AHYs{o-N zSYEQi#8mULh@~E*znZHz(UevbFRoD)!W?e+3l-#G{6IKbm`g%e_Hp71Sy5X45g7i1&J$II#rt zSI^0J*lEN@><2ZALi_Z@r5$N~j-*kc&HpbDf| z%`&<6T&LM4N|NAHjwL~Ta0k}2tCD>TuHGw{-zKD}jCEm$*_AtRecuWRiB)k2dnajU zUzRf2XWT(MX#tW{9eLrx9kRN@m8YHBOAs4($QH{JxkL4>c;rz-AMRrYv2cg1OzKx* zIxmb-cZm0Tn&5}QeAe?W?ogLP4cPfhYKXW)@hzOLqOMoeUc9DfY0e#-QTGM8LlvM1 zi3~>FLF3sm?ukc?gK8J$1$lM4sjv6*> zPO8(R?v-PX2Umhv48|vlbS5T znpH<9b?T5rl8zcB>?(Fdk&a5(=T&CBZlojPBW~IZ4q&fgv2F6Z{N#jXG20DNF6b|Y z(D|tW=7TyHUNf`t*$#rnQ$OvtFUpj?tyHSpzF5m!@=_=3sALQKLYGdn40l` z=&@ZYDLyvFqzJiHa4pLuR|V67H`kES=dz>vfu|*4B0|`)Vyy9~@+wzpBroOKOAN&@M~y4*eR8HN@RWFNQ5YiqaKbp2cqAFeb+fe%(8 z0pgT(IKZYD$HF31r|Er4Kwj{*ZpClWMb`<+t4yT%Tt=7I3_G7O5b~hD1_LPrJ7fF= z{iHq3PU`3`p2kGtYQ;v1`?yPhJjr31YJk%}+lWjOxhf)+EBZ|4e_>LB-r+-Dev#i8 zO;`Ras1#(e`g##uDsU8z*`phK<<(fz@vtVEkGqK*e$Gkfu(?Ndwgg%vlCpRSpIG5V zscb5Cdps-gJYuMcr#&PRGuIqYPjLlziL@xTB5sflO^GkmRYUFpS*A#fVrHxCvTl0D z;EY8*7mpz-yEp6-p=ncKJip^drI?vt=N=53%rK0IxalSg<|?*alFVK4KAHO^!G-jO zPZ3rmYt*$KNGn`EBRP3pJ8#v{^-@z6pHe?oCwN!%u5k$4dI zvcw!ppPXITC~GK2sFO-D#>9lH;z*V`p3G?S7X_`&%*rf`%>;}iM5XdPh8T_{nhG>| zv&}G+XpX9ipOfdjYF=7w(=Kq@j1%1}oQx_7L`fTw`*T%z%YBEZFr3;TWYrqSA)0{m z7~}%3Z7hg!Rk3z&ZY+31k%6n6BeIWWB*Dhs$sSUCQJi?RrfMkM0!$%Oe7y)ZWu?)Y zB3npcykgOiy(90E7;3zx_SLnYAHvT;!C`Zc>uk}dMX)KqZG{&#R)EWFm_JXvTu+ zjd^UWg^4gH5BUh6kaxcdb_lh-P;9hdNWMGBMT1gg9 z+c>MACX%GmunM{pHus@EmhX#E(z5~rxWtUhyB9$vL{N(NMp+8!vc9r2%Bo>00<=nYvIniXIX$ogPq7rFRqH?GQm0L|cV$O!Z#Ag;Ob{b-{^0AhNFzk` zej=lZYCSmEbQ~vqV~Lw|rgZ=*`1x(Qi1n)Dw3&ei%%p@#yre88HWWuk7J5-5%>sX z(ukiNPfsy6P1z!x@hfrFG{f;hCdLgi1zt0L+BaOX;uooeUx`5ku!&pXGZWTP)h%Z7 zY<%QZlbV-oq$LaQ%CugPjUY#0;~5DOlFly#3SqjDS%|BA!|I~2Xfs!XpQ440>x7Fy zkgi%$lbvXaG6^bI&ItqAD~3)1juPFmgU@#?K5N2el~Tq{q3yy4MGeNIX*D6$uQ6tk z26DMrZ1nBF$9*2(vZ0^Qf?HfC2`pI)f*`}#Os=4GwBbF>78ETAoGDPZvWBcMttR`K zmQ(#x-!7$L71o`wxpEX`AItaIC@VaG$E^Pq8UjSua}&%WEmbtY9p|9z4?!s&CIO@b z6GK`OOcwm*btX=em+eA{841$yXZc!uL_+)XF%#{DnNWha(?_RkwJY zuZ_JVGr2LlWSAq;(ZWqE%Ncf3F1!s~uu1%c%X&}aCvmllSVE{V<0JfOKRLT11#zF4 z&_+w>g0&nwfwKAD$@XTySiI*%OHRklX#->Dp){lU}I>lsu&Ud?UN_9q^$ex?2KegGOZ4w}ct) z=FULD44HGu63jl$iW(EBPMqlL32?}!*$?Uf-S>sGC{Xht+AFxxmO!(nZudEX`fd@y zwK33a0OQaJbhu`NotIiYS|%Kh6DYMHr|1lGL)JLPTYE(?8tz1V>TdYHajak%cyt7_ z!9luZ(vYoMyRX;G2I`Ty&M{l$KtP%v{y2dKt{no}=g3?rhka|IR<^LW-9q;+ys=ez zWa89$NI8VDaL86rv7-;Iu}w>Ka`L_p(4r0fwV`bs-5*Qx%urQ^=JhG`tRd2Fjfzyon!O z8rGly!VXud4;saB2Ol@UqS|DjDv*;z%c3xn#f~Shp6VnzEtAfklYYgz{T_$8B0NYSQ*)o!l!NFM(K~?^3!*4 zDU_}Ah|Dx`b&JjMzA&ud1pJp0GbCBM3HF*KaGt2qPC;8$;1Ku=ajydsi@mcAv9Q?4L(AhicuulvpHVeSWgJ3{QZW%xyz+%@WbdOmL#=2>&z2{=)*H#vY1T< zazvntAc91LViNgErCdxRFWe`~rf((fM`D(sQ@Flue-4ef-_|vWXA7n|YCHzhU>>Xs z`~Bpx{v(5$wMNq)#$>l<)QVjF5Pmj>2phEqK?er7kx9mnVb&CHPb2Rhvi@;zd4I&n zE4cd=8`j|Hs)aS+sF;5kKy^6%VD%%4Yh459ap^GkhX~SjZxE^PH;8h3n#(et;0;35 z6^or;0VJ5OYrxh120ihHTWW4t(`7JIM^?nyi8KOR`)n?Zhx0EZb8wvXuWWU5R)mz5 z5b(ZtGloorGWUo|iOI@Qdw&{`^EkKw)#6HznbZ*OpzkDs*?ULIw+n8@cd?A^F;xmX z6xUk!M{vad&4;Fl?{~f79PQuqY+>5q9d7OvEi@Ip3#d}j!7wB3&m2+s@fy)?x4o5- z8FOYf@kz$GYKh@uj`3x0N|J@W*!rCQN&3GA_1gY$^XEEt6UW5uF?8H9zU>bt9u68< z)%QnGM9W2n*`68llyuu`rJy?BfjNNM1_f6ax!z{vEBAmGN?WYt?i2AGO5rb7ErGld z6DE%UY4?EP1)-?eI<}|bQ)25PsF046-^fM;oY8LyJTl0qe`%GVZu6&IrD_LmL0eSy z{;KMZYBv%IR|5Ew4s(C{%K;pB89XN12oCDP{l_8k4ir+WN37;3fFeVN=f=WH0EdW2 zvf913H=)}yz4>wyPkwUqO>-vqV5NCve7q(fXf8Ybi zrs9zW1*KOuKX6-xci*37MmKUdC|eb-DOQD5>v3dcwl6cc=mJi-ZD~-^9c`X_=p78& zqh?&GDBxpTKMC}Su6iE_hmGZ3z;%OG1E`?iLTAOpxe|&(9gI{xXs+n#J?|9mt34)w zBIk9Dg#d2B_tJyyU)9dz1^(Vkk`g>PvgIcl<@mO<8uAo;AsI3FA<@f9FwE$M{-OXo z5kF)M17P`Oe{&Gm2k5~BlYVGpv=T8KUg$5rvC|H3j1loS#cII*e6yWZris$@$DE02 z?;i#<%$;jbQZRZH(Tof$EC)?THt;vS!N&!m1Gkr*GC9#Anqy`0MFxj&g`4F55Dr_S zYpFw2ArSK5>bvtPzB+pY`~nIYpRIsbQs3`S!z+>_alqalj$>j$H-c(!Wmd(U3y$3N zxN=d(^92c0lz3zq6sKXgtU93ZYWF+jl-h)hTy?6AJ79OWv=jbt<=RJpS&C50*iZJN zguMz%)&ch{ZGye5wr%S6NrVe%HbM1>7Q(laUJ%OUPD--<1q={nJrd|%#0JRiGj^l_ z>Nt8SzwG@J+x}(@Ij++K8w;8dkKsnUq{2V%U(y(0x54i$w&~)-;>9Ql2~p<}9B?3U z&5qQk0Mky`>r{l4?I>qb5%~huNzzc0R%3gb)Dp(1t>|_mI~ZP=*uD0aR5TBhmw_bn zavMoH-Stre0Td(-``jK8asZd+ELzXUZx*6hkA*7(F;?;vE~4nO3)jG1c=pqX0JBn@ z?8Gw$+5OR?4)}%uvvV68^C4i5Vsd{7{abSm)i>T8Awx(j>(D!9VXuMyhP*?7q^Mix zioeBVD&_$g5x*U8#FQIw4}s;f=oGUL0k*v(k~s*zRfu5`zUCBm!Kh zMTQV=tT~J=TL%6L!K;P(I9Z^Nbp4a)BKD(%v0S7$;2yk12y>sw?IYwff<(>eKutEU z7>(d=qvI-Aq#{nEeqjiA!-SBL^J`WkNE<=GU-XVRq*c`+GiUi;zlVRxrb(67RH`;@>HX}HD?Q$aMQB~;`ZExrw_!wE?y?!4BJ|3EP7yj` z;%J{cMd*K@BJ{>ZP7!)x6|9g`gwCbwQ-nT6XbvCmm*hSyLgPG_8BvvteU<8(Z{BX= zb1Y83MVyvs{nFwz_eY*boK{7jsW`3c)SF`hr?dfCT8cIktIVlN^M6Wy7=f#jUIe~Lge0vR6>8|=Zm(D=;<*laI%2O> z$!y=GK<-72I_!M{s&xJN1yos5$y1zqi1dj%O(ttuQ}MP#C2|?KQ#*4N5sLk0$)Rukdntc8$G$YX!srJ{qhvx52e>!%uT-LXyqHo@ z8?fRcH3`}*rfFU6H;+X9=Fpd%`y#i#G!=4PUN?ltp!}D4_bL4?emNW8B$1-E3sN?p ziORq0bnZKy`*s_MZm$JSfPq7axnrHqeGBTuiIUUa>D0*%EL;IbHkUWT$JNGy#`mCUTl3 zPqU7AZ^h3Bwb;!d;VM|<`WWVDdNoYpC}M83FVUsCW9@AX*}e5&V}6?`9U@k#nU z5({nmy{CEg)f)!UIsOb}=XDgP?0m}3=d~EDEbDV#i#fVn_a0U#J5RbxcixIQZ^f)j ziNAFL*QDz6R?MPK)XlzsZ?|GT+LNm%ba3WHLa5SBqWiE%-|x($?}fekk}OST@Mn>w zRnJpp>BX(9G@%C`R*{EHGV|x2J!Z0(-%m2X2d)%)5qQVEu3MK0`O5jX3Hj#DB|i%J zQ^0%+oj5bVR!^(E&FB9#$9pM+9G$Z;-SgzoaN1(leKR{@e- zyo$nJnQU+Ysfvlq=v}-Nm@Vi@x}H|_J6$ys1>3LC!^_?TG)$1&s$uY8-TZczCXTf~%qHOV(QbyuFRJi~6Y@NF}P=jxH@Xm|G zgI3Q{`E=>Gc#_H&U#}PQ;j-Q+&uuvu)$ErX#d~mVwfHTmASYnz#k)@!#HOg|DdOO> z`EMm`E63U9z7=8@Obhc*4#-AUEnT1{e1XN&Y39+I0u86fRvFOk4979LhZ zo>4H7GaTC)jt$OwhGUbq zX>~fSPMrVN=d?N#b$lJTee&NPg7)*JI6I87dehzY-&)|MQc4>dH4al0Vzx zzLT(;u<+}i%(0Brz_N<8Tt3GVvRw!v+%BrB9DMZyE*mve|4NUi}w0=poc465tty>FlE;D?=r>?(eh1-b9vTRK<#Vki|Jxd`i*^ z_z1Vt)RKCGVDE#EeaapGUlj%$@=sor28GxIJ4(q?69N(+`KGj4E>eAn$?;gA9oW zO%q6z2*55FC*jqZ9mU{k{is0$`KC$LN6?1tA$JqgLs(@Z;5)2$5E3cU=E=q6By2Xr zRQz~H$n+0LBHp_JX~AI9CZqO-pd0qJ1m|gkaM5(Mn^_zri`pJ?Kg6(DF0bTE*#NPq z5CFpZ>6$0iI@CeTMjt!7S3fm)PlRnJ?ep0M zvIb8Mr6d?XfaF}?5PM^Lggn|0YbCW388SCeLS_?M)_UsOhmduPp3GP~q-ZQ2KUrFp z>S}w&(ek1gA9DDI6JpgOQzXf;wns@!A(S5G=%Z@0GZNJuTb~bn4a z?xW_(2u^U4t?@f?jz!W?-{`5AVEY$h;t;pQgOYD##_z@l87GqMWdcvU*d8+C##|%< z)HD$)*=J553u{~_*?1ca=i4KCDtp+=L7md#&;S2u7baMK|$yH>h=ZIEj_E#%~P> zOk1skC1Co6)XK;n4yWur^-kYmDorAR4?KSaDN_d<1FXaMpe3d@TR0K}%by*_ZAA?% z$lejGilof0+ge13D7`#d)~98Uvz^A3u}dtwf?L_72mlwq!pS1re#rJ?z7ZXGQ8|P*MiaHaNWXnQ=$c_yLz9-K=}znNW>@xPiuRv1YM3{8@5!o)g7{Bl2S(< zUzzTl(XIDxI&Dw0!Mlc7kjzqJ#csV4p=ssnds9#jq6n1LJL*YGQ#*wpKiH2UZU1qQ zBzjc)VXbLbBRrob%r^-!r_Iq-1RCNIryX}6MWPJjaSn|gS+9*5`m_k-O@J~;gv!>o zSD@uccSxb&cKjLA2mzs&X7ZRNthjcTqV2Q=xk2J!0A6lH)A#v)I<{c4P{PMN(?Hq~ zT{K>3#oG!*w^nWpYT4Cy zK;*o5@QJs(g=$ij^1Ax?>*OrghJye%$-!lPC@_|L_l26z5R$D7S#AB6zgt1t-cq!m z_5n`~Kx%V@E%=m2t@ak}18z!LH>}m3h{ROAJ<1Jl`vB?Jw+9co14vj6sNDdG)MV$N zuvR-8I#>yCsi(eun717ceef0uaN+n_aqO%PRUBqDe)f*Rr!Qevwck%(P$$bEn=ljQ zrE*M7&;*Wtq!`$qLBp3!?sNEQN<&DRN7nb9x{+)xhV58Uy~lK`3<=g#Hz*wyY;*T1 zFp>&j%ydC-oCZd5}%YpEaxpfT8iImX7@e8Z|3ya?Npi^e2{O1=;eu{V1V#X4erty<^Y z^u^t6J08VpWjw8nr0O z_UWvQcez*S$lS(4UCw*P6Oj`8W=aD+i75wAJK~& z7%{Z}85kJ1QJe0cG%%u~-wcdTi#cEK z6@=IO^8NDe>nKjK`4pQ^vH296f05X{GLchkKE>uUUlUtt!^Oo@Y_3Afe!SSsZ6WXb z)^JaJljuGi!TU90&dW8KgyGL2Myr<3P>ja$&PP(_@{C1HmY*K~y?RvlhVT}iCbI5* zm?l0L)tx&=^T_pWZefn?+}*ceCGm@KCc?$ocGJjJ`-#hBX$FbQ@eBcFcUsuwM6LNv2GD%J)P6y*noJJx-6`fc$pg#2@v?FO(N3OY&Q;52x&8^Ew(Sij z4ty$D&+hLGB>kGb#; zh!^webCKzCS=$mOX(vV#PIu;G#3>;}o6aw~REGRHDM}+z9~8E-ZJRS}h z%rk7|ijFgElY(sqzDY~>lY(gJm!VJlaO ziet+ew(<;HsQ{ZCW7kJ9htIH;1lUB6yguixve&p(hW_KvAZ+D6iqk#zbdNpVW8Kzr zhOK<;t+JhoobIv9CVbv1J8zYp?y)c69$O^G%Zy&X;8qz)9Ede(e+;@jd*t^PIYklt zYUnwPOcU-N16Hw-90qqegpdV^0BVE*A{e>?^M5Y`A|^T#wc(vN3}Z8p+=fJIDkK&= zHDNxv-N-0J_6cQ1(uK} zkzaku`)!407qwsS9*WM%FluiI0+T<)d%*NsHcS)BGC}Y8#VFqC@2F0ad7&5?rUADr z98m8)n93WtaUvueUG|K^rw>a146bkZ->K8&uB)d3lkiV(AO8N~2X1KVjyATj{9?BI z_!Coy%-4qP{l`nA|Hp@4fBnE6Q|{WnFQjU7^+@{_|748_v4cHFqr_mJFK)} zwqYjLB={hhiyRP?=TNRy+oMF7WbC^8Bte#Wvx2*m&2Vsu>h7fJxRQ}m#IZi)c&ec~ z(wxDy-#i5GV307=^>h9v(`VhAk=&m?oyo1aEaM5@ykV?lt8tM@Np~5*4NAI0=ArA% z#^M;?bWxfUmmY~Eoj{G#3~gQ1AgT7~KMNM8$iWPBavH<34+WBD)V+6p2*5KZ5EfpBmE=yt0G# zU*f5`H4i4Ub$Ha|)! z>l15Ah;{R(Ol-_zqgAoD#4mUm)%r3cvwfMlMTcx!a>8v(gNp81{#qmJTZS4EnjP}s z<&B1UyPK%9B5igbiCH%}em(ho$h^n(jn;wk!z0*+t&z%&54 zuD|SW`9bqucjSOcKLANT_+Bsc7hl>Th&Lvd^Ebt6!2W!*2y|=6Cky^m#eF&+1r$6t zK1D8bwIrG$96o{1SBl|pxSLYYh>b;r1tzO6*_HRA zguM!?^NHRi(OH{dFRN{vx_uJi9GXo~O+LD;o%DiK#rIA(RMrRfNAhXp&$WQRB?XbY zupUA4DeVb;b!d#$Oo+8>sk zg{UuIc3wwu%Fd_ke9F$J?EHuba<%NdGLchuK4s@Kf*e~Z+8%FOI0G*yqxeThki&tb zke!`G_u*(^uMt6Rv2Tx3nLdLot$IFBS$cLMK}s(K-NcugP@!R@y89*aHQrEv2J-bf zic`Km8DwkK^HkY-iNaO39!22_Jl~UsJ$E-ZZ8>gG7HlhYHWx(T364rTb2Z1K z%X}&B^0FvN<9QV5Q{!U7ZSKhu@G)cCza{XS;GZkhS0CMvrqGTF$SBlzDaDKBlz0Eu zH@|v8m!^xST!_#mffk$o)ZYi(2>6dH1-MHpZWx{=!-Uy>zTqe+irQ{O5cie)x?_*e z@pd7C;6Zqp4L9sS=m@q85n5j&hM1HQiJ-+|J2`5#GBfK~bs55a z`w0m{{WOoO{l`*J5Sra>d6s)9>xzH!MF<=ah3zTgG>RyTYQdrni_0hiDQAi;3aPk{ zR1Y`+8AsA(3Bl`cV7a%Hz75&KGZ<2r*`943<;%6Cl#&_w`vI;Rzdz-)$3nu#E-%}s z*CxE&1U@hq+uewCPa?P>k>+N)`AaGlZWo+uZay?enwv0Sc&-@@owD# zQ=3z2T0*_tuclSYA&f62`?TO%u!+Co`tLwZyao(OlL)ReO z|M}gXK&HfdER#FFz#vJ-qc|;8r-kaYP@NX4M_8zinaF9OIxSSEh3d3W9a*S8`t}4d zGcqB}>!Lo*<%y)Mo5cA7ZCs`u{;r7dWq#cr2$`Feb$kOs+6c~@6U$03Ew>--H^aiqjHZ(l=svw; z*CIp9&*B+mXjStx8G7;RDvarYe^ul*BcpraHKQVPnn?!vz{x@{0+*Rr_32tf`^jI5 zmNy0Y-pz{w`Ch(UcA10aZeA9wF3zt`2)>uo?pa8>YIt6P@CTur=Hu?&#gjf zEg@-jWF)cW23XLEd42i!$>+0LPsyX2#7Xn zk)f$?UyzqqGvQZ4!WDD#@(9&Z&5rSvlb8SW6A(dSGGKiF@!5KJu_g@5?{)7|vT?a< ziRp*|>Gu#V>t}G;TIbGuw%$AK@6+D+TKv}ID`bL-rMk}-B=)ZI+5KpDtp(Xl=C2hZ z7bO28U#x~`s|t3N7+rfiU9luRpMh*~1qlPxhG9N~fVZbB*6z%B2D0VUSVfLCcV=Ex z(PmFqEU}=|73*}x;;i;(>WX!r+<^zF<4bhJIvB%gPO4SHXAs*nh;8o-2NR)lxjaWs zBIHS~e>mfV7@l7Gq@lMNxRx-BE+&tP=7Fezn{panIbZKsGMutp4FpicX(k5w_Kc~` zvbIG#9|Wa7ep9G_-yaFPIbb2D6V@^{X9(LWy6r-Gr!h%FGLNEg&!nNrxQpyjgO3S6 zi{k{G#sF_VLb5nU#cBlBkIqEiD2YJDYhti~*+hV8Vzu=5Uj;W=74;wOgw=3?dDmLE zUcdBde6SYvo5csnl;M@`_7O@vtL5=Zyv26pHGPp4CsM(ycdb{!tKjpu8?9nFun!poJj6COZq*AZpB$I+rC z=`_iv9cUeYce+u&>7W>bw0FUa*~0xNh^ z2{jp7tJ7QMd9!`_2}we|{8EA|&BAo=!}rMHkKk>qqo2a@$nRzim1MusuWk;3p?lpk z_~F=0S~~U*&_KyyvcO3io+|Oj_q;w{ibGU%=4P;TzWr!F9K-sw^H>Xd^nNV=Vuzej zG1u-RsW#2`5S_PJJNP(*BbCXi&(zY`JWh|C&5pCBD-Rr!T$Won$eCLD^vFr}1O0j6 zYjdWSPRX3l)Y9&*)SszGPDdtbceX7ED zM3OeIxe-GFz1r8`Kl}x%IyT2G?z}E6E?F?_Z|>De)pvZqZc^Hg^vA4h;T)}7CGxQU z^OGya*ZI!YGWNHTHmMBTg^vVrC(Sr0;&w8258W?bAIybqM{EV}_)63bKuP2=wet$c zm9+!V7QtQ#FZQRIFC7kO+=O>uEBwU$Zc#t>QhJ4An67%~y0OQ@sp)a)hDi74He9${ zeVvMNT|&r4>f5duRM>ul{kSC`$o7m}&U^FFLY{N)hkqX~z0^Jqd($vURm`y3$<=UI zxC<^E49-t@n%Ya(aphZT^X(zc#;*#aO^XGi<68UOM|i>F6#~9_z|HvD-{e!ZJS|Z_ zqB?sJI^10^=N>{Sdr7ny+P>kvygkH)35NaVVStuK?-e=B?d47xM#JqH$MF&ZHe979 zIm!lzt5no9aY@(_93IhHGdq3TGHGtqpn(Vr(-n{Jy~+VpzI(tPcx8&V@euX~n_-Vn zr}N4rK?}ni32)*Enf?JeUukoHpja-scRp%K&wLx4r;SdDULLxc#WA@$yCc|+3oG5- z`Kc2KVCko89%CoeL5P&e4X9T?HF!^iZ6`+PGx{%ZdRNmC4608n{#t zHqUm2$L`iqtWm<0sBiSti*@EgrX2zzdC>c%n_>37>n3~pWdcvU*q#A;4!KAKsA(ed zQtNIywEY;@Ny@6`?(ivkDtoE$7nTBia!0}zdMHPZ$1@{u$&Cy`0mev6He-E>3feQYQ7m2Qo# zqtd2tSS9RLp7uwjPYNO7CJiLGKXL16Q*<5eI>Qt^yzd=Mha;8ynCIP0&PF5iA8ZO{#@8BdS>87?6pX}Ye+Ec-kVH8gBJ$pNlQ zH=7BV^>}mbG&5viEXZN<25r21&_?G6-?CZY5#F_aNZL9HZR5F*7K|omXdU-4(c;!! z`_bchV!|Ux#3-;tYdby~W;cW-bPY_=4XI_4Qb!$MneK>j)_X?-wx`+PT|+EL)=Oi> zZoPKeRT5WsostYI%Ie*y($dsU;l~g5V@TV79ON`4F*2$(?P{0QIo~A2oHj>S5om}< zoOaxO6p1p7$2l~1&B6?4$Fdu+@a{n>@JujaITFF`idlXq%o)-M0il;>@|fjfiFTHv z?X(5CLCV(8S{*>F|C%kh?+`n2p4*-dX+w0u`C==(bv-*V!+%9ul;ky5?^>^rT(gRVjX;?Y|s+;_YssnpD*jeaYXz>5vo< z?h)Xo!L5G^jOE^aq2@D$WGh2f+xv7QLm*p&_LidkvnWm3+6PA0RM$-hkT4KXyS2lS)XqU+t#&qauoB=>Pks9^Z#x|N>_|E! zgyUz$v9r2?a+tLZSAjk}T9|30bH{)tq?LAJqP$d2;2CIwOH{Z8ZqK0MOC~2+<@RVw zLrBn%tnWK@>$vC@!gj2v-ebD86R%dJ8O=nn{My@ZExh?KAw2t&_w2*3}zw zGnnScT8io+B#9@nOSp-W_#3v*(c?OK!ERunjNi^*d-JS*&VzPDbfX&DSxW^m0FA*8 zi~t&M^9`$F@FHwGv`JD3d5Fmnd%{vqKbP+wyi-@HR7cAC;w}pvjp4K{p0>r)w&=L^ zd0EJ-f*-{O(G$a)&(P85ZGS`;w?QMHpSS(b%R(Q0S*WlrW~Q%CXIw-dr9h&!Bma}E zi>a2+(7cFfznd3Hu`KiAVXAAr3)3in*tFQ7@WnQnE(+u~_kJZ+1o zZSm>%7Iz+UUR+$XdZ%&mG%ju$tvi<&6odOTEFi8 z;(AvR#f+Rz?Vci=rWqXZ0xYw=e$YRU+|cqy(S1a_!>D_S_5&Zn^h1VQoL0KMy zz~Gg~t z(pU4}s;?f1C}rsYs-42@!{8BKYaDqM85lgOh5LDY`y$R3^QU|XF@%3q4G18 z>)nUXRIBCU?TeqOi1GLg6rox^KZ+o4>P``Z&Qn+w41MNF$7%Az36f%g~*ylvv7=RWfn>w$b0;y!0Ax`$uG- z{ZOic#%lQtDS$A88`n1quwWs}`u^s%X5aPVbDMo)TtCD5S1q66>??u6mZ^gEu08+L ztbf;&&x``tFrI+|td`G@0*JA^Q-Dc#=5+uSNb(a!Xy4awQHFvENitMf;Q#x4`~EH0 zsQX@uI&3$%f2&=>bExOu`w4jb95b(4KEs(O?ZUqHR~cWkyv?p=+vE2+_x~x&vQ0ql zy*I@SOTxo5DaipZJ>$d@{&;TRsg}=h#>vsL&A4PLt@nIAzvhg)-h9Ft$20C3X54Cd z+KdxRKQNVXCLYFlP?8eTHIea%sMSiMaG%DhA4YDpE7u7D*3@Z|l<$sxDk5z3)!x11 zG))L-GN?=gW-z69A<+vE1jWxEqEZKKO6H+|d+6nrwLgoot|te>PKaVXZc{PB)Q0oR zBiErlnv?^Io8Oict8d7#1HG@$8M2u~wdOCdEP> zb0)>w+2t9!j+>WZs;e_8)|nLROo~NPLYKVeOp28@(laSmoj&UfU3Z4AJ44s4g7%Ww z^Gu3`w&r<4*O7Yc%fAx14dQfYJ{_7*hh`L{>vN{XdSqHGGB&S_5dHR<7YhP9L)V?5 z>voma8M^NI+*fbjHrIHIR~%>qm$%=`y)AR4Tpb!p@3JE=#>l;q9JAM%RLCR*pUJ9z z8;4=GG|FTy$Lp~j$#FdocO|+1UgkqsBVpOF70yF9G=mIi6mhAqgLxADbG*+}FWV$$ zNSO(7+}j}wt0N|+0)PgTTQ>WK{KHm%UO48K&{^qkgDwz)M4j;6wIVZx+ON6s0MaZ>r*C|53$|` zaaBm%#TI9d2syT81kQX{anyFc*EnIjPd^bwsE>x@{l`lqeYI~Byz_mRQ9+MGmTsS7 zWEP^GGee$>O-}Nmh1)yUtm{1XO=gPY7snHyyc)7)R!w}#R5t(njRq>OhO9zpPh7#T z+I_xk2FshiA3&~Hrf&K!e-2G`DvH^wgc z4e&RsfV|;}5#DFHM{Q37ubfGf*XgS9`iNmvaCeyJFu0WuJG+wlIsY(#>aO>0q7x6n zyMb=`B=@)W67*)g65h!j7;epF8Bg%$4Pzy#y}yV(176j@w6k034fk2xu%?T$p~Lw1 zX98-RX5RxPxMw?IWIGspg_47hb5`_@J;@O8zISB(X2y!|;IovjlfvH($ax%GfNJrh z$4qJnchL8#^EhGhdNQ%=TFv(KEU}Ia$=l%#ZfK@_Xh7ZWs-bOtR+t<9J$mE38o={L zQ^C7{D!G`CE0II*98vi38qwaiy=BGpc;jRfpCk#ARj}x;I4g~=EhGqgvGqCqv%fYC zV$1%_g6k%i^4<`IaN`LIcdF|Md2SfK8B{+_o@A9y<|amQCeXz}=RpEi8jwoD?gB!?k)wduFy8!@W% zFHyU+HKW^E1|!V71VdLzZ}3#T;6cQX(KqOt0e%Pdw^{u%D8Jtly9^T6URu@Jy5_+EOj{j1t}ym()R@Pod*5arZV>uC&WDoI=E zheBZUZ~aBV=Mg0Pa1hY%+z{|_f1v!7lO7vS-}&th-ljM2SjF?bo86W(iUIW8LfEU( zD%LfD(Ql6ZA>5E{iydMLh#p*hpSUIo>)en7Y+Tbp1nt8JUQeG=gSnoUrR19H|*dU4k@>t@ON!2Fu) z4e4_&;BU!5cMTEhIC|Mme#f<~4;NQImjj#19l_R-8!oUqJZE&FoeVbScNN=k`*!dm zlmvvR^9T(?Ha{cv(SnYE>vQVskM#A2Jmd^OvJemJ1HqRoIy-+s&6r?7x| z2(axvZI2Q65LkEfU~|MiVz7XJM1TteX}W8rlz-2w#7U@+Gq_`TXw{ZCBx9M|BgR6i z7Q`=)O_)c>Wdzx9lG-1W$}2V_xZCKMU1M++pHY&SyDm9w4?z=<@M}gRNE<=GUG(lu zHN%{}PiqI4|3J72mK1z?Q+R)@zCKphA+yCV-lNAOcVVePN94;CxR21|sTO}bDO1`d z$ucYYfF2J4?)~WgK*YX9jW@W<#|nOJ7Y|ttA5JS%Z4^Wk_~L?I9}eP_m`{oMl$cM6 z`4J)e4tdBaF)w1(DKS^V^eHi)67xp~XtO-9os*cIH22{EZSr<`$$;0%hoM(?nc71A zROwl@JVkn5ZuaLAb#Tc(a%Yj`oqMyWr-(ibbHQ}DKX>#WHJtvu!@GR{KZM*FavD5h&I4C6Mey0Q~c zSN2)<+Xn+JThY&$A9~o&VyG2!E}foD?2!`WY6*9QDy~>+&4F=Ba2%!PQb0VNYv0LY zYZ*^OLRqZrAYRReqtLNNTehOZdS&Ze^*#3FVI=QvxwZ6uZ*@Lw@s=<|*S$@zGa{w; z4?(CF>#e#8S8R#c$-h-lLcWxn(j_xLTe0MEGcGsd+BEyINVO|-uZsCYF}!gzuDR<3 zN+$CxH{-JOzMFAP6U5E9FmBw$44>SLYwZps$EP;qiloBbL3x13C#0pGX@(P1PE0v5 z<;2u0h^c3!h*MKeO?fsc*3v6eQ8(sN?w}tw=8A2PW%Eu0WYkV?aKElwZPoPp?0?Zv zSNw4o-Q1)Re?jH@8YQ19y0en+N6ors9Uq!E6W#f{?7Awe#)!X%8cK8NTz*d<@I0M9 zJfbheGtF=a?GV}_v_t5(LFiQ&A_|L1{9mU)9u4c%f-C3Ze}hdtcH>qLDHo@T7nKU` zJlOGWx>+!H);VXW`BAC9t}$*s`0y-_RJukkgVpF=&s+7RQo%7A_bNixS6rzm=Kc^{ zZ_4SifNS@Mm=%li=o$!UU}h3;2yPRt^)DQHia`|iW@ZNLZc0I%1GYnsWCYC_jTat> zmHKjL#9EL$s*-jX-xBauwHOYDxX!MJ+z4w0r-9Y(dHXc`#T@C{AGYp_Ev7R&2yIc_ z9gJu02dOchxesq%Dtb^zoww{rlQ9CbMeY)X9^d7^yl0N4mTl915}4C?U23_Xe|`#dkt&=-?MAJsA6W9W%HCjmAxFylqSUHUfp>r0#;?75mQX@PE1FMrP)2Pg_oviCaEZtvkz=igjo0 zwzR%H;wQ51B$pviJ*Ig@+WO{dJ-RaOG+#voF)~#2bAvJJ89$3fC*cj%(e1Vz)kE*y zGU(h1q&tS-n@6#mSEOeqz)`YTYfe+kVL93=r1?KP1mE20gOT{pTFoN)-)6_DFnp*A zSVr*Hk-gJe%sS$M zMLe*`wg>anIdkfqAGY2kV7S#qlWk^Wn}{zR6!H7Z(BSh={sHOkpUs?e2cCIS#3`WT z#4v5@w=0G2%lf>jnma1=e$;4l(&vQ+ivx6QzyEdm+f3Ko(wY*F__jh1cB8Q?3R?b> zK8LO=A5rRI_dGy`kcddp{+nhb!m@dfQ0EqN&%&EnUpY1~5&tS1U6x!VZE zr1hv4g@Yl#gf&aT)|f!&#Bn!~f=i^$QRznyPsLQ?QLPyXLEtgf$e2pmP|Ji5K4XHc z@a(%92;EvKNe(6qxU4Y=jpA{x?;l`gh@!mJNhT)lPv~QUV4DEV#IQfp%i~}g(6_xb z#Z()25v~=Rl>Lp3ZQS?qoJh2U!Hn5Hk_G9v17#DTFW|1&Rhl5Cfj+4fBw{opoo#@4 zqLx&PX1b{zO*@CoL^(bsrfl51!E|OlFj}iL`{~p&mpW_z(+(se;9M{R)OFptT9BMs z@ZY9?nd6mP6GRq+eq-%JP<=)R=8r)$F}&%9b3~?%ota53T}d!=CNe{`wg;O$xIzUb zH}*$_4xyRK8ek?e&qqn}9GC_%3)0w;b;67e4BJ%B&J6;E^Pp+q<>*bFWc;X?P3Ym1 zP5+ST&gnVL?IY7z{0tcqwgzQAry6f3VNBYPrw&roX7A8r@nT|0Xy$R!oFmc{ZnRsi zeC^D%R_=xEg*7)A7%*$G4T4c!Wf|(5JBZy$NOdt zmr2=m&LbxkDQGz&Yg}1r%sEzxc~vlPHpw9viQh1>*eyTgc;bCSG!JHYc!R42Q{?W0 z9SB4~?d}r}Fpos4M(&QV?izC+vOd!15<#XX8|KEhlNLJL_{ai)WmDRvV`3I#zCvD~ zr8h{RB&p8eVAEpeO9^{Uo)??Ig2-m|lE5f>iMwsJ0`%);152t5YSsf|)%ihtUsn? z-%c>HR_nB?5pG)#XK%@5o)$+_5#3O4@wDP@t(ay;k#VLQQ<#OJO^89p3}%Mn80>%v zuOp9xr<+;v2c|}~AoC^kwrAn;wXz)UJuN||k?ao`7j}b)gze!IOE8(6kYiS82sAS< zf(5N9^G+rfI~$Fk{BqN{bY@TFZh1fa`6Z5l$45JKB>P&uU4QGO*fKX%khltSyK8 zPwRkrf%K+maYQWGL|2$J@&aiiVQS5KSBbShQuTTOU8Z%QGq=Jn?ncSuIxqpadaY$| zXlfOJo1WC(AK_g#hc=Lt09>{Gym73ormNV@s{O1Ttxa6RsA|3MEl}@4E0G+Nglb${ zk17LEf!XOudWrRD)qG)co4HX#S}n=#!TR>08dB`l%O>8aYtkZWECi$I#2?63V5@mRf)VZEMlgcCi`OEtwWa&}5ke7WNEAaN#eE?ZGdfxW z?b%1LJyF~kX%CI^QT%`ticTobG8VS3!sxpOgNcb-$V6-s zWomj1h5BNMj{vRy3xMXO5e}LiG&^W^(EJwAyvPs-%?_F!G&^XXLj8PO!=>F1G~*X; z!bXS2pt+YrcK<=xkForV@yUi2zk3v4%*S4i*Ho)j;}amSsAkn8vlwYiH! z8Wml;{9nINOXD}&SW?kFOf^e24>&3E7ILR)wX0%M$dz5YtaTz_w%P99y}M2X97&Uz z2~-HO+X(*lyJdk0EvtMA4f02kpT@6E2+_)*cNl#9A@5*}Ew{=C9QMuR8rd-^p+4`rJBck;}xQ2TkEyHYc1FB-o8tB72}NprmX9^ zeF6ei&NS59oxjd;-6oJ1gMRSyZuqqc{8(;Ht&8nxB|^N9wOgt~M%DLD;)h+=w)RYG&Nd6n%oNfT$`tT8h@mB-WQi?V zBpj_egq0*pQm-(ISW%U&BSG8T4b0<8&RSeTR1u2D<4P_{ZI3JIaV0&jxVF$CdQBl8S)IMs_(A6xicR5&;vH z({gxRNrjJo@3@l0Z2tTft!pFPqSY;0-J;bjEFM?#wQ(g^8R8bL^9t;7B|WaB;gLPA z}XTkklg3B=8L@m6ZQ;gBraFEfni`b{^w|1byFnyN-0tYq zlN;muJp;@am3)I_Yh6tAcOan_$zBxYl5B7oZ5OkKLuZQ){@0h&f1UpKBpV+bLenAj zwf*)7&y0!GR=*c^TOZzg02bSJB;s=xH`vr1Ol%@)5oBm%tu2Zb^m-)~wWpv}?E^E5CCCft5Uv_h^|d1EqmJtpfE6;mItLoxeNVn~~S z4IEM~tj|3CnUy}%zE31DyL99++B&6lC^II>DBZ(a3GAR$!TJ!Y;6 zE|Od-$(-$ps(@p5k$%oR`ABV%_rRRe#IBSgjii;vl9H8jBvl2`A<9%9XrnWFNBc6GMW7Q$_(yvZetSxb5h51yMau_34i%)`wkAEh3A~<;wUd4XjOu zDKM(>U8j5b3*>BbsB%wa8P(c8D${Ix&CE+zk%a4##w;3lIcLkXZgyQm60(~zczw=+ z?S##eOD?7PT1Dzs?pi5Td2V&*l?*4DU_&hU$`g=dt{bfERNr5%F_lteUF0P_^g^ZF z+~4yPtbbjtJa&_iE&3GjzQq}#uyZ4zrv4+t^?FOzKBhT|pN)i@dhe=Kvgz4{ z>B>Fnys@&!THysMkPxND)L3wJg*dE_MFyl)%;H^Kt=ygs@wJe z#Ecs14Gh5R_5B5IJ);h0IxtK?_v$|GJY`K2;E zQWHA&_^wZjGLjs$tK04O#i^?-XDvIJqUbN!S_=R2f&QI7d=hNGG{dpIV|&N;j_u#3 zAy}k{V|&N;9<7eG)I&TMbBB?iy70a%i$I&&8@c;_mM;1VMEPVT5T8 z`aA4zpuS{PQrik(KEXBtbDvf%>CoDDq8m5|{nIMo7lB&Rh=I=(aDWR*@^veEW#$4E zxGzy`We(>c+R#$#9{b7yHWPLOKo6_F>j$9%G|Y#`o=%oM!1S?d>N8!c82fOca(9}{ z1)la38T?@RGpXSZ{i`j~Zg+QO?6ZE;So$1#`Q0bS!5&0&ZYB{9lkI+HR&TcQ3FAOd zqbylBb0s30Ycx^eOx4zhvFU z{}K_qSCw;DukT^tjso|G4SA-{Hi7h~@N+MAHXV*StR6(2VH>FqQm=fn;ndHEdDYIr;jn% zne=f=xOh;)N#VBB=f14fJEUzqRQLw1-VcW&FB(*n=x2^TkJc0e>^1w0w5V(`Z!7Zp z5(xNqG~h^_Yep4=w@H`RCv31+4F(^u-a@m7542oj%mthdA`XkzJ{sFRG@_9-IlZ-E z#sRQev_yNd_Q*{b&Nu?#?P2V~izVKO@w&aao(k0?k7_K!dt61Hi2aVew>8Gbz!<}S zTuu({!nCteGIYbmLjf-~k{$|pG{*7CLjhydYhT0!Q-ht7%yJi(zb$)N@Y+K%>IEtp820A^XG#W-fZUAeo0i{QPwRY;Bs?%ww} ziJSXiLotgWiuU!p4PySgu3^qe%9Ey93^! z*2OLKNXlACU=+Q?-L_go((P-tqIk`?POnE~kfsMUo_RefcnBPD!8c_s2;!v9B7e<| zn&Q1p@<7D0@eIS^e39x~1DSuIK{vo zY<0^h+1;>fIa9Yt0J;c+M{gBg&>y&d^ z(P>4`Fv?sKnkplaAMJkMJE=` z!s5i@Yl+2GhB&jh=)XL|_+S-MC7DU_WAq5)vtCGHLk1Fs8C@L28-d7Mo3n!im81~r z#@-kW1{t!dASv^_!!yFbvR#3w8?|+^C26?DB zZ&;faa#3E2A{s?1&gV<~H<67X%^&e#gf%9$4EYX;(HKw&9~}MMfsxm?;y@Wl;y|L9 zO)zvN)5_$yV08DS>Y6+pjH0@4i}ssp@$}kiC|(Arv~Btp66l^2dT!*`Dj`Vt6wkjM zf=!AQta1dkf+8qJ=n-Sg9P#_A70tzO**xWd%LZ-VKP3r?iob}_<&%g=jva?)Kb=}s z`8y91IhT!`3&wM{gG;CuRESPYq_<9kO|RUVEE$BTHNuxDq@rc;w!mk1>q)u+RZma) zEwetfbS3$k#PmDUIQNy9A!i!#D!?*-Jz8D`CQ6k+bf$6Xrovu2(})kgWp8m(i$nq) zt@CbI(vK@y+p*+GzFgSm?Wns?PG0>+0VN zvUIE7KM_x$w_L1DCM1Ld^OX!$Pi~5=Vi%#7~O|))4rf97e(hjjQ3|64F&e0Oe4W! z?%>5p4(?qVs_X}{3OCy|nbnel)N9P{jkdhJG z)L9UsIxh}Rs2QZJhT`*fa z8zMTjSi0yM&R^zQ&o$-#F>VIM(Tjo#aI_ud?zk2m z)E7{{Z>8`x=`gSBZKq5WB>@9>x9x}nZqtmBL0b74E`cOJroN8)dW`&y0$wQ}h(m>b zemjOUc13Zt0jtQ2Q7uNUitT$!Ts__PSl=>?7#tm48K1f2@l&09yg&D7NU;y)9qVxGv@yPoPYm+r~msqE6IPJ{&{L<6PD+4 zGLmOwhotTRS%!)Ss9n5f`GKQ+#fwF zW9cLhpX%XLomg~Y(TT-v&G4*@=j6m9%F72K7Kt74`JEbKgb*k-(8W6=ofTiuGWUaVn2CAhh#6YFoto+Y22Sk{iCGZ_w z3{K3(w;9)HX85-gYQHf_fw&wnB3KQlY<#96X;hFVl4;`BMS^&lej>bIL(MjA2r<2= z0}C1(r$xoOVK5KI%_!Ei#ywjpw;Q4e+1OMia9Hi(8z`O~chgZHcd)CiJ2k%Asd14Z z?$kKHAnw$7#W^~$=)~gPiABqJeI&6MN#k?}VzE^7h{PgMOE#xQIWx*(5m{G=M4TF1 z5sEXhSO`Z9bc!RR$_z)MF`xf&3MG}f3{ft`M%(B4Az zN}xJvnlD2W^4BKDKb!F1fAH_mCWiTUe6omdF)t&^-O!P$v~P14hcup%Y32X=g>E1Z zYZp`Bp&#l4HoaIYllTF+*xn@%da33S!FF#Gp`-LtcNehD4{OCIfGrJN0p8Dm^77qE z9c^caNfv-F0`o5Z0>FG}gadO2<_^pqn7;*>FEYe6-mdX3X~8O9Hm>n@jrSdZc@O<- zfVn}36Bq|{k6$g4yFcI_?vflVs+tD`+^I3i!KA%@4d512T(sW;Xp1+1}h zyocFHspb)ZHMwe5vyqZbS7sxN7F$3Y+u8!8(PS4b^>STcT0ZOiUBI=jvz{*J%J-zv z{%)Y1;t~U;kPm;INTwwgf@C?<2O0A4w|>dV|D+Fu;ZTA3Q~50#g6o0bl$kzIWctAO zbwR)Q&J&7t)%9)u&0o_AemvYzNp5 zu-^i(7a8IJ+X1!%YzNry2(XFb+-@c!L`q)K-pc@6Hrs&jp8>K5w4sMQjR~0euP>+n zI{hypNM(W?Bd~G$(VqXc_Y<7VzmuwYK#-lA&1AlL31nw!vjw(gG9pd)qVd-6a^70> zyv8;g!~D;0o4q!|fwu#12i^|6-vYc>L5TjL1iSGx2TCO1X%6On2rKLy*NAQ*afQju zK>G37YMUhFL%bE{2osDDci9^VWmJuMq>`knHZF@~b*KbAQn{uB3@k?|<*uS0$@pWG zmTo<;Fs_C@QpwT+HzAoLUcG~6dk?%V0(>OkP29wL0Pj-GBLeUA28T(Rp%kDku+7W# z{iY-t1CUQ2{%>uB18xW04!9j~zX5QsGQ>6AGb-~aB_5^3Kz@%>ayL_wz0Gzu$nR&_ zY!le`E?`>KJR+Fxj5B13E+U(3X{a$9vC&8LS(_xN9?_$3#Qxiof zQQ4iZ>T5LHx%~y4BiBYa&~~8hK-+=#TY&Z|2wk&1A#DfR4zwL;pWa`yZBXGuX|@L> z;g6e?fJ+|}jE|eC{G_E8u>M#uKKud>l;myqNF|b+=hnfvgK-DrZvo?r3~{ZuYrWmR z8?}~4Dgjh{`w3v&pu$H2<1KbJcL3w1ng`U3w`nu0pW<#mqZuzIC32utavXtn*>xi) ziw1p;d{Ue(S$hkhpX-{OGQZdMyOkZ%XLq_>8{ryq2jvdR9hAQTl&>+995dHOxHjCi;jRsLZTMTX;j18Yd+`Z*yS=#Ei@Uw}`kO@ z-(7PT=gm^h0|M_Z8t2XDwBhdqygTA4eR?yLwGj@y9e6wNcHsR6;JwNa*Lb_e+cn;< z@&0KVZ;JpQ3V7$cIBIsP<`IE+YaBI8q!ekfSv!l3H%Po_w`KROc;C`&>-Qh?b^Ttn z-qM1%-)sNfF33UE}>88gJYIP12pt zAiywwZPsvvPwn=Z^HWyKKi)l~W!K-u8M9RLh=6;v&X@{KXaM&VW{`6VH^@3#GFk${ z1-y&7i2%4l7w(dZz9tl5*Z%^JmTMy%Xgkn$pzT2WEkJt}gbuVFXgkpM=qK-&Waj|1 z4f1;gpxrljaj-1aJRs2Sqj9i2YPJ_mc8Oq8G}nM?X}0xQVG3p64KQD9yvun3^6q;z z+&x(J)0>v8jd0-Yz}tbh1MfEg?^TAlX^ESbxM>M1sfQgb-udqk1AGs>EfRbP;GOQ` zMA@sFM+Dxjb)uY2MxF!OlSUhGEhoxh53v7vx?2V&F|1?P^CJAYT&;K}u%NdoP zw0f6wr1WmI`(MDozh4^RyD;B{`7X?NVQ<-mEi%M+VZICVU6}8}-qFDSunRND?-6!k zV9a}jvMJR(AkZFyG3!8v+gL^3BO0m!Www5JqvbaumVJxucHf{{kfH+6dpi`}W

eWi7;#m$p0Eb&-q}yd^jYylJLmjcblUY0bstato9}uGP77RdZA_B`aOU(ho%e z?x<|u#p29-qVLsQP%xRv1NwaH$vKGv`tqSw>Fm-vuOxX=o}Yv~$zFe5S@yP+?YK-2 zUJ3|cqf1txUPolVJp$iq+_Hy|_d47yH3aTY+Z98MQK;e244^VglP!;xfbGrX1ClU7ye)`z%>u|RX5>vOP z$l|`$3*LShwhsF$Ru%jg;H7|U*T`N`LueSKFUCc%aA5!?8whT!3mxCmnaq<3^ZCh|O}WXaboM5GJ91zWiJ6p=B*JukUC6L<6}gv*7iPci($>+Dm2 zOI~1uiN{vu!p@Hh<6RPLoD}xo&~!_rc5F zxKnwgKY#>h<45~&$PAQ1dbFi4P@f-2R=u&WeU*j_AU}ePH|LedwvN21EJIRp5ET3i z`8}O***1~01!<7AI`^u?w33GJP%dKTSZ-}*PXO|V|38I{`F?abM?T%R0e4~h;Uma- zU~Ai3vkN0XnY3WU!Q>9PVBm%{U?LW4mISxXR?Y5OmJuWi5riLDXiAZ`9#e|wg2PuPW{YrMl0UrRya@gmE;qPQ z%tyI&n3;J`VNb*gu8SzwD1dRAi3Av`%Q&2aU4UEX7?(l8)HK%BoMdogy`|A2~95B`b46AQ>+Uqooce?5@@X;m~zQr+`RhFRmN7GRWuI%*)3 z-I0M-RKMHBj4~4*c{z^_El7pc;F{NYg#S^JT;{TE(mG}oM2OnLuW;dUwYz( z0h0l*QGoG?*J2njek`l9cYm-mhHE3 zs4s*d5H)GIxE*(Sz@!q_n&AEi?usX+e(P`oy(XzTPl{N!!reB4u{o{kW6FT^ZaxjC(TNA!!kzhOUw1yf9_K*u}$q!*JC^m~X_CiKs#z zC4H7uv(BQHV;m_c%G;%ih`T$HW2t)_2k;c`xwF+MZu>-YjqmaW94hgsu zXSzHEaEAo$3BH153j_6V0=M=CVZ*IKJn2Ay4xDYPu~lMi2Fl^zdqWyIz=D&__Aefc zAxKMUorinj{u7vG8_5UA(p`Y7fe-sg0|Zz4VV*{$eRG!_5!_E`L~;&l z+MXl5$19TFaJ?r}i@A>%f&)SM>NOoJk2XRVmw#6*MBy5Bvu^0z+-r{1;M$H0IuWQ( za|&2t^K@1xd+%(Yf2l+yl%)apn4Ho(TbQ?+WzNQQFU(sO0=-ZN$i|YI!fG!J4YrL` zw__j`9RsOi97qtow)Z`pgCVWA=(p|~dIq?8t5oCmb&tu{uvL-8v}oJ43grbhTsG$l zOc5`nz!Z8zX&A0b6>VJ&GzH1*t3&OFy-3JSR!#RFOPBRcM=%7pfJ66rL>sP{#jYR=G^80Qadc#oJ z{0P{WkzIt<($aC}-efUdx1pfHxh0R>lU!nET!8RDf)7svX-N7I- zHQhVMyM%#y?-I6P!2PB<{Jsdnfj zv{%A?`qY6%?2i`@Pi1#)?p=;kC5}L9UE6kn-fP2^Z3Jf05!@ZL?Mq)|Pi*O(lP33| zDtmcLZ>=Ax_URpcF^W$bcPUe6@G@NJvZ)*2;sw>HjPRB~e$F*F_MY*NmFP-{5x{Nc zbX9|m>_U|K9ezU=H0qmf?43VRr*7!xdL-tvkesWINI@h9vaFF0UfO+5_tof;{;T3> z35#JBLYZdaUUW+iVv_Qj1^HF8>PWtz-N>WCPf0`eAvi4ww;Tk`R|b(52$$Tz z!40wRqTE*>%uZvETG_%PO4NbR1<<(CCZayxt&e!YUj9XP+61!wQII~|f#BpO zvU1_Npo)#WFUZjbexgC5tk-Z?P*l^ARiiq?`2sNvkj)^j;I;?5M(EN<*01QMe1pLe zMAwb1>K_5iKa`!$GV`;A1a3P$IKOWJd(6t_CnT0MWX!`P$`cQ{hS42Jl&ZpCh+A{u zQd6tpC}{CeQOMf3^`3vA!F|eGU90HcKb-a9f9R{C)n{Xl(4@DNBqi#mS;q3m;Fctf zVpgiik_|UCENIIz=_(Q0m77DynI=1f?f6=@gb3Q^=QzPpHEMFQ76N@ucsj?|G@#%h zDVLLfl++Epvb_-N0^~{Y6-F<*!NB2M?VE}9-Iw$7Krt;1AC%BojAw_B3&5^}%4shB zRiPhyEc>AuhHhfc3>^OXQ5QKO;4o#o`Sw`;Oc2e)Ze@Tybz*jq{k)QWU(tY827qCm ziky7VjWFf$?8S{A-j`3Jy~g-!GtZ5G(ZjnFE>>0c#S^lN=aR3dcX8tdmJkv&RYh(B zzObqGn=n@QDWv4I5jw9;W-#dS~zI)Q| zWWx(1`@IDH`kNC=PYzm}45&yPT+*%T97RcBj8K)n9N6Z#DX4Qz)E{~nm zDAaGHj>HjOih`H!&c%IvYsp{AYk2mSU}Z6>p%ysHz&pcsfANY203wK8$=S|v4fw; z&ZC8p?{a~yvvu>a4)70_!xVxcVj&oi+{YJX2NZ+#jb`WIpWn>S4opD#;;(Jc{W|Nr zBg%1R_x|B3CnU_V{Of`j(gHP*z`{2QgD=}|1A9OJi5(X|Cp^F9Pfv~LMrd%8b{hsK za@g+Rj+4xSLw!jYYO(GF%91V$haypoMaw6E=3#!en5Ml!%uKSb>$LC&31SW}ieveP2$gvHeeGXRmK}p&H0_;oW#@H4GT3_bTMrZX%$K z1Sg(-0C57eSSKRC@T}XYkNJ{}dVv(w?y~j#q;gh zcpO3XD)a^XUObp+SY}!Fu}Ou}f>{R>Mv7^f(g3C&5*n^-mlu(>%-bvpX)rV(5hRXp zh$F#0eVi4+in#y(;xHLi-@}NaJ{6oLvQ1p8x}FZU7UX~Ni&sXz79^@g>>KeKkwzM# z44tMYkjBT$grfSReV*$2s$#MtMxbjoNGxDQ5ZjQ;lQUk7Biz4RarXaMQ$uQ}<=GPo z0Yr^L@?H1S?EDRZa+?qi1cD{|(2Zy`P!g22q0;r;*e6e7ST9aTw+CtCK5wRKW8J*BjF38J5@ z313Hx-6xmU&_{THIIv)9f>o;o;x&_FBm#k#L?WAbMF0ej(+%Aejp5bN zT&T>tEas(;EuQ8Ux;I>}+}sEekNs?T*^9cKbszYQui`)%WhoMCy!DIM!wDS5c@5VR zwn7APpo3=){(uP!R_%qK$fgIueBronm@op=TSxsmoB0VkUqrkjH}hNYE~*Flt{nAF zG|Be9oGldt>va^Mv;9l5^MjnQi4vTheHawdsEI^mUc3r%6}iePCIk$mr{dQFKy5)d zf-b#+C|`)UDsE534h$1MrMaXW;_e5l+%G^@-apbNwQ9*q5X-Qlg2h5wcT3rkRNu6j z*pey`*Wh(vLNLRkry~ljWgO@EP}$fQv(SFK!w?;a#XkABa@4$w3AaNRXc|U%a5yLm zRQP*B?w2TdC&gD7!RJwL(bEw%b;K8<%84%orgnkxM_2c-h2WQBy?dKubI;Ds7{GxDhgYZ>u@(^3i%q{i z0?n3M%a#X8Xe4hgsJx)R7TFT%<+gv#mUF?E?EbT})A|F=v0tEYvOf0zGCQvv1Y{Jn zk9d?%Wak%yukeO#cs)A>GgiUn)a0ZgWH_+~VA8-kw=LiZUUFDK?xqQQhN#cRzm}c8 z*nM)p7K@-+$t}h;1+)tMoht%nr zM_!D^Ni}u!#j=r=E;YEVM0QFt@}$G`;eZ1LX(%}KNe~mj3rFh6WVm;yirw(F>@4N~rHBQS1RY z%oaDq_*Ne@m`B!SFXlOOaj}RQFgQMg_=uL^?S9K}}}} zw(bi3kySm*-2W9{Kt9EG&?6!w50d}JT482g_VFGXigNd^=Pq~DOEUX!tY zgfiUSdx?04x&JHG>!aR2l(v?`&D&@wg?e+V&PM+&9nBsrbyTA$HkPiRioElnP& zjZXOby1#4~+hi}=fhU3=^-o04PV4yHV1+?7DM~^R2wM|WpWfcIvHF=xMdtaj!?=x6Ba5RS5*^?9Bty_;r^St0qiG~RG)D|N=!({;=gNe2_ zrAq957ad~Se{16Kj)i-uL@Ir^s9P()MM2z#6CV4@Ipenki`M}{93rDbp=^RN*9P!A+h ze4b0N8yoYHt+l4`*o^mqZolfK#55QT>ex1|8X6$8kC%E{rd!;(RN9)=(azv7q_xzT#m_M}WB$}i^XURLRf)}N^ybgOHGm7E3o zYgTXT{~pb+GD9!?45VRN;BOWTU?cW68%{-|#^oWCW1HvznAM`A!$3r_i!#s)xO)DT z#K;MOb}g54@ACE5$n%X+QK?+=&6z4b11=($!Zuj=j?q-E1@$3T&P{ekX5Xw5rz9kY zdg}~VYcEI~-m$z+jwmc{;>%*SWN^JkbsuHVw%hF_4^fWLSR}q1#v0 zmMS=XCUh~kqnyNHc?=}g!~}{m7%Bb2L~bN>PV#iwMTy*1p-(9v zDC&|17kyItG+LUukk7n^uJ)V9q7yQX0MQjx2P_Z7_yDt4m`PvveP^QmTWc>2xAV`D;7)xygtWUrZ$bVl zxbvg?bd6FG0Q^Xm_0gw&=o3~{)B?U0)tC2q!Lg*mN9Z0P*apSkYy{W31ea8504kC+ zN?B^G)v6S|lv{L#{0oWG)WYMFZ^={k5pLtju8xSmdQswnD5@a!@+FCd9lHS#^XN^f zA$lV`+ZN#K)i!V;@0qhdq_c}9_}|lb^*56Es&)Ri|I}S2;IK-%x(XYSz%1<=F-ok2 zbN;KjA509Y^=Bvg)QOiRG8ltJnb$*j?y}1g*&ZAn_2C~n%&R`Ew{>{=C>T-wmnV*& z2ty6fva!Ta2cE21Q2&h{j@u}u1CYxd^^Eg?D+)1Yq*JtNGSQNm5z5?y{qHy`tD}tg zt__1B{TwY_U9J6ZE-fUmUwTX8Fm?vqX6F8q z?!4xV!@t|EOyp6&1t#dI+5!(?2<{t)o%rOihvUnd=M3)Vy09%I>c+kBTZ6?b22nAp z$hX-8_^JcuNP!3Xz&0<4djy^6b5$Z29Vcte-e2I1gX&6M{q4lX+cqa+DXy_?jXNi# zI`7?ya}dVQ(Ndp>47vT_j-!^&nAW@X(?6VdUZ8a2T0Ot6n$dOQg<#& z9wxlO+rdS3?Y^7^nvU8n>VFm`XAQH47^Ec~B1zuH&2cNGEpWBTjmY_fQ@_{|xQ^)i zW@A*Iin9$dropFb*9plHoYVt@>Iaj4jq#3|;sQkdVnbr=Vpl_TR6utq3kn}W~6Vf)RU3Vs? zPhcp38`Z69-CVe3YjJ~Z&qW$ISwwN|gxyFJhr1jd|9eyLMQ8ZA`m8jAO*R$xeDP3q z&C8szo+bmgHVe9uGch?DL$GdX)UJT0G5fbAQT@xB(Cw1|D(o?7uyeX&1Jr}*`={l! zl4?^hDTi|llk5{Ymyu^%O$Ohlml}O4u_jeV{%+*}#d%jK`YXM4s=8Lx+9wk^b!7LE*Tze& z^RoS?p>v26PmdaUU5aVr_5mG_lBbGOF*{ALUtCb4fF-Wt>|b5Ig#z39F;=e7huc1$ zC=`U|gTuK1M5zgb^szr~$I!`N!CE#O{=BTEIh zImf9+KO|wA|CRO$wDsH{4dT4->%d-?o20MZkUgzx&xaDTi>U4p(a_0rdDGtBjuTA@ z^SgVFhV1eEo&6u#p7OZoAKeJ{gKuypp7aBD3KL;749=T-EAYs8-mieWHX`ImHqJ$C z#z`>gNB(MqeM{zcB{XH)zb%>TUzW^Uy+mi&QY8tBAmp0hMs2?)(YsXUCQWjBS72$( zzbu{$u6Hzbm$?YI8#R5?Q+@h;&sU6{%5D|Nmmh;x!!W@Si6wQzSXJXb>!EWw@TW&1?K@=LS9@khJthjA z>a2-GL;ta50#CH6xd~}kEB!aeH(8k*xKSGmg42i?S!J?l8z63beCuauKt0{P3T?fm zeO;vL9VfcHhohkRjy=+yu~h2Nk_*N)C9Jjp~_fZ6%BUe!0o7L*QA5Ln7MIXxSSX#z2f17K#x2xs^#aUyL3KXu{b`^4WQ>(Wn z&Pk#}0l(V+%aPvI%O6O*C5>k}IVf7RN>Xy-HZDxS3)&jCt?R#b*i{`f1u$y6I9Jckj z?jA<$aJ^(4cx{8acLx^wI$_9;3edxo##)~;90{J`eA_UjKm+D#Z;wgGZV#otx+9UB z@J$h;T)PK`8!c^kn!*H)$xbrVBWSogYSzN^-I$unA=Mg7vz3_=KF1}Z?u4ds$-}G6M&_uEO|B7leL68F z8oP6{Qh314064cbvmq-As%V!cPeOwpozwZH1IgbrE^23P9dL5D`mUk2qXi(nT%fPI zt0#%Z-$eECX8SMAGQ?Jj+c7R5tsouhIHMX^_g`ESxb7gom2vOF=Ti)sW&KQ~jA69d zAy4tqxlW98p~ISo$S0G0Q`83}HT1$TpKNFw67$#i+ch5KwgG4!R2Zc~nLJN{X1Rl4 zbaiX+P~yvpuZH@P`6xfsmRK^|gSIeoJI;RWDNk=?(B}7I$$SKNAN?MB9e)q~rb_iC zb8GeB;hz)-x6m1e!lM;qK|s~gd6Ar+H4doLj`4L6k0cSpea(1{h@$$M93i>XLd7%5 zF$y=#1$spN+qT3lSt7UG_Gw)6YufoFxYNtp|Mb$%4_DvPiyd&jfHvCA&)q%ed8)km> zpwioawopOn2d*!LW!TD zXKSN1(z37IXNgKj>tdZvjj>7|mc}x{m(+&0Cvwx#;P^(vKSbZd)uxf8M04TRpqAZ| zm=i_FQ>otMu-bHcVsV6`To9UmuA2)yHywLQWAbi(J`G`m>mmIQ8hSbtuL46j+>j%s zm%|Vhj#y2Q;zJNXEd*Cj`5&ky%Mvq=3HE2B(Ld0xHZ4oMJCA{kz!x`xicE<&=ybKY znTW}u^wEqMJ6&ERQguya->m;Qs?>D+@WAnLBTS+PNs143e&xT3ndXb;75)3qroC@V3Md z-s5mSY|8jnA(Uy|nOxdb`fZ{h3weZbK@PWk$hh`VF65CJP;1U|L9!;Dqj;50iVYPh}yo39v@aDSwKEPgd(dUS%DB((w8;kKH)TC=fk$UYD*+NhREOYE{mYzPe; z@Wo{ni3hakZth;9LBuDgLFkeRO~;Aa*NGb|jzJ9JWVm34{w`9g2NlK`-n{ssu|CX< zPORk^0XR0&q*B&bb<9$(@zkFGP827+ZD{?CcsSV*lYHO*c@HlOfZ>9abRou3U#m?$ z_y_{aYJ{P7^0f(HPCnmS{#B;@i{2JmvJKl71hTYVaP=pgDA=s6-g5)}#f3;q;lA;$ zC_$|-AEz1#WFOS9XC}dCyVtKjIuCU)&hi;c=9= z_>g0tLa;5XJwwS^0YWryxOh|O%bGidJ|QkeI}} zGgF-T*~BqHZU(MQC`>>~X<-p>W>mh^wXsg}Vti&}p%)A`^L^AhaA%Sn8jp4z>#ASj z;PJgcY?||*R`}@&J^i^vOpML%{aj+vh;Q14 z$#7?E_q1<|y2TBkvCsLx$N{SLjK0o79u5%tUjxLXNC?5&$pW8mwi;vF{Uz)H*q7tM zyC^22EjSR=Bdg`>ukL;*ac!D=BE~x7J2@0TMjVf!|sKyTY?vFj$@Uhr~v#} zL=KJ$60O4NaI29=6YXcB{%E^$5Wwkq5i1zBWR_URQgbZ2pHfH?=HJRgME=}bD=m~Mun#;C^jKC~{UwYMvxhJhd%fwU1!sLV4iw+;aK0F4H z9$Xr9f`J8Okx6!9J=)Crk)OlYO+;#6lM6*g#b;6Ec@?_3(mNQZ0_U2>sIeb#iYD!= zx>@|}$=;D=uObx^py))yP_53nBAuk2?AXqPLAdWobu~MlybzyHR9GzvC!MV*>^f&Y z#BY)#g3N9Bt2o(zB$pTaJCtc)$XU?NEvH_3QkYMb97VWQ*C2eoiOu^R@E`ez;Xkdv zG`E@$uOZc3t$~V<31f4^Jy=}CtcQVEVYsnN$=OB`;aopAkGUme^KXH7Q@PAVHwQfbWo#TL%G_V2^-oc#2 zcgnoNaY!v+{8XLnd%{qNjzYalmE8$^6eQFp*o&;RV>l=yu$V&wLES%+P@j7$ToU|U z;68Y8BWFtiULt_xLWFS;11cta(hW@L(~Cwn6#tLi1>3&cM~2TLP2mFPP30xR!of9$ zzTW!Og!@~}-#s_?)D8wNe;+@3LNM5v@S`~dhn@v<)@!om4&NWfFlx6-YhxirO=u&j z-DbjzY@ZPPa>EKkx*1KMl=3HwBDCr6s+l56DgUCS{9VP0@fM_UG;W+^ZMSs7o^brY9Z=?nG3&=;~UZe9`sinzRW`V z{c^?^$vga?iJ24O-QDcY|E6YMA>+0DDU5_oH{Fw?Yk{QgafP*VWp$zo)lXI?rs$ww zf*;8u)G`I3D-vTz*dszch#k!5f&)+fgyGf=Cg)~-$RYg5Bm+Tj>3d}G1|ne1+T_5pEf-COP2kti(kG;xR1>A!r9)^r+Z6~k$E0{mc&*OHcY z2Gt2iv?0|uW8G#>Y5k|UX$1ciNzk^2jUe#3zBo%<)FgUCzY;!2)O9YvtHiHBpZIQi zTa5#Vr%~ew2q(p70Q-y@TqofvA#4Q1JZ$&Lzn7A;f z8LOB1G~`ZpVW)av$XHzBjCUCkSS%MB27F~5QC6-NWHVb7($U3oyzdwe(jG?bnVUQ$ zN)(w|{e6O#e>*o>$l={88L+XFjX638YMmXM92p6F!Y$G0Zd#-C_#4#U9-Ew-@k|rx zL9D~1HJ$LZ8#qODF#2KZIcEqR0uvp$s|~FI5%O(!TXO_UdIlX>VgeU2?IAJ9BP`?Y z&f*|eRuA2oNa8%=eq!{W-nO!&B@it|tE0Mp9zL5eJk;B+Ko1cVB!E_Dp=wV}HyO&; ze;UdU{wb7iTP63DZvZCX{a%558?6ue=7yV_djJiAC}G@m2kJ|awL_vng5~k<; zt%u917ix(@+B3QN2*t+1!_zE*9r~~)u)Mvr;>s_gzj(Ge6s+42K|R~tY2+&8p*i`v_l_lIM3I>cG3g{=g#wmq|GCPR zR+0m(fU8UJVM#rGHc8qUMxV~k4^5!@Jt7=PGW^i@6Aj-ns-a@GHF6=h05hlPxO+9t z4n}bp*wtk&3LXL!vz~M>>pQ&@;DSJ+jehFkI}-^hM$o1XbBcPqlk8KrxVurUEGLGK zEF*_{j!_Y3B>)Gv(e|L~sZyePyt{?Ffpn77bkYG_v(g{K%G@530m3Hgou^Rn3`{wb zU?hM($Bri^OMl}Xbs12W;`vUoia>k5GV>~_4G1ajS0E8kkC`&>T_6dF_v(dbWD@Qs>p*? z_53y}tcc6}WWn_*lu&KWGuCgh{dasKacp9NY=r{p&|(aI?ckz{TD3nh>xz(Wt`o`g zh9(71izJ#i1k?UY_W~JMtV;wyHpt&5DkbOzv(`^>DMa-Z zj!*~FWL{JYPs8wV?<U?jT***v}?QVJx+g>{NLx#lv81QuY z5#!WaRT?iL1ChaN2*F-9^=#1_r$`#8_uXjpC`$GHvRRPc`&y@#5FDCGd9^`_`?p8Ek?OisAVspI;pAj(UDvqi_g7EX8~NKFIepy zgodB`8`;+IB!4UEB$r3Xr^x=}^lfKYmFw8JrgtjXu^5C1vVx=;C1?e!5%HByTwYm6mkozMb7IXx2X$i2LLcf_ zvwYwhH6IAA8~3EJmkGpiBTKI6a-YU)Ezpc$!`}5=taNwU;qZY_GyP0wCQrKKG{+lT zm;G0EhJN5_=LRJ5BOHSyX;d>*tG`8#H1e$LATvpdcHEtbMKlnOe>Tuj8C7tH}0XvSGe_<69sXbw@i zUy<1r^C!^&;`XO6V{#V|!?NcKRcYlig8t02tmfi?%==oJ?I3SzZ4P_=2>mGYpM08r zL{KeW!~@J={`m_kAYgyHxuw#qF?$F%(@Aho0^<+Al2|-96jaes1u&qG-DSZCn#+Ri zP>lJ9Ax(z3Nav{0C&u^+6l|P{ss1L^ex~FhpR~vjrWohgX7>7)nOi-w^ zff9zZ?`9O0oMkZAz;P?g0miNl+@3frQk8_D$BMecb6g9v0c*i_>QVh)qTj1(^>`$E zp%929{PMjltwt50J0RrJ5d2fR+1BteWCHp_Bj!VaS(@2Q546kokPrY;B!nIdY(5kl z>il0M^8H$*a1e+yogk93zir&=jH@F#JrTA?d+KzS1f&we;@QwlO1P=+$Ps6(>lR$y zO5Q-Ru4jdhxld-U=y&W&o~i8%8T=F6r?W(?Nw9ZN!-|F-3&T~N8rXx|jA$GYm2o&E zf!-x0FSJoUvZOc*xQC~!=4a*Y)Q8Lm+q~_VZ`SK#n@0rf()ED z$`iO`Uu6({$gbls1{ml*RtU2!5#KP3a_#6s8@%+_FOx6ri_sv^38aAQ-G;AXHr`~@u z0N{iTAT9=2Q<&}q0ib{HvEnq#;f*zKT!>l5gg#DGHL96 zL;)Cc9vU!xJD!0OBwR!wa!W*n9*N-67iJVa9w9-_CJ_<>?N;knL@DV>kuFygtvAC_ z(KnQ+*bFbQiZwaHgMSJyu&v=^$aL&i4|g)Nw?8|{Os5AyFj_V4Ug!Te`PMBeh+Lfn zS7M}b>nMc0A$kYdf_||Ji$u{{31bi*&S`jr=3Aign%G`>o$_2R1yx(5ko@~rq_F7F zuWRMoTaZP35(T~?YSX6^)6_(NvaS;-<`9m!Be=YVY_g{dGya=@L#H+CT(aAl}Q8FNSa?KC~+ga%bQ319;Ss9<8 z6JPMO*(Tqc(rePs{I4@~cMzzUhi*calS1A`N8m!t^f{AauQgY-YcyG!6PP>a2v>3! z)LKhW^)w1opr3ZiGBeQF0Y=ZO#%+HlJ&3h%Rrjso*nmifpjfJ^tNW9$S2xZeT!_6G zp7k*8*9?}nUj4Phuj>B2L)+Hy5y4c9<7kNzKu+EkxUx>%(mwtiH-8a`T-+h_ZA0(j zqDcA(@Q0CGUpyvABthKKv^4UZm%5CLRWK02k&~ zVn(zWoD9psCBeJW`w_$9b;c!mtZy4ZMrb)0dkq&+IeskUXV6 zo~V1jhkGp=j2dC-D1F=62t+49<|uR{XmjD)I(ZaJ7B;ugzQ`|OeYx6mDTMhns$(Qg zkl@BMC3#fX976g|*3~x!we#5I%(M@?lxaKvhl%-@Oo~F-rZAkAvx(kelGV!B2uCG? z4PwOulEcd>yDG#Wa+uRw?c9+VCIYJ6!Vzy6l&`VE9YFZBtE;-|F{#o_PyuFql8@mL zE?QfOi>T-idFQIz%q2+wX*f~vPvJwh)d#K9>i*(1?fyB}|9Q z?lp-wk8;RUqY?GDO-aPfgg`=Mbu`o>-l+`>lNamAry=}9-N|Is8H*AZr*ZWnV_};a zP-E>2i7q&Piyj7cNm)nBWps8KxFCN26p*o@%w=2BExfmj!T4X)yv5&GCRmvr&9nAj zx+AO;scakz(-@X1Cm$mDeQb6GUDAzOH4veMdP}yeHXBDXf>IAJp>V{uRSN=>`qbuyzyX@prWKHXEgqiiaQuBZvu)y5iFeXo zus1AB?#z&-vf?Fp@yobqh=^-fg^QYs6e5RR)bZtudAQsfxpath#)sO@UN!ajSCG_; zVLe@Z#ru+G7T%^BcVWX*+JEV8Xzj?P#2uR&FqMrOT0|J7o3VQb?9PUC=JxT#AD{e#x;)$VUOUTGN>ATb7F+6t_v&h5Mzp6 zF&Pph`T`}EYzH}_^`C?sqkL$4@!3XP&1Rn!$(|{_MX%xNz^m^2j1Extci}BA1)lc| zQ4qBuMX1FHj$}&vK^({bqiA)BgBjHF-==wX|(q|D%qz|DJ9C-87z@)w zIYNCrwd^en5vwx<*OFD|@?)X>v7*ix7=6~;e;+$1GOWH*PiCa?5!-m6&NTTwwPF6{ zcTOGOU=}o<*)Su#-~P);IrX4^SXWQ#M*Yp4${Z(e=-K2D+S^EH0bCo9l?3ThIk)A2 zYd301eR(aV!z48dx!cB3spwRa$Z_KEGF{!ZEIH2vB}pZtwnHja0E%ktt&zi(+zwOY zqz!U1CzZHxitEeUJLaol?&2hjb3p+wQTx7ez}-X~UqU}(9~MF%nt_Ga4(scAdv)46 zs7w%tT3l1FKR;2Jf$t)QZ4yF~9$D@=Exj}$kirNT6Tjo;c)}&&c-}^eF&Z=lnzyFE zkK-rTJr6S#l{Buryu&Bmqnk$TJ~X#Cs%aG~^=oKtkFXNC&>151dvNPlnPDhQ3qvsw zK#Vz4=&Nyw$tZ|z^@}wS+1EysbB_vxk9!)&fd?0A({B^g7W00qf^FxLe~% z>ii2L6%0zw@8+j3h|G_~OFDT6p?-@ljvT3WzBiZe(l^P_KQ7-qOucY!>X3f@T|Tqv zy2u;V_SYqs;T|bzL&$(%Rf{iFxW0W=uywcoq-pJ80we*pm6EjF}-to$6*FCw#T?3v|Q3Jp6_K}$_;2*y+ zvb6;_e&yRo)5npU$2XIz+V#e%_YoT&c+lMcBR~s-dGF1IOJkr(3V?XfM4_3XX{Wrt zJNtwtP6U_!LoOt+{}+SCBhk=0XWBnG5InCCNWJ6XG_YX7@}DnGmLfTc#{l>o+G4nsPbt zD1l8=H+<#e8MLNegH#l*lRbw9q(xul%GtjDT zDcyf%a(-k0W2XEh58uQc$yw^NAB!yM(nm=XnBE>aLTy};ogSCOL6ZDMowGf1rlwr` zWioNA9gjp_uZF%FIV4v`x+{pxIHDTORa5%P zF<TY(-gZ*AMx#Bui=IxQU zI#836bNh|SdNv3_MQvHx|J5+iX8&#kjui4nv-n{Al311ts|!N{8bx4^9Gs^{3(+~< zf{!9o0^fjLP=21fodQ%p`a!Ly?J(4$MO|t9Pr2tS#6?aB9Hr1CS`N-=Iex&dtP6R2kl2BJGS&#BZb8Kg%6d@$A zq0+Y}SDf6H@f&K#?~*6RDB4m|d!9+I)`Xzez7pw;0-sReCDF=Q(d>A&{gp_XEKW~f zo!YI&ejiCi%FW_Wdde}C`eicR%&jOK6H}u{#FwiVUW%mD<~J0UuIR=rE9&msl1IpS zJEKpqf`{$H&m_0S(D-Rmy{@NHZqEK$=Gl~8D$u$6v2KSV>2c?T0jHNNXR$#+F7Y4Svl19dC}Xqy^u`F*Oq-NGhMCvLo(kL zdcviC`)$d?)eEzuhxE!;sH$&1lT+8!p0$+EFW zewREchDVFpHvEOiwdqgEkM-~j5o<|TR*eepX1l=IA}FNpDP-06o`KaR{wMjDD6U;< z%l{d8o7yu?wo9$*=5a54-txE}+7J9_3QSIOo4p<%!XkbF&pzCj^3yDnDftmnmX@0zmr^{<-jz~ z3Zzyc4^dTD<}Oy6OONY$dpv{ri+istautAR7`I8LRy{(M#9Xh_M89*0uEkDfAgeRJU( zhVq>&ZbTC;=OX8E`m&xmYUh*r%s{KH`Q1~7j)@?SLiS6y4dm3Jw;9QrpA(_LD)hQ0@0 z98ZIz1(+$dflX^A)sC-^+?PSp@U=H1EBY(3VE^XRXC*Iz~cdd~LKN z{t|dTh$AZgUMzmGNV!gu58$NAwG!`m@_eAIRJ+y>UDF)BdT5{vv?GbB*^}He$38SP zYG|j`*4(*%Xij8cTx@R;b5U-IGt|mkd**h&fy_rF4Ki z=bSX*@C$(7_>3S(S!x-=rOcI{Rn&zWcl8_-iEB2BQ>59A-~CF@c;~02{sQTI zQz--)`(y1RL#sr2abh2zuXEdablcEHS?Y=|XuHN%M{9;@UldP~z-|F%1t&2c`w*TT zXcdlKjs=@F!%lNZy2s$6A{((g7$w&Fh^SRnY8Y{&SL+@by47HmB$J|~yd+zZG$@UB z*ee+*n;ZVQ=b4m$(skk80SN2Hsu1WbjQdg;x(`BQOz6%Ea^~(RMvW96Hy~nMaDfQd zMt5>ihWeEx>uO~j#+T4QnD(t9)fqQTjea%QEart$U={04ZCnVz$lY~6_sD~!IGAm? z`p!V4_8b#kYBnjsX8Q`!&3647jXQQlPYcYoPD1#euLhT6->JQFzIr!py)HM0OJb=C zCY5q~Gvn@f)kwEQQlT#nlMS)d60=Ge3S6ty;9mUM=Z4PnPZ`DH*}Z}7)@ZJthz9{_ z6wQSJK*&hb281H^kBF>rWbdr*tVctwO{MI5G%5B(H<;;Ov+IJrreNUFFjhiZpV?0PkW2?J0hngk|2N8%NZbU#bJC2UN zD>w-rba4`_h8%;2GI0^qTiPO`h$wdV+~|8UenddPqIm2Q9?;&%rZh|ro5B8EUsi4Z zYR_Wz_}i1q`(?{;-BUZ}MYlpp9{Q&Drsv{D|JtqDz`l#F*(@7%&qjm;lv`@Ew&r4J zbdid*qqUr-7WT%D=+bOT%tX`Qs-(cSOEZUeU00)7JdUTT%-m1EkOqhl??68t;jo(K%Y}@T}K0(X4vv z+|)eshMQ?{5!>~NsL|!OzS~ec-lj`%ljALO`%dJW}qzZ5DgW1ceZn94htJ6=FY29OC3 zI8bsHiw-{<1O;&fc|7ca5y?ZKFCvxSfcq6T38_lzLK)WqM=tMNw`3L#CMA0ZC7$ay zkj3r3DXR6KFXYwLubVQgR{lD5D*7e=oJ7v<+H?@EWjY{M??TxEp4|i?YY&(0?@!I@)?{$Q@=T^Q*4%Yx^w<_nl}hS{pY#r^Pfw&SmMQr#!(*?L z%fTM5RaA+M8qS+zfJl~5NpvkzkX@Dsoe5Rp8Ji zr--a_0MpIdxakFD?Een>p?iMc@YS&)7hv+P+P*Kkv`b5dDigW&XQ??_mTf_|{)y-o zvq4I#|HEe6A&@oB9-16WuK|%pBv7r?PsOlpC&z_gI>Wo zCs|7~(XCw}^_~TJb{-s#`)^8}q1In8b$PF_4KkTOmHI%I-Ge_!OUfcoiBV2;i}KLa zimVqC)TkYEresy><*2iUm_+nlSTY|TW*{+!nS;6$`#onNg&<(l3Kkg{q4dDT|)$VUs;EKLmOc^%~^qmW&;Cngp+HU=FX{&3m>~SgI z!R244!wPyXG(UBC?AFe`l<tzTJEa`+z@mxYiwjL$-jbP|X}?y;=XLdOJbU=$w(;9fG&`q>2J zxe*6k>#7hkb>pi5ulIrEI4cBUvfc_)2!wDjr=I#yp(4Ht#yj9(&9GI1kE_@ zckgm3AhF}L*tR~&dMn&$B{?6dC%#wYvNI|k*Q6MbWR;JbJ~~WSCd~$ zW3Be)@o$Y?80+DX-hO`U)b7AtTpK$|3xRPnSH!0+|JJ)jFpyjqdpiYRn%Az2{ZC3y zB6U`Juk%N)dD^>T^UUOE&o?)}Cw76J+~zguE=_Ls`RNmT1%ni8U75K}CiT+!>38%H z2KU|f$6hj%+I(v)ub#doW-!LDWoA;+-u(4ei?K8QCU#nPF!uD{#E#Y&i|LKC_kHPY zGO>q05ql3cL7MeX#{O(3_SntoZ)t4tN4`1qMF(5_EHt0HEp4#%zaCqlk}>hQ`w!_D#$xwcltt$&ayACPp<&+Xj! zW#=aCyQlYpBmCMYV!ie5?EIHvy({|ltdPkZF7dP8-fQ(_)=cRwsLT6$zbL<&)BAhP zWSX>Jrzf)hx9KiT)#q@{tG|vB1x}dK3U0P2=@hjgP`+eFl zswO{~3-_yKGkV|B9i%)pqgQX7Z@z3c&NmO~U85(mCzdIw@4aFt!moVu>$9DS@KYwj zS`K8+>(ai#__S|%`tWW4*gI3N5*gxJtMrY*%sch0cFbp$zI?PIw?R~Xu!zcQou%KR&P4Hdnz3WTg&W%mld zEJCEcx#yjBuRL^4w-9pvxn{2%JY^ed+%XG-t#d_8T_&vQrer-zbqS)HJJEHZ@2cr9fmU2e%0W9^R~>l1k?xb z>lUbMcH0vS<*~yVPq@GLlRb6pLZ8Si>Rh*^FNt;a`114-t;4(Sx`-Y3K<^EDKW+RP z$bI|)OJw}A$d&fyj~}wgUHq+XA$R>}3~~?sM}ypz|B!h^kUR11ZXtK}cl18m_Bp+c zwms5o2xr!pA>w22u|)indmJLBU7vp29`Egz)P(G=FHKLc?VTk=yy>fEM{nBK`w&P+ zRD7aa^7F$_7^1mrxB0|fPxgL6(0S?)df(O^uK3&!dQTQ0zTeC!xmP{*!`{c_3)}y- z_ibGg7VwAAJVuL{^23qp9{hSnf9vLNWV!^+*n=4j&C@^b)zG9L%6wL+?&}X_PUsQ` z$BJ^`w`r}MdG@E~E3+QX+}J||`jnsdp5C2Rx$Eb8Rhl>K$r#3t|p$K{dCN0P#c;4~d`Nek(s zNDztdhGe#CFi5F9Wn5Hiqa{3dD{Ayz@k20Rw%=hONj&9h!9H%rX|<`nCnkpv^N-80 zM1RQ*wlxK{YF*?XS05z2yc+Hpjv|))Ksa5AK}yeh&)*T|A%SowxgNbXEclU7aD&`N zf|~vJ`C(C1-!(vVugqe+thW4peq4R;m%YPX15LE!Ezl~&+&9$o3!{a63*}W=GFePo zWKP)ENu4wR!u6!ERsAt@nA)>+V1agHOS1z=YUNnn$-65FDK3up622h=G~?fta_;=y zy!?~-6Jqv}VDEpj4cO8j#9M$h% ztDkiI@}}B*OYU&>-Q)U(yEYlAV%M5XQY*g)or$6fe5#n$&VtJa%oG}ANJ%Z~J0~kP zGy>PGUr&C`*Vg>$k0SM$zj5^E5&VA0)V3@s zdCOfx+_^u}x$BPw3Syl-9ex6W7YrDzH*iG<&f6Ri$+{w5w7&VN(SHj9vgr3AfNc6x zIviXiLklMD3OUSxA228{wR`eaq<2kkF;{KDg zWI)65C&pi=g@NoC5*#_jB|{0J1=Z0?rD((fyxs9)D^bG@4(}|M20Y15f%R^VdhqtaH^WqMd*bjRZ?ROlIYG) z3B;{}5Y@5`Ukw2l?bjEg_XSq8+Kfz_LL`PC+UD5t(=HDI7N;{JSi1x)>IKUUGWy^& zTezwsO9!0g#WL%-+T8U5);_Z*_29IQApR1>rL(@j_O& zVchA{QhvP6rKpCX4%}~oJmz#~&8Vhu;FOW2W~J~&e224A6lzl&f7f?uVA6EDWFTZw zz`f+p3$E6<$)%SiT*n6t8~^6y86A6`=%pA}+h>j}bKsa==(jtLx*zJfb%jep=B4({ z8rdC$ule+_q+aoFy7A_Q_YPb}jFS%vweOSBl8!s>(u&}~e@=gEMOLpXSV(XsR~xP@ zoEO|K;{^1=3GLSQK_B-u&^cUI5#LXFmyWNdmxB-w^#2lEZ@qhcU~)CJ^fNudb*VL%{a!Nv7X1rTYieh~j1C7IZyo7ma4`7+A06%QJS5ye zq}JZykUnWET%<2qD-w&QG(v#cvMr2SYRv;P3DXaQX7q-F981Kud4M79grvht&FdaC z#TyHjVhC9|v45*Mj|hp{@cBYc;%DZDz+(~?1s6dlEDCJFTBEsP6@ftkPR8Bs^#0Cc z-SxWE@vfQaFfk%?&uD>Cme`wP)!3RT*#Iay%f;@%jO$K@B0q?Alc5Mmyem^zsUrvH zD~aOi4lApxo#*r~GbDpwLrYxf(*j^!?f=Zc;vf?sr9~(cKmnGPsKy}tlGH-)G%s7O z>qJLqbcdU9W%e-vTG~vYPF}_nR`xFou7b{P5j-+UWAP5Sb4Y*Z==ZT_o#3KNc_H*> z!$0q?f<6BwzlEIthH$vgMt+#jsqbDhWkCSjCdoyR-ffzT;Cf1;3kj(UP>#-Y(Iv_u zv4tG}X0P#M?uf4^x-qL)5@Sb&6rBj=WYWQ(%}R zsr5Sf-|AAA%V?vY(WnJHF6=s#d~auF>DEkjrJw-}GORrZOph?j_MIbB`~f zhSAE=6joQ*{a-xkllR&8@cMupEov z3TiGlp!@{Tj}KT7p&>NDi?qLSju;a(wUnN#qdymw1^Z4yVV+A3d1ueLep4^m?7ZMN zBUcTQEy#zJ=Bh{Xl7GMlB^T>%go`^+*3^Oj({G|ASw6kBs0gP)wY!J};G0e+z4GI; zGrel(KlhJkq@);{Z?gP0OfV?GUNsKm`FvT^?Fn&% z>nib@U+AB&Uijx6$pba@P`OX^#J)MGjnBo;Jm~BWVToHYk1nW52@fjjqO2XmWYN6& zzxqGkIZHBGHp_^}lJlezm&7shO9HZwiu6g&P?CVHe0gNL`mg`npYPmHL+5zH!qSdk zj@vnqS>^udO2dszhE@_>AalGtLh(ZKous5BE8YPV6BarpVohghPV2;q6L@qX(VG7CZf4tV;E0* zN$n5<3dwguKq2=|2q-#$8TnI6{I+8*%M7kBqL>%EkhQ?BA0A+CP}c2B>69mb&{<~b z11(C*6LR)=7D4HJ%FLus9a$jrx74yZ*o*~IJBDVAoi(ESHw;FlYaYkweZaZysmwb8lI`&#SxHxpF1Om zos)v)$H1L0ypYo+}p0ZcRfnf$Y<95TEg z0(1AyhCDEr?+_%Jl#*FYbUuJhQps)sOvRh4;s#*5=ID1=^DWM1<4k=qeXLsgokXwN z_{L~j?YTBPCk^Pt=C_R5B{=wDg>cx-O+5@kuIg1JZ$Gl?&HZm5B3DcR@-F4SF}uCY z-5g5O#USiWf#!|7bTl zj#D~zJ}?mqYuJ1D;jifcA$2!7@!=9=4k?w%EQhguv{K_#DOS1W)kL)5&WG9k>a+6K zG=K8O{7~m5(J*6kLg2Dl+#8=QCiirdCY7r7N1lUN4t@JEYJN<&q;pncypd>k)FUfveuX09X~IQ}*w1&xbG>n^Uhwf>s7f$baz}?VXQyi*shi$_z;BJ|h z<*tJcVp#w}5*&7(62L-(d=-F@l(3h#mkSZ=jNjzfW~rl1lIXf*0XI3%i1XF;vfQw! zRpSz0lMU?WOvb4@ipWY>knc-3ugN6eof%fypf# zawpBaCNvUQv>~+AR>N0t)x}eX)eXOhH~heC`gI?Q2G72$iJJh527hbuc+$+1l)goy z>`@rWs=P_O+VOqOLV(-8i*q151_8oR;E+f26D$JqQOhN=W)k0YYaW>IWgeF1`J~Xi zMJYb#`s7O2D@E4~q*;!wE=@tw{d0;$$t&UjVHnk4tI=V=hJN)l<`Z6@<2uABB?xoZJ+TP8*t`85X@myjuKu! zo?n zYFH)Soh@|>^Tfv8RWKz72Q5ZK5Ei=?zcuDX5*F?c#5jF<*gtxa4Npd&O-*q@tcKR* zAI!QMOwdJ<5|7&pmDpe#1H>yA_^ryjdx z%1tfU*v{HvPVzwrfT$2$9&^RAt(E2h@VxiuA9Ob~54|COe9Y6b?gRM^F{*~P)-4TG z&wVK0#dX7`W!4P}(L_|%rY&c$qSV*N+Q#eCE2pqm9mlceu8-t@>s_$Vf5HdPm7ny( zbMIYVc!rA6VIBC;t$m1k70Z}jBw`(M>fROElk_R=z=MQ7v~&1$wejrU%s`7;)WnnV z2f?##Xzo8Mb%J*#2EXB*`Q2lw*LR`LvOzi5s+J9niRxvbO^j&H4y#lf+fFU4c5Qq0 z&0oa5`)AWrao_%V!z0XkN{PDUmXD~t|B}y1RKtngq6>rqEN)Ak-NUTEUD(>fHk|H6 z?nyVCT{t`IVApuVa_IA_DD0Eo2NHgOnAchi)4gdz5K!2km}x;{Spp`5?p1NK=tpla zMr&s^_$g*<2QK__HvDq<(h&B9;_@TI_vL)E2iPhGrnA!6AzGVGX5ZX0)ORHX#oH@n zVUjQ4x7M-2*n*=TU)u+nOObT5y)eD*9HdCP;mu+M!0qd8zNJv>|Co6ouoBw~eKn@+ zT{VHQ(p-I3=2BQQd0Ne}rCxa)$$1s!OuI$kRkiEU!DampSa+|;zDd(}3li?6I7!w0 zvsRBsvjI@FNXC7+SaYIF29k*)} z!TnUcMVuAhb#LG84%uPxp#bR&HM(ZXoWKIhb_5dUoD{d0qt8i|h z;;Ja#qYiHr`>o?`?(AE+E20`&ielEo@0gL2t70ewJ8nr=V`+c?T2o&bLwF?RYDpxG zOUp(5o!9QO`%U~D9EVb8+3@?oxx57$S2)~#uFM1=!+Ww)*d09QYGm@u^kS3zF_1~J_EmY{-!7&#b+`=6k*SU{w|KY&JK^)WXl7ZbJ?Zz`aWM9?AHT<$zwtXtuBNi(e zx7%r5J)VdL!$Z8qyhaQCEmn>JSnm4Q=cGo6=T;|A;RcgHqp*)~6W~eLV0Qv^LnkCW)P~fC_?=K5osPDp6Qo{13JniEngR`w_!)a?Siw+(YiK9TE3!MJI ze-uvd0@E|1jJToW0W$(39@ACsRZfY3@0MdC~@p&lW5a31&78ddG7Wt!N z_YDUqDxkQ4;uk*;`G2)st_tkE&_=YU2@dmaOVaqTr)+tM`?sd2ahmiXl)B#L8$*I z_kxLCdT={H2X&-6VeVk(sz3W#Y~5Zi7k3`0r?2gMqxB9l6R0E4Gl8WhjYLtb|D|yP z-i^OQ-M9y3Nyg#apq#TxI|yZh?Z!nY8+_n)63XD!=R0z`W7~27b;ZgKw%ST+-wgw| z#Vz1fwd9VGL$}QtuB9cRu{$cdE|#t5VecNO)ysE89vJeWqPhOPNiLthR;0?h^(0Dq zK~-ZPNOrF3a6r;QvrGHU-Xc4sM9q%A5?M|Lb2b+)in>53F5p#?!n7-dvbbX2dM*{R zek!##zS{@+{eK$~7XU9hng>3Typp2aUibuZ9WvYTk?p{!gJ#<>a$&jM5)Zz7?Wo{P zvEtKlHjI@kWNi>Fq@GuBlQzao+-wjpMD$4DY&HNbSuDip)h%!lL|U=40~Q6e>HCbV zELrkdS%MZ`kQ(heURWd(cf2qu28_=Rb<8{)SnfKr@5$^AA!pJyNCa&d++21-;YPEG zyK&dxZeMeZWajWJ%u`DTS}P8lCL7QC6j8J-%`adzn%l+OI1J#_Lp|XD>uB1LEii6l zY62^*Hb2tSxeeD@Q@H|J`-IcPItzm`yIbPFb=2?>CHh)X!yIH{nZVaLxU}g9hjxcx zpgH!Fo=O;pYS?(&05irFZ_67BotxneTqS}(xL7SST#B)|SK0L}5$j-rhyBnz6|z+mJ$4I_@?=cRbL6x0xU`YX6EUs2DyvaA=okPpW6FK5U@9K-|x6?>7(? z)idh~m-$)0ntlBc>0CU_rMZNJi9rSeAU5jOzbq6i`{+RD>O#9JD9ap~XF*(_hiH;b z%$;4FqPqIZ!kUncqjn8Pcl$xS{~to3A(4jE=wOthS0KXD`*3DPcdqUZND_EU${ih) zfP=PX4y|>GERIcALkp+&tIPj9JRaOYMI|w~K~`TXnjqZJCpro@8`yIQvf7^U!t5z? zxT_$c-Kw!~ERZ12dm(34y34Na>T`cw0|wf}JuMk(s- ze-2whX&sVAFQFdqAE^crOi0_xew1q-Dqw0Q8%i7UhKZ%kl*qE?)@D(EPG7XXmmcX{ zn`Ji-9u`8=mK6Bak|4BfSRx!l&B%_N6*7P8)*A%O#?*!Zrh{s;LBRB_ZA_i^&i*bG z3N@5~%YmQL#S1}9lg|Dj!cpSVLtwLRyFu7Ygl*UxMjQxRG>XVmMg;3iw`f8;EjSb} z`v3NQ1r?}hMNbGJTjRGI!q}RtCgNcyf2r>_)DRcHK3B!`-4T{1oK)w>yzv*e$nO z8Aq}!K6`y?u8vg??klqYQ(itOz(bTa?l!QH&8P2L#^y?#&&*UvmE1UTvd_P{(T$v3wr?9{0=Qx%D~3A`ZzjiF+j#hYCRS0$5C=F&SA8EWaK`t+VIju#!J#zq zOZa>N>kP5(;F{F2o}<;cEtnIiV{?X`j`3X}pY%+73(&p`&YebF7sUBrWJIrBr6fU& zOWsiKG=-#t711s(?=#z5X~%<>hJa}I6gN4tVv5trMxO$FJB`dm8VCgdj&SRqu?B3?yToyy7{}Nx)KJ>4x zm|m?`UQm|u&JyHOMa_ivcoeC+nc+FIT6G9qnssCRa%lUyJ2p0N7HD5 z#!7JS%TpYKnpyVxSUnW>y2)t34#1rhF<)j@BR^}U3VVTWF=D7rL{!o`vw?3T zG`Fng#Dq9~?c}++p_go9{?%6d77ceH0^P!hJk#FV^~xPDOvPcyx7c;^8;ET@gL8ss z5lA>h5!z`wVM*skF*_q1R%AwI|J7@y-3O)~6|vinDx<2HO}#(kp9t-%*YvGC*vMZh zkuMl0y0_A(HY#Op8zxy8zVXxvB@2M8DX?N0ZLW?^y`ysmR+LR5i6AJUa?;epj1jEW z)?D8^6(iUJ`7U%uq_DMYE-k=PCZjIGIEQXuQwb+P(d5P zay4y|cbSJP^`gn2nyuGs3nVRZ#o>02^c3>IN>70&lIh{{Shij+`i4SG`|L>P(K8m* zsv7H^dW0?&NKAz`$fF27P?~m|#k%BrATPjK8A;YM&N@{}4U@csbejJ$@Us*r?$lG5 zr&t$UARCElo)rD;LMXhQ8u6Jd7RQa5se1a?BifR+%$Y1g73r8qMB`P-VcGJn1L;J? zqLT?eXwLrKNEx+o@JYp9sR(!Xt_0s|U8%aY9jmwsdLUdnW9sb=a2SEt95;25B;@hK zrPke&+8x|?Rg#EEezP!uM}IZQ4LAr@UEilVzayG88dvEBQ<7#iCwMyb~`tkC# zPo;?;^6nQk`?#S6LJxiF%F47uI#--n3}fBxg@MUM!@)BljV=-%$H4ow>a@3nY#e+y zu;YdxbM|LIa&X&>H#hZ7LFORR%S-NR(+Ys=PTmU(7r}~x=2nPRtgsJ&LK zs&AxvW~q~xO}ms0gpZSl>r&e<+qpbo*IXhCUDM&%STW)X|8T*y<{vJY zKK0v_H!M>sN5zktL4qZuisC4Fe#XW|uNtMa!dMZkQqJh%qh=gEG46RXRwrp)HQ0t9 zjHe&2WEDJ!d~G#}SqQY@T;y+)$(gnZXG-HpV8y_IBFDfRAG*XAd*AaK9s{dsST{SOehzvx%8tfOGU>QdfA0RdIe2-Npd>=+69Sd|s zQ1wGcz4kiQjQopAaeIGTDWnY^V*9CI9y6o9Zdtv0V(BE}9LG*>oYY`uC!M@(e0k+W wwn=%}iRIGb(MA7zm$wZrUOf1&Yu3HCWfgGu$Zz!cD>$$jRAfK0roh1d@w5VL}p7J3ttscEi5~Z_>7? z?U00{DO&|exBVP}M27QJhJ?!TDE+3luABFI` z2R>JMiut5hjeDXuoE)keKhuGE{AsiutNZEqQP-N3bU zEdMDM%2ugSE7MrDQY$seO?xo2y{I*;8Wqd+nq@WXR&5FxO65kOR4+9v&63rqSAn9p z*#MYosg=0%;;FhkP>l}?^-{f9E!G=WsVZZgqO{nG-8))nR0|BFTB??t#hU$c^FX~> zu$r|75R}TzYNO0h^=GZVFCEufbI<5eR}9pBA2w@+DL$;W?!Rkcyk2VEcGpC_R&AYm z*UCA}j;9Z+XzH3u=9BTT_O2M9vvKJ(UT?N;yK`c~*OGv8g$+vFvIL?zn`Q&})_do) z?z=lb=|e|_!DuA4p1S*{T(wqcHmeo{p)uO1lv_KWeuGL6rnB)zv$gZV1y}wFCazjz z5LTsJfD%eYNTWIhWwbUPUff!7XZBM4T4u6bbk(ruv0U|)ZKhtMP_t^)a;?JT@vl;9 z==rlMod(oHmDt3Lt3W27Wdu6Am1G<>a7>fF!dju`{@1A1rmQl!t27%djix0ptM$@U zxz6X_aqFTh1}de(l={?Y?4;!(uLXu#Tk{P?Z9h6T21{_^PR8s9M1b?ap)qj9?6?Xb zmKFmOuz3J_3zRZdt^uk4Jror)f#KKTq(<%X1#YQuvu2t z8LJW#Hdy(?cxmf}jib$IW1 z0tj0JUs|w|zuszQ`U1rbCSHH;tKLvs`i4hm%Dk?Yi^B1tJV;Q8vLRiv0=ymQQbU6J zCu4#dgFl5vozl=Y1Q@&5g~4w9aG8P54F~KBnku&r-!Of-4hcH^H^rDwDF-oZDsdglxZ|e9-gV5 zJ2$pY4G*SA5~UKv8wtxSTa5zq->|tOn-bH?cHO93)lQ+MsdXl-E|gm?mORxPO-MtE z>%n5?6}h5RtTZi$i&~Y+l>P+v?EQd6BTUx$cY3*Q!T18TG;{SA8}8aEZSDN(+!M>i zCWPE5RUB3-gskb<13_#5e-;~lpzIYkYYWb(q$3dJg~VQWzS0IVf-Jj0u@`I`>RGWC zMDsbqr2PPB6bn}keF4crZSF~DQ{M1}Ig0|d8+uz06gMlaZNIv5v}RQb%u=Q3uvvSf z&*`<W9uG&H? z6mq2S6>e6sWNguzkQZT12&%(dhS|AW7Upt-ucp}xeT7xcSVA|$wE+xQ^tKoQQ?aUb zM4M{4YL;MA&Jm4uu*2=Oe7Tyq25$rZ9%tg1ZrLo)K_~0wtJWv7i#d^6^ zF=x%1RHd|1R=XF*@?-K?K@@UVDXMJmaJ~>IrYZ}-U)eNQY;FAJRGe1#|5JLjM;a{` z)l^GlGMgB4QS?Y&)w-M&F3VOq`FDu|wT3=5{0YcSGz>MX?t-GJ zkFA9nAGz78h-#zat}AClS>b^~kv7=Cy5xqoMW$MWvPzMIWwlz8&7&+rnSNJ>skrLL zn>9mxzVfCm;&^M@LRhgO#CLSL2*)lrn?(d4*|qdJLP)LDY;;I5ArCPqf9`Cx=~LLGu7cCj#ohM-r<6mon?6L(q2F0FNd&YtY;x$e9k!HR|&tVgU^s?DkQ*Ztg=w8c# z&r226_nO#cBZ5;G`<3(X+Kg33SSxY55lPl6N2kasvec|n_Y}+)IfWLaP^njo&3a9X z<`xpSC~{`dQ3Pu{^k0(Mw-V$(h+HcOF^#)XJ4klK;szv7u z!YVs!rY_6PUNibPFx4uBW*IGHqiIBN%Xv{(hrg80pKqQ^?9#q!oX_=)+y7_QNk}zA z()EfuaAIsUUaG78R%{`ETh{j{5~W5(?VXH`#;UEAKNwqFl?~4Ym7)AuO63dPz|@#eh61FqaFvaPaAeuUYa>pRm;Ku&Uj1Yful*(rCIl4Fv*M`O z#JE*A`VzY_O{-YSuK&TblSrRK*Rjt1$ zy*PryvQ-gP4pu(<1~I1THrvX{9~;Lz_87y3VMYLtX@CESQ589FizlZ<|47gis*m6%R#@y!tVd1 zwZEOWg5@kJ)_}j^+*f-pMx}J zI;1O5Guz1Qp|1=BEC?>AKTS^l+Gwi;Z8Md|?3fOn9Gm*>iPF?>|F)@LKiS)X{U!uM z*9YcI6-%WZ5}D6jy0s%)VAVgUF-)-64Y$%eQM%$O#^})V=Vm}IS_f;^NCcU z7^c&xRLdyliyfVZ`KB!AXm=+Sm0g$4Hv{Du>>+($u@T=rh3er-Y<#9%D;MA_#R?lq zN0lSAEe;2+{>&Qi4cn}N@WSBd0-nFKQ4~j}Hy3nzWXn8*b(|u6g%;o&ytzK-T-P+n z0lL}o88!npfjg7rnlPKd?Wxr4-KphmNTA`|iXq;rukFx;jVaS0|8Jjcn|8Ub-KlKI zrHmNjn*cD_t*J7viA`rqMNDWNax4`!!M`z$kY1>whSoB)dTK-Zgg*u2uZTLZgk@v}oktBXm_;IKtQ`7?Aa#f3oDUVY;>gyVNRHy*okOs+ceEBlCUW5{pD^pQn{U z{#qD}SQ>oXdj2P)asK?|@dc=&yt{zoWMv_ax(6jw#mDd~7qn*nEToJhEDU@u2D`AX zq;$5CnUMp)txt^3gaOIN{$dVD?n90C3Ys0kVH08&hdnpK{PoY0qwmpAhW9)37eosl zIhcOG^ThahC39jk?dWZaH*PGNRbYAL3LD?9n!k_lXT(XbtL>?xfXASA)gNzAvx<iU$+rdKajE2Xkk z7bY%tQ2nmPLTjGkJ_FYnp@$4mHDH_aH_T}eTBqC`ZEKizINBav!|_CXD(e{jEZLys zYnc*EvHGyvTJ)Qf67nDi*SWJ-H|@pIMst*%3GZJ3^N%Zh^s|B=iZIr&7s0Es&I#sO zG@&yh1RnlI=CBf&E44oxn{!IADZMd-G}O>$;Svt49$h_}Ep0`@`NczO2p8{6FTCnc zLBz5oai;YUWuu`5`58aKOI;yiF?_lX?P5%Ww_EJ=fns54_#(LJQCAmkRr8XtFk$_U zm8QQK?5J@XC{&&qowUol#i){mKezTjJDQ-y)^oo&?x<$dORutl2)#B-9deEHTc~x; zY;~oj<7svL6lW~nK4tU)sAPyUvjY{11_nP1*1~YCsWR*Z$Zu%m4|T)>FsX_1q(FVW z5eMe5*4p~3tJT(vdy^w>FI@X9nekJkI+TkY7lk^|&ndOTZJkqro0K@!Xo_6xqe#a) zx6XR;);9(v3>zWk9JY$AJ2y?@#nVv5Ik7o&=dekaFrH5ZYvIJ|_9DZG>}|-L z<4mFY@T%A`GmL?TOC3ip$CFF;B^Thr^|S!zFJuAux}YY7!OziF1p6A){M0ibUvt{( z;sXOT_#hRfmuJ9KaiOe(u~{+h%+ZWF^Ei`apXlrf(<%%5w|%11Pqxa!eiMQaeO?Qq z&Tg-JptG#gH2Qequ5Bv-IE?zHgcDu2rkv<5nN5e03$7fsp_yK|`A;ASV4Y`ei`BMX z=7?>t9b>#K1msy$TMM+J19W{LM8|f7s1PV-*F?I*honon5*?upU}E?7e8AS;b@Z$A zQ>q4QX-e}K8=W7etsnh*f!NJo{x!CgYHQ**XH1s7{m5`-T&9lsV#YTXX^xHBS6bp& zu0QoQi0iOx;GJ>L4tEey=SXk9adzy7p)Wu<4%r_3Rf~H2KiS`oeZ=w?YahC+Lha|H z0V?DaB);Wu{o~27jOn9*oe15p@J8X@r4m}d3Q8YNlu{@MswG#3RD}9UxQMyy8sfva z7%0WUK=4tqUPEbJ(Ay?<#T>QQnH2AmqqI!@kO)=Pl8gR4n3) znrNRz%_qtVeFX8tAcZrAZ#!ocVLA43#r0EkDRyaC8#1!lJN^A*Udh>(V_pC-fW<`)$1%Za``IOHz8HUMmO!PYBT6g#n#TxPZCy&RzMJ3A3)ve9JXZyI@v2@btJ_>|3XYY(dLv7T{-insW{wO^rdc#>T5kwq3JPgBu znb3#2Kq+&kePNvW)l;GVDI1$u;F&h4(m%ab?Q@=E$85O8ajbGXo_u3~M0H?g6qyQyOWuyYMub-x+ zA)A>U8KLOIj1-RT(76%f4Sm6+iFbFYJk*_gtD;Yp!TN^R2IgLrWLM>|Yi9Up+q(n>*QkcKn<89)EcC*om>Rc%#-j{EG!gp}X*C3moePPR-(-beYAr z<_5*4$jTp38rlNwi&kyc{>|`Yl-GZMbbcr(pu!9B%&e#hMWuc8qY<#$nF39v&Lr69 zK2rrp$^a_hryP211gZ0mij9m}Vx_j{R9rV$ZdI$blSYgsR-2~ z(R8Z{EEIvM&esOKDr&f52|p7fwQGck3mE3hhA~HQ?$ME1ysBCig*NI~v=;8K%+~8I zlgMpw>o4?rvKg@eQIUvgX2ICZjT5XuTZJ8V$0p}cTb9OgTDPvLBJfkMQBxYyf{ba_ z4n1HY^LdReT8NPmD`Os`ElsU+n4V?kpUlBG%fr*qg5GaJyi)gHU(+h@P z!%-V-*=xn%#q+h1Aw5MRl*(xcinHDQke+R%8{eo_@#%}g`T1q!y@1VY!d2Ukjhz&M z(Cnpfga9I%aGmM^Td^IpL+T0t#9quk=(4UsQ9E{@YsSAml2oR-yC)-4KO3}jlh|>6Acq70TYRcKe;UyC?=oUfwhy1p_k2+wAldqbwnI`yGl>*k_R5&NC*Ve9bFGV|n- zc#Nz5On7Zu5+*r_rd7VzKM|lrtappTPPw@4y8R6_E0fPf0{4F5-fPv-y~BNTL+bFQ z9L2R;!&po^?32@|p=M5tO~f6C{W9+N<8e#-tB*Q=wM#ySNiEeT@XONQbef>N85_e$ z<{uS30$;Ek6XtM!Mh=9t02qoABhuQ~5#h!DX>1w#!EDn`6$CNQ{AkRV9sd$_&QY;k z-rk^fYnnNr0KfhRApem}2VMs{yYqXEo@b!hXF0ADv=fT#9gC{Z6wjcO(l=KknVMVZ00dK^Itf zHT(7UW+VmEB%vM0&Iq$~M}M#Z8Z}x-u!tnC@x)5lvki|3#7gK?LS4UdyJq0?hLCee zSCq~=G7YI2d=NOeF4{B}6IV?6sH{$ZnpDi|J*td6VyDYsh3P*i0V7TIc z?aXTKq#USU#8E#Ntf{u25}T7iJE@Zk#JZ_1&}2$z_~}}s*-eZfL<}v8oY*ZSWtGO5 zuT-sB9g{R^=^7u;4GN(|`7caXo3X;hza>fZEz(}4uAA~AXh)tgEFNQv;E3QSIxIG6&-Ucv; zSWjOVYTM3ug_x%C7LLNNEg%lp;UqYOdDVqA9Wu3KV|Z=h-agMZJKBcqrCuRVVy!s$ zu`_!`WK(W6)uBdgbV8o6K>O>6=b~tBy`P$RDyoZP+nCxi89Qz+mYopcm4$%ZXnVSy z9Mg_&V@J(iSGN^sP{%f7>oU%m0cA!&2?v)o8IGM$TxtcvEJ*hG#o5tK z!WgTqtG+ODadO)}$w&rS_I2u?lH{ zh>^7O6JVf{^aPj-{k7GHPKl8)5i@fg-w86_8Z)oiLvcJWpgXBzeKPi1QSr#DN~xxP zd`fIVf*-q1h3WCv+dxTD@`?*upgcrtq|*+Oat0SUBQA^UV+qnAJCXl;Da97T=H>!$ z#?;2J!2aec|L=;utvI#AI|UfgKZFkR^+yP25E~krz}JSSQmnCj^z8FM+Lg~PjxAdh z3O6D%CLA9+G@D%!cp;V&>LWk+>dPz!YBy2xUN~DWRT6YmUBMZRYE(H@16c*|cz{8a z*$CWc;Zjp?{-*}mt*)(wWyx#VO+c$lQT&pb2d9Q_^*f&XpE zBO@CtMW7aWL7-dFF9@S;z31nd)+@glYklsS?dN_}?=LhT7Wr@1qI)V~qWF zHm~3y=TjTErx!+{LhyM7V`&p50w#A?#FkA9`H;F=5?sPO`D4ML_mJ>3VS5b;ESoGmM4a6Rj+&0zCzsg5CY-GDrvs(*vSSwHz4TfdAgo&=$hF zLkkfY-Rte)`5_L2&0oi?0$-`&b_Tf%X2X4VqSW5SvFb@Mg8;l@)b*EYezz=8uH{O6 zodRvJ{(Wsg;z*XWx$hE+=H_;`a2bV%LV$mXW*JLs0Y|hVZiyzJy!N$OA6{2@9VbtB zb!b&o)PX{FHw2e@jl5gLQ|PSbcIHq{A~iKs!?r8G+-+&Sk-tzB@bK1-OFa$yKI2G9 zN@KPf+wBPlZxV1c8V!uTV!RfUDR#61$INcpRSIWhnaLSgS1@Pb;7?bDkTzsZhWGd1 z4U#>^1H2zjhURNRdk#yXjlJ3M8=MS;TVGpDn=yiUXF$&;<|5C?bX_gK8rzZR1gh3N zkP6Pcb?rmGjPbErY;2Agz(uyjrfXx?d@LT37tVIf4<>JER>URpPqGGJj__f|?cSN{ zDnm+&^8$-NS7s43u++Ni3ooY>Rjj{Mggg^ACZes{OMV&&@gXhD^S@X~5eoG0k1pb` zR|b&0?m}6C^41E%#VUBndW-=gM&qMQyZ(4FU23RY|1?w{{3%p!mxi~&V4PkTIzgS? zZbQd8H#mF&OGZ;N;i4Th7|fXTp(X8abZ$5{!!R#|99AykXIbYG8q=T|jj#DA12mQK3u68vcR}}rNgTK8H^9P6BZln@9;W%_XeOU;(k^n0jRc=t< zgm_AVUDDBXI5v@`66Q9ma_Y1)8>#yPa~6|a6wNZ?6#3LU8R6tr8PUtG-pbrPXU6rc zcL*b%_)GEbFKdR-{n}*C6OZF=Oa^|y63-;A(4?X6ZVoy&4HruZopU2?q|2 zielJ}C4f`0<*_+ug}g8{jSkrN0ayilfrj8ovnjrUiic9QA*?w9@f+TXj-iHot`S6V z(S;b{&O{;>Q5i^72l@3)R>aV{FlKVUxT+hrjBw&B6Q)ek=yH`n`6_Ah9n%j?kjsc5 zSUaJdd`}r(6&?FKMdVw@U(Hc$1mB}2AuW^b=B8P%y8(_-J2+Zm~eSd7gB=^ zAKX)fH9+JS-Xoj=yN#KK&ZbGJr>6!5wmhSM8crYlDb?)K&?fYFy#2{1{I3JXj7&wy zC_5GG_Z~O{m;jX?00M~6xb~vjOwWvaenMuFu0rNKNE@>t^9yEh-(KjO(*gbc-f?Ip2MBq z_8`?&C`bDsiR7B(oWZTg-1(y4l{lz*z7Pj$$5wcp{-GVhg4O5{Umny#&tDKjgTRj) z&yOvb0e74ns<_$LxK)B|7qZ95lE&@c+mjSZ04?=hpi3z(oFd^KX{oz~Ggt(siO~K8 z6|;@63xRK-X6p^Xl)-rrHT2;AXAn5+4EW|uy>=)zZ^oDd?HLw=wP!L6F)&~`p9Ih) zi%0vzL;bo1t;_J&byg3;ZMTKIjYM~4ozN(U`y%=b7X^!MeBDSDi>wpcVKtjNkxLXt zLTR^aBqX^h>$>EzBaus+FqP}VDw>1y6mBBUI?+GT4N&5;t2w2(xOvhmi+_oJhp^|Z zufsJ?^_3bwJ6~NRjaa4DhHuVKkby>R5yv8kT*ueCjFEaZh;yjRM5fn*h;m0%7V>RK zCqQ4qWk`l0XCgDQr6Hq6M->8~d>)1j9fs*n_uWNa2(tCIWN^!l34^w$z>vLuFy{ul zJct8%?Z(SIv+7ZHI`iFW7V@vF`TfKBI3C;A4-Sv1MQh00YE{+7{^3z|=^DZ@c({5^ z?BqC__~!e!@wbJ4VE z=tlc5ZH%e^IW1l4*2mP>E;0STq-)sYXj~%WFe4mdz1pC2kli^bV=t?x(hT=+b+wW@ zD1exTO6td#NSBuCdA0d#*?-sacOK>uuKGgiBKvh6_hRhconc!A^}97PY)d_8fAh0$ z8)NFEOJ$^%T6U>4TvAuse|7Jl(=W}q#QyCJ**i0a!AN{-fQmVr_rE6ghFlHO?XGfe z7AULfk>TUiQ-#>7k-95KR0(G?4tY^1E&zVA84>(%6 zMy;#jdw}Wgh)cUIoZo3!&UhjH$>C-85xRgBXqJG4Ak>`Myv6pB%^+;99FD>!aDSK(XEoxG2BOC_37zM%Kqh)SfrRZ^L*5Wl*08$?WB^W`rZaRhJPgrw214 zo*%zFc59#AV?`B@8a`pypZ7M#aCgCFkc&PEBh=C{cq+HEb9&y=mj`P&l6hV!Ye(#! zJWSgEroHdlcsV&5@}}9|c~#GeNwsEuVr3pj0d630w^>p9tI6fj!H)c`VFy+Xdqw^D z^4P1@iW3s6`ZT%;&sBTRjWx3d@B{(?8D&GU$-NM0bJ}nHtC)&K0kU`kS$O@b^|#pT8#Zp26%^fU zRck&TORC3ji4E#C-Y?NRe1eP5m){dx7u^^TTo}W0kgeP2@xVWTY^V3NPRFEu+<4~j zoAVsF3nhe0*JXq4jd#Xmm5Vjl^QNp~Z|%Kj*!!ZrWAQ*ene!I1O*Y!|`$t#+vb=MW zyW86qA)Zhh3aLN#qG=n@n!5a!*a`>i8o>;1u;SGgVt)9Z zO-+Quw{lDJ%4A-rrS_nyp*GIXT^!w%5;g3e(q^pQ&OhJ>1G$DYiGvLu7?LZh+| zr3z~6yZYy=Jx>hgSNtKE7R?Aw)TFjUCtGAG)r*z(^3TRT8aww7X(oI(l&y{HscsrR zUT=hb`kB*>qJyn!-%rdgc)NQ3i?O7HpB#KuVy?O~lO9)J{X%T)yod%+RfqfIXC)9D z)y7ALr`7eJOsvvf4x)xEpeDWant?M^b|Ae_ZSBu2R;%xfWfHh>x3^t6{O5gyXsey? zOWvpUy%ZaXHQF1Wi=D+_YwhVTk8Vn;JwJ|Raq^r0Vr=>O5sjCOlOtarK2yEpq5h0o zKNNp|qFE#a<)+~qx%#`ET|DuNj9UF%EUR`rp1V&y|6LhCd*wgm%Srvv{>TYEC$ku< zy{lB_#aKpVPU%?@(b%|6#Ek9DH;rf1@}!Kd+*H#~#NVtw@OW&bJ^D!h^BJ|~Il4Xg zGkbLHgWJce42Z(^_pP3*4ANBVW8=#&h=3~yQITX_j|+#$^^XjHjH|-b9@f1^Q@qLf z@BZF<^#FKiA3ndQWKb1r-k7=Ya_0y4$sOx*&DHs?gNmqlf*?i+0{vEs+ZxP`B% zHWbE3)k9y5r`3m_9X>6B^=kU9sgdV~Pf*vl5=Zw*o(Zli;ezQ);%0N~(GjLKb@;jA zH}$i+3niF*rM>ZzzH9q(2-#jwYIJyK#P1#UmbY(vV_!Y#FMM)+-!;iB_F8WXYU=%i z%P)*zE3kn>5(cTqY4Casc&eBfY4z#^46L8K&yAm!_YN2_mSrYFZwQ3#{pWG?3wwd! zdnFKIBJy~btBuc07SvO>CKf~>8`@AI=mwx#e@VOx)k~MeFU|&_QX7{H-RGYOYt2}2 zcGkbQ|Jr04-9MM}5ut@zpso&{J8tQtYlNh?WnFxwruDt&jpx<1m&A`(zgQQ4(Vm^U z`j5-w+rYJZ9L!E#&8&|vJ@TU=YGfRO3H3#4ub|?QTkP@HLeoJGEOFPsjHfN|YQ?;f zo7(T&5Fd+TUDwgAK}yJ)tKS`8pvB()PFZ{TypfY*{oFh*b?Q~M=Zo>V>O;qlyfy;O zfZa<&UHtC&a;HyZ$>|&8t3~ErY4=-4m>ixza#Ow`*AsXyi>bHwFHF9rFI$wLK=&K9 z^YPrhS@NTJ%iAmdAzw{q0>#^Yp(Rj`gV`qDh3=;6Dtk)L@(5Oi0T&IPAbOb%uRH?p zb_Y~sQ_=GTN3Qn%vgiJsf8g~}d+*Dsax#E`dV6{fC%_!41P{vU?97)Tzlm}uf)!%J zv}@kTacafseaG}^VxqLYclpQ(4&l^M79LtL^4_ez6Ua49btA#v*4u-4$3bxVh<86M zE@*2T#FDaol6a<4t54x9S-}648`-MO5`A);0s8v)#oy8X#Hx}0D3qmm`HQs?cB7s> zbEMSYd2EloFTMb9#cz!aiuO9W?(C685hw|rURfISI;FP$EOCs}wH&?vCjKG2XTrr* z@lwu)I~FF7$u`g>c5aIo>y%k6gH4nRcBXl?`fn$`JmMQEwf1#C9XM61 zOID3EB@(9-QGgbh)e#+#B2oB(lrn%kRlR&${Fe@-orU5ZJi_nB@Als78T{?f3^csp z9Q@qGwaE-3k_$i3ie4Ez-jhhGsrc9*N|Bi4NsVk2?0DBf3u>Y8Z5y^T@L8CqMh4{&_Uden$gqN`G>8N_Esi*E6 zS#CNa0`lTXZ5C9an;D1^Adbq>s)A5ood$51c-({BbGhfs5sY&#}^7DChVRp zp6}k`_RhsUWmvVp_|V+3P010-sO)M*&HwDcil_i=s@+e+&oasQ+#Zci&T6M5EVbgl z;_LeaqnKx4Xg3XS8imu~s@C<|mkp=A<&pS*WHNq$)b#M2dq;ew?So$(s3ZfxH`}pf z@1|tN2PL$#bs`GQh(JYRIkoZ1k>!2%Lq%qCyA7Y1TTzkZpjSy&-$_tZEVpAX4*oc! zicchR{$X1j2ENpPZ_WoJnJwD;uZ@?Iew0}4>%Tp4RWj#?vRF~uZip|7VtdkXVmg_d zFa(QzO+9~nVuuYTjQXMbM=lHuOdb5t#C<{VM3n|f`r&II{(%Mq?|P!89l{n~eE8F` z=(bu73)g}ilW^t?=HHz&>2KhXk+s2Li!5}XZy{Nl%gYhLyTG^+uf6*-sjHG15@x!9 zVQzPS24Lib5Y@!MtA&#o0u(0i0>)du(69iuZvw# zsqLPZn8{0m4L8Zki*4)UCq<#<)F?sWBx^5TFR448?HyIG9G}=`)*h!F^@*R1+>n=B zyFFvzg{a=5qB6YlyGw@r{%$;=^t=6uk+%oOzzZ2eR8vt>Pu}ND1p(CVA)pAn?WvI) zdTlhQ5B;=nLd`usaZXh5qx8O;1nhv;^O!gY5|AYV1=^q`&N;P?NiZCpCUpKdZLOpoHcseR&q3K=inVVQ4M0g-M z<|aY{;$NN`dm+a-G$24EaU5NUBA;y~3t{7=0fj74zl*D0?pR5iPQ znK1f>KBuUC@@q4k8cnuunH=QSqtyCOBvNX}8&k)qJC=<0M{p81-NAg-#tRcmF;-R7 z?!&23wRJ;cxlufr5yqbmM2ecE-Q5uV+;4 z``GA|n)+GquN)u<$`#wxpmowIlUx~QQume8IR!P?Tm!893xrY-+5MB3Yiv`d&kIbs)lV5#|kmA{WzM1Og;ZM}L3udW0UaH# zE{Y}%?Wslxrm-QL% zL7tw!C$qiBc*v?xZO&}UONMQn@0_d-e9|=fAwM7-u*E7FEN<_9V;>5BAKaYZcdnS^ znC=CUR_4Eda9I@RHycJZ^}fvU+A!H`L#g)uq<3dZyQQk%y)X0n9Fc1Uq6oO?(nR6n zk2U=}q}Qx>PLLVITzPNCUu=w(ArKl{r4;~C-19Dq!uo1MB)krS?Ev`v)4gQ4``GA4 z<9tiVnl{Ry4f9Z>Xk1o)Js$#4>;jY#Bfi@0J3bFhX2spM8`(h4R?TN4IPEzTw)gJL zO52~ch<5exJ(&+XB)NT0W_z|uPFdFg&=Y7im3Z_-w=@vDG*0cMf!b!vhD2v+?D%!! zukv7%lfRK6MNGC3ZbbPI;mo3S*Q4k$6Rn=TC$keLQ}G|bf}sz-3`2Cdu3_+E_dgCV zj&MeHyo7(J83I1Fdp|b1!(KjH@6UV~s`3s1oyi^lI9!NsE=tG&Lf`ffa5p*pbng;P z;PyB+{x7Y}?ia(v>FDADlc4q+l-dkFK|uViMjB!zKLgdDyu=!-%P?5vC} zuXN@C@^lmA#s@Mp8DIZ!tGn_?X+=bIbHVjYdM@k*%47TR-;W*_Gn|Ihhgu&n%E{BK z5Wu^jeJGDzA;5(29l?NdU&hOt%C=!Rz=Sq_Uzm`OrIyQT=lW6Ofpp{!3w4spa4jyW zg)qTda{EWQOjN3*y}`G=gb9{%uJ@|9Z~jqcdnAV@5~i_s36xS-Jz*c3(B0T&?QK)Z z#WA&hPb!s?t4p-m>nL@_TkoO=Gu{-fE_BFjnFC+N^~{NU6)uO5W6d zcvbS4*f~e6Nnm>k_b#`{!=vmwYRAtlD!<^2{E|u!Q~j!)GUp>W;J1gDP!}77|F_?YEqpd`DlRi~xJbn&hZ@ zes%Ird1~{tBH1Z#pWHt(WylQQ$4W)5eM9n95vWN8E!?Pncyn$Qh*8#M$&aRVHYl|v zAJ41nhsGw=hD2Wtx7ljBU3_Em|7G-;Vkc)u)enE(e^;EL@?Z~DireRJNnVkRGse6A zJjyX{d?2OAxU-b~Xs?XX!o-t(Wc&nG{JV5YE%~>;TB0aRp`87l8RX8hvXAJ|@?)&M z?)}MA4MKSwZ|^xj`zAfgo?DX_M!=p7CPnsI`4>qP-Zl03t;t}HF9XK^V z1tuHi_Oq?zf7zIPYj#`>Z_Iwt;PtJH^k2W)cSh+H$jvI)03`mp|g5j>qx#j=!=|_p@&$FN{Dd zZKF=yvU4kCU=M%W#+>+3<5aU2q*a>j2mU2#&+N7*l4I&8f15Q+g{PHfW~IFSqo3OJ zxBThoaQ4{K250j>ZE$wi&ysJ_GdAxZ45r#Ye8w3CMdR(IpU-Yg;(*O|bys#nWLPRy z)r!AJYAkL0WpbBhEJ$mspUIZhnqMVfr^j^N3!vxWU)h|5CmTId-u~uGf}VO^Eq*!K zh>ZD_)coy+hdlqXJ$WJptdVi;dnLI{#`V!yO0UQE!3VNtM3juTr&1|aA_Lm~wQM6I z8s9aLI=e@6Vg`0|>Q*81CkIluX!LB!q{h{|22*Cq@if-H=$l!?9NIjx;z0AikEUK9 z*|cF;b%^^rV=2ArwtP2xxgO4exeVv=aeFvCjkUk{zntOl$Z!aZx?n1`HoD;;f`2Ea zsmPjdhV#$!Q*YD5S+>BQrQs*-SyB{@x7VF0)5J*jpORV|(KM-zr>4&Cm3fjd+})R@ zcFIJpSe&{_4`u(e@W$^vWAjFy#@fyA#U0+rGpK=XiuF_@G7c``u?`1+`IlM4!Etd^ zdk1riKDs7nR@kvG*!+=IqgdoLO5ED{6~58)e>huTFhf&)d?WoLT6< zS(7ruX`lWYn~wL5MK_WS<2k*NeeyCx!^r4-iPGrJd0_LNC^`?Ad` z*fYfQ@b%Fxv-Mk28c}-}=QQtG_BMO5KUA=1>c+P_qo8QK{dn2N(aJ`2({-p}rt6rS z&2;T+<_ybu?p+{c`MXjEAw1a#k@EI4*~yJaLnXW=?tE|R(x^DknzL*wmgqA#6)!nE zXSmPK_uGqV<2lZvq6o?H!?LIt&ata=mqx~tv1>Ri`Q_C)v$11^J$Oy-X!V7Uq%PBx zll?eb#k`N&TLn*J?O#mi?4658_#xx^!0pkYsqn^}VbGXjI}AF#Huv#(rKWDbBRUdY zw%d^Cj&+7akNG=$6IlKC5XYzf&L$3?Y~qme_GdpMs|A?TUyKgsJ)3OOfa5yC!}cq4 zj|j-;-4!9vK)LNm1xxNWYvLPsr#>FXT5|2?+!;}k`m>uIcxvj7%ZxDe=ry@_X_C75 zTAKs(-Q!@EqVe`MZx;>#W)I$wi)_(d{(za}JvW+3Uix6_>w?wHUq;7e_WWh;Y<&oC z;);-L$;Pz(ow>g>oOhoif!^dS>DWFILBD42liS}D-9VPyVxt{PfI~*Z@6A2PNUG{P z@6AOe>#F7dVz9dNeFm%Z9!-5gu=?#sQ|qFlq0Qe(ouiLtf0I*!(u*ETJtlq3I}lwT z4*V8fEbLVKWQ*1zoZcXa*!OPoopOK~a$?v6>MuoOx zzHiWW{Z50nm%pESw>ZOn_}1J-QT1_bD|e1Q>u^{;IF>4@+giC7WsW}hL(^IIUsLNz zA$)`xHOT5fQsf3<==g~?aY`of6shA0=Hd)qZV>N75@^z#T2qqIPxNh)50o1%UEyJr zk=&6i#@riSEfT|7Q_T(W!6d<)?6z-;&y(yNuKGH4u!MTL$}G};>Q?VUjA>zFkc1|61g?7mxrOAenQF%v-+tvcgO8hd4Iii~ySD#-`pVkhnGC_nyp8?WB=h)(dJ%#d zK;kqaLK;+tVkCMdTp9ev40!Mk9DZozc4yvfQQWof0vr} zLZ`V zSL`xq^&iVejy*brH;coWX3Z-7*YUmfk|CM1x~{)xY1TjCc6tCWYV7m?zCzLiz$`NV zIdJBXn>N(yclB4*@`uJxJ#u3zMlBM9HMu5@d=4ZnL{(WK7ZI6tu}tav-pF*$1~1N_elOSRGrgkNx$}FuH{>MID>*K}g30w)Bd>$b0VbCj5HRn0!K{uFkaoV`92dpCq_Sq%1 z_MJ<67UNAK+3raTqn`VE_PAZo_C}F7$#g+3pX&yQD$^st({o#`SLa|Mft~J?9f&>` z?b?PpRFaeB@eskQ2fs)A%1S)CO&od#>6J?yNI`6e0;@fR@%zYp;45x#dpoIfLdw~y zY_Er0lkBnXrmDu(Gb&W$Mz;Tzu@xx|HHPXz{AOR>v)+I#8;RHl^9{Man9JO_PzAS_ zDqPj}^~?oeGJ8x2On1DoFBH}t+S$_&rp`lie)*3-V`#vL#9rRBve*1BtL)1?x7rZG zi%Gz-Kz;nw{A=@s3KfV8A_m%Ai&3lCAz~q^&5(m1NMc6v)A#|!TMVDi z^P+-OO>OI6WdmAM+YWR9h4*%hY}nYfv&l`o84s2u^)4bn(C6IpNXydjC(ZeUi_fxG+e z3(ju6*tR|yD}^o1y%&#P6`VzKu3wy89u{f$0G5 z$>p+af>3BbhdJ<7R$XwF*4weqlSCy;fWL>ka2WmP)avNqn19~H2|C??&0wzo`~Hvg zYIcfY@z63Np9%+iUYqj|8z%+HbrDkD)=6Q)UaWj~Y7<#u`~cM@_eFHk(0WS9ntRm1 ziXJmRYW~-HT4r{*;#cjM7~d2^XKRM%+#j5s;;V&@_WNkEBI?mM z5KO<8w?QF4(Y6T(6!Iiw7mlwDk`A^0YT~}Ypz*pP6$0-3{<&2l`jpGhVt zPeYcBq(arq**86sQ;O>bkL{g|ibFS5=4<(thLbhb&X))5<&V3XxG2uub=u&bgA6e>J8!ol;8x!P=ll5dthF1{? zNVBFNF|cnNnp_!}4s;uDp9QePFJy^L1zlc_3}lD)Aftv%6#P;VBZE1 zq&{RvM>L2GC?o)35r%zRJjq$Z21t_C+5jD^zIyfel|xM~By_eD_0WZxx()`7ZZN1| z*xe29Wh@6@>1#P-F^O#7ndcDT*_JIl#X31{qZ;9b9B3t4$grVTZnxJ^B8+*>aCuM?(U(LXq1P$-Y9o6~;O)Y~uD)VpXshN!&9T zK(OO+lwEx4=({6{RiO{@4`(-j{_VX}qNd3Wbjk{fe%_&eysy^|@W-l2ZSghUuw?Z7 z2m+3{MMAeo92fmB?Q9X71|6L^U+a_yx`pjUIxmmD)Pt0(ob2zJ zoKzQlGZMYB-Hj*ETn|P9&2?(YRpw$CboIy$_e@qydQ*u76PvWrLXyAA*o7oO(jCwX zLvzB;y~W+Ib6V%&A2JeKP zdy1XVbJEjxBYexa9m!n|yIz=#;vDNtqaA*(N6&RII=VF_m)n$;2|wosq;9x18R$ee zaM2%VauNG9Iez8lE-}d>6E(1wO16h$8SNjJ%Cl&=*S6Wd`sckLjU=H4DS&{XtahB& zXKXIq8ET4Z1w}7gcb(g(??}77*OJIEqAgZD*L$XV`4_!Wm`&}@&=T)FuWxyO=W*Au zeI^HfpXn7{%gX0^Zyc5Q*FuG)Mx+hbw^zeMY`cqGCxQl^uLOfw7V@rfWJS$*_TO#5ZWQB$fZ489yNHednQi2mySme}p`&tYGhK zRw6Ti+tUZPb5SpzG*ItOXEtGVubkfZh5#X=%$F=1!(M3Gs~6;PVDT1m14euI=QF@k z=KfOV zWaJ}>#9X-LQO410RtooxzBu_VvJ6(egHVUCc1Je^%%tui)Qar`7xXQP*%M3_B{{*~ zjOEKa3d;Y$OZ3R#A@Q0GtgThaj!t4F5)a@&LyQ#Hr{geF)#Qxi2}DNLgUSBkW2nasq{}f1&RI=b^pi zOJk=eJ5M+NS6|V@dH2@As?nZg^~$AENFYOgt_|35P+Js0ZYr&AA^pY5YRom-l; zf3N>+j$6Ovj!v?)FbnEC&!^6hYz`#*WoP_4`=yLu)9#A9awnH`H{8vro%v`#ysUpqGQp5l=C`RywffBda%A)mu33RgHPUrT%Qf4^ZtgKi zS3B1Xj;T8y8&0Wxe=*i{#-n1f@ds>_?)i#)pu;`mGEfv+8+v;t)osJ0!#e40bfd+3 z%WBo5)d?(JBqHw1KlxhUOoDrU)sj5@f8ig87e+R{coDmoSQUl4v&0;9t=!-Ht_-&d zyPT&v&~~(%(G7*5E!S$tZE4?atoCL9-1ndMauG)*(QT46TaN|><2adNx5es5uHd5$ z^3GJb_KDa4uBjtduRJ9l%cQU6+>ZYh2Ldi8v7N9Ym}9H1!$e5Gv%JS#7dhY*!ECi3 zR#LM2sq8Z&lWN5)1LNX|6=lcsxAm{=cly+RESG2xdF~QLJeD*N-2@tI4)m4AxDt%4 zC-^BLj=+UP-Gy6=$=g|Ei*s9^d8Ot*lf)nwcwrn4^TcBKKWXFJVvYu@(3x{Zi^~cu z;}H*+2nfr8xv65!L0mx0L>Mm@CP71wrq0KM1$=THcbKs3ibbvM`$Z-QC1G)Q_uV@h z1hQP$8= zq~o|XKZ}afwQUidBO2XbWby%eg)`~Yv>`9-)U;u5=D(X02Az1R8!Z!wX`>@Jg{%wS#^85+MbNNdC?ax3q>{xPq6E(DN=?+yn9IsDVH zC~j|d0BMM^51YAx1Pg+Ti&U{7;HPzEkjOa2bGurAl^8RxgffTo!r?Dc@!TSXTcyBh@)1>f~l&l-^kt<95qRtbhfo1^i|_T1F4et)I(?- zv+tT%5+O|5lg42IY-e{*e1wYx_C1~{>LaiX#nXmVe66jgFCXw+F5?4hN`;GtEcrU8{zo{=u93-_3r~^!i&$8qdzH z!_lFaz!ni7>~+lYd|;w87PPkqX8J!f}n&a2Vv${FMeVQNYUlKB0HUDS%u#K$N-g0&-9KiVx;Fl8y zpv#9PI`YArO*Uv-`s8W)je|IjXxQp#VemIv5h5c}Q7-omLR@cKOA)j}Kau;u-_;z%Sybhesn6FEM?&B<6-%^Tt73 zoXsF`+r%!9`=4(NYReN5-Q;Yj3+G^QCgb4GLfL&wEU&g7Ks%rvsBDDb5X7;3U7pK! z%3cqu=KU`Y{zS)Wj}o)&l`T*g$!Xj#K4vc(u7|OVrq$kgRgVZ=9-&?xe9iExKhV}% z!+1*)-$td{z`82&ZB>idCXz+hNz2gW(#wiOzhP@#@p%6SqVPr_N72V9&VL zx99phW$o!F`%jF;>kW0s{{Atw{i*&)a@*SNBRJCM@;);Ho-RMszk@T1jHj+%d0(cg zuRs~)+SytGk1?FbxHCyqDHyv6Onqx#woKG4?qzi(D)A_S!ED((c3;L{Y6P+z*H-(g zxAz_%#P7URLJV@ZL;5%J4@BVY;oz5*DzL`Lx%xtGOl`Prd^wAzA5ICl=+I2s`)pu@ z>cG$Y?;r6EyPa9cwj2N+m-EHqAA}EQ7Z%!%>PTi_fl|J+XMAOk%o@MvztCS)?|WeU z*ES?bbGJM=eq#m?DDIkbW`>H{!NJA&KbYjfN3LuvljoyC23#&6=I#z|ImO+0stQ8H zJ&csFRmv@^hzNAo(w?pD(;pt6h~lblyiSD`rEH*TPfw;tavidN8b#x-jftLw?4Vs^$77$GEODP+6FarIC~4ON7+=-+ z9^@;8hIr0QEMo~W3439p%SNq`Z`#ve9^I52!>sB%Dac^9yeF|Vip|=9Zg18a_=K}p zYrtivp1ysO6!CKhPS23*yx@vzw%TjnIr&@$ZvsEWvW??PA1K%RIC0#;H?ommgLAW%}%a~DsJ!NhNQRw&b|?ri?KXc!ZzC3_xC=V37IAu(D7*@knVX|MEH;w zhq7F1k_!T=cC3#^RIn%2hzfdAV@6UiQ_40gno}s4AXm5Mw9zn^nuH8`*IRq<3n^|- zr{!|1;B+?HyI<2U2bCb0CdEv2#A}NqdP3EwZ;53@9QkWKrE%nt^!$;964d*;T&a%l zlq;y$>dGRykf{Yt#wWu=+-)O`1R-{$5taR6e_s9IHN%k@0nAi#$B~@k4Rhi_gnJu6 zodafCyUt_@dL@Wh>i+w>rKyUZ}U+5xXXg7s>TX(efg)D#*b> z!>TH;&t$Z|KqyyohOKyE>>>^92$wc?qIwZq#L4&BOxiPSb;my>z8nU*bDWSV?I8s>K3@{r>m8nYWq;z!!Ij44 z8v632&^P+}q&z-?p8bdpB8_)3TQ-u0gw|__)T{p`kyY#8IQSmsEd@k4wI2JS{FOe4 zHher24$=Peh#w7wNQchntsqEh+jKmV)3jc3B41&6bf(9|&+F;YNxZhBGA65(dx@xR z&&)DC+FR8NdHa)}&s>)bnHZC_BtkMX)Hg0Xw_>CfJa;FmS_V?bcDxZc0>R+54j1cyS8!p?#7CTU|yT; zLV?pE@Ih>}b!-o?`FBYoA#|u~R3-yMfOtT=Hh!L58^2tQ)d?OC(i@fKtP%FYB*XA+ zGV8vtHyQt&m60DW8!YMQ@#y9Z^@EF9a5l$|Ckrc4D%W={PU!gYkdd2!_^=lyB0f07 zWo^pK2Bu4HNm>)#!YXScp3Nu9+Jle@h7Tz>;qW0q>UemjncV+XVuMMc{IZFpqn2pbQMo1^Wf7$L0zmW`974u}tXp#$PYhR*ue6B?Z# z=ZP&DpFBFcX#x^#iyEvX$|^Ufz)#w-dR!I;+~J|Y`$E{k^Dkgp3KJm1?DIXjJN6Q<==jiJWqa(qpqc?=t;YH5b zoG37Y$@OsLf}4XcOdPHD?eAYTW|8UHV-As8Qfq<{61D}WnZeb}sEp{P|PKWCk&@^ZLM zEWr&TUYFFLtpR^<`UqTE)gy<5JgB33C!= zP7GRA^6U{1LQ;ImW=i}uSv}d+tV4s_+VA?rk;{2DUBjOqhfVGhw&d^uY$L_6`hPn3DvvKHNzNa7ej{ z0mfOy|A8F@oNvO(JyXi*p_3pfLb%H6&`n2HvpR2IvtPX*yuo!Eex%)*A~IQo~a`G_v-mW=i&Vpz`Th=$p&7urx%cV zEOf320^UsCPTx#LmiF4_78UibW)~ogGcMYb0N;N(b?B4%CRxQj1jF>{Y=~SO(4+2L zJalw)RD4|vPG`27nD2-{nEA7Jn0_&Knp(VeXaf>Ew@+~G($2Nzv{fgO*%ZPKw=Fbxe&Q4A zx^+XxrP$ocb@j1zL-i3vEq(Cf{};m@VEP0x6+AkWK0d`8a5g=ZJ}J)McMhdblvkg& z|5D{5_0w;q7w_s#XZxKtE%KVC$Hp!4>=1}sB<4iNC88hW+9g#OO^+W%Fc-dcL@w4# zBrs?Y>sG_pik#1cbd01I#QA$DogST2C)TYd-ic*9yOmrqvUz~l4-cmo&c*q+D!Gd= zxB{z%YZ4h_IL1%mhkoI3dS#ry+lSL*vsbiRS`ymP6?Ek7ACEWFy^M0*Y*28)lxNfe z*%hRg3Bv~}k`OFyVnPIo31a`%=SI?tCjHd_lDR=x{`ZmeEqQzcKqfa6=ty)N6dR4! z&MWh3MPj%|J-aBKRd;35r>YeL>DQxtt&xbTN~R0r$c4+QI{e}E6>4NKJrZv;TRR_I zaNVDP0?D5*j(i+8YA6FrH4c;J5J{E?wforgTy! z0eo^)5oaK<;3*QK(Or zF`33ZWt#^`Fhj1yT9q7$;@ybfV@X^dVH0>N+m+ScC({$BxeBC3?&pD?yOk)T4Z*yx zkjqDR932}yPBd%H2H0ki@{iR@qDJY+HB$BKFQ%(2+$FRsm88{K8}JUo^f$4j1E?OB zf2=Zo&rmgxSImx%0PbkfHFAUF%>%63K&dR!4l+yX^t;mYJW%tkS<0?2)eU#0|8ibg zoRQfk>}e!PT(MBB5H|(IqGdg_C_PVB^?PLTSF1IP`@&3qM-fZ93mW$+>x|ffWq;g? z=34Xg_yjpxV6EJY;$rI!t}k*{Z|==f!?k$*mGxTm7t(^gXuH33MRAs{Hj33UUg}Ox zICQgW+m7_;I6k_P8-`qAP67@x1!2YdLVA2W>=ll?2Tx0nPJ}l4dtXYAd9uDty_7Df zXY%Pxy=;S7gOc31FiTA<23;7E(#->9bmhfS_SkaOY8~F2@1YbCK<{@6`5_zL3_rYk z2Z?a>*MV}#MwU|NA7*3PL&9)xh>dD(sv-TCxf8;(C+X5F2Jmk-6&N5tXLPaoZU1!F z2yKMgvv+%h!*&LDlD*GssIQ=5=Y?Hvm`oRK29+}cASrM>01DJs41~``*u2T|4J*H9 zphoUN|17&ubj`petW*b!fhM42n(z|}dMCNaQa;la(49Li=u)+f zNH0=%X3~q*`zO+`&q4g2-5k}$;rFtc53`vkN+nBn^K1UNwJ!^r(=NXLokVO+O;hY? zb=>9g$>D}Vv)LeSYHlzS_JNBraNlR(TfOGPUeKt`AiBQ{gQ#F~Xp$$e1g31gRT*|` zSu>=PsvuUf=bL?fAgp0i*H@LP4H+Cc7Lgztdb1?U9umIZ)=Oa{pz5L{t;-2-*-`0} z@;-bm2E%$|pAC`aA`vDCFV00v4H4*No{$9n#X!XA1ub`znKFAl`}CClgrthT4@w0Q z1)P7&%A_ov3e=K2R9T8({sFWhpse>%Ru_*)bPD_1U^N2PS(-Xfz9V@k3`%8FcHN z0k!jO>A5EcS}}aWU#t#3n*Q^gDE7Jbr_sp)TvrE=Nk2GBChP)GkR#ic4Qye5V~%I{ zg4Q<@G}8-?{5oHT!ww{&Qof@n9!mvMwpCy{9sN17pGcKt7q7y+nE$TJ-isu~;e>GrH{gHW#?*7YX=}z)WS@8FW0nSv zr0?H9ejk8yxJOLj4uDk?6kRtfLc{QXMd(}!?+Bkm2{v^RB@>0)NqX`me{B&dLg=8P z)+|cDJ;y20EMyb&$fl^8$H6?xvm7i!ms~<`qGft2vwtI}w#JJ*Wtn~rT!9p@(S8%E!$5;hhsXjxS zBLGV;_)Z;uC_Rx6X;8nIwWoagBr@%LgsR1s95EKxe8nC3P>UNhnDNSTU{VoI4Q?j) zrKi+^lhUKpow9Dl%>yA{Yr+a`lnqihYB!*EJerS|Ko~T5{1KZ%>B`4=8Nlm~7Q~LOb?5J-7L~NEr z>`Yiy7ioFF(v;;b;^c3p{?AJ?wLe4 zS16(uW#+5gjUl3@C3WQ(Iy%c+aRuafI~m^3?|*ArJ}K`5elduWjpdX#gy0XPhzkcN za0i7DGxUfo?l0UtP=Qv9T$*a9trn>Sep%tryL(|Q|5|w@@YY);UYnYS=;`qdTsj)&Ds|8 zAgN2a;s+^7=h7$_J<8^cTK|c}JoTKFe)}j>j_S^(ZLZ=shH`3S4*t?`ElLb5T2Hkx z`sFSsBb2cY)as5?(+kh=k+jbo;;K%#zh1zuBGt1vJuf3iKlh4OhZd)g%5emPBf3|w zTE94bbS6;x0ZKuSw+-P6YWw2!WN7Oaa=x39E#~a27br?|cR9scUPf)^01XsP(WSCs zu!VK!Ul(%3Dk1lE7pPOpsS#(sD(OsdPU1);r$+rwLuRWCWv$vU6A&GQ+^MxsYTp_?qG;5P}Ac zwrPX55X2hExW#d6J>>Yd{y@pzUYsD%RI_+~MCh+2LziA9}I`OZ;uf1bWXGDElzn2`^^HG@z?6oOV@gqB&9L=i}T zP{qSvxZN}X5Z;y;y`)wdA8+8aB79&&Vj06LdrTkHp5xMe)1h6sXhLXj`pk#cm~pfW z$o12Z5^#e#1}2Z_!iyzBx7SPa7EO>cgD^YV>dRBcjmi1X&kY zG93u1RW4MVg+#V41{a!}h6khrZfyT2Ee?0bS0C$b1nOakg+K6>8|AFKRPA|Eu4GI< zFwd$=0yZ%j(aeYp%;I?lma?}6Adu1^Tuy1Q2e<;yfWxj41CyI{mk7QDh#+VPV)ZQi ztxM${dmbB{mPkf3AUAwHERnKn(_YIKnbI|uPPJChyG()sT5v_b-M!!jF}6!hj_hxv zxT3kIwINuIlDE{L+|yQV-5dZl4aw`MY<3KLnw*Lp)nAe@^g z83-gqnj;@#*E>Rju;wlT<^NLC8h@d5=Ws6VpN1?Uh#n{QP!$ryTUi_R%&YUPFtP%5 z>$Y@y1c*ueg#{H7QtZqmB~(Ki86iPvEstO$B)~EyIKV5{+MZvV5L~I-&q<#)Jp&f> zMj@wUi>Bz`qV23NB;Oqi>Ij9L3e5V%DsBQTh7estRCFcw4}otSs5=~_Lfn?&yi(r-&(9XPJmydgbyRTQTi9lNAgw2~^UO5iOCfY{EP zCx^@m0IR{q?xXGf&YWy-ne^ox?DkK4utk}Ou1#`4I{b#%m$rm}>d_CUyGLLS!L|fu zL^?@eBg-)n<>SLx;e^-WAbK(n7_I2_k6`Kwp>?`Xd8VX2kgH2qq>Iy@B18y4;k-{O zyjUHsLI0K$&X$F)X+8?F&bz@}7ZYVzO@QJ4(-vSNgEN(SmwP`UF|_mFjyr$aT@5zj z1nU#-9nCyiOl!66E$QQ?C3_sr8$07)C$-V#!X)Ld|ObcKP> z>vFt9hO&n~bY^nsOM3Q8_0Kjk9XjHjx^{xrWW-;-WBX5GDP95dp^If{h+Q~+0KDBY%tR6x|t`XpL5>b)l7g#V085-GycW+%1KBxGalG z2v)j`;g^=(OX%BA^ySr>OVVfSCr_SD=05Kq>&QzkP^#a0)F!z(N5!1{DyIK1Omtkk2M47Mf& zN!Rr>Z~!@QaXNp2uofaWbw~p?6Z#C)yqGnIh5Z~vx4Wf~hD-BuU!gE-(FUXqhS&K0 zBZxvI4Z8cpl2aU0IZYLI9C>o=`Ur?Z1A5scvi^jUWmY0*TjvgBr-y2Z}c5+C8xE32Y!Qf1w^^zFD_k@ni zEgI68T^l+T0>pBn35Qwag=e*x%*Qv6DQ6-_)!J$7o`-t&h4ft3keKAxUY>4DhvHM; zJ!Fw=kt6+^+3-+jq7x;Yo>7sY*)qryb1Gciu|JXbh!u0_N}^+Xzuwr!CXx;~W-vzVcVqg}l5~hMyKAxqnO6}j42

u!;z`(`~IilnVvfyFe&)W+-*vyCuH59y-auPXKTUv{Ej(t(H?(Mg^3bx1292wXy3 zo7b2Pz_eeoL<@-=?1z(vw5)55x|1w(!?G?uUG>1X491Rf)+Ha$py7Q!T zY8bf@W`w+nNDEkVc$-p1Z9fUt2kC!kbxmGJg&|}n!7*N`&UCx;s`N1KpB~u95Z!C( z>Z#Md8mVBf8jiPYg#EIs^iL)T3+!frTE(cB+#HZNv*|h<2Yny7o=DIh^_$P7yGDF% z%KDAOr-u2FADa0g;)9p@aa`|&e|1mGP#2-%uAN{G3cTjg7WzL24Wh{k4n^sVGqZE= z5Fj-36TpZ-D?NDo#pu;To6%&WabX!}z;oEb7{IPi)0DPb}1ZmC(GY>^r+S>t1gNh?0F_4F*2`ebfQ zop@#X-7|1K8SxcuD}WGxi3Q)a5wJi-EI!;Kotg+!k=lBtsrZFDG$pLPi>3rV)zl(T zN{5!Nw14TA!dGG$iGru)M}()0WWkmH)T}q9`w+O)5ME=S4iCgj3wbi{CUT9c?3)m{ zgxA$INf{3B-c$~SSL$B1X4sFbF(~b!Z2y93e}zUONI^L6mApwN57{kcpF~cVW0Q(( z$|H1bl_Qej^+>Mu5}7`*9mmRF*VQ0cjefVBwl=Y2>goJ!UEwL0%mrc%Yb34IYf0-d zIP7{Qmtxu^`+heXCO@7gxc8OmTS;qzF|^wT3*DKu!NMiPb5;rG_Wtwy*ZyTl0QZ2O0#q@ccEqmgn)jwt;_FTvh%M{W`52)f-z(nN z&fiF05snP8O@sZsQl0K+{-7TjV+dx9;g-LK3Jo`h(u*n7%W}-&*4^TIG3L`39~M6D zquDCwIqW{=a@p%T5}C*seQj+F@2A68r3Yu53U@g}Z~%yXHHktc&cBDhpFUwWhB6-Y zgs>}ejFGa)85ge>&y>s&XQzgLCjCplQ~vRd+|$n2H!ZGCe{&1QG&^ku$dNL7CZ_QL zfHR;rY$5dd4y#~=u*_hE`daKe-RsjmKd_{7FY-a4pPDwI9x4?@jOjhxga-B;?xOlk zNB<>i^95ar0rv@aB%WFHY2FjA4(DR8`D0x3+WA~EbGi4YSQP6MJ_up*vIVqP3-+do ztS!ciY+_ET>!&`qhy#NM4ucD;)3+JgT?oFSp-g;m9B$mZkQw4jP zVZa@w$MU%N$RtCd5GoP?TlMct597OTpkLoJBfjw4@#9M$D^=K+&K#qWAZQJu+ngrS z3UR)@rwP-tLt-`M+>}LQFg1Z7)peH4^ZRZ2z)3<+BQ{eJgvt<6wEJ0&krZcvGQ!8; zEY}X(fW4q2HVpg3bzg>kt&db#g>>tj!1hnwTzqMHTo57yDW7(e5jk^X8ed=@>iFQd z{A5|OQj%dm-=Q!0s?#{Vg;pZy;BeN-mPt0XwuNWdD6gWa8S<38pQ{)nvdid;=>>4NK5ojO z9DJ2f#t@*lMP#fAp!hHcilM~t4mfzU357%e(w~UUxAy~NYtDb-3!;Ms1zN#v%45Oz zvGDLRSVP@#Gp1OT+Ro|paJ<}5U%EMc`iO7F_Mu=K*>9#pdJK*uISS1{Gta#}^_f8r z;%d1-<(sI+lX>dG?Y^2Sngmx{B18uR>2?LJ!enN^xHzz@v z9Zm&Zc3={V=e>%?c>j4Pq4^cOv)w3kxRv>D_m(@%3OpHcRmf#(13t)M;vSQo=qm*} zV#*0?$MvH{fciws2W3nXb#t}u?dds7TYoxz>ND;ywIa7bv5~lm5(slv2or`EqEZ!6 zyp}imXRHg&1#M-Oa)$F8lMRF(@eJRcYTHJ`g zyPPM7eBjTtb2xVVmH&N}gZC&PV1+7R1%fd;Dn{+TV682Pkl{W|rlp%8xj!<5$Xz0$ z8m<>A+P`!wtj8PNu=ubN_ruy&)YYobN)$}w^LV}B;8R4Ypk1Ib(^lDRe_?Tz15-GaCMrY+XY-x>~1DG1#DB8Y8Ie8s);~F3y#{J`LjoK;`MGpq zdPYnH5l6pa7!It2<}d=Kuov3z#o6IzDbyX0rUzf+T}>gBwD$I3LVpYry9;v!@tbfQ z!7$EtB#fWV!{nh@ad~gUjqRSBerw<)>!6{Lm};ZO!s$r6GhiN}J;(STVkZzNRy#tl z@35rYl%6|X4QuN<&Hm5yviS>nP}wux{$V#Dq62u7Mkys;; z581_ zAb}0sxZ@$oc7PBCi#a6?HZXi^YeO`oIpt{liH3p*h-*%~ujHMe>q;2B@kO8e6V!!x zBl~;e0LoeNm)o>GUCt4!24G>cb$Fzm*z;fx>Lt~Hho+cc^&4?>@sYE zv^AEx;IrwG0zv_3BJN5PjnEL2_pBwjF!;#U4S#rWO0y{hE8)KzrgZ7&8A?*ERJGZ$>dxNqwr`#5UA!8rel zTNOrFK|Py3u6R#+Mv+1e8<~8b``_t8%>B<`+>~Ns74i{g@iUBJ=P>P`s=2lOr5J$7 zu?`mdpcmk|EW>dZhU@cy%e5S>MQTYC8B!i$?G-~V?Ah0X8?I=qQP#aaJu;v55E8B1 zQv>;xd<-sak!8@}r@$pXYh*|IRXQ*3Ru__Oh6@R|goeZXa=ab?h)y}90wU8A zGxV+faF@7cSXQ8_#e)%W=eQ8#hGRWFG5r#-FbqaEXf+BLEomL$4IwSvN80m|Uduo~ zf-Gw2(f-oS2t`P6k~%gL69o3+`BK9mMLZ?9!JzBF>bO}>6pO?b7V&CD*GZ@)LNyWj z)mI58X}l;yyLD=ZLu-wD=4&CaE}Re$!k7chpZ1g+T!8^p783f|QNZZULPR5P5wdcu zYTBmn=2jH{J`y3wwm7$S#h2@fhDh8BBx2v zVd;y(jIUEoetcz`#nETcdUwJGTg01Eb?Aijn+MS|R3Hh~he-SMl|^g%I<@qk^c!d7 z7UYpY@&vdDeel)R<6^IU$AAB!?>!zk7l?ZWT$*z<*yoy(bkI=!=@-&-R(h%pG4Oq0 z2?d|JNrpTZ10)01SH~V7L68xo3%XXQMtH3WF4Y%&x=!Rq?&c(>{MLD~>;hjo%qi#BTWF37 zW%{U$in*4D7C5ZENVjANHM%j)3*Y`_&Y&~BnLf3h*MlSbXCvcDw1{3K@v zKZq?j`Vh1R(Xa3SkVOGR-=e4;kEVxD@HW+l*4L?42)sLwU6AKU;uT;X?VBIOg&^}+ z_*RQq(2o80Wn#vkI;qd%j?teDs>>fv&w5+rM^O}h1mkbRMgHYY>0__;ZB=RJy3##g znA7R$qxCiyhKaSKiEhR8gQru!x`zs)DDq#~=0QHfMG{uaRC$sY!uouLD$^&g@}U6_ zkT!~^|Bzb9iJRiWkvy(pzSg! z76RIghza5mW*vl|=f`+(W#s$@OIa_BmE2!zJEY@%E%lY`EtB{6d-8RBJUyqkT63Z& zcB%FOme@@*+x2DIcdOjV(M3x2$Mir#%pyn%@b>#dtw^TlEf2&@F-={k+xwLbqv$PE zUrVNs8HURy!xQSSmLUX6Xv3cmlK6-PN3lCWoCJhJ#MG`;Os(9tp|$uJ3Wr_@?f4Zd z^{Cvng#dIg>BcmFemIKc0)`g@41J{aPqqK2>EUiE;R%On^*`aDq#KBI!uvR`6n9L0 zE5GASPiIo&94AgD9}vJ~XvYVCol!@=&x@HXWj{@ij39pUeyUqz(XGRlRFLIJ7?ak& zy1bAJezha>^ek2UKj~zg2q|KDyW`Ej&d#z!`^P9(cWnN3p@ZBaGEFWOfknc6Y{ew_ ze1XtBfi-l7U$;Mvn~X(^aF$LJ9wzNAWu)|=u%f5G$eV`wYxp#YV^MDb-o3NFzvaXxwXC=7lW>KJqTOhnI_(etl4w z>v^WqU=QHIGvEleKdlknbJnw)^h}tmNx%pKhqzVKMECbJu9t+o3{KC8U>__R>xS^y z#c8diBYV^3=51`7gn>>}0@u>LMdqz1Xu300M(+_#hTLtXsjk;bNY`#L9eA4B*k>4r zB3^c+?~ojPkq{>o$$KF2k<^p7V}h+|6-@jL&cOLVRJ2M(YnV9Z*kjxkhu#EznF$@TkuZ93 zD2)CoWYQP3M_N$K-Q@|FB=2PXiKxDiRJH>wv3K0euv(gpbq3-kVM8lt(D$w3^-ZZF zT+-ZW&6T*L63O#I_OU3=+`~$lL^t%t@G&PQEMAh%KGb$6w`a@$xiQ@f8A>n$LlQbO z4V0e#(l7vnVB=z9aO?#Mql;1&LBPzY4_hlM_czPdT4RUy*ag?(G}|PI9T*%}gd=t9 z#p(WYM0INzA8kkrKjmuDqBxjx1j8kHTAG+B*pzcGh;fRsg%Q=YQSl#0Z=W$%Qh*oQ za%uX6KSFS5li-6@cSXu=#YXYPN7ij!#DzeCuFo{h@D`1?40hVTbh9!F9&*k!@UI|_ zB?)ZO5V? z%y^-*k_Seb#xc!w71x~iNaNHQY z_)FEs?tYW75R`ah#A9x09*wT9bs4U@Jf2-kEe-M0^<9^$J0P$gOB|5>Su`L*^8}ERb!a;jpK8@(20R&#lD5Avw3wiOMwAij*eCf_2h$gZuUkMII&b{~Zpm z)WOh(rJsVh1?yk7$N70bykopAjmf^hrUe<}dXQlwX<=g&EJhp#@9Y%-m@xM+L&75zPZL^j3cBGMjr>fB$T?;Yb>zS`2Iu-{FMZwyP`e zIC$S2wP$JiJnmzkXriu-_aiW|;oZjd=E@TcJ0M9%v8t@%4+;SgQ&}tmjR+#Vx$7YM zztjiOUr2ZMAhv&*6D#pRVC%&aoENlJxbj@IH?TVOd+8o=^5tZcMykQv5VKE*hf$;7 zOAn2N*Wn{=Ga-eIU~7jYvvhEL-LJNwE%@Od6ZT2WbLL~=9K@vD!Lu-nUH!2^$+PI@AsO)3YXn;`hJ6UnMn~ zT_Js-7bmdkTex$HSZ=^XG~~HMDOY>0O3yk=H^95XSIrADu<=7$(K#15cb5d~P$ynP zLJ-j&sB^DQ|D=OJFlyd4n5o0=g!Lu~=Up*@go7}%37M>nBbE-Hg*UK;z%FZzD!?M; z_*QH?`GCt5wXClnefO#(*GLv?LY&2}C38COFXxV(AV{e9jxG9*h)#YolP`bpmR0Mv zrcb!~zpod^%*Nx(kBkQp#j4pA;mbK7_;H4{c3rZ*56#vIbQXS+5J(is_RI^2l)T7q zBt&pYQqJoCvMhu>?h8QwB;y z4hAwuPrP7}f17iGK-$x%eyeD&TK8(}Q!(8ms0`%cnihmR2(44CyG=}k`UoO zpqnGWs;QTs(gva4&$I$es@;8w5ewpvR_qWu_P0Pl(!jsi!Lr0FY{f4W=WDSO;*{{L zB5$@$HBVtHO0I5TRq@8ANCecjR76Y8&tM-y7emMUFDD5f_=<31OzVSFOZ}x#V{i3L z_zhVMvE%V#m9r&WMo6(p*%@N<;dJ3G8g8Q!bWq^yheH(H6I%7B4H%53m?waPLS3ph zKA*mr-3P1RPJ29oQ5oh5m;EArfrR$GWJYoOAQ!Xm;oqo=d+Z;DYnOCSy!^ev`0#_V z#s`6OqT9Q;691=~>i7%k&+;YhU%H`)@oN=g8*zxNa~%OWk-r$mL|ygXbT2s!@VrBs zStf8g)Uy?lv!*3;L*bQb|9W{Og!ZrNhQsT0r}INd2Y_qRK~@6q697h0L}k3~upD)> zuEKdxT11>hCY;$QTfBU{;aQ*sYVWz}p$^=Pv>(kBKfDdC03cAzbIv=)PWq$pdCmzI3s`cZb(F!u z7G63WOod|-frZ6%2MeKMze*Qo&9EZqbFdN`K2=Z49DfT|-~)aBr9ZrCMn;fG$`gg- zZrjUoCylq^J?bLyalb^+`kAm|@E+S{j=dRn;3q_d9|iLfR1vWOL}-O*p~4!q!)EJ< zDIqx+x#SV6wlxWIZrr>_Xm9#-ht{A}cZh-Or=bR-XD3W8DHz*vzfq(kmgH(HW7q8p zG8Wo-Xj>60g#cVd$EPzp!hE^HjLAdRJ&7s(SUSqarmb(n)(pvu#{Wu(hYvk*;9902 znzP_sB9$kDB*YRug_Cqq=m@cjo#raLgP_kFzLQSywr_V}h={A5&cKCWNef?s&TS9!q|bX z^yJTWCXXsy9LU=^a>0)1!dGrYgRWAI(UWJ!y$2Hg@L3QJozRZJRLff9cV@80n1sV$ z2N0|A5$uVV&acuJpCB=5cx*Va=#b}YM%&>qb&QUAojoV2m5<>gF!nprp@gdfgMiv>@;t0oNBR6gf8gN z9{OV!Zz8sb{(dx}39HZp=(kY&mu@^J$re}zaMb3(aTZoP{xO|HEg^{s2vSfhVs+p0 zw5+P_|A<;5ysoBgjs{1(MabDrfaPn(c6R zKqZSdUL}f}u~K0&-XWv~d0JXQXJiNr=B()~L)ND$ky6h{ysmca_hq* zKQU;)oejmQ7BcAwv$_f8+zN<@k&rb=48Yq%-ZHul&6fWQUhww6<@#S~8)#NR>&_!1 zP;TyiPq7;9?jIo|GyP7G#Gy>scVdsXGBHX1V$YoA&>`FqDT8YVNGYNe5l9?usk?`> zT9i3-JWw>_{M;C_u(*pPnvLNNJy7e2JAx#^z7In2T6A#iLh+1ijhSZ`$t!b)k)iW zjt4JskZuTT=%Oy(Z#1&JMFd3<3{unnrJEsuA&MK9O@$b^I>Q7hQMBJn2UTSAXf`KgF|ri zPbAZnxU2=8QrxaQrjp{Wo3p;B^zVS1c-PG-_^CcnLw&Y$dq4Ap?_ z8GosXkTf$ULoly7AcJUl9cRI`wwTjxS5J#vWFa9;0UW@4a5ma_88M)7M?0U}Zq=Mr z|ExHX8#eUz532K0{e^g`q1L7PPmzB=D*s~m(X{^_SQ#5szmrB3rhEENnajuxWL?+` zW1CTI!2Va6kRAs!C-w2Z{t;<=J#FRRPuhR!XjuKMr#~l!N2HL^X7`$Z8GTS)(koNZ z^V0MCNUzKjr?fPcU)7ZemGl=i^?UvAxLWc?x?R#owg{cp=-^@aU)+qVh^&mp!$>LW)SKRse5x=3J! z04-|OK>zgv6Ry-%2#BNdeDMlvN?PVMfvBVn2F@^!kUXrhi|Ts6)8y1!Bwbmu>-wo1 zioZmF@YY%aa;>?)=Yn+C5EM>WLLV7cyDmtN429Lqt62$o=m5HIFl=z$}p$qbKYZt2{E66Y`S_2PB)v_sgHIYrV z8^i6OPNWd~bEH}B^^{U<%`q4|>e6-(=e9Z)5mv}}GUu6R=m!T|0&gE0Ze&&7VsoqD z#Uc13ke0^gxcbO<(u-dk28bj#^Mj|wPfL8|Wh3f_VG2WrzYimL%2vDwnaI!Bx}K#2 zP|P4<${?j`o2Q|-=UFzYp80$%e&?k0(c4v0+s@+UJ@({ zuZUfwCQs^E)~#_aa=N`|$Lk?bkdSMA?7pyyX6Yw@7h1FG4_&WKs127S1v*K}Yo3eN(-#pVQtJ>z+3(kIL_0^V>N8VounHW{0|CC(uDo#1~REZr8 z?Z#hR^fmD0<4{ygXE~eb-Wud`KtA2P^3P%_76r(>^RU({7S)>-Ez+Oma;VK%Fk zpNb{aC?TldeO2R{e0ozX9M1}1gqx-Yt{-2wx@GkZ2mtqO=9Xj;-jydYfne>qQ+81Mmb0V4m zkwjDRGdqy@sdW$cuTmR6-LXs$*^4*}*ZO&HysqbTmF>YLX>%$wrdE78mgzuH+T3zg z|9iUQXiv7^n%JlIzZe^c)tl>%#Li^0wdSe^2G=Llo}b0CL|z$vA-43~h~|q2%D{K} z&Gn5R+Qx6B@@h?A{KFkMx~s#R`frTa8_n$4@NY6|#gSN6ZF@YoPd)o%nMZT#bNNa_ z|Ixhtq|Q?~ljB{>ROW?PMrBUzoQ!CS-csDQ>+yg>}r`@8Pb6X1{LbLV!J4aQ=P`x9NvXL(0F!>4=yfS+3?(=j(Hq_M$e zRvox3$VR*)Q7#rMYV*H$d{n(98OMyBOJ#I@?*ci=$47JeSf^*%`-}ujBx5p2MSbQM z1GlRUUGa?mD|TM@EVZXMUWf)xR1bRpE)!wK%D%W_aCi}JpuGBZcl=uOXXeC?Rgr;M z`d-Uy7@4T#gBH=H5a!vPji7XaL z-X7Gv5BDxTKZ5JP!UAs$LSLgc?C3bAQ{%X%iX8(xx+Kc40CvyW@z>?O6Na(ns0kY! z0%7yOIXni#Dqw}L0wN^J9-OFkPme5APuz@b;`$5YC#v79 zj=x}6XF~n!74a?L+C2|eXF^S{i7!6-$0CAx+}A4j0yGGCO_XnJL$rnV1U`9U42F(b zM-ft!a|bpxZ(SQNL~*9^j*u+|_qpN&@#8fkoNARdm(CqHC6v7zJG>L-1kD2{B;L`T zEs{2;jNHp{#)dI|Ja-?t4SeOz$|wcK`M~@LWQWeE91TXDr`8S(AL9%yFS5Ug zf6R_t;-nPc$dhr~35jE~Vs6+ns}!Z5IV`=nFppsuq?|QnY?gi)2{~W$Pk%32Y;fKAVPsX+nb|loic;VIVNX$b?Mrwrbcr~HC zB-RoP8H|{0Npd&TNVA5-Yx5W5o0?Dm&v-r-0aq+hPa0));MfkslXaPbdUN`V@l#@5 z;^{%y2BF=nq8g1%X!{11nt^c2e(uB$L#@qV#J-)pdf@GOi6DlzoMXg0kGPpeaGw#y zDAtcW_lQeNxh&YdS!^-9#m((wofSy6zxeQ+!urI34sX-$MUDPV&ty~pq9*<2z>-dl zN#1Lxc9hiQf5z8z3o_B#K+87uuOEcSU|iaEvXi@}x$)unzh*LiSk$WiS@#Y2N}Gqi z)>BOc;BGWyiLUjDj1NGz&F0}Kgd_qLaU|8ct038;hUvB?Rawcc7D&-nBP+?VUnLv2 zlcWGsnr7^U-k)Vu@rjO{f9@q-17Atqm-7KCA04pw&W23@}3EUBFoK9+;k?@An4RVE5A@r>RsjY>nz#quji%*cH{F$yn_40`w zTg=(x$)o=A=L7G{V;=3D0~I2Ji)xn9YmINJj8aaYMs@JnWI?6R>n=yN_EB|_4x-&Mz`wduh` z8nL$te?bNd=V1kR;n@7C-FN4{I^Zgh1#M2nN5&JquF~dR|B)Os5362DZD)<9)siz( zXGRAjdjc32qov~(_&xBwd~asjBDgwkBo2MpNw;VJ+yl9c+rrv7fH*;m>yq{)AH-8RpYyMN+or7xsCkE%KdB5uVcLxZfpNO`qS4^uM98Ug- z*}$(D)$@v@7A=TbU%f8A`*lQb0@!M`rcS(D1s-rGZP+l z%*2Z2T7_!k!px2o?^-=R2lv{{a*;C}Q$XcFpu-XdXN1?6Hyvt%hN!5q-@qh}7qF*F zZFwYnUsy%+P;3Y@rjSpX`q7t1&?8wN+`XyThq6(K9~>}wO9T5-;54hkYxb6o+Z?dT z_9*Jw96mKZu+-?E<@e=-<>SrLMSYl_h1A%W9#FAqJy7AFzb9ohywNQy8`%RI5h1s4 zcYy|J_;&tOwLjK#9#%I9wB2|{o*$7piA5~&vevA~O!lfU75E1m6*os!Mb;R~^yw;ra#>|JKxNS??>a79S@7%VX zrl@)Hn=_}xy0yJ0S*u%DZ6yNYZ3jhT2=QK$)KgINKHY(#rJw`7Q>nRX|FxNv zdZv`_6C0O>8SYgKsH+J5jew{*bxGz=x-+1oMcPGdr1mZxx-aW5ooKH6E#mNgZ{y~H zD>K(5GPpN7mxJ_xQhsjtk_dK@0TlUxr_A z!$&*J0iQLD*vJnIPi|3G28)}!FY89+?}MEe{r1Tb9`0T+>1Fi8y-T8a(OEdvyjwGq zUB-@*P%uC5+Md*=tLhK8W-iX*S4yfJ%tx$O88%z1{s0%7^)3l~gD5cX%lM0p`Z5GK zqrEHzpc50mH$XY>7; zkF%@16F`8n>zn-xqgxBSMcr$G@yT<)>{_HZxShwk-*>!=eSu`CjR!s&II-ixDADjh zYh%J>dp73vU(HNsi45mn2zh{=*BymS*f|*+Uv8}f+ta-v*FBh-&iKZMTHT$Wt)&vt ztp%~~WG&2%(X9_DMa}2_dhj(dLv3&<(XxR-UZ7s#05%8B!+Ep~0YZdD2^y7s883ON zSWR(&5UqPm2$7Gh;+(pD&7iSKI(jpP34AvtaUDVPc@s$bb7pHKk0-qEIKO1(R#!h^A5RE#Y*};5yu?^ct=W@ICJ`k-p|vRCZSTmxR`ooQ z8IFL-0Vo*^obR5S$g53HWES8)Xv^RWk5Amz8lSa1{e;AZLYXKT3&#ly-x49nV(Ryj zK6gcTm70Dedw*VzqoY?Xvl3@? zO57rp(H~!)D5_n{)4eKP8eG@`u6r=)n(6j( z_Kq$c6AIl=_TizERPnFUNww&Ib=NwIax5y@KbWa*KQsHVo-;oR&D9@HEHKFB&!Og? zbF**NbM3q>aef43%3xLau&MVZPLLOhLG0tVC3c$W!f$Q(RBoj@xFA0dtkx^dXLcn1 z(_;0??2zhTm;I8#@s-T?pT5?8Y9djVeG$7dd!wG~^>-)EkLqB&ba&#l?P;#MCc9Hk z$K&@TZt38~)Vy*};`e558*j2`-*tOpBM53U6{>iL4Nc=Tr)>_J&|NINPFPHu@I{f|U zmx<*N7B%`=gSoqZm3XUOy}6$=_-g+2X=fG`4K){kA-gVt(KZ*^-PyH~;fkb?lkZJT z$yB!dHnCHao$`cQ@pQJLR{ne9EqYEjJP&#v`gcob_{*Y4%A0@pqM(PoYGW@Y>XDJg zvKrl*TPD+b_9eS`!XK=ZdF_8Wu|(!|M=YsNX!Fp6Su-O_hMMz|NzNt{+WPHmJ)-@- zvnRQ{Q`2cCc2n{;+3ZjDByZ8^*_cTVshfL~=J@efq4|ct%Nlag89r zdOD?1Go9~_Cf}*2v*dWYO8rmTRZ$ZDE^5c5l7Wd`M zLI01HNi&`1X>YRocz+?fnXDbkX`=k;OU)i$I-D~TI5=!3p!iW}e&%v#dH8dvdE}U! zS)Oy=5#f;{kD5c67hRb&+h!bPE8FHIwPH^;sjh!#a+yX?Y&|OR%TLIe+l#;Kl1X{< z(rc5DXEx768=^aAYc?h|qV|sEH0@dPPJ7tDvCyv6jqh@1LD5k2@ruRKR6V-oI$Sr) zb?i-Mx%M}5hU6T%8H6moIcX5WUlt)!-h4VcvJTFO?7iyCA4a+dB_E4=m%Q;jO!ApKz4i(cmZbj~mk&$GS9u7% zrF!RNKgCrs_YQki@K>Svn^ie`bMYtika>ONuISLT@UomC&?swL1Uh|r?o)AM{N1%H zx-Gh7x7niGR+}w)>|fbSV8vgvIX?4Oc60ET-5gTh{F~3qX#wW+m!gAt&w9Hxptuh6 zu=T3k!vgX-cSlGw5Pdsb!J>Q2nRw)$DYc@LBDP9$*muZZX%0rv1mt6;B2G*59Pkj zOvcp@Ka`7#*Hue@V6eLVR)f{Kk0!q;SpEK^$<AdqLLdqdzr+ zW&bI;=IA4K6BmLI^L1R;F)1a@W`j`X^QxFs$Q!&;$2Ev_Sp+gJ=}1UAD3hd6@VG@G zq$3g>QGz9Ie-WS0nrf_#_a<=u?xkTb1QbU=+1(-Nd$BZh?Qx{OYkAj%1Cs#GOzhD4g_2W#c_8mj}}&OMO!6gA(F z9>NjT+phVI{!Zf=bq4-c?eE2W6YbuGolBy_!?@T?`tY#Gtg5bZh4Az3O)pxmwiqE= zi+bjo?B*4j5s4M<0xhUsZd$DQ5HuN1m_xbn4`qTta z1{*gIyqH*zkwygq;C3ffn-Ah`E$){QqJXpMLP3|^6Dsz<2J!_L*_vS+V2Jb4KO|Rq zAyZ#oI22guo8JYrgvN896tQdFIH&KLMA`$Yn%tDCs!w-y&WR3AQWm)3Jk!9bOOIx$ z+y22Oe5Khm|GISGxMM=7wAlY?BCXPY9^Y$^3?bRo4XMt>Sw9MFU;!^`Y+wOjA%O*; z7@2?TIit_LH`I!oQ{!ssH-;7*y}}jc7eU4vWJo3o1VJDXT9V&{B;I7HAed0zP z!G>F9ew^FfTtCSt_~f_jdweLH3xp2TNvwN9#rCWaBCMwX}B{AHLD#F zH7g^YuyeF9C)F;>{v@}f+l-2c=gU9IU6LdC$U-7xfCUpbu;#=QlME}k+Pi9;Knj5h zCy+w0!WC1jf>PVtpN=UOMSutkAofTCvyNV8Q7zFGev;EM^`rtf3AbLW?3%`7B&KJX&y>ZG^YfhOcHe<%u9J z5fa+VMupgeL?Ep+vmx7E8_h&_U<mPy=Z4sy<=5k6FBxwMm_by$WpCx zKKi3uhQ6>vp_vmCB-oY&BXEWgaw2zP>`_6dN@%1i5$vw`P(j5aP<${9Dqr;fH*|t^ zSi){wQfq#BapxEoClcwHU^42+ce1b9`Ak<7VVBGhypB#C#?epD0E5siwJsgKg?IT=*ueiD8 zT?E_-Dd(!P))Bb|8HwCojT?*5s8Ef$*@2e}#`7nsK}W0Ii;e9?oofu-a+`>{FkhEU ze6B38P%UEv!prrfrNV` z#*H6Z?8~qcJtrz~)x0gKlikpw+&tKV7E;{Oq-O+LC*R3Da@RSgzJ8E|Oy3^@s5TxA zDc3|gu!H4j!CXgRhGCa=+YR1jZK#bm4%ubJLS0QgUpQZz45aG>q;i&YqPhKj2~2(i z>!S|d)4eaa&J)FE>C>@t*m2!^!O+#g^_)AG zZ#MjO>h>;8Vo^IDUV`V;!b6>J&iSW}oJ@jdgp@aRbeXVn46apP>8FoM+;6nC~n~zfER#&E$hvV-|xAK z;3jxYipPo^AhBRxE=-zRm_JIVc3E;Q@lU5N$jn!hLw)%m zOcDh(c#tF{Y8XLln79g=z>!&1>s%QX10~Mct%KiC*?XMRLR@=QyuD+-%KU%vd;s5k zCY~iBaoWklQuDIoU`+F zy(a`t2`-4=$?ppmOHg~(#!mnmI;8#jMBcwPGKe_wMeu^tr=?URtmqA$cCX=QwEaP6 zfyBFK)wx4c!9zk&iuJJ&7NAsYuKF=irvl(eMJtAV;J#th?9cL%1;e#)sqK#p6MRn2 zQ%PdR3QZthoBk8^`oPo~wH5{T*KmTbDz>85D2!HdM{n z;><#uZ6LV&;2j;-ATprf0E9#s@?GLDd39KTB>b%f=s5MYYlg1sBiC2!I#J&^KQp2I zNTZt!Vi|6CLwlLap_jXNICCM)h2%WQqo(p)%O&i{T2XSNn+c31C(}U-Oc`9eGZi7L zWI4zMry{X)Bbx)hE%NA(Parp6l^IkYuXUZMwqDfrf}IEc13G$c4mQr~+EO-gFG5a? z4yt=!SVfZnySP~g4_Ub+@r;BV`d<444s6HWJ$ku~Wb7=GO_eY%_-dibBcT=vd+>1~ z9HF>O6G{XvACKCx1%n@m#K(m(AVdtMo_$x>JQ3aGdRk=*72~{H{cL}i4G@6Nlh$I1 zymryxxe+)kk)=ZShz}U!kLq`Cs#U1&-rse;j+H@5M>90MEJIf%gG;Vbl+1jh(jIwyuRp?w`kwd9!`;%1Sy9!sZ%aBwNJD(qk;!*3Yp!H+dvnThAc9Bg=CY_2h ze(a=MYWr;y*G>clZ+MkD8Bt&pIatz!iOv=Vsg62TqDB-ehyo>Cus$vu~5nOTxz$&x|c#Q{Fm&P|CvRTdsnp@nWo&XDpb$4iwOqLF5d2}C?xOY)4DGSY)B;h61Jn?3r%yy z@p&v=yoDs#Xzu<(23RW9y5|%iBhcw_TCvX}ctu&D$gFivH<>TYE^X9YFyUga)}P(| zAxiR7Olbo}IWG`yo!S143a!>ko z>R-PUFGR4}%y0-y4u7Y6amx7%S@NCTuQ!1Z8J1_IgbV${s_x6PNaYvem`^}|ZADor z8#W1L6Nen%q7Bb?Kj{3?T=bQ~X^GZfH~nXK(KwEGO@LKt{oGdzXGgG6?7VUDerjIf zv~K55mHlq_nA)|adrg;xLT$*$2isoceHt1|;F~{su<+ZAGh6lOqlGpgcji(qK>qp1 zg^hq^VOTRK6(J0$Te{^T}O({ElBsd<|^6`EWyVl_*>&8nq+NquOr|-@=vtD}-vv$^_`OuQo#zY5GR+--?N7RZlQkBT| zKe*-uF4jobaWYqKDcsa)kgm3`>@BEWKk84a{qHR_ocX9&Z0JFY(mh{wPqe>tNG6Ju zYi(EOh`O_XuwRGNjc&H6bUCehwmK@NYm11n^UuHCJ>5ZuVYMjF_+R{H{|S*TFXqN- zUb=9)J!0cX;hiJqplj+t*UcI78O!-D8Y01)wk7I}ZYubBxu=5r_MM#eCExA-H+x*f zqDcgvgyhzp&&I|147aPO46b7`Et*YSZqZ(@aUG5HtCtuZKtBG zTrSi$^&~NcO_q2P?RXq34|bOeWE~@v3ieE}BqkOp?G$#exEYDYu9* z;y*+TBL4eLCI~4Wb@z1NHy8x8Vr^o=tF&=>z7#+}MH|LM2Y*HFI#pC*dM^^)RUP_e z4~hf>I;=C+YpZj030&;5UMp3aqZ@mk$%HH)!n7sB_k~rE4uhbEp*7leW-tWUs*d0o zCA1jOOm$gk)yBV0?P#qtY@}n=HJU}x>AJb_=`qWj4{TS6la6*9QemUrhSiLIfJX*{ zcsDl!Ct}@3KsYTO!5#qJSsPq2tZ~4t@-W1!c&y4*0fm^U1Hq#6gB+ zuV|cnAR(*YJRBiNRbyY%Z6U0Rg$)K!db?KD%ir#~Fl6HFqOYX(^?Mhh`O=SL^@P80 z-H!h2(Ik-)%|mwJ8zNGywbK40cYNsIyGe0HeQ?ew1|5Y z8Ux8!9CEJ4y3cx+_cuB1yf#4@oU6xy*5ME&X1)Qg-lnC{wg1Kk=2?T zmnXvk9DNXboiG4hwk^?ZAFSNug0}28f33Q#7lRTF+XR9b?2sly*h3mh8u1{+6V1|M zc&yM*BPpu&5aN+V<_XS+=Q`|u^crUb>pA(Vt4o1)M+6ws6)RV z4&DsAPmI??w&X?jp_l8@>(7HX`u6_82-!=t zU@nfiu2x>wi|MnO1m>J*=P?WP%|UH^BBFfJW_MvUyya_!rM&$)D7$Zo<<-`M2ne)c zl|=}KLcGdX=Sk#4x>a{Zp~n3$^!{A?br0g-?By+x7|CPY&pu|~&_5AIG8(1k_NzOE z>GCl3>d>3|m%U20YYjavL4oVl@j8lD@r4^N;ay4q>Is55G{~x16;C|1ge>=@{6w3$Hkw z+Qw5wrZu5nzBMzhldBAp-nO<7gEDN(NXvvP9M`MJ+OO=+R&cb%`b;NsmGW`5ac^N? z#$RgqvRpaPyt((eUd+)vXT>{mw!HQ+LbPhi=SZ4nL5l-mt#hsg*r#&<@97SGmj8bJEV!4Sut1(MZ_jG2uIxvYg zqDS@e+7AB2sue}V;wUaIJES&THSu)Sp3Y3C#7pEhHB!f&>pD6+BpWmP;Lj`#`zA z)$sri*2uMfHEeDGTJCj8nG(glZkAi$>qf|IR@+|fW_yuv&Ss${2bU)eZM~WOaMv@L zkhP)%?aCGc?w*%~s}HF-oF#2aE(opKwk8_x!2+wf2iM+?84kiMF4wOJQ`yV7$GU~7 z^}0!*5;F6hS9a|SDQ>PxOCGJ@!q%I+-;|OEOb}KRt0uaGY}ph|Hq>WtiDiUM`E$Ll zarl$;=)ei$4*Zr}c>?n)mpgE&&7W?B~ zfF+NlQ^LsJwVrWGg!8vh>R>Xfv}sLNplrDTml{=T4jcxc2{RL1RxY^pn7Ct$;{|== zuGn>9q)E~_MN66p&(I=Gs(NuIqlF2weI*Rp8^R{k&{mKkk5+!6x&QF0ES!hyZJ6Bi+5i7{f?d*`h-`|> zmINYjLIGu(9B^|(Wd_ zwx%PhJ3Ad&)2UeRcnBsHn!8X8qqyTmSf~;1V* zf<=3_CGArCY-1YUb}$dYyw>T30;m1vgV<xqgykC5-wuFiybAO9ITFV zWn$-8hjuy-nYr8^WxTsd+aoI}qKAEWjkNG&Urh#~D!nMeX^o4h*Yyj0P zb}brAMWJG_!=qJMyK`i++su!@o?1Pky*#Ig({1J<3Un(z)f0I;H`PL7r#4DH#Y#>L zIIHdoZS=A)8z^>6UVm=0QLaR=$DOr+Bl}pdc4fm~+hPMLDDZDfX~?yL z#ew{FEW?4P}I~Tc#;v(DcWr<4D+VA==_j=3q zszx^D>gB3?^NF-1drC(XvN8wXbs+>(`qUwPAy4+|k)rz1Cr19m*?QcCVtb!0`{$xc z)3H|@Gj$wwSPgfAav9AN8c}p#<3#Mki-h3&5-SzwZDNLU)s+tSZfV~9mm`BwXp2b< zD(b!pP7j+KeVXiLd)kG~;^E$fu~c26%oEj>$VYdLlp;9b&IlDX-RLu7=9HZYX2qoi zecD6!3_NsYT%^6u8K12^*$3+=@sPf>)sPj$&N|C%9)}E6h*d5RL;BFXYTMCVutKEH za9zO)SWQui<&f}>dplFR*K|xq!AM$YRk6@#ltf)l$+|-$w|7~LtK#2v%~rd)!o{uj_Vk^flR&mU1d11NNV#z%#?Zz8f%PNKHz4hvb>(r<3c3^_TorZr7uYqL z)u^gP3;J$%pn~gkqRiz&Kv1P*J`^ooQUrQ`d-%3RmUfa@*s=B$+1_<4a3n1|i z{=tI2Pv;v%FZXO1mQP1mBtb!^`tn%cG12WBn6gr#bsF%M^2`Xq@RPqDxi|!2sQZo2 zh#&XkEuWEKjrJMA(hk2Z&pGF{^WCJFV$6+>Kw;s%xNn&~4dZI>izCiy5U1orJ@L8f z>feoARS-tZhi$1p&=raKfZ4{V%;jiyxBeCc&vRUoaS$ht$YCB4AML?yK=G z=CYi$2TJ~w{by-5oAH*yO{}#aAvLw>Mx3|5GRZeD-HXh}Kgp%_Edfu{iJgc|H7t8DIlZ^W#6C{o3gX zPff92!ZooTD635rJ!Pd@4PU*gudIP%W7%JZN~01egR3xQ)6SG?gft>>if5WN;sN4D z?tdJ&x4dGn6gr+p z<7b|ER--a?)>&swRnM9_vr$=AT;3=a&pe~JWZvojb(7USOP2J!>)q?#`R*Iv`Hm~G SWX8^^Uhg^a#N{i_`u_n@O}^a# diff --git a/README.md b/README.md index d6f29b6..9798ca5 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,6 @@ Tecnologías y herramientas utilizadas en el backend de este proyecto: #### 🪵 Logging y Utilidades - **morgan** 🪵 – Middleware para registrar peticiones HTTP. -- **commander** ⚙️ – Gestión de comandos CLI (si aplica). #### 📦 Formateo, Linting y Calidad de Código - **prettier** ✨ – Formateador de código automático. @@ -48,7 +47,6 @@ Tecnologías y herramientas utilizadas en el backend de este proyecto: - **concurrently** 🧵 – Ejecuta múltiples comandos en paralelo. - **dotenv** 🧬 – Carga variables de entorno desde archivos `.env`. - **husky** 🐶 – Automatiza scripts en Git como pre-commit o pre-push. -- **@formkit/tempo** 🕒 – Formatea fechas en un formato legible y localizado. #### 📚 Documentación - **swagger-jsdoc** 📝 – Generador de especificaciones OpenAPI desde JSDoc. diff --git "a/assets/Administracion de jardin de ni\303\261os.svg" "b/assets/Administracion de jardin de ni\303\261os.svg" index c7b671f..bd32de5 100644 --- "a/assets/Administracion de jardin de ni\303\261os.svg" +++ "b/assets/Administracion de jardin de ni\303\261os.svg" @@ -1,4 +1,4 @@ -1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*0..1*1*actionsactions_idchar(36)namevarchar(50)createddatetimeupdateddatetimeasset_conditionscondition_idchar(36)namevarchar(100)descriptionvarchar(255)cat_assetsassets_idchar(36)condition_idchar(36)location_idchar(36)namevarchar(100)descriptionvarchar(255)purchase_datedatecostdecimal(10,2)last_maintenance_datedatewarranty_end_datedatecreateddatetimeupdateddatetimestatus_idchar(36)cat_classroomslocation_idchar(36)namevarchar(100)room_typevarchar(50)capacityintcat_educational_levellevel_education_idchar(36)namevarchar(50)short_namevarchar(20)cat_gendergender_idchar(36)namevarchar(30)cat_inventoryinventory_idchar(36)condition_idchar(36)location_idchar(36)item_codevarchar(50)serial_numbervarchar(100)namevarchar(100)descriptionvarchar(255)quantityintweightdecimal(10,2)widthdecimal(10,2)heightdecimal(10,2)purchase_datedatecreateddatetimeupdateddatetimestatus_idchar(36)cat_statusstatus_idchar(36)namevarchar(30)descriptionvarchar(100)cat_suppliersupplier_idchar(36)namevarchar(100)emailvarchar(100)phonevarchar(15)addressvarchar(255)cat_suppliessupplies_idchar(36)supplier_idchar(36)unit_idchar(36)namevarchar(100)descriptionvarchar(255)quantityintpurchase_datedateexpiry_datedatecostdecimal(10,2)createddatetimeupdateddatetimestatus_idchar(36)cat_work_shiftsshifts_works_idchar(36)namevarchar(50)diagnosticdiagnostic_idchar(36)student_idchar(36)teacher_idchar(36)grade_group_idchar(36)level_education_idchar(36)gender_idchar(36)family_incomedecimal(12,2)number_of_family_membersintnumber_of_siblingsintparents_marital_statusvarchar(50)housing_typevarchar(100)housing_conditionvarchar(100)number_of_roomsintfather_education_levelvarchar(100)mother_education_levelvarchar(100)father_employment_statusvarchar(100)mother_employment_statusvarchar(100)father_occupationvarchar(150)mother_occupationvarchar(150)has_running_watertinyint(1)has_electricitytinyint(1)has_internet_accesstinyint(1)internet_typevarchar(100)has_study_spacetinyint(1)study_space_descriptionvarchar(255)health_issuestexthas_health_insurancetinyint(1)type_of_health_insurancevarchar(100)transport_to_schoolvarchar(100)transport_time_minutesintdevices_availablevarchar(255)extracurricular_activitiesvarchar(255)family_support_for_studiesvarchar(255)additional_notestextcreateddatetimeupdateddatetimegrade_groupsgrade_group_idchar(36)grade_namevarchar(50)group_namevarchar(10)labelvarchar(20)modulesmodule_idchar(36)namevarchar(100)createddatetimeupdateddatetimeparentsparents_idchar(36)gender_idchar(36)level_studies_idchar(36)grade_group_idchar(36)work_shift_idchar(36)first_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdateocupationvarchar(60)curpvarchar(18)emailvarchar(100)phonevarchar(15)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)createddatetimeupdateddatetimestatus_idchar(36)permissionspermissions_idchar(36)module_idchar(36)action_idchar(36)createddatetimeupdateddatetimerolerole_idchar(36)namevarchar(20)descriptionvarchar(200)student_parentsstudent_parent_idchar(36)student_idchar(36)parents_idchar(36)relationshipvarchar(30)is_primarytinyint(1)createddatetimeupdateddatetimestudent_teacher_historyhistory_idchar(36)student_idchar(36)teacher_idchar(36)grade_group_idchar(36)start_datedateend_datedatecreateddatetimeupdateddatetimestudentsstudent_idchar(36)teacher_idchar(36)gender_idchar(36)grade_group_idchar(36)work_shift_idchar(36)first_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdatecurpvarchar(18)allergiesvarchar(255)medical_conditionsvarchar(255)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)enrollment_datedatecreateddatetimeupdateddatetimestatus_idchar(36)supply_unitsunit_idchar(36)namevarchar(100)symbolvarchar(20)teachersteacher_idchar(36)user_idchar(36)location_idchar(36)gender_idchar(36)level_studies_idchar(36)grade_group_idchar(36)work_shift_idchar(36)first_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdatename_schoolvarchar(150)students_in_chargeintcctvarchar(45)school_zonevarchar(15)curpvarchar(18)emailvarchar(100)phonevarchar(15)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)createddatetimeupdateddatetimestatus_idchar(36)user_permissionsuser_permissions_idchar(36)user_idchar(36)permissions_idchar(36)createddatetimeupdateddatetimeusersuser_idchar(36)role_idvarchar(50)name_uservarchar(100)emailvarchar(100)passwordvarchar(100)profile_picturevarchar(500)account_typevarchar(20)last_logindatetimecreateddatetimeupdateddatetimestatus_idchar(36) \ No newline at end of file diff --git a/database.sql b/database.sql index acc6500..6e54c13 100644 --- a/database.sql +++ b/database.sql @@ -1,4 +1,4 @@ --- MySQL dump 10.13 Distrib 8.0.38, for Win64 (x86_64) +-- MySQL dump 10.13 Distrib 8.0.39, for Win64 (x86_64) -- -- Host: 127.0.0.1 Database: akt_backend_mirror -- ------------------------------------------------------ @@ -7,7 +7,7 @@ /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!50503 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; @@ -35,10 +35,8 @@ CREATE TABLE `actions` ( -- Dumping data for table `actions` -- -LOCK TABLES `actions` WRITE; /*!40000 ALTER TABLE `actions` DISABLE KEYS */; /*!40000 ALTER TABLE `actions` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `asset_conditions` @@ -59,10 +57,9 @@ CREATE TABLE `asset_conditions` ( -- Dumping data for table `asset_conditions` -- -LOCK TABLES `asset_conditions` WRITE; /*!40000 ALTER TABLE `asset_conditions` DISABLE KEYS */; +INSERT INTO `asset_conditions` VALUES ('ca5af1d5-61fb-11f0-a977-d843ae0db894','Nuevo','Activo sin uso previo, en condiciones óptimas de fábrica'),('ca5b271a-61fb-11f0-a977-d843ae0db894','Usado','Activo con uso previo, pero en buen estado funcional'),('ca5b2dc5-61fb-11f0-a977-d843ae0db894','Reacondicionado','Activo restaurado o reparado para volver a usarse'),('ca5b3001-61fb-11f0-a977-d843ae0db894','Dañado','Activo con fallas que afectan parcial o totalmente su funcionamiento'),('ca5b31ef-61fb-11f0-a977-d843ae0db894','Obsoleto','Activo funcional pero fuera de uso por antigüedad o falta de soporte'),('ca5b33c2-61fb-11f0-a977-d843ae0db894','Extraviado','Activo perdido y no disponible físicamente'),('ca5b357f-61fb-11f0-a977-d843ae0db894','Robado','Activo no recuperado por hurto'),('ca5b3fa8-61fb-11f0-a977-d843ae0db894','En reparación','Activo fuera de servicio por mantenimiento o reparación'),('ca5b4372-61fb-11f0-a977-d843ae0db894','Descompuesto','Activo que no funciona y está pendiente de revisión'),('ca5b4524-61fb-11f0-a977-d843ae0db894','De baja','Activo oficialmente dado de baja del inventario'); /*!40000 ALTER TABLE `asset_conditions` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `cat_assets` @@ -98,10 +95,8 @@ CREATE TABLE `cat_assets` ( -- Dumping data for table `cat_assets` -- -LOCK TABLES `cat_assets` WRITE; /*!40000 ALTER TABLE `cat_assets` DISABLE KEYS */; /*!40000 ALTER TABLE `cat_assets` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `cat_classrooms` @@ -123,10 +118,9 @@ CREATE TABLE `cat_classrooms` ( -- Dumping data for table `cat_classrooms` -- -LOCK TABLES `cat_classrooms` WRITE; /*!40000 ALTER TABLE `cat_classrooms` DISABLE KEYS */; +INSERT INTO `cat_classrooms` VALUES ('8b89c363-61f6-11f0-a977-d843ae0db894','Aula 1','Aula',31),('8b89f0d3-61f6-11f0-a977-d843ae0db894','Aula 2','Aula',31),('8b89f6ce-61f6-11f0-a977-d843ae0db894','Aula 3','Aula',31),('8b89f878-61f6-11f0-a977-d843ae0db894','Aula 4','Aula',31),('8b89f9f3-61f6-11f0-a977-d843ae0db894','Aula 5','Aula',31),('8b89fb52-61f6-11f0-a977-d843ae0db894','Aula 6','Aula',31),('8b89fcc2-61f6-11f0-a977-d843ae0db894','Aula 7','Aula',31),('8b89fe39-61f6-11f0-a977-d843ae0db894','Dirección','Oficina',7),('8b8a0011-61f6-11f0-a977-d843ae0db894','Comedor','Área común',45),('8b8a016d-61f6-11f0-a977-d843ae0db894','Bodega 1','Almacén',3),('8b8a02c3-61f6-11f0-a977-d843ae0db894','Bodega 2','Almacén',3); /*!40000 ALTER TABLE `cat_classrooms` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `cat_educational_level` @@ -138,7 +132,7 @@ DROP TABLE IF EXISTS `cat_educational_level`; CREATE TABLE `cat_educational_level` ( `level_education_id` char(36) NOT NULL, `name` varchar(50) NOT NULL, - `short_name` varchar(10) DEFAULT NULL, + `short_name` varchar(20) DEFAULT NULL, PRIMARY KEY (`level_education_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -147,10 +141,9 @@ CREATE TABLE `cat_educational_level` ( -- Dumping data for table `cat_educational_level` -- -LOCK TABLES `cat_educational_level` WRITE; /*!40000 ALTER TABLE `cat_educational_level` DISABLE KEYS */; +INSERT INTO `cat_educational_level` VALUES ('db6c40cd-61f6-11f0-a977-d843ae0db894','Primaria trunca','Prim. trunca'),('db6c51d7-61f6-11f0-a977-d843ae0db894','Primaria terminada','Primaria'),('db6c553a-61f6-11f0-a977-d843ae0db894','Secundaria trunca','Sec. trunca'),('db6c5662-61f6-11f0-a977-d843ae0db894','Secundaria terminada','Secundaria'),('db6c5766-61f6-11f0-a977-d843ae0db894','Preparatoria o bachillerato trunco','Prepa trunca'),('db6c587c-61f6-11f0-a977-d843ae0db894','Preparatoria o bachillerato terminado','Preparatoria'),('db6c5973-61f6-11f0-a977-d843ae0db894','Carrera técnica','Técnica'),('db6c5a59-61f6-11f0-a977-d843ae0db894','Carrera técnica con preparatoria','Técnica + Prepa'),('db6c5bb7-61f6-11f0-a977-d843ae0db894','Licenciatura trunca','Lic. trunca'),('db6c5ca7-61f6-11f0-a977-d843ae0db894','Licenciatura terminada','Licenciatura'),('db6c5d8f-61f6-11f0-a977-d843ae0db894','Ingeniería trunca','Ing. trunca'),('db6c5e89-61f6-11f0-a977-d843ae0db894','Ingeniería terminada','Ingeniería'),('db6c5f81-61f6-11f0-a977-d843ae0db894','Especialidad','Especialidad'),('db6c65e2-61f6-11f0-a977-d843ae0db894','Maestría trunca','Mtra. trunca'),('db6c6ba6-61f6-11f0-a977-d843ae0db894','Maestría terminada','Maestría'),('db6c6d12-61f6-11f0-a977-d843ae0db894','Doctorado trunco','Dr. trunco'),('db6c6e1d-61f6-11f0-a977-d843ae0db894','Doctorado terminado','Doctorado'),('db6c6f26-61f6-11f0-a977-d843ae0db894','Sin estudios','Ninguno'); /*!40000 ALTER TABLE `cat_educational_level` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `cat_gender` @@ -170,10 +163,9 @@ CREATE TABLE `cat_gender` ( -- Dumping data for table `cat_gender` -- -LOCK TABLES `cat_gender` WRITE; /*!40000 ALTER TABLE `cat_gender` DISABLE KEYS */; +INSERT INTO `cat_gender` VALUES ('1ec5aff0-61fc-11f0-a977-d843ae0db894','Femenino'),('1ec5cc92-61fc-11f0-a977-d843ae0db894','Masculino'),('1ec5d235-61fc-11f0-a977-d843ae0db894','No binario'),('1ec5d430-61fc-11f0-a977-d843ae0db894','Prefiere no decirlo'),('1ec5d5f3-61fc-11f0-a977-d843ae0db894','Otro'); /*!40000 ALTER TABLE `cat_gender` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `cat_inventory` @@ -212,10 +204,8 @@ CREATE TABLE `cat_inventory` ( -- Dumping data for table `cat_inventory` -- -LOCK TABLES `cat_inventory` WRITE; /*!40000 ALTER TABLE `cat_inventory` DISABLE KEYS */; /*!40000 ALTER TABLE `cat_inventory` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `cat_status` @@ -236,10 +226,9 @@ CREATE TABLE `cat_status` ( -- Dumping data for table `cat_status` -- -LOCK TABLES `cat_status` WRITE; /*!40000 ALTER TABLE `cat_status` DISABLE KEYS */; +INSERT INTO `cat_status` VALUES ('cefd84f3-61f5-11f0-a977-d843ae0db894','Activo','Elemento disponible y en funcionamiento'),('cefdafcc-61f5-11f0-a977-d843ae0db894','Inactivo','Elemento deshabilitado temporalmente, no disponible para operaciones'),('cefdb1eb-61f5-11f0-a977-d843ae0db894','Pendiente','Elemento registrado pero en espera de aprobación o validación'),('cefdb257-61f5-11f0-a977-d843ae0db894','Suspendido','Elemento pausado por razones administrativas o de cumplimiento'),('cefdb296-61f5-11f0-a977-d843ae0db894','Eliminado','Elemento marcado como eliminado de forma lógica, no visible en operaciones comunes'),('cefdb2d4-61f5-11f0-a977-d843ae0db894','Archivado','Elemento guardado para referencia, no activo en operaciones actuales'),('cefdb314-61f5-11f0-a977-d843ae0db894','En revisión','Elemento en proceso de análisis o evaluación'),('cefdb376-61f5-11f0-a977-d843ae0db894','Aprobado','Elemento validado y aprobado para su uso'),('cefdb3fa-61f5-11f0-a977-d843ae0db894','Rechazado','Elemento revisado y no aprobado, requiere modificación o eliminación'),('cefdb461-61f5-11f0-a977-d843ae0db894','Bloqueado','Elemento restringido por razones de seguridad o políticas internas'),('cefdb4f2-61f5-11f0-a977-d843ae0db894','Caducado','Elemento ha superado su tiempo de validez o vigencia'),('cefdb547-61f5-11f0-a977-d843ae0db894','Completo','Elemento con todos sus procesos o tareas finalizados correctamente'),('cfcb73fd-61f5-11f0-a977-d843ae0db894','Activo','Elemento disponible y en funcionamiento'),('cfcb813a-61f5-11f0-a977-d843ae0db894','Inactivo','Elemento deshabilitado temporalmente, no disponible para operaciones'),('cfcb833b-61f5-11f0-a977-d843ae0db894','Pendiente','Elemento registrado pero en espera de aprobación o validación'),('cfcb84c8-61f5-11f0-a977-d843ae0db894','Suspendido','Elemento pausado por razones administrativas o de cumplimiento'),('cfcb863f-61f5-11f0-a977-d843ae0db894','Eliminado','Elemento marcado como eliminado de forma lógica, no visible en operaciones comunes'),('cfcb87c6-61f5-11f0-a977-d843ae0db894','Archivado','Elemento guardado para referencia, no activo en operaciones actuales'),('cfcb8915-61f5-11f0-a977-d843ae0db894','En revisión','Elemento en proceso de análisis o evaluación'),('cfcb8a95-61f5-11f0-a977-d843ae0db894','Aprobado','Elemento validado y aprobado para su uso'),('cfcb8be8-61f5-11f0-a977-d843ae0db894','Rechazado','Elemento revisado y no aprobado, requiere modificación o eliminación'),('cfcb8d35-61f5-11f0-a977-d843ae0db894','Bloqueado','Elemento restringido por razones de seguridad o políticas internas'),('cfcb8ec3-61f5-11f0-a977-d843ae0db894','Caducado','Elemento ha superado su tiempo de validez o vigencia'),('cfcb9010-61f5-11f0-a977-d843ae0db894','Completo','Elemento con todos sus procesos o tareas finalizados correctamente'); /*!40000 ALTER TABLE `cat_status` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `cat_supplier` @@ -263,10 +252,8 @@ CREATE TABLE `cat_supplier` ( -- Dumping data for table `cat_supplier` -- -LOCK TABLES `cat_supplier` WRITE; /*!40000 ALTER TABLE `cat_supplier` DISABLE KEYS */; /*!40000 ALTER TABLE `cat_supplier` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `cat_supplies` @@ -302,10 +289,8 @@ CREATE TABLE `cat_supplies` ( -- Dumping data for table `cat_supplies` -- -LOCK TABLES `cat_supplies` WRITE; /*!40000 ALTER TABLE `cat_supplies` DISABLE KEYS */; /*!40000 ALTER TABLE `cat_supplies` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `cat_work_shifts` @@ -325,10 +310,9 @@ CREATE TABLE `cat_work_shifts` ( -- Dumping data for table `cat_work_shifts` -- -LOCK TABLES `cat_work_shifts` WRITE; /*!40000 ALTER TABLE `cat_work_shifts` DISABLE KEYS */; +INSERT INTO `cat_work_shifts` VALUES ('6fdcd8a4-61fc-11f0-a977-d843ae0db894','Matutino'),('6fdce875-61fc-11f0-a977-d843ae0db894','Vespertino'); /*!40000 ALTER TABLE `cat_work_shifts` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `diagnostic` @@ -392,10 +376,8 @@ CREATE TABLE `diagnostic` ( -- Dumping data for table `diagnostic` -- -LOCK TABLES `diagnostic` WRITE; /*!40000 ALTER TABLE `diagnostic` DISABLE KEYS */; /*!40000 ALTER TABLE `diagnostic` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `grade_groups` @@ -406,14 +388,11 @@ DROP TABLE IF EXISTS `grade_groups`; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `grade_groups` ( `grade_group_id` char(36) NOT NULL, - `level_education_id` char(36) NOT NULL, `grade_name` varchar(50) NOT NULL, `group_name` varchar(10) NOT NULL, `label` varchar(20) NOT NULL, PRIMARY KEY (`grade_group_id`), - UNIQUE KEY `label` (`label`), - KEY `level_education_id` (`level_education_id`), - CONSTRAINT `grade_groups_ibfk_1` FOREIGN KEY (`level_education_id`) REFERENCES `cat_educational_level` (`level_education_id`) + UNIQUE KEY `label` (`label`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -421,10 +400,9 @@ CREATE TABLE `grade_groups` ( -- Dumping data for table `grade_groups` -- -LOCK TABLES `grade_groups` WRITE; /*!40000 ALTER TABLE `grade_groups` DISABLE KEYS */; +INSERT INTO `grade_groups` VALUES ('2da64d8e-61fd-11f0-a977-d843ae0db894','Primero','A','Primero A'),('2da66b50-61fd-11f0-a977-d843ae0db894','Segundo','A','Segundo A'),('2da66f9e-61fd-11f0-a977-d843ae0db894','Segundo','B','Segundo B'),('2da67173-61fd-11f0-a977-d843ae0db894','Tercero','A','Tercero A'),('2da672d4-61fd-11f0-a977-d843ae0db894','Tercero','B','Tercero B'),('2da6745b-61fd-11f0-a977-d843ae0db894','Tercero','C','Tercero C'); /*!40000 ALTER TABLE `grade_groups` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `modules` @@ -446,10 +424,8 @@ CREATE TABLE `modules` ( -- Dumping data for table `modules` -- -LOCK TABLES `modules` WRITE; /*!40000 ALTER TABLE `modules` DISABLE KEYS */; /*!40000 ALTER TABLE `modules` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `parents` @@ -499,10 +475,8 @@ CREATE TABLE `parents` ( -- Dumping data for table `parents` -- -LOCK TABLES `parents` WRITE; /*!40000 ALTER TABLE `parents` DISABLE KEYS */; /*!40000 ALTER TABLE `parents` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `permissions` @@ -529,10 +503,8 @@ CREATE TABLE `permissions` ( -- Dumping data for table `permissions` -- -LOCK TABLES `permissions` WRITE; /*!40000 ALTER TABLE `permissions` DISABLE KEYS */; /*!40000 ALTER TABLE `permissions` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `role` @@ -544,7 +516,7 @@ DROP TABLE IF EXISTS `role`; CREATE TABLE `role` ( `role_id` char(36) NOT NULL, `name` varchar(20) NOT NULL, - `description` varchar(100) DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, PRIMARY KEY (`role_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -553,10 +525,9 @@ CREATE TABLE `role` ( -- Dumping data for table `role` -- -LOCK TABLES `role` WRITE; /*!40000 ALTER TABLE `role` DISABLE KEYS */; +INSERT INTO `role` VALUES ('b20fb5fc-6224-11f0-a977-d843ae0db894','Administrador','Encargado de la gestión total del sistema: usuarios, configuraciones, datos institucionales.'),('b20fc386-6224-11f0-a977-d843ae0db894','Director(a)','Responsable de supervisar todo el funcionamiento del kínder, incluyendo personal docente y administrativo.'),('b20fc76c-6224-11f0-a977-d843ae0db894','Docente','Encargado de registrar información académica, asistencia y observaciones de los estudiantes.'),('b20fc8b7-6224-11f0-a977-d843ae0db894','Padre/Madre/Tutor','Accede a la información del estudiante: reportes, mensajes, eventos y seguimiento académico.'),('b20fc9cc-6224-11f0-a977-d843ae0db894','Secretaría','Gestiona inscripciones, documentación, control escolar y apoyo administrativo.'),('b20fcadf-6224-11f0-a977-d843ae0db894','Psicólogo(a)','Accede a los registros necesarios para dar seguimiento psicológico y emocional a los estudiantes.'),('b20fcbdf-6224-11f0-a977-d843ae0db894','Soporte Técnico','Encargado del mantenimiento del sistema y atención a incidencias técnicas.'); /*!40000 ALTER TABLE `role` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `student_parents` @@ -585,10 +556,8 @@ CREATE TABLE `student_parents` ( -- Dumping data for table `student_parents` -- -LOCK TABLES `student_parents` WRITE; /*!40000 ALTER TABLE `student_parents` DISABLE KEYS */; /*!40000 ALTER TABLE `student_parents` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `student_teacher_history` @@ -620,10 +589,8 @@ CREATE TABLE `student_teacher_history` ( -- Dumping data for table `student_teacher_history` -- -LOCK TABLES `student_teacher_history` WRITE; /*!40000 ALTER TABLE `student_teacher_history` DISABLE KEYS */; /*!40000 ALTER TABLE `student_teacher_history` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `students` @@ -671,10 +638,8 @@ CREATE TABLE `students` ( -- Dumping data for table `students` -- -LOCK TABLES `students` WRITE; /*!40000 ALTER TABLE `students` DISABLE KEYS */; /*!40000 ALTER TABLE `students` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `supply_units` @@ -695,10 +660,9 @@ CREATE TABLE `supply_units` ( -- Dumping data for table `supply_units` -- -LOCK TABLES `supply_units` WRITE; /*!40000 ALTER TABLE `supply_units` DISABLE KEYS */; +INSERT INTO `supply_units` VALUES ('ea91373e-6224-11f0-a977-d843ae0db894','Caja','cj'),('ea915cef-6224-11f0-a977-d843ae0db894','Paquete','pqt'),('ea916287-6224-11f0-a977-d843ae0db894','Bolsa','bls'),('ea916487-6224-11f0-a977-d843ae0db894','Pieza','pz'),('ea91665d-6224-11f0-a977-d843ae0db894','Litro','L'),('ea916817-6224-11f0-a977-d843ae0db894','Mililitro','ml'),('ea9169dc-6224-11f0-a977-d843ae0db894','Metro','m'),('ea916b7e-6224-11f0-a977-d843ae0db894','Metro cuadrado','m²'),('ea916d73-6224-11f0-a977-d843ae0db894','Botella','bt'),('ea916f0d-6224-11f0-a977-d843ae0db894','Tubo','tb'),('ea91709f-6224-11f0-a977-d843ae0db894','Unidad','u'),('ea91725e-6224-11f0-a977-d843ae0db894','Galón','gal'),('ea9173fb-6224-11f0-a977-d843ae0db894','Rollo','rl'),('ea9175ee-6224-11f0-a977-d843ae0db894','Sobre','sb'),('ea9180bf-6224-11f0-a977-d843ae0db894','Kit','kt'),('ea918267-6224-11f0-a977-d843ae0db894','Jarro','jr'),('ea9184f6-6224-11f0-a977-d843ae0db894','Cuaderno','cuad'),('ea9186aa-6224-11f0-a977-d843ae0db894','Hoja','hoj'),('ea918841-6224-11f0-a977-d843ae0db894','Resma','res'); /*!40000 ALTER TABLE `supply_units` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `teachers` @@ -757,10 +721,8 @@ CREATE TABLE `teachers` ( -- Dumping data for table `teachers` -- -LOCK TABLES `teachers` WRITE; /*!40000 ALTER TABLE `teachers` DISABLE KEYS */; /*!40000 ALTER TABLE `teachers` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `user_permissions` @@ -787,10 +749,8 @@ CREATE TABLE `user_permissions` ( -- Dumping data for table `user_permissions` -- -LOCK TABLES `user_permissions` WRITE; /*!40000 ALTER TABLE `user_permissions` DISABLE KEYS */; /*!40000 ALTER TABLE `user_permissions` ENABLE KEYS */; -UNLOCK TABLES; -- -- Table structure for table `users` @@ -824,10 +784,12 @@ CREATE TABLE `users` ( -- Dumping data for table `users` -- -LOCK TABLES `users` WRITE; /*!40000 ALTER TABLE `users` DISABLE KEYS */; /*!40000 ALTER TABLE `users` ENABLE KEYS */; -UNLOCK TABLES; + +-- +-- Dumping routines for database 'akt_backend_mirror' +-- /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; @@ -838,4 +800,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-07-15 5:03:35 +-- Dump completed on 2025-07-16 3:15:50 diff --git a/src/controllers/users/functions/users.controllers.js b/src/controllers/users/functions/users.controllers.js index 7a1703e..3346683 100644 --- a/src/controllers/users/functions/users.controllers.js +++ b/src/controllers/users/functions/users.controllers.js @@ -53,6 +53,7 @@ export const UpdateUser = async (userId, userData) => { export const DeleteUser = async (userId) => { const deleteUser = await deleteUserService(userId); + console.log(deleteUser); return deleteUser; }; diff --git a/src/helpers/delete.helpers.js b/src/helpers/delete.helpers.js new file mode 100644 index 0000000..9086054 --- /dev/null +++ b/src/helpers/delete.helpers.js @@ -0,0 +1,11 @@ +import { connectionQuery } from "../helpers/connection.helpers.js"; + +export const validateFoundToEliminated = async ( + paramId, + field_name, + table_name, +) => { + const query = `SELECT ${field_name} FROM ${table_name} WHERE user_id = ?`; + const params = [paramId]; + return await connectionQuery(query, params); +}; diff --git a/src/helpers/findUserByEmail.helpers.js b/src/helpers/findUserByEmail.helpers.js index df6e5bd..4ced095 100644 --- a/src/helpers/findUserByEmail.helpers.js +++ b/src/helpers/findUserByEmail.helpers.js @@ -4,7 +4,12 @@ import { connectionQuery } from "./connection.helpers.js"; // y fallara la insercion regresando un estado Conflict export const findUserByEmail = async (email) => { - const query = `SELECT * FROM users WHERE Email = ?`; + const query = `SELECT + user_id, + role_id, + password + FROM users + WHERE email = ?`; const params = [email]; const result = await connectionQuery(query, params); return result[0]; diff --git a/src/helpers/getUserByEmail.helpers.js b/src/helpers/getUserByEmail.helpers.js index f54106a..52931f5 100644 --- a/src/helpers/getUserByEmail.helpers.js +++ b/src/helpers/getUserByEmail.helpers.js @@ -1,9 +1,19 @@ import { connectionQuery } from "./connection.helpers.js"; -// Esta funcion es para regresar en la peticion de la solicitud cuando es exitosa, -// regresa los campos seleccionados en la consulta +// Esta funcion se ocupa para que al momento de crear o registrar un usuario, este regrese los campos importantes como lo es +// el nombre del usuario, su email, su rol que tiene y su estatus dentro del sistema, sirve tanto para la insercion y el registro + export const getUserByEmail = async (email) => { - const query = `SELECT NameUser, Email, Role, AccountStatus FROM users WHERE Email = ?`; + const query = `SELECT + name_user, + email, + role.name AS rol, + cat_status.name AS status + FROM users + LEFT JOIN role ON role.role_id = users.role_id + LEFT JOIN cat_status ON cat_status.status_id = users.status_id + WHERE email = ?; +`; const result = await connectionQuery(query, [email]); return result[0]; }; diff --git a/src/helpers/getUserByEmailAndId.helpers.js b/src/helpers/getUserByEmailAndId.helpers.js index f7782d8..eb384e8 100644 --- a/src/helpers/getUserByEmailAndId.helpers.js +++ b/src/helpers/getUserByEmailAndId.helpers.js @@ -5,7 +5,7 @@ import { connectionQuery } from "./connection.helpers.js"; // y fallara la insercion regresando un estado Conflict export const findEmailInOtherUser = async (email, id) => { - const query = `SELECT id FROM users WHERE Email = ? AND ID != ?`; + const query = `SELECT user_id FROM users WHERE email = ? AND user_id != ?`; const params = [email, id]; const result = await connectionQuery(query, params); return result[0]; diff --git a/src/helpers/jwt.helpers.js b/src/helpers/jwt.helpers.js index 9589fc2..9423ff9 100644 --- a/src/helpers/jwt.helpers.js +++ b/src/helpers/jwt.helpers.js @@ -4,14 +4,8 @@ import { config } from "../config/config.js"; export const createToken = (user) => { const payload = { - id: user.id, - nameUser: user.nameUser, - email: user.email, - profilePicture: user.profilePicture, - role: user.role, - accountType: user.accountType, - lastLogin: user.lastLogin, - accountStatus: user.accountStatus, + user_id: user.user_id, + role_id: user.role_id, }; return jwt.sign(payload, config.jwt.secret, { expiresIn: `${config.jwt.expiresIn}h`, @@ -32,14 +26,8 @@ export const refreshToken = (token) => { } const payload = { - id: decoded.id, - nameUser: decoded.nameUser, - email: decoded.email, - profilePicture: decoded.profilePicture, - role: decoded.role, - accountType: decoded.accountType, - lastLogin: decoded.lastLogin, - accountStatus: decoded.accountStatus, + user_id: decoded.user_id, + role_id: decoded.role_id, }; return jwt.sign(payload, config.jwt.secret, { expiresIn: `${config.jwt.expiresIn}h`, diff --git a/src/helpers/userLastLogin.helpers.js b/src/helpers/userLastLogin.helpers.js index dadc4d1..0da8e00 100644 --- a/src/helpers/userLastLogin.helpers.js +++ b/src/helpers/userLastLogin.helpers.js @@ -1,6 +1,6 @@ import { connectionQuery } from "./connection.helpers.js"; export const lastLogin = (userId) => { - const updateUserLastLogin = `UPDATE users SET LastLogin = CURRENT_TIMESTAMP WHERE id = ?`; + const updateUserLastLogin = `UPDATE users SET last_login = CURRENT_TIMESTAMP WHERE user_id = ?`; return connectionQuery(updateUserLastLogin, [userId]); }; diff --git a/src/middleware/verificarToken.middleware.js b/src/middleware/verificarToken.middleware.js index da69d38..bdb3f26 100644 --- a/src/middleware/verificarToken.middleware.js +++ b/src/middleware/verificarToken.middleware.js @@ -19,10 +19,10 @@ export const verificarToken = (request, response, next) => { if (!bearerToken) { throw { statusCode: 401, - message: "Acceso no autorizado, token no proporcionado", - code: "TOKEN_NOT_FOUND", + message: "Acceso no autorizado, bearer no proporcionado", + code: "BEARER_NOT_FOUND", details: - "El token no se mando o no esta autorizado para realizar esta peticion", + "El bearer no se mando o no esta autorizado para realizar esta peticion", }; } diff --git a/src/models/users/functions/delete.models.js b/src/models/users/functions/delete.models.js index 9b374de..da368dd 100644 --- a/src/models/users/functions/delete.models.js +++ b/src/models/users/functions/delete.models.js @@ -1,18 +1,12 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; -export const validateFoundUserToEliminated = async (userId) => { - const query = `SELECT NameUser FROM users WHERE ID = ?`; - const params = [userId]; - return await connectionQuery(query, params); -}; - export const deleteUser = async (userId) => { - const query = `DELETE FROM users WHERE ID = ?`; + const query = `DELETE FROM users WHERE user_id = ?`; const params = [userId]; return await connectionQuery(query, params); }; export const deleteUserBulk = async (placeholders, batch) => { - const query = `DELETE FROM users WHERE ID IN (${placeholders})`; + const query = `DELETE FROM users WHERE user_id IN (${placeholders})`; return await connectionQuery(query, batch); }; diff --git a/src/models/users/functions/insert.models.js b/src/models/users/functions/insert.models.js index 627d134..71852c2 100644 --- a/src/models/users/functions/insert.models.js +++ b/src/models/users/functions/insert.models.js @@ -1,16 +1,15 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const insertUser = async ( - nameUser, + name_user, email, hashedPassword, - accountStatus, - role, + status_id, + role_id, ) => { - const query = ` - INSERT INTO users (ID, NameUser, Email, Password, Role, AccountType, AccountStatus, LastLogin) - VALUES (UUID(), ?, ?, ?, ?, "normal", ?, NULL) + const query = ` INSERT INTO users (user_id, role_id, name_user, email, password, account_type, status_id) + VALUES (UUID(),?, ?, ?, ?, 'local', ?) `; - const params = [nameUser, email, hashedPassword, role, accountStatus]; + const params = [role_id, name_user, email, hashedPassword, status_id]; return await connectionQuery(query, params); }; diff --git a/src/models/users/functions/register.models.js b/src/models/users/functions/register.models.js index f96f9a9..b5fa311 100644 --- a/src/models/users/functions/register.models.js +++ b/src/models/users/functions/register.models.js @@ -1,10 +1,10 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; -export const registerUser = async (nameUser, email, hashedPassword) => { - const query = ` - INSERT INTO users (ID, NameUser, Email, Password, Role, AccountType, AccountStatus, LastLogin) - VALUES (UUID(), ?, ?, ?, "user", "normal", "Inactivo", NULL) - `; - const params = [nameUser, email, hashedPassword]; +export const registerUser = async (name_user, email, hashedPassword) => { + const query = ` INSERT INTO users (user_id, role_id, name_user, email, password, account_type, status_id) + VALUES (UUID(), null, ?, ?, ?, 'local', 'cefdafcc-61f5-11f0-a977-d843ae0db894') + `; + + const params = [name_user, email, hashedPassword]; return await connectionQuery(query, params); }; diff --git a/src/models/users/functions/update.models.js b/src/models/users/functions/update.models.js index 7980eca..ddc5c6f 100644 --- a/src/models/users/functions/update.models.js +++ b/src/models/users/functions/update.models.js @@ -1,40 +1,42 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const findUserById = async (userId) => { - const query = `SELECT * FROM users WHERE ID = ?`; + const query = `SELECT * FROM users WHERE user_id = ?`; const result = await connectionQuery(query, [userId]); return result[0]; }; -export const updateUserWithPassword = async ({ - nameUser, +export const extractRoleByName = async (role) => { + const query = `SELECT role_id FROM role WHERE name = ?`; + const result = await connectionQuery(query, [role]); + return result[0]; +}; + +export const extractStatusByName = async (status) => { + const query = `SELECT status_id FROM cat_status WHERE name = ?`; + const result = await connectionQuery(query, [status]); + return result[0]; +}; + +export const updateUser = async ({ + name_user, email, password, role, - accountStatus, + status, userId, }) => { - const query = ` - UPDATE users - SET NameUser = ?, Email = ?, Password = ?, Role = ?, AccountStatus = ? - WHERE ID = ? - `; - const params = [nameUser, email, password, role, accountStatus, userId]; - return await connectionQuery(query, params); -}; + // Construir query dinámicamente basado en si hay contraseña o no + const fields = ["name_user = ?", "email = ?", "role_id = ?", "status_id = ?"]; + const params = [name_user, email, role, status]; -export const updateUserWithoutPassword = async ( - nameUser, - email, - role, - accountStatus, - userId, -) => { - const query = ` - UPDATE users - SET NameUser = ?, Email = ?, Role = ?, AccountStatus = ? - WHERE ID = ? - `; - const params = [nameUser, email, role, accountStatus, userId]; + if (password) { + fields.push("password = ?"); + params.push(password); + } + + params.push(userId); // WHERE user_id = ? + + const query = `UPDATE users SET ${fields.join(", ")} WHERE user_id = ?`; return await connectionQuery(query, params); }; diff --git a/src/routes/users.routes.js b/src/routes/users.routes.js index c6b955b..b733bc5 100644 --- a/src/routes/users.routes.js +++ b/src/routes/users.routes.js @@ -74,12 +74,7 @@ apiUsers.post("/auth/register", async (request, response, next) => { try { const registerUser = request.body; const result = await RegisterUser(registerUser); - methodCreated( - request, - response, - result, - "Se registro correctamente el usuario", - ); + methodCreated(request, response, result, "Se ha registrado exitosamente"); } catch (error) { next(error); } @@ -135,7 +130,7 @@ apiUsers.delete("/:id", verificarToken, async (request, response, next) => { request, response, undefined, - `El usuario ${result.NameUser} fue eliminado correctamente`, + `El usuario ${result.name_user} fue eliminado correctamente`, ); } catch (error) { next(error); diff --git a/src/services/users/functions/auth.services.js b/src/services/users/functions/auth.services.js index cba47fd..51890e9 100644 --- a/src/services/users/functions/auth.services.js +++ b/src/services/users/functions/auth.services.js @@ -6,7 +6,6 @@ import { lastLogin } from "../../../helpers/userLastLogin.helpers.js"; export const loginService = async ({ email, password }) => { const user = await findUserByEmail(email); - if (!user) { throw { statusCode: 404, @@ -25,7 +24,7 @@ export const loginService = async ({ email, password }) => { }; } - const isPasswordValid = await hashedArg.verify(user.Password, password); + const isPasswordValid = await hashedArg.verify(user.password, password); if (!isPasswordValid) { throw { @@ -46,20 +45,13 @@ export const loginService = async ({ email, password }) => { "El usuario no puede iniciar sesión porque su cuenta está inactiva", }; } - // Crea el token const token = createToken({ - id: user.ID, - nameUser: user.NameUser, - email: user.Email, - profilePicture: user.ProfilePicture, - role: user.Role, - accountType: user.AccountType, - lastLogin: user.LastLogin, - accountStatus: user.AccountStatus, + user_id: user.user_id, + role_id: user.role_id, }); - await lastLogin(user.ID); + await lastLogin(user.user_id); return token; }; diff --git a/src/services/users/functions/delete.services.js b/src/services/users/functions/delete.services.js index a8167fe..d1221e0 100644 --- a/src/services/users/functions/delete.services.js +++ b/src/services/users/functions/delete.services.js @@ -1,8 +1,5 @@ -import { - deleteUser, - deleteUserBulk, - validateFoundUserToEliminated, -} from "../../../models/users/index.js"; +import { validateFoundToEliminated } from "../../../helpers/delete.helpers.js"; +import { deleteUser, deleteUserBulk } from "../../../models/users/index.js"; export const deleteUserService = async (userId) => { if (!userId) { @@ -14,7 +11,11 @@ export const deleteUserService = async (userId) => { }; } - const foundUserToEliminated = await validateFoundUserToEliminated(userId); + const foundUserToEliminated = await validateFoundToEliminated( + userId, + "name_user", + "users", + ); if (foundUserToEliminated.length === 0) { throw { statusCode: 404, diff --git a/src/services/users/functions/insert.services.js b/src/services/users/functions/insert.services.js index 6d29217..150c3da 100644 --- a/src/services/users/functions/insert.services.js +++ b/src/services/users/functions/insert.services.js @@ -6,13 +6,13 @@ import { getUserByEmail } from "../../../helpers/getUserByEmail.helpers.js"; import { insertUser } from "../../../models/users/index.js"; export const insertUserService = async ({ - nameUser, + name_user, email, password, - accountStatus, - role, + status_id, + role_id, }) => { - if (!nameUser || !email || !password || !accountStatus || !role) { + if (!name_user || !email || !password || !status_id || !role_id) { throw { statusCode: 400, message: "Debe de proporcionar todos los campos", @@ -33,11 +33,11 @@ export const insertUserService = async ({ const hashedPassword = await hashedArg.hash(password); const insertResult = await insertUser( - nameUser, + name_user, email, hashedPassword, - accountStatus, - role, + status_id, + role_id, ); if (insertResult.affectedRows > 0) { @@ -67,11 +67,11 @@ export const insertUserMasiveService = async (countInsert) => { const insertados = []; for (let i = 0; i < countInsert; i++) { - const nameUser = faker.internet.username(); + const name_user = faker.internet.username(); const email = faker.internet.email(); const password = faker.internet.password(); - const role = "user"; - const accountStatus = "Inactivo"; + const role_id = undefined; + const status_id = "cefdafcc-61f5-11f0-a977-d843ae0db894"; const existingUser = await findUserByEmail(email); if (existingUser) { @@ -85,15 +85,15 @@ export const insertUserMasiveService = async (countInsert) => { const hashedPassword = await hashedArg.hash(password); const insertResult = await insertUser( - nameUser, + name_user, email, hashedPassword, - accountStatus, - role, + status_id, + role_id, ); if (insertResult.affectedRows > 0) { - insertados.push({ nameUser, email, hashedPassword, role, accountStatus }); + insertados.push({ name_user, email, hashedPassword, role_id, status_id }); } } return insertados; diff --git a/src/services/users/functions/list.services.js b/src/services/users/functions/list.services.js index 55e20d2..49eab72 100644 --- a/src/services/users/functions/list.services.js +++ b/src/services/users/functions/list.services.js @@ -5,26 +5,41 @@ export const listUsersService = async ({ status, correo, rol }) => { const values = []; if (status && status !== "All") { - where += " AND AccountStatus = ?"; + where += " AND cat_status.name = ?"; values.push(status); } if (correo && correo !== "All") { - where += " AND AccountType = ?"; + where += " AND account_type = ?"; values.push(correo); } if (rol && rol !== "All") { - where += " AND Role = ?"; + where += " AND role.name = ?"; values.push(rol); } const queryString = ` - SELECT * FROM users + SELECT + user_id, + role.name AS role_name, + name_user, + email, + profile_picture, + account_type, + last_login, + created, + updated, + cat_status.name AS status_name + FROM + users + LEFT JOIN + role ON role.role_id = users.role_id + LEFT JOIN + cat_status ON cat_status.status_id = users.status_id ${where} - ORDER BY NameUser ASC + ORDER BY name_user ASC `; - const resultList = await listUsersModel(queryString, values); if (resultList.length === 0) { diff --git a/src/services/users/functions/register.services.js b/src/services/users/functions/register.services.js index 5e0e220..f316ded 100644 --- a/src/services/users/functions/register.services.js +++ b/src/services/users/functions/register.services.js @@ -5,8 +5,8 @@ import { findUserByEmail } from "../../../helpers/findUserByEmail.helpers.js"; import { getUserByEmail } from "../../../helpers/getUserByEmail.helpers.js"; import { registerUser } from "../../../models/users/functions/register.models.js"; -export const registerUserService = async ({ nameUser, email, password }) => { - if (!nameUser || !email || !password) { +export const registerUserService = async ({ name_user, email, password }) => { + if (!name_user || !email || !password) { throw { statusCode: 400, message: "Debe de proporcionar todos los campos", @@ -27,7 +27,7 @@ export const registerUserService = async ({ nameUser, email, password }) => { } const hashedPassword = await hashedArg.hash(password); - const insertResult = await registerUser(nameUser, email, hashedPassword); + const insertResult = await registerUser(name_user, email, hashedPassword); if (insertResult.affectedRows > 0) { const newUser = await getUserByEmail(email); diff --git a/src/services/users/functions/search.services.js b/src/services/users/functions/search.services.js index 6422ca7..da243d7 100644 --- a/src/services/users/functions/search.services.js +++ b/src/services/users/functions/search.services.js @@ -1,11 +1,29 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const searchUserService = async (email) => { - let querySearchUsers = `SELECT * FROM users WHERE 1=1`; + let querySearchUsers = `SELECT + user_id, + role.name AS role_name, + name_user, + email, + profile_picture, + account_type, + last_login, + created, + updated, + cat_status.name AS status_name +FROM + users + LEFT JOIN + role ON role.role_id = users.role_id + LEFT JOIN + cat_status ON cat_status.status_id = users.status_id +WHERE + 1 = 1`; const queryParamsSearch = []; if (email) { - querySearchUsers += ` AND Email LIKE ?`; + querySearchUsers += ` AND email LIKE ?`; queryParamsSearch.push(`%${email}%`); } else { throw { diff --git a/src/services/users/functions/update.services.js b/src/services/users/functions/update.services.js index 1483015..a7cbbeb 100644 --- a/src/services/users/functions/update.services.js +++ b/src/services/users/functions/update.services.js @@ -2,17 +2,25 @@ import hashedArg from "argon2"; import { findEmailInOtherUser } from "../../../helpers/getUserByEmailAndId.helpers.js"; import { + extractRoleByName, + extractStatusByName, findUserById, - updateUserWithPassword, - updateUserWithoutPassword, + updateUser, } from "../../../models/users/index.js"; export const updateUserService = async ( userId, - { nameUser, email, password, role, accountStatus }, + { name_user, email, password, role, status }, ) => { // Verificar si otro usuario ya usa ese correo - const emailConflict = await findEmailInOtherUser(email, userId); + const [emailConflict, existingUser, extractRole, extractStatus] = + await Promise.all([ + findEmailInOtherUser(email, userId), + findUserById(userId), + extractRoleByName(role), + extractStatusByName(status), + ]); + if (emailConflict) { throw { statusCode: 409, @@ -23,7 +31,6 @@ export const updateUserService = async ( } // Verificar si el usuario existe - const existingUser = await findUserById(userId); if (!existingUser) { throw { statusCode: 404, @@ -33,27 +40,20 @@ export const updateUserService = async ( }; } - // Determinar si se actualiza con o sin contraseña - let result; + // Preparar datos para actualización + const updateData = { + name_user, + email, + role: extractRole.role_id, + status: extractStatus.status_id, + userId, + }; + + // Agregar contraseña hasheada si se proporcionó if (password && password.trim() !== "") { - const hashedPassword = await hashedArg.hash(password); - result = await updateUserWithPassword({ - nameUser, - email, - password: hashedPassword, - role, - accountStatus, - userId, - }); - } else { - result = await updateUserWithoutPassword( - nameUser, - email, - role, - accountStatus, - userId, - ); + updateData.password = await hashedArg.hash(password); } + const result = await updateUser(updateData); return result.affectedRows > 0; }; From e882eb8559ddae3a326df4a0aaf26634a6c7d9cf Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Fri, 18 Jul 2025 03:28:12 -0600 Subject: [PATCH 17/20] fix(assets): Se restructura todos los enpoints del catalogo y correcciones a los usuarios, por la nueva base de datos --- .../assets/functions/assets.controllers.js | 4 +- .../users/functions/users.controllers.js | 1 - src/helpers/delete.helpers.js | 3 +- src/models/assets/functions/delete.models.js | 4 +- src/models/assets/functions/insert.models.js | 59 +++++++++++++++---- src/models/assets/functions/update.models.js | 22 +++---- src/models/assets/functions/vault.models.js | 2 +- src/models/users/functions/delete.models.js | 2 +- src/models/users/functions/insert.models.js | 28 +++++++-- src/models/users/functions/update.models.js | 12 ---- src/routes/catAssets.routes.js | 4 +- .../assets/functions/delete.services.js | 22 ++++++- .../assets/functions/insert.services.js | 51 ++++++++++++---- .../assets/functions/list.services.js | 34 +++++++++-- .../assets/functions/search.services.js | 4 +- .../assets/functions/update.services.js | 37 +++++++++++- .../users/functions/delete.services.js | 9 ++- .../users/functions/insert.services.js | 33 ++++++----- .../users/functions/update.services.js | 19 +++--- 19 files changed, 250 insertions(+), 100 deletions(-) diff --git a/src/controllers/assets/functions/assets.controllers.js b/src/controllers/assets/functions/assets.controllers.js index 5a55608..2083e93 100644 --- a/src/controllers/assets/functions/assets.controllers.js +++ b/src/controllers/assets/functions/assets.controllers.js @@ -18,8 +18,8 @@ export const SearchOfAssets = async (name) => { return searchOfAssets; }; -export const InsertAssets = async (user) => { - const insertAssets = await insertAssetsService(user); +export const InsertAssets = async (asset) => { + const insertAssets = await insertAssetsService(asset); return insertAssets; }; diff --git a/src/controllers/users/functions/users.controllers.js b/src/controllers/users/functions/users.controllers.js index 3346683..7a1703e 100644 --- a/src/controllers/users/functions/users.controllers.js +++ b/src/controllers/users/functions/users.controllers.js @@ -53,7 +53,6 @@ export const UpdateUser = async (userId, userData) => { export const DeleteUser = async (userId) => { const deleteUser = await deleteUserService(userId); - console.log(deleteUser); return deleteUser; }; diff --git a/src/helpers/delete.helpers.js b/src/helpers/delete.helpers.js index 9086054..6cf7f0e 100644 --- a/src/helpers/delete.helpers.js +++ b/src/helpers/delete.helpers.js @@ -2,10 +2,11 @@ import { connectionQuery } from "../helpers/connection.helpers.js"; export const validateFoundToEliminated = async ( paramId, + filed_id, field_name, table_name, ) => { - const query = `SELECT ${field_name} FROM ${table_name} WHERE user_id = ?`; + const query = `SELECT ${field_name} FROM ${table_name} WHERE ${filed_id} = ?`; const params = [paramId]; return await connectionQuery(query, params); }; diff --git a/src/models/assets/functions/delete.models.js b/src/models/assets/functions/delete.models.js index 03763cf..5150bda 100644 --- a/src/models/assets/functions/delete.models.js +++ b/src/models/assets/functions/delete.models.js @@ -1,12 +1,12 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const deleteAssetModel = async (assetId) => { - const query = `DELETE FROM catassets WHERE ID = ?`; + const query = `DELETE FROM cat_assets WHERE assets_id = ?`; const params = [assetId]; return await connectionQuery(query, params); }; export const deleteAssetBulk = async (placeholders, batch) => { - const query = `DELETE FROM catassets WHERE ID IN (${placeholders})`; + const query = `DELETE FROM cat_assets WHERE assets_id IN (${placeholders})`; return await connectionQuery(query, batch); }; diff --git a/src/models/assets/functions/insert.models.js b/src/models/assets/functions/insert.models.js index 02725e9..70fec31 100644 --- a/src/models/assets/functions/insert.models.js +++ b/src/models/assets/functions/insert.models.js @@ -1,26 +1,61 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; +export const extractForeignKeysAssetsModel = async ( + condition, + location, + status, +) => { + const query = `SELECT + (SELECT + condition_id + FROM + asset_conditions + WHERE + name = ?) AS 'condition', + (SELECT + location_id + FROM + cat_classrooms + WHERE + name = ?) AS location, + (SELECT + status_id + FROM + cat_status + WHERE + name = ?) AS status;`; + const result = await connectionQuery(query, [condition, location, status]); + return result; +}; + export const insertAssetsModel = async ({ + condition, + location, name, description, - purchaseDate, + purchase_date, cost, - location, - condition, - lastMaintenanceDate, - warrantyEndDate, + last_maintenance_date, + warranty_end_date, + status, }) => { - const query = `INSERT INTO catassets(ID, Name, Description, PurchaseDate, Cost, Location, \`Condition\`, LastMaintenanceDate, WarrantyEndDate) - VALUES (UUID(), ?, ?, ?, ?, ?, ?, ?, ?);`; + const query = `INSERT INTO cat_assets ( + assets_id, condition_id, location_id, + name, description, purchase_date, + cost, last_maintenance_date, warranty_end_date, + status_id + ) + VALUES (UUID(), ?, ?, ?, ?, ?, ?, ?, ?, ?);`; const params = [ + condition, + location, name, description, - purchaseDate, + purchase_date, cost, - location, - condition, - lastMaintenanceDate, - warrantyEndDate, + last_maintenance_date, + warranty_end_date, + status, ]; return await connectionQuery(query, params); }; diff --git a/src/models/assets/functions/update.models.js b/src/models/assets/functions/update.models.js index 7e31294..3751418 100644 --- a/src/models/assets/functions/update.models.js +++ b/src/models/assets/functions/update.models.js @@ -3,28 +3,28 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const updateAssetsModel = async ( assetsId, { + condition, + location, name, description, - purchaseDate, + purchase_date, cost, - location, - condition, + last_maintenance_date, + warranty_end_date, status, - lastMaintenanceDate, - warrantyEndDate, }, ) => { - const query = `UPDATE catassets SET Name = ?, Description = ?, PurchaseDate = ?, Cost = ?, Location = ?, \`Condition\` = ?, Status = ?, LastMaintenanceDate = ?, WarrantyEndDate = ? WHERE ID = ?`; + const query = `UPDATE cat_assets SET condition_id = ?, location_id = ?, name = ?, description = ?, purchase_date = ?, cost = ?, last_maintenance_date = ?, warranty_end_date = ?, status_id = ? WHERE assets_id = ?`; const params = [ + condition, + location, name, description, - purchaseDate, + purchase_date, cost, - location, - condition, + last_maintenance_date, + warranty_end_date, status, - lastMaintenanceDate, - warrantyEndDate, assetsId, ]; return await connectionQuery(query, params); diff --git a/src/models/assets/functions/vault.models.js b/src/models/assets/functions/vault.models.js index 5ee7ed0..ac07607 100644 --- a/src/models/assets/functions/vault.models.js +++ b/src/models/assets/functions/vault.models.js @@ -1,7 +1,7 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const vaultAssetsModel = async (assetId) => { - const query = `UPDATE catassets SET Status = 'Inactivo' WHERE ID = ?`; + const query = `UPDATE cat_assets SET status_id = "cefdb296-61f5-11f0-a977-d843ae0db894" WHERE assets_id = ?`; const params = [assetId]; await connectionQuery(query, params); }; diff --git a/src/models/users/functions/delete.models.js b/src/models/users/functions/delete.models.js index da368dd..ab78c9e 100644 --- a/src/models/users/functions/delete.models.js +++ b/src/models/users/functions/delete.models.js @@ -1,6 +1,6 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; -export const deleteUser = async (userId) => { +export const deleteUserModel = async (userId) => { const query = `DELETE FROM users WHERE user_id = ?`; const params = [userId]; return await connectionQuery(query, params); diff --git a/src/models/users/functions/insert.models.js b/src/models/users/functions/insert.models.js index 71852c2..cceb55f 100644 --- a/src/models/users/functions/insert.models.js +++ b/src/models/users/functions/insert.models.js @@ -1,15 +1,33 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; -export const insertUser = async ( +export const extractForeignKeysUserModel = async (role, status) => { + const query = `SELECT + (SELECT + role_id + FROM + role + WHERE + name = ?) AS role, + (SELECT + status_id + FROM + cat_status + WHERE + name = ?) AS status;`; + const result = await connectionQuery(query, [role, status]); + return result; +}; + +export const insertUserModel = async ({ name_user, email, hashedPassword, - status_id, - role_id, -) => { + role, + status, +}) => { const query = ` INSERT INTO users (user_id, role_id, name_user, email, password, account_type, status_id) VALUES (UUID(),?, ?, ?, ?, 'local', ?) `; - const params = [role_id, name_user, email, hashedPassword, status_id]; + const params = [role, name_user, email, hashedPassword, status]; return await connectionQuery(query, params); }; diff --git a/src/models/users/functions/update.models.js b/src/models/users/functions/update.models.js index ddc5c6f..4ad8863 100644 --- a/src/models/users/functions/update.models.js +++ b/src/models/users/functions/update.models.js @@ -6,18 +6,6 @@ export const findUserById = async (userId) => { return result[0]; }; -export const extractRoleByName = async (role) => { - const query = `SELECT role_id FROM role WHERE name = ?`; - const result = await connectionQuery(query, [role]); - return result[0]; -}; - -export const extractStatusByName = async (status) => { - const query = `SELECT status_id FROM cat_status WHERE name = ?`; - const result = await connectionQuery(query, [status]); - return result[0]; -}; - export const updateUser = async ({ name_user, email, diff --git a/src/routes/catAssets.routes.js b/src/routes/catAssets.routes.js index a22c4fc..07aceea 100644 --- a/src/routes/catAssets.routes.js +++ b/src/routes/catAssets.routes.js @@ -109,8 +109,8 @@ apiCatAssets.delete("/:id", verificarToken, async (request, response, next) => { methodOK( request, response, - result, - "El activo fue eliminado correctamente", + undefined, + `El activo ${result.name} fue eliminado correctamente`, ); } catch (error) { next(error); diff --git a/src/services/assets/functions/delete.services.js b/src/services/assets/functions/delete.services.js index 1b62d48..eda1694 100644 --- a/src/services/assets/functions/delete.services.js +++ b/src/services/assets/functions/delete.services.js @@ -1,3 +1,4 @@ +import { validateFoundToEliminated } from "../../../helpers/delete.helpers.js"; import { deleteAssetBulk, deleteAssetModel, @@ -13,6 +14,22 @@ export const deleteAssetService = async (assetId) => { }; } + const foundUserToEliminated = await validateFoundToEliminated( + assetId, + "assets_id", + "name", + "cat_assets", + ); + + if (foundUserToEliminated.length === 0) { + throw { + statusCode: 404, + message: "No se proporcionó un ID válido o el activo no existe", + code: "ASSETS_NOT_FOUND", + details: "El activo con el ID proporcionado no fue encontrado", + }; + } + const result = await deleteAssetModel(assetId); if (result.affectedRows === 0) { @@ -20,10 +37,11 @@ export const deleteAssetService = async (assetId) => { statusCode: 500, message: "No se pudo eliminar el activo", code: "ASSETS_DELETE_FAILED", - dettails: - "Hubo un error al intentar borrar el activo en la base de datos", + ettails: "Hubo un error al intentar borrar el activo en la base de datos", }; } + + return foundUserToEliminated[0]; }; export const deleteAssetsBulkService = async (ids) => { diff --git a/src/services/assets/functions/insert.services.js b/src/services/assets/functions/insert.services.js index aeb4380..d1e697e 100644 --- a/src/services/assets/functions/insert.services.js +++ b/src/services/assets/functions/insert.services.js @@ -1,15 +1,28 @@ -import { insertAssetsModel } from "../../../models/assets/index.js"; +import { + extractForeignKeysAssetsModel, + insertAssetsModel, +} from "../../../models/assets/index.js"; -export const insertAssetsService = async (user) => { +export const insertAssetsService = async ({ + condition, + location, + name, + description, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + status, +}) => { if ( - !user.name || - !user.description || - !user.purchaseDate || - !user.cost || - !user.location || - !user.condition || - !user.lastMaintenanceDate || - !user.warrantyEndDate + !condition || + !location || + !name || + !description || + !purchase_date || + !cost || + !last_maintenance_date || + !status ) { throw { statusCode: 400, @@ -19,7 +32,23 @@ export const insertAssetsService = async (user) => { }; } - const result = await insertAssetsModel(user); + const extract = await extractForeignKeysAssetsModel( + condition, + location, + status, + ); + + const result = await insertAssetsModel({ + condition: extract[0].condition, + location: extract[0].location, + name, + description, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + status: extract[0].status, + }); if (!result.affectedRows > 0) { throw { diff --git a/src/services/assets/functions/list.services.js b/src/services/assets/functions/list.services.js index b141807..d43f921 100644 --- a/src/services/assets/functions/list.services.js +++ b/src/services/assets/functions/list.services.js @@ -11,30 +11,52 @@ export const listAssetsService = async ({ const values = []; if (cost && cost !== "All" && !limitCost) { - where += " AND Cost = ?"; + where += " AND cost = ?"; values.push(cost); } else if (cost && limitCost) { - where += " AND Cost BETWEEN ? AND ?"; + where += " AND cost BETWEEN ? AND ?"; values.push(cost, limitCost); } if (location && location !== "All") { - where += " AND Location = ?"; + where += " AND cat_classrooms.name = ?"; values.push(location); } if (condition && condition !== "All") { - where += " AND `Condition` = ?"; + where += " AND `asset_conditions.name` = ?"; values.push(condition); } if (status && status !== "All") { - where += " AND Status = ?"; + where += " AND cat_status.name = ?"; values.push(status); } const queryString = ` - SELECT * FROM catassets ${where} ORDER BY Name ASC + SELECT + assets_id, + asset_conditions.name AS 'condition', + cat_classrooms.name AS location, + cat_assets.name, + cat_assets.description, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + created, + updated, + cat_status.name AS status + FROM + cat_assets + INNER JOIN + asset_conditions ON asset_conditions.condition_id = cat_assets.condition_id + INNER JOIN + cat_classrooms ON cat_classrooms.location_id = cat_assets.location_id + INNER JOIN + cat_status ON cat_status.status_id = cat_assets.status_id + ${where} + ORDER BY cat_assets.name ASC `; const resultList = await listAssetsModel(queryString, values); diff --git a/src/services/assets/functions/search.services.js b/src/services/assets/functions/search.services.js index fb05c6c..4b3d8a9 100644 --- a/src/services/assets/functions/search.services.js +++ b/src/services/assets/functions/search.services.js @@ -1,11 +1,11 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const searchAssetsService = async (name) => { - let query = `SELECT * FROM catassets WHERE 1=1`; + let query = `SELECT * FROM cat_assets WHERE 1=1`; const params = []; if (name) { - query += ` AND Name LIKE ?`; + query += ` AND name LIKE ?`; params.push(`%${name}%`); } else { throw { diff --git a/src/services/assets/functions/update.services.js b/src/services/assets/functions/update.services.js index 0e65422..6169057 100644 --- a/src/services/assets/functions/update.services.js +++ b/src/services/assets/functions/update.services.js @@ -1,5 +1,38 @@ -import { updateAssetsModel } from "../../../models/assets/index.js"; +import { + extractForeignKeysAssetsModel, + updateAssetsModel, +} from "../../../models/assets/index.js"; -export const updateAssetsService = async (assetsId, assetsData) => { +export const updateAssetsService = async ( + assetsId, + { + condition, + location, + name, + description, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + status, + }, +) => { + const extract = await extractForeignKeysAssetsModel( + condition, + location, + status, + ); + + const assetsData = { + condition: extract[0].condition, + location: extract[0].location, + name, + description, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + status: extract[0].status, + }; await updateAssetsModel(assetsId, assetsData); }; diff --git a/src/services/users/functions/delete.services.js b/src/services/users/functions/delete.services.js index d1221e0..1544a91 100644 --- a/src/services/users/functions/delete.services.js +++ b/src/services/users/functions/delete.services.js @@ -1,5 +1,8 @@ import { validateFoundToEliminated } from "../../../helpers/delete.helpers.js"; -import { deleteUser, deleteUserBulk } from "../../../models/users/index.js"; +import { + deleteUserBulk, + deleteUserModel, +} from "../../../models/users/index.js"; export const deleteUserService = async (userId) => { if (!userId) { @@ -13,9 +16,11 @@ export const deleteUserService = async (userId) => { const foundUserToEliminated = await validateFoundToEliminated( userId, + "user_id", "name_user", "users", ); + if (foundUserToEliminated.length === 0) { throw { statusCode: 404, @@ -25,7 +30,7 @@ export const deleteUserService = async (userId) => { }; } - const deleteUserFromID = await deleteUser(userId); + const deleteUserFromID = await deleteUserModel(userId); if (deleteUserFromID.affectedRows === 0) { throw { statusCode: 500 }; } diff --git a/src/services/users/functions/insert.services.js b/src/services/users/functions/insert.services.js index 150c3da..42d56a0 100644 --- a/src/services/users/functions/insert.services.js +++ b/src/services/users/functions/insert.services.js @@ -3,16 +3,19 @@ import hashedArg from "argon2"; import { findUserByEmail } from "../../../helpers/findUserByEmail.helpers.js"; import { getUserByEmail } from "../../../helpers/getUserByEmail.helpers.js"; -import { insertUser } from "../../../models/users/index.js"; +import { + extractForeignKeysUserModel, + insertUserModel, +} from "../../../models/users/index.js"; export const insertUserService = async ({ name_user, email, password, - status_id, - role_id, + role, + status, }) => { - if (!name_user || !email || !password || !status_id || !role_id) { + if (!name_user || !email || !password || !role || !status) { throw { statusCode: 400, message: "Debe de proporcionar todos los campos", @@ -31,14 +34,16 @@ export const insertUserService = async ({ }; } + const extract = await extractForeignKeysUserModel(role, status); + const hashedPassword = await hashedArg.hash(password); - const insertResult = await insertUser( + const insertResult = await insertUserModel({ name_user, email, hashedPassword, - status_id, - role_id, - ); + role: extract[0].role, + status: extract[0].status, + }); if (insertResult.affectedRows > 0) { const newUser = await getUserByEmail(email); @@ -70,8 +75,8 @@ export const insertUserMasiveService = async (countInsert) => { const name_user = faker.internet.username(); const email = faker.internet.email(); const password = faker.internet.password(); - const role_id = undefined; - const status_id = "cefdafcc-61f5-11f0-a977-d843ae0db894"; + const role = undefined; + const status = "cefdafcc-61f5-11f0-a977-d843ae0db894"; const existingUser = await findUserByEmail(email); if (existingUser) { @@ -84,16 +89,16 @@ export const insertUserMasiveService = async (countInsert) => { } const hashedPassword = await hashedArg.hash(password); - const insertResult = await insertUser( + const insertResult = await insertUserModel( name_user, email, hashedPassword, - status_id, - role_id, + role, + status, ); if (insertResult.affectedRows > 0) { - insertados.push({ name_user, email, hashedPassword, role_id, status_id }); + insertados.push({ name_user, email, hashedPassword, role, status }); } } return insertados; diff --git a/src/services/users/functions/update.services.js b/src/services/users/functions/update.services.js index a7cbbeb..37f7100 100644 --- a/src/services/users/functions/update.services.js +++ b/src/services/users/functions/update.services.js @@ -2,8 +2,7 @@ import hashedArg from "argon2"; import { findEmailInOtherUser } from "../../../helpers/getUserByEmailAndId.helpers.js"; import { - extractRoleByName, - extractStatusByName, + extractForeignKeysUserModel, findUserById, updateUser, } from "../../../models/users/index.js"; @@ -13,13 +12,11 @@ export const updateUserService = async ( { name_user, email, password, role, status }, ) => { // Verificar si otro usuario ya usa ese correo - const [emailConflict, existingUser, extractRole, extractStatus] = - await Promise.all([ - findEmailInOtherUser(email, userId), - findUserById(userId), - extractRoleByName(role), - extractStatusByName(status), - ]); + const [emailConflict, existingUser, extract] = await Promise.all([ + findEmailInOtherUser(email, userId), + findUserById(userId), + extractForeignKeysUserModel(role, status), + ]); if (emailConflict) { throw { @@ -44,8 +41,8 @@ export const updateUserService = async ( const updateData = { name_user, email, - role: extractRole.role_id, - status: extractStatus.status_id, + role: extract[0].role, + status: extract[0].status, userId, }; From 37f37da9ded10218e2b357dbf6e196235789b871 Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Thu, 24 Jul 2025 00:05:43 -0600 Subject: [PATCH 18/20] fix(names): Se corrigen nombres en constantes para eliminacion de un activo --- src/services/assets/functions/delete.services.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/services/assets/functions/delete.services.js b/src/services/assets/functions/delete.services.js index eda1694..72f2ceb 100644 --- a/src/services/assets/functions/delete.services.js +++ b/src/services/assets/functions/delete.services.js @@ -14,14 +14,14 @@ export const deleteAssetService = async (assetId) => { }; } - const foundUserToEliminated = await validateFoundToEliminated( + const foundAssetToEliminated = await validateFoundToEliminated( assetId, "assets_id", "name", "cat_assets", ); - if (foundUserToEliminated.length === 0) { + if (foundAssetToEliminated.length === 0) { throw { statusCode: 404, message: "No se proporcionó un ID válido o el activo no existe", @@ -41,7 +41,7 @@ export const deleteAssetService = async (assetId) => { }; } - return foundUserToEliminated[0]; + return foundAssetToEliminated[0]; }; export const deleteAssetsBulkService = async (ids) => { From b97611449a74e8e2ec1666067e06d82a1d1e60c5 Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Thu, 24 Jul 2025 03:49:11 -0600 Subject: [PATCH 19/20] fix(supplies): Se restructura el catalogo completo de suministros y se corrige busqueda de activos --- src/models/supply/functions/delete.models.js | 4 +- src/models/supply/functions/insert.models.js | 38 ++++++++++++--- src/models/supply/functions/update.models.js | 20 ++++++-- src/models/supply/functions/vault.models.js | 2 +- src/routes/catSupplies.routes.js | 4 +- .../assets/functions/search.services.js | 24 +++++++++- .../supply/functions/delete.services.js | 19 ++++++++ .../supply/functions/insert.service.js | 47 +++++++++++++++---- .../supply/functions/list.services.js | 37 +++++++++++---- .../supply/functions/search.services.js | 25 ++++++++-- .../supply/functions/update.services.js | 34 +++++++++++++- 11 files changed, 212 insertions(+), 42 deletions(-) diff --git a/src/models/supply/functions/delete.models.js b/src/models/supply/functions/delete.models.js index c897a7b..b3194ab 100644 --- a/src/models/supply/functions/delete.models.js +++ b/src/models/supply/functions/delete.models.js @@ -1,12 +1,12 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const deleteSupplyModel = async (supplyId) => { - const query = `DELETE FROM catsupplies WHERE ID = ?`; + const query = `DELETE FROM cat_supplies WHERE supplies_id = ?`; const params = [supplyId]; return await connectionQuery(query, params); }; export const deleteSupplyBulk = async (placeholders, batch) => { - const query = `DELETE FROM catsupplies WHERE ID IN (${placeholders})`; + const query = `DELETE FROM cat_supplies WHERE supplies_id IN (${placeholders})`; return await connectionQuery(query, batch); }; diff --git a/src/models/supply/functions/insert.models.js b/src/models/supply/functions/insert.models.js index 3f69ffc..5a72df3 100644 --- a/src/models/supply/functions/insert.models.js +++ b/src/models/supply/functions/insert.models.js @@ -1,27 +1,53 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; +export const extractForeignKeysSupplyModel = async (supplier, unit, status) => { + const query = `SELECT + (SELECT + supplier_id + FROM + cat_supplier + WHERE + name = ?) AS supplier, + (SELECT + unit_id + FROM + supply_units + WHERE + name = ?) AS unit, + (SELECT + status_id + FROM + cat_status + WHERE + name = ?) AS status;`; + const result = await connectionQuery(query, [supplier, unit, status]); + return result; +}; + export const insertSupplyModel = async ({ + supplier, + unit, name, description, quantity, - unit, - supplier, purchaseDate, expiryDate, cost, + status, }) => { - const query = `INSERT INTO catsupplies (ID, Name, Description, Quantity, Unit, Supplier, PurchaseDate, ExpiryDate, Cost) - VALUES (UUID(),? ,? ,? ,? ,? ,? ,? ,? );`; + const query = `INSERT INTO cat_supplies (supplies_id, supplier_id, unit_id, name, description, quantity, purchase_date, expiry_date, cost, status_id) + VALUES (UUID(),? ,? ,? ,? ,? ,? ,? ,?, ?);`; const params = [ + supplier, + unit, name, description, quantity, - unit, - supplier, purchaseDate, expiryDate, cost, + status, ]; return await connectionQuery(query, params); diff --git a/src/models/supply/functions/update.models.js b/src/models/supply/functions/update.models.js index a711767..f8e7475 100644 --- a/src/models/supply/functions/update.models.js +++ b/src/models/supply/functions/update.models.js @@ -3,24 +3,34 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const updateSupplyModel = async ( supplyId, { + supplier, + unit, name, description, quantity, - unit, - supplier, purchaseDate, expiryDate, cost, status, }, ) => { - const query = `UPDATE catsupplies SET Name = ?, Description = ?, Quantity = ?, Unit = ?, Supplier = ?, PurchaseDate = ?, ExpiryDate = ?, Cost = ?, Status = ? WHERE ID = ?`; + const query = `UPDATE cat_supplies SET + supplier_id = ?, + unit_id = ?, + name = ?, + description = ?, + quantity = ?, + purchase_date = ?, + expiry_date = ?, + cost = ?, + status_id = ? + WHERE supplies_id = ?`; const params = [ + supplier, + unit, name, description, quantity, - unit, - supplier, purchaseDate, expiryDate, cost, diff --git a/src/models/supply/functions/vault.models.js b/src/models/supply/functions/vault.models.js index 9a2d9bf..031917e 100644 --- a/src/models/supply/functions/vault.models.js +++ b/src/models/supply/functions/vault.models.js @@ -1,7 +1,7 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const vaultSupplyModel = async (supplyId) => { - const query = `UPDATE catsupplies SET Status = 'Inactivo' WHERE ID = ?`; + const query = `UPDATE cat_supplies SET status_id = 'cefdb296-61f5-11f0-a977-d843ae0db894' WHERE supplies_id = ?`; const params = [supplyId]; await connectionQuery(query, params); }; diff --git a/src/routes/catSupplies.routes.js b/src/routes/catSupplies.routes.js index f5fd897..4d43353 100644 --- a/src/routes/catSupplies.routes.js +++ b/src/routes/catSupplies.routes.js @@ -115,8 +115,8 @@ apiCatSupply.delete("/:id", verificarToken, async (request, response, next) => { methodOK( request, response, - result, - "El suministro fue eliminado correctamente", + undefined, + `El suministro ${result.name} fue eliminado correctamente`, ); } catch (error) { next(error); diff --git a/src/services/assets/functions/search.services.js b/src/services/assets/functions/search.services.js index 4b3d8a9..5cbf079 100644 --- a/src/services/assets/functions/search.services.js +++ b/src/services/assets/functions/search.services.js @@ -1,11 +1,31 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const searchAssetsService = async (name) => { - let query = `SELECT * FROM cat_assets WHERE 1=1`; + let query = `SELECT + assets_id, + asset_conditions.name AS 'condition', + cat_classrooms.name AS location, + cat_assets.name, + cat_assets.description, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + created, + updated, + cat_status.name AS status + FROM + cat_assets + INNER JOIN + asset_conditions ON asset_conditions.condition_id = cat_assets.condition_id + INNER JOIN + cat_classrooms ON cat_classrooms.location_id = cat_assets.location_id + INNER JOIN + cat_status ON cat_status.status_id = cat_assets.status_id WHERE 1=1`; const params = []; if (name) { - query += ` AND name LIKE ?`; + query += ` AND cat_assets.name LIKE ?`; params.push(`%${name}%`); } else { throw { diff --git a/src/services/supply/functions/delete.services.js b/src/services/supply/functions/delete.services.js index aa8e665..e9eca26 100644 --- a/src/services/supply/functions/delete.services.js +++ b/src/services/supply/functions/delete.services.js @@ -1,3 +1,4 @@ +import { validateFoundToEliminated } from "../../../helpers/delete.helpers.js"; import { deleteSupplyBulk, deleteSupplyModel, @@ -13,6 +14,22 @@ export const deleteSupplyService = async (supplyId) => { }; } + const foundSupplyToEliminated = await validateFoundToEliminated( + supplyId, + "supplies_id", + "name", + "cat_supplies", + ); + + if (foundSupplyToEliminated.length === 0) { + throw { + statusCode: 404, + message: "No se proporcionó un ID válido o el suministro no existe", + code: "SUPPLY_NOT_FOUND", + details: "El suministro con el ID proporcionado no fue encontrado", + }; + } + const result = await deleteSupplyModel(supplyId); if (result.affectedRows === 0) { @@ -24,6 +41,8 @@ export const deleteSupplyService = async (supplyId) => { "Hubo un error al intentar borrar el suministro en la base de datos", }; } + + return foundSupplyToEliminated[0]; }; export const deleteSupplyBulkService = async (ids) => { diff --git a/src/services/supply/functions/insert.service.js b/src/services/supply/functions/insert.service.js index 78020f5..d7f4cdf 100644 --- a/src/services/supply/functions/insert.service.js +++ b/src/services/supply/functions/insert.service.js @@ -1,14 +1,29 @@ -import { insertSupplyModel } from "../../../models/supply/index.js"; +import { + extractForeignKeysSupplyModel, + insertSupplyModel, +} from "../../../models/supply/index.js"; -export const insertSupplyService = async (supply) => { +export const insertSupplyService = async ({ + supplier, + unit, + name, + description, + quantity, + purchaseDate, + expiryDate, + cost, + status, +}) => { if ( - !supply.name || - !supply.description || - !supply.quantity || - !supply.unit || - !supply.supplier || - !supply.purchaseDate || - !supply.cost + !supplier || + !unit || + !name || + !description || + !quantity || + !purchaseDate || + !expiryDate || + !cost || + !status ) { throw { statusCode: 400, @@ -18,7 +33,19 @@ export const insertSupplyService = async (supply) => { }; } - const result = await insertSupplyModel(supply); + const extract = await extractForeignKeysSupplyModel(supplier, unit, status); + + const result = await insertSupplyModel({ + supplier: extract[0].supplier, + unit: extract[0].unit, + name, + description, + quantity, + purchaseDate, + expiryDate, + cost, + status: extract[0].status, + }); if (!result.affectedRows > 0) { throw { diff --git a/src/services/supply/functions/list.services.js b/src/services/supply/functions/list.services.js index 4805eb1..8218957 100644 --- a/src/services/supply/functions/list.services.js +++ b/src/services/supply/functions/list.services.js @@ -12,36 +12,55 @@ export const listSupplyService = async ({ const values = []; if (name && name !== "All") { - where += " AND Name = ?"; + where += " AND cat_supplies.name = ?"; values.push(name); } if (unit && unit !== "All") { - where += " AND Unit = ?"; + where += " AND supply_units.name = ?"; values.push(unit); } if (supplier && supplier !== "All") { - where += " AND Supplier = ?"; + where += " AND cat_supplier.name = ?"; values.push(supplier); } if (cost && cost !== "All" && !limitCost) { - where += " AND Cost = ?"; + where += " AND cost = ?"; values.push(cost); } else if (cost && limitCost) { - where += " AND Cost BETWEEN ? AND ?"; + where += " AND cost BETWEEN ? AND ?"; values.push(cost, limitCost); } if (status && status !== "All") { - where += " AND Status = ?"; + where += " AND cat_status.name = ?"; values.push(status); } const queryString = ` - SELECT * FROM catsupplies ${where} ORDER BY Name ASC - `; + SELECT + supplies_id, + cat_supplier.name AS supplier, + supply_units.name AS unit, + cat_supplies.name, + cat_supplies.description, + quantity, + purchase_date, + expiry_date, + cost, + cat_status.name AS status + FROM + cat_supplies + INNER JOIN + cat_supplier ON cat_supplier.supplier_id = cat_supplies.supplier_id + INNER JOIN + supply_units ON supply_units.unit_id = cat_supplies.unit_id + INNER JOIN + cat_status ON cat_status.status_id = cat_supplies.status_id + ${where} + ORDER BY cat_supplies.name ASC`; const resultList = await listSupplyModel(queryString, values); @@ -51,7 +70,7 @@ export const listSupplyService = async ({ message: "No se encontraron suministros con los filtros proporcionados", code: "INVENTORY_NOT_FOUND", details: `No se encontraron suministros con los filtros proporcionados: ${JSON.stringify( - { name, unit, supplier, cost, costLimit, status }, + { name, unit, supplier, cost, limitCost, status }, )}`, }; } diff --git a/src/services/supply/functions/search.services.js b/src/services/supply/functions/search.services.js index 551266b..c8e1854 100644 --- a/src/services/supply/functions/search.services.js +++ b/src/services/supply/functions/search.services.js @@ -1,11 +1,30 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const searchSupplyService = async (name) => { - let query = `SELECT * FROM catsupplies WHERE 1=1`; + let query = `SELECT + supplies_id, + cat_supplier.name AS supplier, + supply_units.name AS unit, + cat_supplies.name, + cat_supplies.description, + quantity, + purchase_date, + expiry_date, + cost, + cat_status.name AS status + FROM + cat_supplies + INNER JOIN + cat_supplier ON cat_supplier.supplier_id = cat_supplies.supplier_id + INNER JOIN + supply_units ON supply_units.unit_id = cat_supplies.unit_id + INNER JOIN + cat_status ON cat_status.status_id = cat_supplies.status_id WHERE 1=1`; + const params = []; if (name) { - query += ` AND Name LIKE ?`; + query += ` AND cat_supplies.name LIKE ?`; params.push(`%${name}%`); } else { throw { @@ -15,7 +34,7 @@ export const searchSupplyService = async (name) => { details: "El campo de nombre es obligatorio para realizar busquedas", }; } - + console.log(query); const result = await connectionQuery(query, params); if (result.length === 0) { diff --git a/src/services/supply/functions/update.services.js b/src/services/supply/functions/update.services.js index 3a6231c..74e35c9 100644 --- a/src/services/supply/functions/update.services.js +++ b/src/services/supply/functions/update.services.js @@ -1,5 +1,35 @@ -import { updateSupplyModel } from "../../../models/supply/index.js"; +import { + extractForeignKeysSupplyModel, + updateSupplyModel, +} from "../../../models/supply/index.js"; + +export const updateSupplyService = async ( + supplyId, + { + supplier, + unit, + name, + description, + quantity, + purchaseDate, + expiryDate, + cost, + status, + }, +) => { + const extract = await extractForeignKeysSupplyModel(supplier, unit, status); + + const supplyData = { + supplier: extract[0].supplier, + unit: extract[0].unit, + name, + description, + quantity, + purchaseDate, + expiryDate, + cost, + status: extract[0].status, + }; -export const updateSupplyService = async (supplyId, supplyData) => { await updateSupplyModel(supplyId, supplyData); }; From 24ad0944ab318a26d8994cbb0ac67d2eb35ee124 Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Thu, 24 Jul 2025 07:21:52 -0600 Subject: [PATCH 20/20] fix(inventory): Se restructura el catalogo completo de inventarios y se corrige el formato de cost y comillas invertidas --- NOTES.md | 15 ---- .../inventory/functions/delete.models.js | 4 +- .../inventory/functions/insert.models.js | 68 +++++++++++++++--- .../inventory/functions/update.models.js | 46 +++++++++--- .../inventory/functions/vault.models.js | 2 +- src/routes/catInventory.routes.js | 4 +- .../assets/functions/list.services.js | 4 +- .../inventory/functions/delete.services.js | 19 +++++ .../inventory/functions/insert.services.js | 72 +++++++++++++++---- .../inventory/functions/list.services.js | 36 ++++++++-- .../inventory/functions/search.services.js | 25 ++++++- .../inventory/functions/update.services.js | 50 ++++++++++++- .../supply/functions/list.services.js | 2 +- 13 files changed, 282 insertions(+), 65 deletions(-) diff --git a/NOTES.md b/NOTES.md index 6b1c11f..1500008 100644 --- a/NOTES.md +++ b/NOTES.md @@ -2,26 +2,11 @@ ## Cambios importantes -- Hacer el cambio para el catalogo de insumos por medio de la modularizacionm de funciones -- Hacer un catalogo de Aulas - -- Hacer dos nuevas tablas una llamada asset_conditions y supply_units para administrar esos catalogos de forma mejor eficiente a la hora de quererlos incluir como listas para insercion o como selectores de busqueda - -- Hacer un catalogo de proveedores que seria el campo de supplier en catsupplies - -- asset_conditions va ser para la condicion del activo condition_id - -- supply_units va ser para la unidades de los suministros unit_id - -- Verificar las funciones de la carpeta helpers para poder reutilizar unas funciones -(sobre todo la de cuando se elimina un registro como el de usuarios en su modelo, esto aplica para todas las tablas) - Verificar testeos del catalogo de activos y de usuarios juntos y hacerlos - Busar una forma mas segura de pasarle el token a los test - Probar la funcion de token para el refresco del mismo, y hacer la docuemntacion en postman - Excluir por aparte el controlador de google para el login, y tenerlo aparte (Sacarlo de los usuario y que tenga su propio espacio) -- - ## Cambios que se puedan ir haciendo - Ir adecuando el codigo poco a poco el codigo en ingles diff --git a/src/models/inventory/functions/delete.models.js b/src/models/inventory/functions/delete.models.js index a9bf064..abc1b11 100644 --- a/src/models/inventory/functions/delete.models.js +++ b/src/models/inventory/functions/delete.models.js @@ -1,12 +1,12 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const deleteInventoryModel = async (inventoryId) => { - const query = `DELETE FROM catinventory WHERE ID = ?`; + const query = `DELETE FROM cat_inventory WHERE inventory_id = ?`; const params = [inventoryId]; return await connectionQuery(query, params); }; export const deleteInventoryBulk = async (placeholders, batch) => { - const query = `DELETE FROM catinventory WHERE ID IN (${placeholders})`; + const query = `DELETE FROM cat_inventory WHERE inventory_id IN (${placeholders})`; return await connectionQuery(query, batch); }; diff --git a/src/models/inventory/functions/insert.models.js b/src/models/inventory/functions/insert.models.js index 6b60aa5..1114686 100644 --- a/src/models/inventory/functions/insert.models.js +++ b/src/models/inventory/functions/insert.models.js @@ -1,31 +1,79 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; +export const extractForeignKeysInventoryModel = async ( + condition, + location, + status, +) => { + const query = `SELECT + (SELECT + condition_id + FROM + asset_conditions + WHERE + name = ?) AS 'condition', + (SELECT + location_id + FROM + cat_classrooms + WHERE + name = ?) AS location, + (SELECT + status_id + FROM + cat_status + WHERE + name = ?) AS status;`; + const result = await connectionQuery(query, [condition, location, status]); + return result; +}; + export const insertInventoryModel = async ({ - itemCode, + condition, + location, + item_code, + serial_number, name, description, quantity, weight, width, height, - location, - condition, - purchaseDate, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + status, }) => { - const query = `INSERT INTO catinventory (ID, ItemCode, Name, Description, Quantity, Weight, Width, Height, Location, \`Condition\`, PurchaseDate) - VALUES (UUID(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);`; + const query = `INSERT INTO cat_inventory ( + inventory_id, condition_id, location_id, item_code, + serial_number, name, description, + quantity, weight, width, height, purchase_date, + cost, last_maintenance_date, warranty_end_date, + status_id +) +VALUES + ( + UUID(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? + ); +`; const params = [ - itemCode, + condition, + location, + item_code, + serial_number, name, description, quantity, weight, width, height, - location, - condition, - purchaseDate, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + status, ]; return await connectionQuery(query, params); diff --git a/src/models/inventory/functions/update.models.js b/src/models/inventory/functions/update.models.js index 55aed4c..1e313a6 100644 --- a/src/models/inventory/functions/update.models.js +++ b/src/models/inventory/functions/update.models.js @@ -3,31 +3,59 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const updateInventoryModel = async ( inventoryId, { - itemCode, + condition, + location, + item_code, + serial_number, name, description, quantity, weight, width, height, - location, - condition, - purchaseDate, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, status, }, ) => { - const query = `UPDATE catinventory SET ItemCode = ?, Name = ?, Description = ?, Quantity = ?, Weight = ?, Width = ?, Height = ?, Location = ?, \`Condition\` = ?, PurchaseDate = ?, Status = ? WHERE ID = ?`; + const query = `UPDATE + cat_inventory + SET + condition_id = ?, + location_id = ?, + item_code = ?, + serial_number = ?, + name = ?, + description = ?, + quantity = ?, + weight = ?, + width = ?, + height = ?, + purchase_date = ?, + cost = ?, + last_maintenance_date = ?, + warranty_end_date = ?, + status_id = ? + WHERE + inventory_id = ?;`; + const params = [ - itemCode, + condition, + location, + item_code, + serial_number, name, description, quantity, weight, width, height, - location, - condition, - purchaseDate, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, status, inventoryId, ]; diff --git a/src/models/inventory/functions/vault.models.js b/src/models/inventory/functions/vault.models.js index 6ba822f..20b59ea 100644 --- a/src/models/inventory/functions/vault.models.js +++ b/src/models/inventory/functions/vault.models.js @@ -1,7 +1,7 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const vaultInventoryModel = async (inventoryId) => { - const query = `UPDATE catinventory SET Status = 'Inactivo' WHERE ID = ?`; + const query = `UPDATE cat_inventory SET status_id = "cefdb296-61f5-11f0-a977-d843ae0db894" WHERE inventory_id = ?`; const params = [inventoryId]; await connectionQuery(query, params); }; diff --git a/src/routes/catInventory.routes.js b/src/routes/catInventory.routes.js index 85f1b33..3769a61 100644 --- a/src/routes/catInventory.routes.js +++ b/src/routes/catInventory.routes.js @@ -121,8 +121,8 @@ apiCatInventory.delete( methodOK( request, response, - result, - "El inventario fue eliminado correctamente", + undefined, + `El inventario ${result.name} fue eliminado correctamente`, ); } catch (error) { next(error); diff --git a/src/services/assets/functions/list.services.js b/src/services/assets/functions/list.services.js index d43f921..fa46ad5 100644 --- a/src/services/assets/functions/list.services.js +++ b/src/services/assets/functions/list.services.js @@ -24,7 +24,7 @@ export const listAssetsService = async ({ } if (condition && condition !== "All") { - where += " AND `asset_conditions.name` = ?"; + where += " AND asset_conditions.name = ?"; values.push(condition); } @@ -41,7 +41,7 @@ export const listAssetsService = async ({ cat_assets.name, cat_assets.description, purchase_date, - cost, + FORMAT(cost, 2) AS cost, last_maintenance_date, warranty_end_date, created, diff --git a/src/services/inventory/functions/delete.services.js b/src/services/inventory/functions/delete.services.js index 91c4f8d..83d552e 100644 --- a/src/services/inventory/functions/delete.services.js +++ b/src/services/inventory/functions/delete.services.js @@ -1,3 +1,4 @@ +import { validateFoundToEliminated } from "../../../helpers/delete.helpers.js"; import { deleteInventoryBulk, deleteInventoryModel, @@ -13,6 +14,22 @@ export const deleteInventoryService = async (inventoryId) => { }; } + const foundInventoryToEliminated = await validateFoundToEliminated( + inventoryId, + "inventory_id", + "name", + "cat_inventory", + ); + + if (foundInventoryToEliminated.length === 0) { + throw { + statusCode: 404, + message: "No se proporcionó un ID válido o el inventario no existe", + code: "INVENTORY_NOT_FOUND", + details: "El inventario con el ID proporcionado no fue encontrado", + }; + } + const result = await deleteInventoryModel(inventoryId); if (result.affectedRows === 0) { @@ -24,6 +41,8 @@ export const deleteInventoryService = async (inventoryId) => { "Hubo un error al intentar borrar el inventario en la base de datos", }; } + + return foundInventoryToEliminated[0]; }; export const deleteInventoryBulkService = async (ids) => { diff --git a/src/services/inventory/functions/insert.services.js b/src/services/inventory/functions/insert.services.js index 0480ecb..87924ec 100644 --- a/src/services/inventory/functions/insert.services.js +++ b/src/services/inventory/functions/insert.services.js @@ -1,17 +1,41 @@ -import { insertInventoryModel } from "../../../models/inventory/index.js"; +import { + extractForeignKeysInventoryModel, + insertInventoryModel, +} from "../../../models/inventory/index.js"; -export const insertInventoryService = async (inventory) => { +export const insertInventoryService = async ({ + condition, + location, + item_code, + serial_number, + name, + description, + quantity, + weight, + width, + height, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + status, +}) => { if ( - !inventory.itemCode || - !inventory.name || - !inventory.description || - !inventory.quantity || - !inventory.weight || - !inventory.width || - !inventory.height || - !inventory.location || - !inventory.condition || - !inventory.purchaseDate + !condition || + !location || + !item_code || + !serial_number || + !name || + !description || + !quantity || + !weight || + !width || + !height || + !purchase_date || + !cost || + !last_maintenance_date || + !warranty_end_date || + !status ) { throw { statusCode: 400, @@ -21,7 +45,29 @@ export const insertInventoryService = async (inventory) => { }; } - const result = await insertInventoryModel(inventory); + const extract = await extractForeignKeysInventoryModel( + condition, + location, + status, + ); + + const result = await insertInventoryModel({ + condition: extract[0].condition, + location: extract[0].location, + item_code, + serial_number, + name, + description, + quantity, + weight, + width, + height, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + status: extract[0].status, + }); if (!result.affectedRows > 0) { throw { diff --git a/src/services/inventory/functions/list.services.js b/src/services/inventory/functions/list.services.js index 1c3c944..0fe509b 100644 --- a/src/services/inventory/functions/list.services.js +++ b/src/services/inventory/functions/list.services.js @@ -11,32 +11,56 @@ export const listInventoryService = async ({ const values = []; if (name && name !== "All") { - where += " AND Name = ?"; + where += " AND cat_inventory.name = ?"; values.push(name); } if (weight && weight !== "All") { - where += " AND Weight = ?"; + where += " AND weight = ?"; values.push(weight); } if (location && location !== "All") { - where += " AND Location = ?"; + where += " AND cat_classrooms.name = ?"; values.push(location); } if (condition && condition !== "All") { - where += " AND `Condition` = ?"; + where += " AND asset_conditions.name = ?"; values.push(condition); } if (status && status !== "All") { - where += " AND Status = ?"; + where += " AND cat_status.name = ?"; values.push(status); } const queryString = ` - SELECT * FROM catinventory ${where} ORDER BY Name ASC + SELECT + inventory_id, + asset_conditions.name AS 'condition', + cat_classrooms.name AS location, + cat_inventory.name, + cat_inventory.description, + quantity, + weight, + width, + height, + purchase_date, + FORMAT(cost, 2) AS cost, + last_maintenance_date, + warranty_end_date, + created, + updated, + cat_status.name AS status + FROM + cat_inventory + INNER JOIN asset_conditions ON asset_conditions.condition_id = cat_inventory.condition_id + INNER JOIN cat_classrooms ON cat_classrooms.location_id = cat_inventory.location_id + INNER JOIN cat_status ON cat_status.status_id = cat_inventory.status_id ${where} + ORDER BY + cat_inventory.name ASC + `; const resultList = await listInventoryModel(queryString, values); diff --git a/src/services/inventory/functions/search.services.js b/src/services/inventory/functions/search.services.js index 2adabce..a4ef6ef 100644 --- a/src/services/inventory/functions/search.services.js +++ b/src/services/inventory/functions/search.services.js @@ -1,11 +1,32 @@ import { connectionQuery } from "../../../helpers/connection.helpers.js"; export const searchInventoryService = async (name) => { - let query = `SELECT * FROM catinventory WHERE 1=1`; + let query = `SELECT + inventory_id, + asset_conditions.name AS 'condition', + cat_classrooms.name AS location, + cat_inventory.name, + cat_inventory.description, + quantity, + weight, + width, + height, + purchase_date, + FORMAT(cost, 2) AS cost, + last_maintenance_date, + warranty_end_date, + created, + updated, + cat_status.name AS status + FROM + cat_inventory + INNER JOIN asset_conditions ON asset_conditions.condition_id = cat_inventory.condition_id + INNER JOIN cat_classrooms ON cat_classrooms.location_id = cat_inventory.location_id + INNER JOIN cat_status ON cat_status.status_id = cat_inventory.status_id WHERE 1=1`; const params = []; if (name) { - query += ` AND Name LIKE ?`; + query += ` AND cat_inventory.name LIKE ?`; params.push(`%${name}%`); } else { throw { diff --git a/src/services/inventory/functions/update.services.js b/src/services/inventory/functions/update.services.js index 0bd407a..afd3fab 100644 --- a/src/services/inventory/functions/update.services.js +++ b/src/services/inventory/functions/update.services.js @@ -1,5 +1,51 @@ -import { updateInventoryModel } from "../../../models/inventory/index.js"; +import { + extractForeignKeysInventoryModel, + updateInventoryModel, +} from "../../../models/inventory/index.js"; + +export const updateInventoryService = async ( + inventoryId, + { + condition, + location, + item_code, + serial_number, + name, + description, + quantity, + weight, + width, + height, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + status, + }, +) => { + const extract = await extractForeignKeysInventoryModel( + condition, + location, + status, + ); + + const inventoryData = { + condition: extract[0].condition, + location: extract[0].location, + item_code, + serial_number, + name, + description, + quantity, + weight, + width, + height, + purchase_date, + cost, + last_maintenance_date, + warranty_end_date, + status: extract[0].status, + }; -export const updateInventoryService = async (inventoryId, inventoryData) => { await updateInventoryModel(inventoryId, inventoryData); }; diff --git a/src/services/supply/functions/list.services.js b/src/services/supply/functions/list.services.js index 8218957..80ff3ac 100644 --- a/src/services/supply/functions/list.services.js +++ b/src/services/supply/functions/list.services.js @@ -49,7 +49,7 @@ export const listSupplyService = async ({ quantity, purchase_date, expiry_date, - cost, + FORMAT(cost, 2) AS cost, cat_status.name AS status FROM cat_supplies

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�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 E2Qj}@_W%F@ literal 772740 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°F3cC;gf@E($F#H$g2CdI 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 KK7De=<^F#P5B9A9 diff --git "a/assets/Administracion de jardin de ni\303\261os.svg" "b/assets/Administracion de jardin de ni\303\261os.svg" index fe8b1e2..c7b671f 100644 --- "a/assets/Administracion de jardin de ni\303\261os.svg" +++ "b/assets/Administracion de jardin de ni\303\261os.svg" @@ -1,4 +1,4 @@ -1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*0..1*1*actionsactions_idchar(36)namevarchar(50)createddatetimeupdateddatetimeasset_conditionscondition_idchar(36)namevarchar(100)descriptionvarchar(255)cat_assetsassets_idchar(36)condition_idchar(36)location_idchar(36)namevarchar(100)descriptionvarchar(255)purchase_datedatecostdecimal(10,2)last_maintenance_datedatewarranty_end_datedatecreateddatetimeupdateddatetimestatus_idchar(36)cat_classroomslocation_idchar(36)namevarchar(100)room_typevarchar(50)capacityintcat_educational_levellevel_education_idchar(36)namevarchar(50)short_namevarchar(10)cat_gendergender_idchar(36)namevarchar(30)cat_inventoryinventory_idchar(36)condition_idchar(36)location_idchar(36)item_codevarchar(50)serial_numbervarchar(100)namevarchar(100)descriptionvarchar(255)quantityintweightdecimal(10,2)widthdecimal(10,2)heightdecimal(10,2)purchase_datedatecreateddatetimeupdateddatetimestatus_idchar(36)cat_statusstatus_idchar(36)namevarchar(30)descriptionvarchar(100)cat_suppliersupplier_idchar(36)namevarchar(100)emailvarchar(100)phonevarchar(15)addressvarchar(255)cat_suppliessupplies_idchar(36)supplier_idchar(36)unit_idchar(36)namevarchar(100)descriptionvarchar(255)quantityintpurchase_datedateexpiry_datedatecostdecimal(10,2)createddatetimeupdateddatetimestatus_idchar(36)cat_work_shiftsshifts_works_idchar(36)namevarchar(50)diagnosticdiagnostic_idchar(36)student_idchar(36)teacher_idchar(36)grade_group_idchar(36)level_education_idchar(36)gender_idchar(36)family_incomedecimal(12,2)number_of_family_membersintnumber_of_siblingsintparents_marital_statusvarchar(50)housing_typevarchar(100)housing_conditionvarchar(100)number_of_roomsintfather_education_levelvarchar(100)mother_education_levelvarchar(100)father_employment_statusvarchar(100)mother_employment_statusvarchar(100)father_occupationvarchar(150)mother_occupationvarchar(150)has_running_watertinyint(1)has_electricitytinyint(1)has_internet_accesstinyint(1)internet_typevarchar(100)has_study_spacetinyint(1)study_space_descriptionvarchar(255)health_issuestexthas_health_insurancetinyint(1)type_of_health_insurancevarchar(100)transport_to_schoolvarchar(100)transport_time_minutesintdevices_availablevarchar(255)extracurricular_activitiesvarchar(255)family_support_for_studiesvarchar(255)additional_notestextcreateddatetimeupdateddatetimegrade_groupsgrade_group_idchar(36)level_education_idchar(36)grade_namevarchar(50)group_namevarchar(10)labelvarchar(20)modulesmodule_idchar(36)namevarchar(100)createddatetimeupdateddatetimeparentsparents_idchar(36)gender_idchar(36)level_studies_idchar(36)grade_group_idchar(36)work_shift_idchar(36)first_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdateocupationvarchar(60)curpvarchar(18)emailvarchar(100)phonevarchar(15)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)createddatetimeupdateddatetimestatus_idchar(36)permissionspermissions_idchar(36)module_idchar(36)action_idchar(36)createddatetimeupdateddatetimerolerole_idchar(36)namevarchar(20)descriptionvarchar(100)student_parentsstudent_parent_idchar(36)student_idchar(36)parents_idchar(36)relationshipvarchar(30)is_primarytinyint(1)createddatetimeupdateddatetimestudent_teacher_historyhistory_idchar(36)student_idchar(36)teacher_idchar(36)grade_group_idchar(36)start_datedateend_datedatecreateddatetimeupdateddatetimestudentsstudent_idchar(36)teacher_idchar(36)gender_idchar(36)grade_group_idchar(36)work_shift_idchar(36)first_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdatecurpvarchar(18)allergiesvarchar(255)medical_conditionsvarchar(255)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)enrollment_datedatecreateddatetimeupdateddatetimestatus_idchar(36)supply_unitsunit_idchar(36)namevarchar(100)symbolvarchar(20)teachersteacher_idchar(36)user_idchar(36)location_idchar(36)gender_idchar(36)level_studies_idchar(36)grade_group_idchar(36)work_shift_idchar(36)first_namevarchar(100)paternal_surnamevarchar(100)maternal_surnamevarchar(100)date_of_birthdatename_schoolvarchar(150)students_in_chargeintcctvarchar(45)school_zonevarchar(15)curpvarchar(18)emailvarchar(100)phonevarchar(15)statevarchar(100)suburbvarchar(100)streetvarchar(150)emergency_contactvarchar(100)emergency_phonevarchar(15)createddatetimeupdateddatetimestatus_idchar(36)user_permissionsuser_permissions_idchar(36)user_idchar(36)permissions_idchar(36)createddatetimeupdateddatetimeusersuser_idchar(36)role_idvarchar(50)name_uservarchar(100)emailvarchar(100)passwordvarchar(100)profile_picturevarchar(500)account_typevarchar(20)last_logindatetimecreateddatetimeupdateddatetimestatus_idchar(36) \ No newline at end of file diff --git a/database.sql b/database.sql index b478c6d..acc6500 100644 --- a/database.sql +++ b/database.sql @@ -1,377 +1,841 @@ -CREATE TABLE `users` ( - `user_id` uuid PRIMARY KEY NOT NULL, - `role_id` varchar(50) DEFAULT null, - `name_user` varchar(100) NOT NULL, - `email` varchar(100) UNIQUE NOT NULL, - `password` varchar(100) NOT NULL, - `profile_picture` varchar(500) DEFAULT null, - `account_type` varchar(20) NOT NULL, - `last_login` datetime DEFAULT null, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), - `status_id` uuid NOT NULL -); - -CREATE TABLE `teachers` ( - `teacher_id` uuid PRIMARY KEY NOT NULL, - `user_id` uuid NOT NULL, - `location_id` uuid NOT NULL, - `gender_id` uuid NOT NULL, - `level_studies_id` uuid NOT NULL, - `grade_group_id` uuid NOT NULL, - `work_shift_id` uuid NOT NULL, +-- MySQL dump 10.13 Distrib 8.0.38, for Win64 (x86_64) +-- +-- Host: 127.0.0.1 Database: akt_backend_mirror +-- ------------------------------------------------------ +-- Server version 8.0.39 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `actions` +-- + +DROP TABLE IF EXISTS `actions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `actions` ( + `actions_id` char(36) NOT NULL, + `name` varchar(50) NOT NULL, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`actions_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `actions` +-- + +LOCK TABLES `actions` WRITE; +/*!40000 ALTER TABLE `actions` DISABLE KEYS */; +/*!40000 ALTER TABLE `actions` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `asset_conditions` +-- + +DROP TABLE IF EXISTS `asset_conditions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `asset_conditions` ( + `condition_id` char(36) NOT NULL, + `name` varchar(100) NOT NULL, + `description` varchar(255) DEFAULT NULL, + PRIMARY KEY (`condition_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `asset_conditions` +-- + +LOCK TABLES `asset_conditions` WRITE; +/*!40000 ALTER TABLE `asset_conditions` DISABLE KEYS */; +/*!40000 ALTER TABLE `asset_conditions` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `cat_assets` +-- + +DROP TABLE IF EXISTS `cat_assets`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cat_assets` ( + `assets_id` char(36) NOT NULL, + `condition_id` char(36) NOT NULL, + `location_id` char(36) NOT NULL, + `name` varchar(100) NOT NULL, + `description` varchar(255) DEFAULT NULL, + `purchase_date` date DEFAULT NULL, + `cost` decimal(10,2) DEFAULT '0.00', + `last_maintenance_date` date DEFAULT NULL, + `warranty_end_date` date DEFAULT NULL, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `status_id` char(36) NOT NULL, + PRIMARY KEY (`assets_id`), + KEY `cat_assets_ibfk1_idx` (`condition_id`), + KEY `cat_assets_ibfk2_idx` (`location_id`), + KEY `cat_assets_ibfk3_idx` (`status_id`), + CONSTRAINT `cat_assets_ibfk1` FOREIGN KEY (`condition_id`) REFERENCES `asset_conditions` (`condition_id`), + CONSTRAINT `cat_assets_ibfk2` FOREIGN KEY (`location_id`) REFERENCES `cat_classrooms` (`location_id`), + CONSTRAINT `cat_assets_ibfk3` FOREIGN KEY (`status_id`) REFERENCES `cat_status` (`status_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `cat_assets` +-- + +LOCK TABLES `cat_assets` WRITE; +/*!40000 ALTER TABLE `cat_assets` DISABLE KEYS */; +/*!40000 ALTER TABLE `cat_assets` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `cat_classrooms` +-- + +DROP TABLE IF EXISTS `cat_classrooms`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cat_classrooms` ( + `location_id` char(36) NOT NULL, + `name` varchar(100) NOT NULL, + `room_type` varchar(50) NOT NULL, + `capacity` int DEFAULT NULL, + PRIMARY KEY (`location_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `cat_classrooms` +-- + +LOCK TABLES `cat_classrooms` WRITE; +/*!40000 ALTER TABLE `cat_classrooms` DISABLE KEYS */; +/*!40000 ALTER TABLE `cat_classrooms` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `cat_educational_level` +-- + +DROP TABLE IF EXISTS `cat_educational_level`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cat_educational_level` ( + `level_education_id` char(36) NOT NULL, + `name` varchar(50) NOT NULL, + `short_name` varchar(10) DEFAULT NULL, + PRIMARY KEY (`level_education_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `cat_educational_level` +-- + +LOCK TABLES `cat_educational_level` WRITE; +/*!40000 ALTER TABLE `cat_educational_level` DISABLE KEYS */; +/*!40000 ALTER TABLE `cat_educational_level` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `cat_gender` +-- + +DROP TABLE IF EXISTS `cat_gender`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cat_gender` ( + `gender_id` char(36) NOT NULL, + `name` varchar(30) NOT NULL, + PRIMARY KEY (`gender_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `cat_gender` +-- + +LOCK TABLES `cat_gender` WRITE; +/*!40000 ALTER TABLE `cat_gender` DISABLE KEYS */; +/*!40000 ALTER TABLE `cat_gender` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `cat_inventory` +-- + +DROP TABLE IF EXISTS `cat_inventory`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cat_inventory` ( + `inventory_id` char(36) NOT NULL, + `condition_id` char(36) NOT NULL, + `location_id` char(36) NOT NULL, + `item_code` varchar(50) NOT NULL, + `serial_number` varchar(100) NOT NULL, + `name` varchar(100) NOT NULL, + `description` varchar(255) DEFAULT NULL, + `quantity` int DEFAULT '0', + `weight` decimal(10,2) DEFAULT NULL, + `width` decimal(10,2) DEFAULT NULL, + `height` decimal(10,2) DEFAULT NULL, + `purchase_date` date DEFAULT NULL, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `status_id` char(36) NOT NULL, + PRIMARY KEY (`inventory_id`), + KEY `cat_inventory_ibfk_1_idx` (`condition_id`), + KEY `cat_inventory_ibfk_2_idx` (`location_id`), + KEY `cat_inventory_ibfk_3_idx` (`status_id`), + CONSTRAINT `cat_inventory_ibfk_1` FOREIGN KEY (`condition_id`) REFERENCES `asset_conditions` (`condition_id`), + CONSTRAINT `cat_inventory_ibfk_2` FOREIGN KEY (`location_id`) REFERENCES `cat_classrooms` (`location_id`), + CONSTRAINT `cat_inventory_ibfk_3` FOREIGN KEY (`status_id`) REFERENCES `cat_status` (`status_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `cat_inventory` +-- + +LOCK TABLES `cat_inventory` WRITE; +/*!40000 ALTER TABLE `cat_inventory` DISABLE KEYS */; +/*!40000 ALTER TABLE `cat_inventory` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `cat_status` +-- + +DROP TABLE IF EXISTS `cat_status`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cat_status` ( + `status_id` char(36) NOT NULL, + `name` varchar(30) NOT NULL, + `description` varchar(100) DEFAULT NULL, + PRIMARY KEY (`status_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `cat_status` +-- + +LOCK TABLES `cat_status` WRITE; +/*!40000 ALTER TABLE `cat_status` DISABLE KEYS */; +/*!40000 ALTER TABLE `cat_status` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `cat_supplier` +-- + +DROP TABLE IF EXISTS `cat_supplier`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cat_supplier` ( + `supplier_id` char(36) NOT NULL, + `name` varchar(100) NOT NULL, + `email` varchar(100) DEFAULT NULL, + `phone` varchar(15) DEFAULT NULL, + `address` varchar(255) DEFAULT NULL, + PRIMARY KEY (`supplier_id`), + UNIQUE KEY `email` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `cat_supplier` +-- + +LOCK TABLES `cat_supplier` WRITE; +/*!40000 ALTER TABLE `cat_supplier` DISABLE KEYS */; +/*!40000 ALTER TABLE `cat_supplier` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `cat_supplies` +-- + +DROP TABLE IF EXISTS `cat_supplies`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cat_supplies` ( + `supplies_id` char(36) NOT NULL, + `supplier_id` char(36) NOT NULL, + `unit_id` char(36) NOT NULL, + `name` varchar(100) NOT NULL, + `description` varchar(255) DEFAULT NULL, + `quantity` int DEFAULT '0', + `purchase_date` date DEFAULT NULL, + `expiry_date` date DEFAULT NULL, + `cost` decimal(10,2) DEFAULT '0.00', + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `status_id` char(36) NOT NULL, + PRIMARY KEY (`supplies_id`), + KEY `cat_supplies_ibfk_1_idx` (`supplier_id`), + KEY `cat_supplies_ibfk_2_idx` (`unit_id`), + KEY `cat_supplies_ibfk_3_idx` (`status_id`), + CONSTRAINT `cat_supplies_ibfk_1` FOREIGN KEY (`supplier_id`) REFERENCES `cat_supplier` (`supplier_id`), + CONSTRAINT `cat_supplies_ibfk_2` FOREIGN KEY (`unit_id`) REFERENCES `supply_units` (`unit_id`), + CONSTRAINT `cat_supplies_ibfk_3` FOREIGN KEY (`status_id`) REFERENCES `cat_status` (`status_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `cat_supplies` +-- + +LOCK TABLES `cat_supplies` WRITE; +/*!40000 ALTER TABLE `cat_supplies` DISABLE KEYS */; +/*!40000 ALTER TABLE `cat_supplies` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `cat_work_shifts` +-- + +DROP TABLE IF EXISTS `cat_work_shifts`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `cat_work_shifts` ( + `shifts_works_id` char(36) NOT NULL, + `name` varchar(50) NOT NULL, + PRIMARY KEY (`shifts_works_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `cat_work_shifts` +-- + +LOCK TABLES `cat_work_shifts` WRITE; +/*!40000 ALTER TABLE `cat_work_shifts` DISABLE KEYS */; +/*!40000 ALTER TABLE `cat_work_shifts` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `diagnostic` +-- + +DROP TABLE IF EXISTS `diagnostic`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `diagnostic` ( + `diagnostic_id` char(36) NOT NULL, + `student_id` char(36) NOT NULL, + `teacher_id` char(36) NOT NULL, + `grade_group_id` char(36) NOT NULL, + `level_education_id` char(36) NOT NULL, + `gender_id` char(36) NOT NULL, + `family_income` decimal(12,2) NOT NULL COMMENT 'Ingreso familiar mensual en moneda local', + `number_of_family_members` int NOT NULL COMMENT 'Número total de integrantes en la familia', + `number_of_siblings` int NOT NULL, + `parents_marital_status` varchar(50) NOT NULL COMMENT 'Estado civil de los padres', + `housing_type` varchar(100) NOT NULL COMMENT 'Tipo de vivienda: propia, rentada, prestada, etc.', + `housing_condition` varchar(100) NOT NULL COMMENT 'Condición de la vivienda: buena, regular, mala', + `number_of_rooms` int NOT NULL COMMENT 'Número de habitaciones en la vivienda', + `father_education_level` varchar(100) NOT NULL, + `mother_education_level` varchar(100) NOT NULL, + `father_employment_status` varchar(100) NOT NULL, + `mother_employment_status` varchar(100) NOT NULL, + `father_occupation` varchar(150) NOT NULL, + `mother_occupation` varchar(150) NOT NULL, + `has_running_water` tinyint(1) NOT NULL DEFAULT '0', + `has_electricity` tinyint(1) NOT NULL DEFAULT '0', + `has_internet_access` tinyint(1) NOT NULL DEFAULT '0', + `internet_type` varchar(100) DEFAULT NULL COMMENT 'Fibra óptica, móvil, etc.', + `has_study_space` tinyint(1) NOT NULL DEFAULT '0', + `study_space_description` varchar(255) DEFAULT NULL, + `health_issues` text COMMENT 'Enfermedades o condiciones de salud del estudiante o familia', + `has_health_insurance` tinyint(1) NOT NULL DEFAULT '0', + `type_of_health_insurance` varchar(100) DEFAULT NULL, + `transport_to_school` varchar(100) NOT NULL COMMENT 'Cómo llega el estudiante a la escuela', + `transport_time_minutes` int DEFAULT NULL COMMENT 'Tiempo aproximado de traslado en minutos', + `devices_available` varchar(255) DEFAULT NULL COMMENT 'Dispositivos tecnológicos en casa (PC, tablet, celular)', + `extracurricular_activities` varchar(255) DEFAULT NULL, + `family_support_for_studies` varchar(255) DEFAULT NULL COMMENT 'Nivel de apoyo que la familia brinda para estudios', + `additional_notes` text, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`diagnostic_id`), + KEY `student_id` (`student_id`), + KEY `teacher_id` (`teacher_id`), + KEY `grade_group_id` (`grade_group_id`), + KEY `level_education_id` (`level_education_id`), + KEY `gender_id` (`gender_id`), + CONSTRAINT `diagnostic_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`), + CONSTRAINT `diagnostic_ibfk_2` FOREIGN KEY (`teacher_id`) REFERENCES `teachers` (`teacher_id`), + CONSTRAINT `diagnostic_ibfk_3` FOREIGN KEY (`grade_group_id`) REFERENCES `grade_groups` (`grade_group_id`), + CONSTRAINT `diagnostic_ibfk_4` FOREIGN KEY (`level_education_id`) REFERENCES `cat_educational_level` (`level_education_id`), + CONSTRAINT `diagnostic_ibfk_5` FOREIGN KEY (`gender_id`) REFERENCES `cat_gender` (`gender_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `diagnostic` +-- + +LOCK TABLES `diagnostic` WRITE; +/*!40000 ALTER TABLE `diagnostic` DISABLE KEYS */; +/*!40000 ALTER TABLE `diagnostic` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `grade_groups` +-- + +DROP TABLE IF EXISTS `grade_groups`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `grade_groups` ( + `grade_group_id` char(36) NOT NULL, + `level_education_id` char(36) NOT NULL, + `grade_name` varchar(50) NOT NULL, + `group_name` varchar(10) NOT NULL, + `label` varchar(20) NOT NULL, + PRIMARY KEY (`grade_group_id`), + UNIQUE KEY `label` (`label`), + KEY `level_education_id` (`level_education_id`), + CONSTRAINT `grade_groups_ibfk_1` FOREIGN KEY (`level_education_id`) REFERENCES `cat_educational_level` (`level_education_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `grade_groups` +-- + +LOCK TABLES `grade_groups` WRITE; +/*!40000 ALTER TABLE `grade_groups` DISABLE KEYS */; +/*!40000 ALTER TABLE `grade_groups` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `modules` +-- + +DROP TABLE IF EXISTS `modules`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `modules` ( + `module_id` char(36) NOT NULL, + `name` varchar(100) NOT NULL, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`module_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `modules` +-- + +LOCK TABLES `modules` WRITE; +/*!40000 ALTER TABLE `modules` DISABLE KEYS */; +/*!40000 ALTER TABLE `modules` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `parents` +-- + +DROP TABLE IF EXISTS `parents`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `parents` ( + `parents_id` char(36) NOT NULL, + `gender_id` char(36) NOT NULL, + `level_studies_id` char(36) NOT NULL, + `grade_group_id` char(36) NOT NULL, + `work_shift_id` char(36) NOT NULL, `first_name` varchar(100) NOT NULL, `paternal_surname` varchar(100) NOT NULL, `maternal_surname` varchar(100) NOT NULL, `date_of_birth` date NOT NULL, - `name_school` varchar(150) NOT NULL, - `students_in_charge` int DEFAULT 0, - `cct` varchar(45) NOT NULL, - `school_zone` varchar(15) NOT NULL, + `ocupation` varchar(60) NOT NULL, `curp` varchar(18) NOT NULL, - `email` varchar(100) UNIQUE NOT NULL, + `email` varchar(100) NOT NULL, `phone` varchar(15) NOT NULL, `state` varchar(100) NOT NULL, `suburb` varchar(100) NOT NULL, `street` varchar(150) NOT NULL, `emergency_contact` varchar(100) NOT NULL, - `emergency_phone` varchar(15) DEFAULT null, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), - `status_id` uuid NOT NULL -); - -CREATE TABLE `parents` ( - `parents_id` uuid PRIMARY KEY NOT NULL, - `gender_id` uuid NOT NULL, - `level_studies_id` uuid NOT NULL, - `grade_group_id` uuid NOT NULL, - `work_shift_id` uuid NOT NULL, + `emergency_phone` varchar(15) DEFAULT NULL, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `status_id` char(36) NOT NULL, + PRIMARY KEY (`parents_id`), + UNIQUE KEY `email` (`email`), + KEY `work_shift_id` (`work_shift_id`), + KEY `grade_group_id` (`grade_group_id`), + KEY `parents_ibfk_3_idx` (`gender_id`), + KEY `parents_ibfk_4_idx` (`level_studies_id`), + KEY `parents_ibfk_5_idx` (`status_id`), + CONSTRAINT `parents_ibfk_1` FOREIGN KEY (`work_shift_id`) REFERENCES `cat_work_shifts` (`shifts_works_id`), + CONSTRAINT `parents_ibfk_2` FOREIGN KEY (`grade_group_id`) REFERENCES `grade_groups` (`grade_group_id`), + CONSTRAINT `parents_ibfk_3` FOREIGN KEY (`gender_id`) REFERENCES `cat_gender` (`gender_id`), + CONSTRAINT `parents_ibfk_4` FOREIGN KEY (`level_studies_id`) REFERENCES `cat_educational_level` (`level_education_id`), + CONSTRAINT `parents_ibfk_5` FOREIGN KEY (`status_id`) REFERENCES `cat_status` (`status_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `parents` +-- + +LOCK TABLES `parents` WRITE; +/*!40000 ALTER TABLE `parents` DISABLE KEYS */; +/*!40000 ALTER TABLE `parents` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `permissions` +-- + +DROP TABLE IF EXISTS `permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `permissions` ( + `permissions_id` char(36) NOT NULL, + `module_id` char(36) NOT NULL, + `action_id` char(36) NOT NULL, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`permissions_id`), + KEY `permissions_ibfk_1` (`module_id`), + KEY `permissions_ibfk_2` (`action_id`), + CONSTRAINT `permissions_ibfk_1` FOREIGN KEY (`module_id`) REFERENCES `modules` (`module_id`), + CONSTRAINT `permissions_ibfk_2` FOREIGN KEY (`action_id`) REFERENCES `actions` (`actions_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `permissions` +-- + +LOCK TABLES `permissions` WRITE; +/*!40000 ALTER TABLE `permissions` DISABLE KEYS */; +/*!40000 ALTER TABLE `permissions` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `role` +-- + +DROP TABLE IF EXISTS `role`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `role` ( + `role_id` char(36) NOT NULL, + `name` varchar(20) NOT NULL, + `description` varchar(100) DEFAULT NULL, + PRIMARY KEY (`role_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `role` +-- + +LOCK TABLES `role` WRITE; +/*!40000 ALTER TABLE `role` DISABLE KEYS */; +/*!40000 ALTER TABLE `role` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `student_parents` +-- + +DROP TABLE IF EXISTS `student_parents`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `student_parents` ( + `student_parent_id` char(36) NOT NULL, + `student_id` char(36) NOT NULL, + `parents_id` char(36) NOT NULL, + `relationship` varchar(30) NOT NULL, + `is_primary` tinyint(1) DEFAULT '0', + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`student_parent_id`), + KEY `student_parents_ibfk_1` (`student_id`), + KEY `student_parents_ibfk_2` (`parents_id`), + CONSTRAINT `student_parents_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`), + CONSTRAINT `student_parents_ibfk_2` FOREIGN KEY (`parents_id`) REFERENCES `parents` (`parents_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `student_parents` +-- + +LOCK TABLES `student_parents` WRITE; +/*!40000 ALTER TABLE `student_parents` DISABLE KEYS */; +/*!40000 ALTER TABLE `student_parents` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `student_teacher_history` +-- + +DROP TABLE IF EXISTS `student_teacher_history`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `student_teacher_history` ( + `history_id` char(36) NOT NULL, + `student_id` char(36) NOT NULL, + `teacher_id` char(36) NOT NULL, + `grade_group_id` char(36) NOT NULL, + `start_date` date NOT NULL, + `end_date` date DEFAULT NULL, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`history_id`), + KEY `student_teacher_history_ibfk_1_idx` (`student_id`), + KEY `student_teacher_history_ibfk_2_idx` (`teacher_id`), + KEY `student_teacher_history_ibfk_3_idx` (`grade_group_id`), + CONSTRAINT `student_teacher_history_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`), + CONSTRAINT `student_teacher_history_ibfk_2` FOREIGN KEY (`teacher_id`) REFERENCES `teachers` (`teacher_id`), + CONSTRAINT `student_teacher_history_ibfk_3` FOREIGN KEY (`grade_group_id`) REFERENCES `grade_groups` (`grade_group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `student_teacher_history` +-- + +LOCK TABLES `student_teacher_history` WRITE; +/*!40000 ALTER TABLE `student_teacher_history` DISABLE KEYS */; +/*!40000 ALTER TABLE `student_teacher_history` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `students` +-- + +DROP TABLE IF EXISTS `students`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `students` ( + `student_id` char(36) NOT NULL, + `teacher_id` char(36) NOT NULL, + `gender_id` char(36) NOT NULL, + `grade_group_id` char(36) NOT NULL, + `work_shift_id` char(36) NOT NULL, `first_name` varchar(100) NOT NULL, `paternal_surname` varchar(100) NOT NULL, `maternal_surname` varchar(100) NOT NULL, `date_of_birth` date NOT NULL, - `ocupation` varchar(60) NOT NULL, `curp` varchar(18) NOT NULL, - `email` varchar(100) UNIQUE NOT NULL, - `phone` varchar(15) NOT NULL, + `allergies` varchar(255) DEFAULT NULL, + `medical_conditions` varchar(255) DEFAULT NULL, `state` varchar(100) NOT NULL, `suburb` varchar(100) NOT NULL, `street` varchar(150) NOT NULL, `emergency_contact` varchar(100) NOT NULL, - `emergency_phone` varchar(15) DEFAULT null, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), - `status_id` uuid NOT NULL -); - -CREATE TABLE `students` ( - `student_id` uuid PRIMARY KEY NOT NULL, - `teacher_id` uuid NOT NULL, - `gender_id` uuid NOT NULL, - `grade_group_id` uuid NOT NULL, - `work_shift_id` uuid NOT NULL, + `emergency_phone` varchar(15) DEFAULT NULL, + `enrollment_date` date NOT NULL, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `status_id` char(36) NOT NULL, + PRIMARY KEY (`student_id`), + KEY `students_ibfk_2_idx` (`gender_id`), + KEY `students_ibfk_3_idx` (`grade_group_id`), + KEY `students_ibfk_3_idx1` (`work_shift_id`), + KEY `students_ibfk_4_idx` (`status_id`), + KEY `students_ibfk_1` (`teacher_id`), + CONSTRAINT `students_ibfk_1` FOREIGN KEY (`teacher_id`) REFERENCES `teachers` (`teacher_id`), + CONSTRAINT `students_ibfk_2` FOREIGN KEY (`gender_id`) REFERENCES `cat_gender` (`gender_id`), + CONSTRAINT `students_ibfk_3` FOREIGN KEY (`grade_group_id`) REFERENCES `grade_groups` (`grade_group_id`), + CONSTRAINT `students_ibfk_4` FOREIGN KEY (`status_id`) REFERENCES `cat_status` (`status_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `students` +-- + +LOCK TABLES `students` WRITE; +/*!40000 ALTER TABLE `students` DISABLE KEYS */; +/*!40000 ALTER TABLE `students` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `supply_units` +-- + +DROP TABLE IF EXISTS `supply_units`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `supply_units` ( + `unit_id` char(36) NOT NULL, + `name` varchar(100) NOT NULL, + `symbol` varchar(20) DEFAULT NULL, + PRIMARY KEY (`unit_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `supply_units` +-- + +LOCK TABLES `supply_units` WRITE; +/*!40000 ALTER TABLE `supply_units` DISABLE KEYS */; +/*!40000 ALTER TABLE `supply_units` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `teachers` +-- + +DROP TABLE IF EXISTS `teachers`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `teachers` ( + `teacher_id` char(36) NOT NULL, + `user_id` char(36) NOT NULL, + `location_id` char(36) NOT NULL, + `gender_id` char(36) NOT NULL, + `level_studies_id` char(36) NOT NULL, + `grade_group_id` char(36) NOT NULL, + `work_shift_id` char(36) NOT NULL, `first_name` varchar(100) NOT NULL, `paternal_surname` varchar(100) NOT NULL, `maternal_surname` varchar(100) NOT NULL, `date_of_birth` date NOT NULL, + `name_school` varchar(150) NOT NULL, + `students_in_charge` int DEFAULT '0', + `cct` varchar(45) NOT NULL, + `school_zone` varchar(15) NOT NULL, `curp` varchar(18) NOT NULL, - `allergies` varchar(255) DEFAULT null, - `medical_conditions` varchar(255) DEFAULT null, + `email` varchar(100) NOT NULL, + `phone` varchar(15) NOT NULL, `state` varchar(100) NOT NULL, `suburb` varchar(100) NOT NULL, `street` varchar(150) NOT NULL, `emergency_contact` varchar(100) NOT NULL, - `emergency_phone` varchar(15) DEFAULT null, - `enrollment_date` date NOT NULL, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), - `status_id` uuid NOT NULL -); - -CREATE TABLE `student_parents` ( - `student_parent_id` uuid PRIMARY KEY NOT NULL, - `student_id` uuid NOT NULL, - `parents_id` uuid NOT NULL, - `relationship` varchar(30) NOT NULL, - `is_primary` boolean DEFAULT false, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) -); - -CREATE TABLE `student_teacher_history` ( - `history_id` uuid PRIMARY KEY NOT NULL, - `student_id` uuid NOT NULL, - `teacher_id` uuid NOT NULL, - `grade_group_id` uuid NOT NULL, - `start_date` date NOT NULL, - `end_date` date DEFAULT null, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) -); - -CREATE TABLE `cat_supplies` ( - `supplies_id` uuid PRIMARY KEY NOT NULL, - `supplier_id` uniqueidentifier NOT NULL, - `unit_id` uuid NOT NULL, - `name` varchar(100) NOT NULL, - `description` varchar(255) DEFAULT null, - `quantity` int DEFAULT 0, - `purchase_date` date DEFAULT null, - `expiry_date` date DEFAULT null, - `cost` decimal(10,2) DEFAULT 0, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), - `status_id` uuid NOT NULL -); - -CREATE TABLE `cat_assets` ( - `assets_id` uuid PRIMARY KEY NOT NULL, - `condition_id` uuid NOT NULL, - `location_id` uuid NOT NULL, - `name` varchar(100) NOT NULL, - `description` varchar(255) DEFAULT null, - `purchase_date` date DEFAULT null, - `cost` decimal(10,2) DEFAULT 0, - `last_maintenance_date` date DEFAULT null, - `warranty_end_date` date DEFAULT null, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), - `status_id` uuid NOT NULL -); - -CREATE TABLE `cat_inventory` ( - `inventory_id` uuid PRIMARY KEY NOT NULL, - `condition_id` uuid NOT NULL, - `location_id` uuid NOT NULL, - `item_code` varchar(50) NOT NULL, - `serial_number` varchar(100) NOT NULL, - `name` varchar(100) NOT NULL, - `description` varchar(255) DEFAULT null, - `quantity` int DEFAULT 0, - `weight` decimal(10,2) DEFAULT null, - `width` decimal(10,2) DEFAULT null, - `height` decimal(10,2) DEFAULT null, - `purchase_date` date DEFAULT null, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP), - `status_id` uuid NOT NULL -); - -CREATE TABLE `cat_supplier` ( - `supplier_id` uuid PRIMARY KEY NOT NULL, - `name` varchar(100) NOT NULL, - `email` varchar(100) UNIQUE DEFAULT null, - `phone` varchar(15) DEFAULT null, - `address` varchar(255) DEFAULT null -); - -CREATE TABLE `cat_classrooms` ( - `location_id` uuid PRIMARY KEY NOT NULL, - `name` varchar(100) NOT NULL, - `room_type` varchar(50) NOT NULL, - `capacity` int DEFAULT null -); - -CREATE TABLE `cat_gender` ( - `gender_id` uuid PRIMARY KEY NOT NULL, - `name` varchar(30) NOT NULL -); - -CREATE TABLE `cat_status` ( - `status_id` uuid PRIMARY KEY NOT NULL, - `name` varchar(30) NOT NULL, - `description` varchar(100) DEFAULT null -); - -CREATE TABLE `role` ( - `role_id` uuid PRIMARY KEY NOT NULL, - `name` varchar(20) NOT NULL, - `description` varchar(100) DEFAULT null -); - -CREATE TABLE `grade_groups` ( - `grade_group_id` uuid PRIMARY KEY NOT NULL, - `level_education_id` uuid NOT NULL, - `grade_name` varchar(50) NOT NULL, - `group_name` varchar(10) NOT NULL, - `label` varchar(20) UNIQUE NOT NULL -); - -CREATE TABLE `cat_educational_level` ( - `level_education_id` uuid PRIMARY KEY NOT NULL, - `name` varchar(50) NOT NULL, - `short_name` varchar(10) -); - -CREATE TABLE `cat_work_shifts` ( - `shifts_works_id` uuid PRIMARY KEY NOT NULL, - `name` varchar(50) NOT NULL -); - -CREATE TABLE `asset_conditions` ( - `condition_id` uuid PRIMARY KEY NOT NULL, - `name` varchar(100) NOT NULL, - `description` varchar(255) DEFAULT null -); - -CREATE TABLE `supply_units` ( - `unit_id` uuid PRIMARY KEY NOT NULL, - `name` varchar(100) NOT NULL, - `symbol` varchar(20) DEFAULT null -); - -CREATE TABLE `diagnostic` ( - `diagnostic_id` uuid PRIMARY KEY NOT NULL, - `student_id` uuid NOT NULL, - `teacher_id` uuid NOT NULL, - `grade_group_id` uuid NOT NULL, - `level_education_id` uuid NOT NULL, - `gender_id` uuid NOT NULL, - `family_income` decimal(12,2) NOT NULL COMMENT 'Ingreso familiar mensual en moneda local', - `number_of_family_members` int NOT NULL COMMENT 'Número total de integrantes en la familia', - `number_of_siblings` int NOT NULL, - `parents_marital_status` varchar(50) NOT NULL COMMENT 'Estado civil de los padres', - `housing_type` varchar(100) NOT NULL COMMENT 'Tipo de vivienda: propia, rentada, prestada, etc.', - `housing_condition` varchar(100) NOT NULL COMMENT 'Condición de la vivienda: buena, regular, mala', - `number_of_rooms` int NOT NULL COMMENT 'Número de habitaciones en la vivienda', - `father_education_level` varchar(100) NOT NULL, - `mother_education_level` varchar(100) NOT NULL, - `father_employment_status` varchar(100) NOT NULL, - `mother_employment_status` varchar(100) NOT NULL, - `father_occupation` varchar(150) NOT NULL, - `mother_occupation` varchar(150) NOT NULL, - `has_running_water` boolean NOT NULL DEFAULT false, - `has_electricity` boolean NOT NULL DEFAULT false, - `has_internet_access` boolean NOT NULL DEFAULT false, - `internet_type` varchar(100) DEFAULT null COMMENT 'Fibra óptica, móvil, etc.', - `has_study_space` boolean NOT NULL DEFAULT false, - `study_space_description` varchar(255) DEFAULT null, - `health_issues` text DEFAULT null COMMENT 'Enfermedades o condiciones de salud del estudiante o familia', - `has_health_insurance` boolean NOT NULL DEFAULT false, - `type_of_health_insurance` varchar(100) DEFAULT null, - `transport_to_school` varchar(100) NOT NULL COMMENT 'Cómo llega el estudiante a la escuela', - `transport_time_minutes` int DEFAULT null COMMENT 'Tiempo aproximado de traslado en minutos', - `devices_available` varchar(255) DEFAULT null COMMENT 'Dispositivos tecnológicos en casa (PC, tablet, celular)', - `extracurricular_activities` varchar(255) DEFAULT null, - `family_support_for_studies` varchar(255) DEFAULT null COMMENT 'Nivel de apoyo que la familia brinda para estudios', - `additional_notes` text DEFAULT null, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) -); - -CREATE TABLE `permissions` ( - `permissions_id` uuid PRIMARY KEY NOT NULL, - `module_id` uuid NOT NULL, - `action_id` uuid NOT NULL, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) -); - -CREATE TABLE `actions` ( - `actions_id` uuid PRIMARY KEY NOT NULL, - `name` varchar(50) NOT NULL, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) -); - + `emergency_phone` varchar(15) DEFAULT NULL, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `status_id` char(36) NOT NULL, + PRIMARY KEY (`teacher_id`), + UNIQUE KEY `email` (`email`), + KEY `teachers_ibfk_1_idx` (`user_id`), + KEY `teachers_ibfk_2_idx` (`location_id`), + KEY `teachers_ibfk_3_idx` (`gender_id`), + KEY `teachers_ibfk_4_idx` (`level_studies_id`), + KEY `teachers_ibfk_5_idx` (`grade_group_id`), + KEY `teachers_ibfk_6_idx` (`work_shift_id`), + KEY `teachers_ibfk_7_idx` (`status_id`), + CONSTRAINT `teachers_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`), + CONSTRAINT `teachers_ibfk_2` FOREIGN KEY (`location_id`) REFERENCES `cat_classrooms` (`location_id`), + CONSTRAINT `teachers_ibfk_3` FOREIGN KEY (`gender_id`) REFERENCES `cat_gender` (`gender_id`), + CONSTRAINT `teachers_ibfk_4` FOREIGN KEY (`level_studies_id`) REFERENCES `cat_educational_level` (`level_education_id`), + CONSTRAINT `teachers_ibfk_5` FOREIGN KEY (`grade_group_id`) REFERENCES `grade_groups` (`grade_group_id`), + CONSTRAINT `teachers_ibfk_6` FOREIGN KEY (`work_shift_id`) REFERENCES `cat_work_shifts` (`shifts_works_id`), + CONSTRAINT `teachers_ibfk_7` FOREIGN KEY (`status_id`) REFERENCES `cat_status` (`status_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `teachers` +-- + +LOCK TABLES `teachers` WRITE; +/*!40000 ALTER TABLE `teachers` DISABLE KEYS */; +/*!40000 ALTER TABLE `teachers` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `user_permissions` +-- + +DROP TABLE IF EXISTS `user_permissions`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `user_permissions` ( - `user_permissions_id` uuid PRIMARY KEY NOT NULL, - `user_id` uuid NOT NULL, - `permission_id` uuid NOT NULL, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) -); - -CREATE TABLE `modules` ( - `module_id` uuid PRIMARY KEY NOT NULL, - `name` varchar(100) NOT NULL, - `created` datetime DEFAULT (CURRENT_TIMESTAMP), - `updated` datetime DEFAULT (CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) -); - -ALTER TABLE `grade_groups` ADD FOREIGN KEY (`level_education_id`) REFERENCES `cat_educational_level` (`level_education_id`); - -ALTER TABLE `diagnostic` ADD FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`); - -ALTER TABLE `diagnostic` ADD FOREIGN KEY (`teacher_id`) REFERENCES `teachers` (`teacher_id`); - -ALTER TABLE `diagnostic` ADD FOREIGN KEY (`grade_group_id`) REFERENCES `grade_groups` (`grade_group_id`); - -ALTER TABLE `diagnostic` ADD FOREIGN KEY (`level_education_id`) REFERENCES `cat_educational_level` (`level_education_id`); - -ALTER TABLE `diagnostic` ADD FOREIGN KEY (`gender_id`) REFERENCES `cat_gender` (`gender_id`); - -ALTER TABLE `teachers` ADD FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`); - -ALTER TABLE `student_teacher_history` ADD FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`); - -ALTER TABLE `student_teacher_history` ADD FOREIGN KEY (`teacher_id`) REFERENCES `teachers` (`teacher_id`); - -ALTER TABLE `user_permissions` ADD FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`); - -ALTER TABLE `modules` ADD FOREIGN KEY (`module_id`) REFERENCES `permissions` (`module_id`); - -ALTER TABLE `permissions` ADD FOREIGN KEY (`permissions_id`) REFERENCES `user_permissions` (`permission_id`); - -ALTER TABLE `actions` ADD FOREIGN KEY (`actions_id`) REFERENCES `permissions` (`action_id`); - -ALTER TABLE `asset_conditions` ADD FOREIGN KEY (`condition_id`) REFERENCES `cat_assets` (`condition_id`); - -ALTER TABLE `supply_units` ADD FOREIGN KEY (`unit_id`) REFERENCES `cat_supplies` (`unit_id`); - -ALTER TABLE `asset_conditions` ADD FOREIGN KEY (`condition_id`) REFERENCES `cat_inventory` (`condition_id`); - -ALTER TABLE `cat_supplier` ADD FOREIGN KEY (`supplier_id`) REFERENCES `cat_supplies` (`supplier_id`); - -ALTER TABLE `cat_classrooms` ADD FOREIGN KEY (`location_id`) REFERENCES `cat_inventory` (`location_id`); - -ALTER TABLE `cat_classrooms` ADD FOREIGN KEY (`location_id`) REFERENCES `cat_assets` (`location_id`); - -ALTER TABLE `cat_classrooms` ADD FOREIGN KEY (`location_id`) REFERENCES `teachers` (`location_id`); - -ALTER TABLE `cat_gender` ADD FOREIGN KEY (`gender_id`) REFERENCES `teachers` (`gender_id`); - -ALTER TABLE `cat_gender` ADD FOREIGN KEY (`gender_id`) REFERENCES `parents` (`gender_id`); - -ALTER TABLE `cat_gender` ADD FOREIGN KEY (`gender_id`) REFERENCES `students` (`gender_id`); - -ALTER TABLE `student_parents` ADD FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`); - -ALTER TABLE `student_parents` ADD FOREIGN KEY (`parents_id`) REFERENCES `parents` (`parents_id`); - -ALTER TABLE `role` ADD FOREIGN KEY (`role_id`) REFERENCES `users` (`role_id`); - -ALTER TABLE `cat_work_shifts` ADD FOREIGN KEY (`shifts_works_id`) REFERENCES `teachers` (`work_shift_id`); - -ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `cat_supplies` (`status_id`); - -ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `cat_assets` (`status_id`); - -ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `teachers` (`status_id`); - -ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `users` (`status_id`); - -ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `cat_inventory` (`status_id`); - -ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `parents` (`status_id`); - -ALTER TABLE `cat_status` ADD FOREIGN KEY (`status_id`) REFERENCES `students` (`status_id`); - -ALTER TABLE `students` ADD FOREIGN KEY (`work_shift_id`) REFERENCES `cat_work_shifts` (`shifts_works_id`); - -ALTER TABLE `parents` ADD FOREIGN KEY (`work_shift_id`) REFERENCES `cat_work_shifts` (`shifts_works_id`); - -ALTER TABLE `parents` ADD FOREIGN KEY (`grade_group_id`) REFERENCES `grade_groups` (`grade_group_id`); - -ALTER TABLE `grade_groups` ADD FOREIGN KEY (`grade_group_id`) REFERENCES `students` (`grade_group_id`); - -ALTER TABLE `grade_groups` ADD FOREIGN KEY (`grade_group_id`) REFERENCES `teachers` (`grade_group_id`); - -ALTER TABLE `grade_groups` ADD FOREIGN KEY (`grade_group_id`) REFERENCES `student_teacher_history` (`grade_group_id`); - -ALTER TABLE `cat_educational_level` ADD FOREIGN KEY (`level_education_id`) REFERENCES `teachers` (`level_studies_id`); - -ALTER TABLE `cat_educational_level` ADD FOREIGN KEY (`level_education_id`) REFERENCES `parents` (`level_studies_id`); - -ALTER TABLE `teachers` ADD FOREIGN KEY (`teacher_id`) REFERENCES `students` (`teacher_id`); + `user_permissions_id` char(36) NOT NULL, + `user_id` char(36) NOT NULL, + `permissions_id` char(36) NOT NULL, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`user_permissions_id`), + KEY `user_id` (`user_id`), + KEY `user_permissions_ibfk_1` (`permissions_id`), + CONSTRAINT `user_permissions_ibfk_1` FOREIGN KEY (`permissions_id`) REFERENCES `permissions` (`permissions_id`), + CONSTRAINT `user_permissions_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `user_permissions` +-- + +LOCK TABLES `user_permissions` WRITE; +/*!40000 ALTER TABLE `user_permissions` DISABLE KEYS */; +/*!40000 ALTER TABLE `user_permissions` ENABLE KEYS */; +UNLOCK TABLES; + +-- +-- Table structure for table `users` +-- + +DROP TABLE IF EXISTS `users`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `users` ( + `user_id` char(36) NOT NULL, + `role_id` varchar(50) DEFAULT NULL, + `name_user` varchar(100) NOT NULL, + `email` varchar(100) NOT NULL, + `password` varchar(100) NOT NULL, + `profile_picture` varchar(500) DEFAULT NULL, + `account_type` varchar(20) NOT NULL, + `last_login` datetime DEFAULT NULL, + `created` datetime DEFAULT (now()), + `updated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `status_id` char(36) NOT NULL, + PRIMARY KEY (`user_id`), + UNIQUE KEY `email` (`email`), + KEY `users_ibfk_1_idx` (`role_id`), + KEY `users_ibfk_2_idx` (`status_id`), + CONSTRAINT `users_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `role` (`role_id`), + CONSTRAINT `users_ibfk_2` FOREIGN KEY (`status_id`) REFERENCES `cat_status` (`status_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `users` +-- + +LOCK TABLES `users` WRITE; +/*!40000 ALTER TABLE `users` DISABLE KEYS */; +/*!40000 ALTER TABLE `users` ENABLE KEYS */; +UNLOCK TABLES; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-07-15 5:03:35 From fc4d0381cfa4737ae6825ee5c443b90020e1d2ff Mon Sep 17 00:00:00 2001 From: Erick Muke Date: Thu, 17 Jul 2025 02:53:58 -0600 Subject: [PATCH 16/20] fix(users): Se restructura todos los endpoints de usuarios por la nueva base de datos --- ...inistracion de Jardin de ni\303\261os.pdf" | Bin 1780348 -> 1761178 bytes README.md | 2 - ...inistracion de jardin de ni\303\261os.svg" | 4 +- database.sql | 76 +++++------------- .../users/functions/users.controllers.js | 1 + src/helpers/delete.helpers.js | 11 +++ src/helpers/findUserByEmail.helpers.js | 7 +- src/helpers/getUserByEmail.helpers.js | 16 +++- src/helpers/getUserByEmailAndId.helpers.js | 2 +- src/helpers/jwt.helpers.js | 20 +---- src/helpers/userLastLogin.helpers.js | 2 +- src/middleware/verificarToken.middleware.js | 6 +- src/models/users/functions/delete.models.js | 10 +-- src/models/users/functions/insert.models.js | 13 ++- src/models/users/functions/register.models.js | 12 +-- src/models/users/functions/update.models.js | 52 ++++++------ src/routes/users.routes.js | 9 +-- src/services/users/functions/auth.services.js | 16 +--- .../users/functions/delete.services.js | 13 +-- .../users/functions/insert.services.js | 28 +++---- src/services/users/functions/list.services.js | 27 +++++-- .../users/functions/register.services.js | 6 +- .../users/functions/search.services.js | 22 ++++- .../users/functions/update.services.js | 48 +++++------ 24 files changed, 197 insertions(+), 206 deletions(-) create mode 100644 src/helpers/delete.helpers.js diff --git "a/Administracion de Jardin de ni\303\261os.pdf" "b/Administracion de Jardin de ni\303\261os.pdf" index 9b6188c4312d93bb336468edf604efaa677a3645..5b23e715ea87a9f6e117b67262087880b013e471 100644 GIT binary patch delta 161053 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