├── src ├── adapters │ ├── nestjs.ts │ ├── express.ts │ └── fastify.ts ├── deque.ts └── index.ts ├── CONTRIBUTING.md ├── .gitignore ├── jest.config.js ├── .editorconfig ├── tsconfig.json ├── examples ├── express │ └── index.ts └── fastify │ └── index.ts ├── LICENSE ├── benchmark └── k6.js ├── test ├── deque.test.ts └── adapter-fastify.test.ts ├── package.json ├── README.md └── pnpm-lock.yaml /src/adapters/nestjs.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Set up 2 | - `pnpm i` -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | *.log -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('ts-jest').JestConfigWithTsJest} */ 2 | module.exports = { 3 | preset: 'ts-jest', 4 | testEnvironment: 'node', 5 | }; -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2021", 4 | "module": "esnext", 5 | "strict": true, 6 | "esModuleInterop": true, 7 | "moduleResolution": "node", 8 | "skipLibCheck": true, 9 | "noUnusedLocals": true, 10 | "noImplicitAny": true, 11 | "allowJs": true, 12 | "noEmit": true, 13 | "forceConsistentCasingInFileNames": true, 14 | "outDir": "dist", 15 | "resolveJsonModule": true, 16 | "types": [ 17 | "node", 18 | "jest" 19 | ], 20 | "lib": [ 21 | "ES2021" 22 | ], 23 | } 24 | } -------------------------------------------------------------------------------- /examples/express/index.ts: -------------------------------------------------------------------------------- 1 | import express from 'express' 2 | import { rateLimitExpress } from '../../src/adapters/express' 3 | 4 | const app = express() 5 | 6 | app.use(rateLimitExpress()); 7 | 8 | const wait = (ms: number) => new Promise((resolve) => setTimeout(() => { 9 | const start = Date.now() 10 | while (Date.now() - start < 10) { } 11 | resolve(null); 12 | }, ms)); 13 | 14 | app.get('/', async function handler(req, res) { 15 | // 150ms async, 30ms sync waiting. Possible rps = less 33 16 | await wait(50); 17 | await wait(50); 18 | await wait(50); 19 | 20 | res.json({ hello: 'world' }) 21 | }) 22 | 23 | app.listen({ port: 3001 }) 24 | -------------------------------------------------------------------------------- /examples/fastify/index.ts: -------------------------------------------------------------------------------- 1 | import Fastify from 'fastify' 2 | import { rateLimitFastify } from '../../src/adapters/fastify' 3 | 4 | const fastify = Fastify({ 5 | logger: false 6 | }) 7 | 8 | fastify.register(rateLimitFastify); 9 | 10 | const wait = (ms: number) => new Promise((resolve) => setTimeout(() => { 11 | const start = Date.now() 12 | while (Date.now() - start < 10) { } 13 | resolve(null); 14 | }, ms)); 15 | 16 | fastify.get('/', async function handler(request, reply) { 17 | // 150ms async, 30ms sync waiting. Possible rps = less 33 18 | await wait(50); 19 | await wait(50); 20 | await wait(50); 21 | 22 | return { hello: 'world' } 23 | }) 24 | 25 | async function main() { 26 | try { 27 | await fastify.listen({ port: 3001 }) 28 | } catch (err) { 29 | fastify.log.error(err) 30 | process.exit(1) 31 | } 32 | } 33 | 34 | main(); 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Andrey Marchenko 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /benchmark/k6.js: -------------------------------------------------------------------------------- 1 | import http from 'k6/http'; 2 | import { Counter } from 'k6/metrics'; 3 | 4 | const SuccessResponses = new Counter('custom_success_responses'); 5 | const ClientErrors = new Counter('custom_client_errors'); 6 | const RateLimitErrors = new Counter('custom_rate_limit_errors'); 7 | const ServerErrors = new Counter('custom_server_errors'); 8 | const TimeoutRequests = new Counter('custom_timeout_requests'); 9 | 10 | export const options = { 11 | stages: [ 12 | { duration: '5s', target: 10 }, 13 | { duration: '10s', target: 200 }, 14 | { duration: '2m', target: 200 }, 15 | { duration: '5s', target: 10 } 16 | ], 17 | userAgent: 'MyK6UserAgentString/1.0', 18 | }; 19 | 20 | export default function () { 21 | const res = http.get('http://127.0.0.1:3001/', { timeout: '4s' }); 22 | 23 | if (res.status === 200) { 24 | SuccessResponses.add(1); 25 | } else if (res.status === 429) { 26 | RateLimitErrors.add(1); 27 | } else if (res.status >= 400 && res.status < 500) { 28 | ClientErrors.add(1); 29 | } else if (res.status >= 500) { 30 | ServerErrors.add(1); 31 | } else if (res.timed_out) { 32 | TimeoutRequests.add(1); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/deque.ts: -------------------------------------------------------------------------------- 1 | export class Deque { 2 | private newStack: Value[] = []; 3 | private oldStack: Value[] = []; 4 | private oldStackFirstIndex = 0; 5 | 6 | push(value: Value): void { 7 | this.newStack.push(value); 8 | } 9 | 10 | pop() { 11 | if (this.newStack.length !== 0) { 12 | return this.newStack.pop(); 13 | } 14 | if ( 15 | this.oldStack.length !== 0 && 16 | this.oldStackFirstIndex < this.oldStack.length 17 | ) { 18 | return this.oldStack.pop(); 19 | } 20 | 21 | return null; 22 | } 23 | 24 | shift() { 25 | if (this.size() === 0) { 26 | return null; 27 | } 28 | 29 | if (this.newStack.length !== 0) { 30 | if ( 31 | this.oldStack.length === 0 || 32 | this.oldStackFirstIndex === this.oldStack.length 33 | ) { 34 | this.oldStack = this.newStack; 35 | this.oldStackFirstIndex = 0; 36 | this.newStack = []; 37 | } 38 | } 39 | 40 | const value = this.oldStack[this.oldStackFirstIndex]; 41 | this.oldStack[this.oldStackFirstIndex] = this.oldStack[0]; // remove element 42 | 43 | this.oldStackFirstIndex++; 44 | 45 | return value; 46 | } 47 | 48 | size() { 49 | return ( 50 | this.newStack.length + this.oldStack.length - this.oldStackFirstIndex 51 | ); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/adapters/express.ts: -------------------------------------------------------------------------------- 1 | import type { Request, Response, NextFunction } from 'express'; 2 | import onFinished from 'on-finished'; 3 | import { RateLimit, RateLimitOptions } from '../index'; 4 | 5 | export interface RequestLimiterRequest { 6 | req: Request; 7 | res: Response; 8 | next: NextFunction; 9 | } 10 | 11 | export interface ExpressRateLimitOptions extends Partial, 'handleNextRequest' | 'handleDiscardedRequest' | 'isRequestExpired'>> { 12 | errorResponseBuilder?: (payload: RequestLimiterRequest) => any; 13 | isImportantRequest?: (payload: RequestLimiterRequest) => boolean; 14 | } 15 | 16 | const defaultErrorResponseBuilder = (payload: RequestLimiterRequest) => { 17 | payload.res.status(429); 18 | if (!payload.res.writableEnded) { 19 | payload.res.send('Too Many Requests'); 20 | } 21 | } 22 | 23 | export const rateLimitExpress = (options: ExpressRateLimitOptions = {}) => { 24 | const errorResponseBuilder = options.errorResponseBuilder || defaultErrorResponseBuilder; 25 | const hasImportantQueue = !!options.isImportantRequest;; 26 | 27 | const rateLimit = new RateLimit({ 28 | ...options, 29 | hasImportantQueue, 30 | handleNextRequest: (payload) => { 31 | onFinished(payload.res, () => { 32 | rateLimit.finish() 33 | }); 34 | 35 | payload.next(); 36 | }, 37 | handleDiscardedRequest: (payload) => { 38 | errorResponseBuilder(payload) 39 | }, 40 | isRequestExpired: (payload) => { 41 | return payload.req.socket.destroyed; 42 | } 43 | }); 44 | return (req: Request, res: Response, next: NextFunction) => { 45 | const payload = { req, res, next }; 46 | rateLimit.add(payload, hasImportantQueue && options.isImportantRequest!(payload)); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/adapters/fastify.ts: -------------------------------------------------------------------------------- 1 | import type { FastifyRequest, FastifyReply, HookHandlerDoneFunction } from 'fastify'; 2 | import fp from 'fastify-plugin'; 3 | import onFinished from 'on-finished'; 4 | 5 | import { RateLimit, RateLimitOptions } from '../index'; 6 | 7 | export interface RateLimitRequest { 8 | req: FastifyRequest; 9 | reply: FastifyReply; 10 | done: HookHandlerDoneFunction; 11 | } 12 | 13 | export interface FastifyRateLimitOptions extends Partial, 'handleNextRequest' | 'handleDiscardedRequest' | 'isRequestExpired'>> { 14 | errorResponseBuilder?: (payload: RateLimitRequest) => any; 15 | isImportantRequest?: (payload: RateLimitRequest) => boolean; 16 | } 17 | 18 | const defaultErrorResponseBuilder = (payload: RateLimitRequest) => { 19 | const error = new Error(`RATE_LIMIT_EXCEEDED, Too Many Requests`); 20 | (error as any).statusCode = 429; 21 | return error; 22 | } 23 | 24 | export const rateLimitFastify = fp(async (fastify, options: FastifyRateLimitOptions) => { 25 | const errorResponseBuilder = options.errorResponseBuilder || defaultErrorResponseBuilder; 26 | const hasImportantQueue = !!options.isImportantRequest;; 27 | 28 | const rateLimit = new RateLimit({ 29 | ...options, 30 | hasImportantQueue, 31 | handleNextRequest: (payload) => { 32 | onFinished(payload.reply.raw, () => { 33 | rateLimit.finish() 34 | }); 35 | 36 | payload.done(); 37 | }, 38 | handleDiscardedRequest: (payload) => { 39 | payload.done(errorResponseBuilder(payload)); 40 | }, 41 | isRequestExpired: (payload) => { 42 | return payload.req.raw.socket.destroyed; 43 | } 44 | }); 45 | 46 | fastify.addHook('onRequest', (req, reply, done) => { 47 | const payload = { req, reply, done }; 48 | rateLimit.add(payload, hasImportantQueue && options.isImportantRequest!(payload)); 49 | }); 50 | 51 | fastify.addHook('onClose', (instance, done) => { 52 | rateLimit.destroy(); 53 | done(); 54 | }); 55 | }); 56 | -------------------------------------------------------------------------------- /test/deque.test.ts: -------------------------------------------------------------------------------- 1 | import { Deque } from "../src/deque"; 2 | 3 | describe("Deque", () => { 4 | test('should push and pop', () => { 5 | const deque = new Deque(); 6 | deque.push(1); 7 | deque.push(2); 8 | deque.push(3); 9 | expect(deque.pop()).toBe(3); 10 | expect(deque.pop()).toBe(2); 11 | expect(deque.pop()).toBe(1); 12 | }); 13 | 14 | test('should push and shift', () => { 15 | const deque = new Deque(); 16 | deque.push(1); 17 | deque.push(2); 18 | deque.push(3); 19 | expect(deque.shift()).toBe(1); 20 | expect(deque.shift()).toBe(2); 21 | expect(deque.shift()).toBe(3); 22 | }); 23 | 24 | test('should push and shift and pop', () => { 25 | const deque = new Deque(); 26 | deque.push(1); 27 | deque.push(2); 28 | deque.push(3); 29 | expect(deque.shift()).toBe(1); 30 | expect(deque.size()).toBe(2); 31 | expect(deque.pop()).toBe(3); 32 | expect(deque.size()).toBe(1); 33 | expect(deque.shift()).toBe(2); 34 | expect(deque.size()).toBe(0); 35 | deque.push(4); 36 | expect(deque.size()).toBe(1); 37 | expect(deque.shift()).toBe(4); 38 | expect(deque.size()).toBe(0); 39 | expect(deque.shift()).toBe(null); 40 | expect(deque.pop()).toBe(null); 41 | }); 42 | 43 | test('should works and return correct result value with Bitwise calculation', () => { 44 | const deque = new Deque(); 45 | let result = 1; 46 | for (let i = 0; i < 1000; i++) { 47 | deque.push(i); 48 | } 49 | 50 | for (let i = 0; i < 250; i++) { 51 | result = (result * (deque.pop() || 1)) % 1000000007 52 | } 53 | expect(deque.size()).toBe(750); 54 | for (let i = 0; i < 250; i++) { 55 | result = (result * (deque.shift() || 1)) % 1000000007 56 | } 57 | expect(deque.size()).toBe(500); 58 | for (let i = 0; i < 250; i++) { 59 | result = (result * (deque.shift() || 1)) % 1000000007 60 | } 61 | expect(deque.size()).toBe(250); 62 | for (let i = 0; i < 250; i++) { 63 | result = (result * (deque.pop() || 1)) % 1000000007 64 | } 65 | 66 | expect(result).toBe(756641425); 67 | }); 68 | }); 69 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rate-limit-guard", 3 | "version": "1.0.0", 4 | "description": "Rate limit guard is a library that helps to prevent overload of the Node.js server. This plugin can help to reduce the timing of the execution of requests. Usually, if you have more requests than your applications can handle it creates a big queue of requests, that consumes more memory and more CPU, a lot of requests will be executed in parallel. As a result, your server will be paralyzed. This library can help to prevent this problem by limiting the amount of executed requests and controlling the health of your server based on the event loop delay.", 5 | "keywords": [ 6 | "rate limit", 7 | "Anti DDOS" 8 | ], 9 | "homepage": "https://github.com/Tom910/rate-limit-guard", 10 | "repository": { 11 | "type": "git", 12 | "url": "git@github.com:Tom910/rate-limit-guard.git" 13 | }, 14 | "publishConfig": { 15 | "access": "public" 16 | }, 17 | "files": [ 18 | "dist" 19 | ], 20 | "main": "./dist/index.js", 21 | "module": "./dist/index.mjs", 22 | "exports": { 23 | ".": { 24 | "require": "./dist/index.js", 25 | "import": "./dist/index.mjs" 26 | }, 27 | "./adapters/fastify": { 28 | "require": "./dist/adapters/fastify.js", 29 | "import": "./dist/adapters/fastify.mjs" 30 | }, 31 | "./adapters/express": { 32 | "require": "./dist/adapters/express.js", 33 | "import": "./dist/adapters/express.mjs" 34 | } 35 | }, 36 | "types": "./dist/index.d.ts", 37 | "tsup": { 38 | "entryPoints": [ 39 | "src/index.ts", 40 | "src/adapters/fastify.ts", 41 | "src/adapters/express.ts" 42 | ], 43 | "format": [ 44 | "cjs", 45 | "esm" 46 | ], 47 | "dts": true, 48 | "treeshake": true, 49 | "clean": true 50 | }, 51 | "scripts": { 52 | "build": "tsup", 53 | "test": "jest", 54 | "example:fastify": "ts-node --compiler-options \"{\\\"module\\\":\\\"commonjs\\\"}\" examples/fastify/index.ts", 55 | "example:express": "ts-node --compiler-options \"{\\\"module\\\":\\\"commonjs\\\"}\" examples/express/index.ts", 56 | "prepublishOnly": "pnpm run build" 57 | }, 58 | "license": "MIT", 59 | "devDependencies": { 60 | "@types/express": "^4.17.17", 61 | "@types/jest": "^29.5.4", 62 | "@types/node": "^18", 63 | "@types/on-finished": "^2.3.1", 64 | "express": "^4.18.2", 65 | "fastify": "^4.22.0", 66 | "fastify-plugin": "^4.5.1", 67 | "jest": "^29.6.4", 68 | "on-finished": "^2.4.1", 69 | "prettier": "^2.8.8", 70 | "ts-jest": "^29.1.1", 71 | "ts-node": "^10.9.1", 72 | "tsup": "^7.2.0", 73 | "typescript": "^5.2.2" 74 | } 75 | } -------------------------------------------------------------------------------- /test/adapter-fastify.test.ts: -------------------------------------------------------------------------------- 1 | import fastify, { FastifyInstance } from "fastify"; 2 | import { rateLimitFastify } from "../src/adapters/fastify"; 3 | 4 | const wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); 5 | 6 | const errorResponseBuilder = (payload: any) => { 7 | const error = new Error(`index ${payload.req.query.index}`); 8 | (error as any).statusCode = 429; 9 | return error; 10 | }; 11 | 12 | describe("rateLimitFastify", () => { 13 | let server: FastifyInstance; 14 | 15 | beforeEach(async () => { 16 | server = fastify(); 17 | server.register(rateLimitFastify, { 18 | isImportantRequest: (payload) => payload.req.url === "/priority", 19 | errorResponseBuilder, 20 | }); 21 | server.get("/", async (req, reply) => { 22 | await wait(10); 23 | const { index } = req.query as any; 24 | return { type: "normal", index: +index || 0 }; 25 | }); 26 | server.get("/priority", async (req, reply) => { 27 | await wait(10); 28 | reply.send({ type: "priority" }); 29 | }); 30 | await server.ready(); 31 | }); 32 | 33 | afterEach(async () => { 34 | await server.close(); 35 | }); 36 | 37 | it("should handle requests and call done", async () => { 38 | const response = await server.inject({ 39 | method: "GET", 40 | url: "/", 41 | query: { index: "0" }, 42 | }); 43 | 44 | expect(response.statusCode).toBe(200); 45 | expect(response.json()).toEqual({ type: "normal", index: 0 }); 46 | }); 47 | 48 | it("should limit the requests when reaching the threshold", async () => { 49 | //@ts-ignore 50 | const promises = []; 51 | for (let i = 0; i < 120; i++) { 52 | promises.push( 53 | server.inject({ method: "GET", url: "/", query: { index: `${i}` } }) 54 | ); 55 | } 56 | 57 | const results: number[][] = []; 58 | await Promise.all(promises).then((responses) => { 59 | responses.forEach((response) => { 60 | results.push([response.statusCode, response.json().message]); 61 | }); 62 | }); 63 | 64 | const byStatuses = results.reduce>((acc, status) => { 65 | const label = status[0].toString(); 66 | acc[label] = (acc[label] || 0) + 1; 67 | return acc; 68 | }, {}); 69 | 70 | expect(byStatuses["200"]).toBe(110); // 100 queue + 10 active = 110 running requests 71 | expect(byStatuses["429"]).toBe(10); // 10 requests was rejected 72 | // first 10 requests should be handled first next 10 requests should be rejected 73 | expect(results.filter((r) => r[0] === 429)).toMatchInlineSnapshot(` 74 | [ 75 | [ 76 | 429, 77 | "index 10", 78 | ], 79 | [ 80 | 429, 81 | "index 11", 82 | ], 83 | [ 84 | 429, 85 | "index 12", 86 | ], 87 | [ 88 | 429, 89 | "index 13", 90 | ], 91 | [ 92 | 429, 93 | "index 14", 94 | ], 95 | [ 96 | 429, 97 | "index 15", 98 | ], 99 | [ 100 | 429, 101 | "index 16", 102 | ], 103 | [ 104 | 429, 105 | "index 17", 106 | ], 107 | [ 108 | 429, 109 | "index 18", 110 | ], 111 | [ 112 | 429, 113 | "index 19", 114 | ], 115 | ] 116 | `); 117 | }); 118 | 119 | it("priority requests should be handled first", async () => { 120 | const results: string[] = []; 121 | const promises = []; 122 | for (let i = 0; i < 100; i++) { 123 | promises.push( 124 | server.inject({ method: "GET", url: "/" }).then((response) => { 125 | results.push(response.json().type); 126 | }) 127 | ); 128 | promises.push( 129 | server.inject({ method: "GET", url: "/priority" }).then((response) => { 130 | results.push(response.json().type); 131 | }) 132 | ); 133 | } 134 | 135 | await Promise.all(promises); 136 | 137 | const lastPriorityIndex = results.lastIndexOf("priority"); 138 | expect(results.length).toBe(200); 139 | // need to run 100 priority requests first 140 | expect(lastPriorityIndex < 140).toBe(true); 141 | }); 142 | }); 143 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import type { IntervalHistogram } from 'perf_hooks'; 2 | import { monitorEventLoopDelay } from 'perf_hooks'; 3 | import { Deque } from './deque'; 4 | 5 | export const DEFAULT_OPTIONS = { 6 | activeLimit: 10, 7 | queueLimit: 100, 8 | maxEventLoopDelay: 100, 9 | hasImportantQueue: false, 10 | isRequestExpired: () => false, 11 | }; 12 | 13 | export interface RateLimitOptions { 14 | hasImportantQueue: boolean; 15 | activeLimit: number; 16 | queueLimit: number; 17 | maxEventLoopDelay: number; 18 | handleDiscardedRequest: (payload: Payload) => void; 19 | handleNextRequest: (payload: Payload) => void; 20 | isRequestExpired: (payload: Payload) => boolean; 21 | } 22 | 23 | const resolution = 10; 24 | 25 | type PartialExcept = Partial & { [P in K]: T[P] } 26 | 27 | export class RateLimit { 28 | private currentActive = 0; 29 | private queue = new Deque(); 30 | private queueImportant = new Deque(); 31 | private minimalActiveRequestLimit: number; 32 | private eventLoopHistogram: IntervalHistogram; 33 | 34 | private activeLimit: RateLimitOptions['activeLimit']; 35 | private queueLimit: RateLimitOptions['queueLimit']; 36 | private handleDiscardedRequest: RateLimitOptions['handleDiscardedRequest']; 37 | private handleNextRequest: RateLimitOptions['handleNextRequest']; 38 | private isRequestExpired: RateLimitOptions['isRequestExpired']; 39 | private maxEventLoopDelay: RateLimitOptions['maxEventLoopDelay']; 40 | private hasImportantQueue: RateLimitOptions['hasImportantQueue']; 41 | private timer: NodeJS.Timer; 42 | 43 | constructor(userOptions: PartialExcept, 'handleDiscardedRequest' | 'handleNextRequest'>) { 44 | const options = { 45 | ...DEFAULT_OPTIONS, 46 | ...userOptions 47 | } 48 | 49 | this.hasImportantQueue = options.hasImportantQueue; 50 | this.activeLimit = options.activeLimit; 51 | this.queueLimit = options.queueLimit; 52 | this.maxEventLoopDelay = options.maxEventLoopDelay; 53 | this.handleDiscardedRequest = options.handleDiscardedRequest; 54 | this.handleNextRequest = options.handleNextRequest; 55 | this.isRequestExpired = options.isRequestExpired; 56 | 57 | this.minimalActiveRequestLimit = Math.round(this.activeLimit / 3); 58 | 59 | this.eventLoopHistogram = monitorEventLoopDelay({ resolution }); 60 | this.eventLoopHistogram.enable(); 61 | 62 | this.timer = setInterval(() => this.nextTick(), 1000); 63 | this.timer.unref(); 64 | } 65 | 66 | add(data: Payload, isImportantRequest: boolean) { 67 | if (this.currentActive < this.activeLimit) { 68 | this.run(data); 69 | return; 70 | } 71 | 72 | // for important requests we have separate queue 73 | if (isImportantRequest) { 74 | return this.addRun(this.queueImportant, data); 75 | } 76 | 77 | return this.addRun(this.queue, data); 78 | } 79 | 80 | private addRun(queue: Deque, data: Payload) { 81 | if (queue.size() >= this.queueLimit) { 82 | const lastNode = queue.shift(); 83 | 84 | this.handleDiscardedRequest(lastNode) 85 | } 86 | queue.push(data); 87 | } 88 | 89 | finish() { 90 | this.currentActive--; 91 | this.loop(); 92 | } 93 | 94 | destroy() { 95 | clearInterval(this.timer) 96 | } 97 | 98 | // General idea is change limits every second. Because if DDOS was happened we need some time to get problem with event loop. And better if we slowly adapt 99 | private nextTick() { 100 | let eventLoopDelay = Math.max(0, this.eventLoopHistogram.mean / 1e6 - resolution); 101 | if (Number.isNaN(eventLoopDelay)) eventLoopDelay = Infinity; 102 | this.eventLoopHistogram.reset(); 103 | 104 | if (this.maxEventLoopDelay >= eventLoopDelay) { 105 | if (this.currentActive >= this.activeLimit) { 106 | this.activeLimit++; 107 | } 108 | // We need to have minimalActiveRequestLimit 109 | } else if (this.activeLimit > this.minimalActiveRequestLimit) { 110 | this.activeLimit--; 111 | } 112 | } 113 | 114 | private loopQueue(queue: Deque) { 115 | while (queue.size() > 0 && this.currentActive < this.activeLimit) { 116 | // better if we start with new requests. Because more opportunity to answer before client cancel request 117 | const nextRequest = queue.pop()!; 118 | 119 | if (!this.isRequestExpired(nextRequest)) { 120 | this.run(nextRequest); 121 | } else { 122 | this.handleDiscardedRequest(nextRequest); 123 | } 124 | } 125 | } 126 | 127 | private loop() { 128 | if (this.hasImportantQueue) { 129 | this.loopQueue(this.queueImportant); 130 | } 131 | this.loopQueue(this.queue); 132 | } 133 | 134 | private run(payload: Payload) { 135 | this.currentActive++; 136 | 137 | this.handleNextRequest(payload); 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Rate limit guard 2 | 3 | Rate limit guard is a library that helps to prevent overload of the Node.js server. This plugin can help to reduce the timing of the execution of requests. Usually, if you have more requests than your applications can handle it creates a big queue of requests, that consumes more memory and more CPU, a lot of requests will be executed in parallel. As a result, your server will be paralyzed. This library can help to prevent this problem by limiting the amount of executed requests and controlling the health of your server based on the event loop delay. 4 | 5 | You can also find more information in [the article on rate limiting](https://amarchenko.dev/blog/2023-09-23-rate-limiting/) 6 | 7 | ## Key Benefits: 8 | 9 | - *Uptime for DDOS attacks* - if you have a lot of requests and your server is overloaded, it will not be able to process requests and will be unavailable. This library will help you to avoid this problem. 10 | - *Not a typical rate-limiter* - usually rate-limiters are used to limit the number of requests per user. This library has different purposes. Can help to prevent overload of the server 11 | - *Efficient algorithm* - this library uses an efficient algorithm and can handle a lot of requests, more than 1000 RPS 12 | - *Fast resilience after overload* - if your server was overloaded, this library will help to recover from overload very fast 13 | - *Universal* - you can use this library for `express`, `fastify`, and any purposes. Because this library has the common core part and adapters for different frameworks 14 | 15 | ## How to Install 16 | 17 | ```bash 18 | npm install --save rate-limit-guard 19 | ``` 20 | 21 | ## How to Use 22 | 23 | `rate-limit-guard` has several different ways to use it. You can use adapters for popular libraries or create your adapter by creating the `RateLimit` class. 24 | 25 | ### Express 26 | 27 | Add middleware `rateLimitExpress` to your Express app: 28 | ```js 29 | const express = require('express'); 30 | const { RateLimitExpress } = require('rate-limit-guard/adapters/express'); 31 | 32 | const app = express(); 33 | 34 | app.get('/healthz', (req, res) => { // Health check need to register before rateLimitExpress plugin. If you use K8S 35 | res.json{ status: 'ok' } 36 | }); 37 | 38 | app.use(rateLimitExpress()); // Very important to register plugin before any other middleware 39 | // app.use(bodyParser.json()); 40 | 41 | app.get('/', (req, res) => { 42 | res.send('Hello World!'); 43 | }); 44 | 45 | app.listen(3000, () => { 46 | console.log('Example app listening on port 3000!'); 47 | }); 48 | ``` 49 | 50 | ### Fastify 51 | 52 | Add plugin `rateLimitFastify` to your Fastify app: 53 | ```js 54 | const fastify = require('fastify'); 55 | const { rateLimitFastify } = require('rate-limit-guard/adapters/fastify'); 56 | 57 | const app = fastify(); 58 | 59 | fastify.get('/healthz', (request, reply) => { // Health check need to register before rateLimitFastify plugin. If you use K8S 60 | return { status: 'ok' } 61 | }); 62 | 63 | fastify.register(rateLimitFastify); // Very important to register plugin before any other plugins 64 | // fastify.register(require('fastify-cors')); 65 | 66 | fastify.get('/', (request, reply) => { 67 | return { hello: 'world' } 68 | }) 69 | 70 | try { 71 | await fastify.listen({ port: 3000 }) 72 | } catch (err) { 73 | fastify.log.error(err) 74 | process.exit(1) 75 | } 76 | ``` 77 | 78 | ### Custom Adapter 79 | 80 | You can create your adapter by creating the `RateLimit` class for any purpose. Rate-limit-guard doesn't look on http-frameworks and you can use it for any other purposes like limit amount of function executions. 81 | 82 | For example, I want to generate HTML pages. If it is a new page I want to generate it with priority. Sometimes a service has a lot of requests and I need to limit the amount of requests 83 | ```js 84 | 85 | const { RateLimit } = require('rate-limit-guard'); 86 | 87 | const rateLimit = new RateLimit({ 88 | hasImportantQueue: true, 89 | handleDiscardedRequest: (payload) => { 90 | console.log('Discarded request', payload); 91 | }, 92 | handleNextRequest: async (payload) => { 93 | const content = await generatePage(payload); 94 | 95 | await savePage(payload, content); 96 | 97 | rateLimit.finish(); 98 | } 99 | }); 100 | 101 | rateLimit.add({ page: 'https://example.com' }, true); 102 | rateLimit.add({ page: 'https://second.com' }, false); 103 | ``` 104 | 105 | 106 | ## Features 107 | 108 | 109 | ### Configuration 110 | 111 | Here's the default configuration: 112 | 113 | ``` 114 | export const DEFAULT_OPTIONS = { 115 | activeLimit: 10, // Maximum number of active processes. 116 | queueLimit: 100, // Maximum number of requests in the queue. 117 | maxEventLoopDelay: 100, // Maximum allowable delay in the event loop 118 | errorResponseBuilder // Function that builds the response to send when the limit is exceeded. 119 | isImportantRequest: (payload) => boolean, // Function that determines whether the request is important. 120 | }; 121 | ``` 122 | 123 | ### Important Requests 124 | 125 | You can mark requests as important by passing a custom `isImportantRequest` function to the constructor. This is useful if you want to split requests into important and not important and increase the chance of executing important requests. 126 | 127 | The function takes the following parameters: 128 | ```ts 129 | isImportantRequest?: (payload: RequestLimiterRequest) => boolean; 130 | ``` 131 | 132 | for example fastify adapter: 133 | ```js 134 | server.register(rateLimitFastify, { isImportantRequest: (payload) => payload.req.url === '/priority' }) 135 | ``` 136 | 137 | for example express adapter: 138 | ```js 139 | app.use(rateLimitExpress({ isImportantRequest: (payload) => payload.req.url === '/priority' })); 140 | ``` 141 | 142 | All requests with URL = `/priority` will be executed first. 143 | 144 | ### Skip outdated requests 145 | 146 | By default `rate-limit-guard` adapters skip all outdated requests. For example, clients' close connection and request was outdated. As a result server will not execute outdated requests 147 | 148 | ### Error Response Builder 149 | 150 | You can customize the response that is sent when the limit is exceeded by passing a custom `errorResponseBuilder` function to the constructor. The function takes the following parameters: 151 | 152 | ```ts 153 | errorResponseBuilder?: (payload: RequestLimiterRequest) => any; 154 | ``` 155 | You need to provide different errorResponseBuilder for different adapters. Check the source code of adapters for more details. 156 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | devDependencies: 8 | '@types/express': 9 | specifier: ^4.17.17 10 | version: 4.17.17 11 | '@types/jest': 12 | specifier: ^29.5.4 13 | version: 29.5.4 14 | '@types/node': 15 | specifier: ^18 16 | version: 18.17.11 17 | '@types/on-finished': 18 | specifier: ^2.3.1 19 | version: 2.3.1 20 | express: 21 | specifier: ^4.18.2 22 | version: 4.18.2 23 | fastify: 24 | specifier: ^4.22.0 25 | version: 4.22.0 26 | fastify-plugin: 27 | specifier: ^4.5.1 28 | version: 4.5.1 29 | jest: 30 | specifier: ^29.6.4 31 | version: 29.6.4(@types/node@18.17.11)(ts-node@10.9.1) 32 | on-finished: 33 | specifier: ^2.4.1 34 | version: 2.4.1 35 | prettier: 36 | specifier: ^2.8.8 37 | version: 2.8.8 38 | ts-jest: 39 | specifier: ^29.1.1 40 | version: 29.1.1(@babel/core@7.22.11)(esbuild@0.18.20)(jest@29.6.4)(typescript@5.2.2) 41 | ts-node: 42 | specifier: ^10.9.1 43 | version: 10.9.1(@types/node@18.17.11)(typescript@5.2.2) 44 | tsup: 45 | specifier: ^7.2.0 46 | version: 7.2.0(ts-node@10.9.1)(typescript@5.2.2) 47 | typescript: 48 | specifier: ^5.2.2 49 | version: 5.2.2 50 | 51 | packages: 52 | 53 | /@ampproject/remapping@2.2.1: 54 | resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} 55 | engines: {node: '>=6.0.0'} 56 | dependencies: 57 | '@jridgewell/gen-mapping': 0.3.3 58 | '@jridgewell/trace-mapping': 0.3.19 59 | dev: true 60 | 61 | /@babel/code-frame@7.22.10: 62 | resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} 63 | engines: {node: '>=6.9.0'} 64 | dependencies: 65 | '@babel/highlight': 7.22.10 66 | chalk: 2.4.2 67 | dev: true 68 | 69 | /@babel/compat-data@7.22.9: 70 | resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} 71 | engines: {node: '>=6.9.0'} 72 | dev: true 73 | 74 | /@babel/core@7.22.11: 75 | resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} 76 | engines: {node: '>=6.9.0'} 77 | dependencies: 78 | '@ampproject/remapping': 2.2.1 79 | '@babel/code-frame': 7.22.10 80 | '@babel/generator': 7.22.10 81 | '@babel/helper-compilation-targets': 7.22.10 82 | '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) 83 | '@babel/helpers': 7.22.11 84 | '@babel/parser': 7.22.11 85 | '@babel/template': 7.22.5 86 | '@babel/traverse': 7.22.11 87 | '@babel/types': 7.22.11 88 | convert-source-map: 1.9.0 89 | debug: 4.3.4 90 | gensync: 1.0.0-beta.2 91 | json5: 2.2.3 92 | semver: 6.3.1 93 | transitivePeerDependencies: 94 | - supports-color 95 | dev: true 96 | 97 | /@babel/generator@7.22.10: 98 | resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} 99 | engines: {node: '>=6.9.0'} 100 | dependencies: 101 | '@babel/types': 7.22.11 102 | '@jridgewell/gen-mapping': 0.3.3 103 | '@jridgewell/trace-mapping': 0.3.19 104 | jsesc: 2.5.2 105 | dev: true 106 | 107 | /@babel/helper-compilation-targets@7.22.10: 108 | resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} 109 | engines: {node: '>=6.9.0'} 110 | dependencies: 111 | '@babel/compat-data': 7.22.9 112 | '@babel/helper-validator-option': 7.22.5 113 | browserslist: 4.21.10 114 | lru-cache: 5.1.1 115 | semver: 6.3.1 116 | dev: true 117 | 118 | /@babel/helper-environment-visitor@7.22.5: 119 | resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} 120 | engines: {node: '>=6.9.0'} 121 | dev: true 122 | 123 | /@babel/helper-function-name@7.22.5: 124 | resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} 125 | engines: {node: '>=6.9.0'} 126 | dependencies: 127 | '@babel/template': 7.22.5 128 | '@babel/types': 7.22.11 129 | dev: true 130 | 131 | /@babel/helper-hoist-variables@7.22.5: 132 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 133 | engines: {node: '>=6.9.0'} 134 | dependencies: 135 | '@babel/types': 7.22.11 136 | dev: true 137 | 138 | /@babel/helper-module-imports@7.22.5: 139 | resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} 140 | engines: {node: '>=6.9.0'} 141 | dependencies: 142 | '@babel/types': 7.22.11 143 | dev: true 144 | 145 | /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): 146 | resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} 147 | engines: {node: '>=6.9.0'} 148 | peerDependencies: 149 | '@babel/core': ^7.0.0 150 | dependencies: 151 | '@babel/core': 7.22.11 152 | '@babel/helper-environment-visitor': 7.22.5 153 | '@babel/helper-module-imports': 7.22.5 154 | '@babel/helper-simple-access': 7.22.5 155 | '@babel/helper-split-export-declaration': 7.22.6 156 | '@babel/helper-validator-identifier': 7.22.5 157 | dev: true 158 | 159 | /@babel/helper-plugin-utils@7.22.5: 160 | resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} 161 | engines: {node: '>=6.9.0'} 162 | dev: true 163 | 164 | /@babel/helper-simple-access@7.22.5: 165 | resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} 166 | engines: {node: '>=6.9.0'} 167 | dependencies: 168 | '@babel/types': 7.22.11 169 | dev: true 170 | 171 | /@babel/helper-split-export-declaration@7.22.6: 172 | resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} 173 | engines: {node: '>=6.9.0'} 174 | dependencies: 175 | '@babel/types': 7.22.11 176 | dev: true 177 | 178 | /@babel/helper-string-parser@7.22.5: 179 | resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} 180 | engines: {node: '>=6.9.0'} 181 | dev: true 182 | 183 | /@babel/helper-validator-identifier@7.22.5: 184 | resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} 185 | engines: {node: '>=6.9.0'} 186 | dev: true 187 | 188 | /@babel/helper-validator-option@7.22.5: 189 | resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} 190 | engines: {node: '>=6.9.0'} 191 | dev: true 192 | 193 | /@babel/helpers@7.22.11: 194 | resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} 195 | engines: {node: '>=6.9.0'} 196 | dependencies: 197 | '@babel/template': 7.22.5 198 | '@babel/traverse': 7.22.11 199 | '@babel/types': 7.22.11 200 | transitivePeerDependencies: 201 | - supports-color 202 | dev: true 203 | 204 | /@babel/highlight@7.22.10: 205 | resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} 206 | engines: {node: '>=6.9.0'} 207 | dependencies: 208 | '@babel/helper-validator-identifier': 7.22.5 209 | chalk: 2.4.2 210 | js-tokens: 4.0.0 211 | dev: true 212 | 213 | /@babel/parser@7.22.11: 214 | resolution: {integrity: sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==} 215 | engines: {node: '>=6.0.0'} 216 | hasBin: true 217 | dependencies: 218 | '@babel/types': 7.22.11 219 | dev: true 220 | 221 | /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.11): 222 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 223 | peerDependencies: 224 | '@babel/core': ^7.0.0-0 225 | dependencies: 226 | '@babel/core': 7.22.11 227 | '@babel/helper-plugin-utils': 7.22.5 228 | dev: true 229 | 230 | /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.11): 231 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 232 | peerDependencies: 233 | '@babel/core': ^7.0.0-0 234 | dependencies: 235 | '@babel/core': 7.22.11 236 | '@babel/helper-plugin-utils': 7.22.5 237 | dev: true 238 | 239 | /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.11): 240 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 241 | peerDependencies: 242 | '@babel/core': ^7.0.0-0 243 | dependencies: 244 | '@babel/core': 7.22.11 245 | '@babel/helper-plugin-utils': 7.22.5 246 | dev: true 247 | 248 | /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.11): 249 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 250 | peerDependencies: 251 | '@babel/core': ^7.0.0-0 252 | dependencies: 253 | '@babel/core': 7.22.11 254 | '@babel/helper-plugin-utils': 7.22.5 255 | dev: true 256 | 257 | /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.11): 258 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 259 | peerDependencies: 260 | '@babel/core': ^7.0.0-0 261 | dependencies: 262 | '@babel/core': 7.22.11 263 | '@babel/helper-plugin-utils': 7.22.5 264 | dev: true 265 | 266 | /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.22.11): 267 | resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} 268 | engines: {node: '>=6.9.0'} 269 | peerDependencies: 270 | '@babel/core': ^7.0.0-0 271 | dependencies: 272 | '@babel/core': 7.22.11 273 | '@babel/helper-plugin-utils': 7.22.5 274 | dev: true 275 | 276 | /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.11): 277 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 278 | peerDependencies: 279 | '@babel/core': ^7.0.0-0 280 | dependencies: 281 | '@babel/core': 7.22.11 282 | '@babel/helper-plugin-utils': 7.22.5 283 | dev: true 284 | 285 | /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.11): 286 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 287 | peerDependencies: 288 | '@babel/core': ^7.0.0-0 289 | dependencies: 290 | '@babel/core': 7.22.11 291 | '@babel/helper-plugin-utils': 7.22.5 292 | dev: true 293 | 294 | /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.11): 295 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 296 | peerDependencies: 297 | '@babel/core': ^7.0.0-0 298 | dependencies: 299 | '@babel/core': 7.22.11 300 | '@babel/helper-plugin-utils': 7.22.5 301 | dev: true 302 | 303 | /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.11): 304 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 305 | peerDependencies: 306 | '@babel/core': ^7.0.0-0 307 | dependencies: 308 | '@babel/core': 7.22.11 309 | '@babel/helper-plugin-utils': 7.22.5 310 | dev: true 311 | 312 | /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.11): 313 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 314 | peerDependencies: 315 | '@babel/core': ^7.0.0-0 316 | dependencies: 317 | '@babel/core': 7.22.11 318 | '@babel/helper-plugin-utils': 7.22.5 319 | dev: true 320 | 321 | /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.11): 322 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 323 | peerDependencies: 324 | '@babel/core': ^7.0.0-0 325 | dependencies: 326 | '@babel/core': 7.22.11 327 | '@babel/helper-plugin-utils': 7.22.5 328 | dev: true 329 | 330 | /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.11): 331 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 332 | engines: {node: '>=6.9.0'} 333 | peerDependencies: 334 | '@babel/core': ^7.0.0-0 335 | dependencies: 336 | '@babel/core': 7.22.11 337 | '@babel/helper-plugin-utils': 7.22.5 338 | dev: true 339 | 340 | /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.11): 341 | resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} 342 | engines: {node: '>=6.9.0'} 343 | peerDependencies: 344 | '@babel/core': ^7.0.0-0 345 | dependencies: 346 | '@babel/core': 7.22.11 347 | '@babel/helper-plugin-utils': 7.22.5 348 | dev: true 349 | 350 | /@babel/template@7.22.5: 351 | resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} 352 | engines: {node: '>=6.9.0'} 353 | dependencies: 354 | '@babel/code-frame': 7.22.10 355 | '@babel/parser': 7.22.11 356 | '@babel/types': 7.22.11 357 | dev: true 358 | 359 | /@babel/traverse@7.22.11: 360 | resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} 361 | engines: {node: '>=6.9.0'} 362 | dependencies: 363 | '@babel/code-frame': 7.22.10 364 | '@babel/generator': 7.22.10 365 | '@babel/helper-environment-visitor': 7.22.5 366 | '@babel/helper-function-name': 7.22.5 367 | '@babel/helper-hoist-variables': 7.22.5 368 | '@babel/helper-split-export-declaration': 7.22.6 369 | '@babel/parser': 7.22.11 370 | '@babel/types': 7.22.11 371 | debug: 4.3.4 372 | globals: 11.12.0 373 | transitivePeerDependencies: 374 | - supports-color 375 | dev: true 376 | 377 | /@babel/types@7.22.11: 378 | resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} 379 | engines: {node: '>=6.9.0'} 380 | dependencies: 381 | '@babel/helper-string-parser': 7.22.5 382 | '@babel/helper-validator-identifier': 7.22.5 383 | to-fast-properties: 2.0.0 384 | dev: true 385 | 386 | /@bcoe/v8-coverage@0.2.3: 387 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 388 | dev: true 389 | 390 | /@cspotcode/source-map-support@0.8.1: 391 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 392 | engines: {node: '>=12'} 393 | dependencies: 394 | '@jridgewell/trace-mapping': 0.3.9 395 | dev: true 396 | 397 | /@esbuild/android-arm64@0.18.20: 398 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 399 | engines: {node: '>=12'} 400 | cpu: [arm64] 401 | os: [android] 402 | requiresBuild: true 403 | dev: true 404 | optional: true 405 | 406 | /@esbuild/android-arm@0.18.20: 407 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 408 | engines: {node: '>=12'} 409 | cpu: [arm] 410 | os: [android] 411 | requiresBuild: true 412 | dev: true 413 | optional: true 414 | 415 | /@esbuild/android-x64@0.18.20: 416 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 417 | engines: {node: '>=12'} 418 | cpu: [x64] 419 | os: [android] 420 | requiresBuild: true 421 | dev: true 422 | optional: true 423 | 424 | /@esbuild/darwin-arm64@0.18.20: 425 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 426 | engines: {node: '>=12'} 427 | cpu: [arm64] 428 | os: [darwin] 429 | requiresBuild: true 430 | dev: true 431 | optional: true 432 | 433 | /@esbuild/darwin-x64@0.18.20: 434 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 435 | engines: {node: '>=12'} 436 | cpu: [x64] 437 | os: [darwin] 438 | requiresBuild: true 439 | dev: true 440 | optional: true 441 | 442 | /@esbuild/freebsd-arm64@0.18.20: 443 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 444 | engines: {node: '>=12'} 445 | cpu: [arm64] 446 | os: [freebsd] 447 | requiresBuild: true 448 | dev: true 449 | optional: true 450 | 451 | /@esbuild/freebsd-x64@0.18.20: 452 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 453 | engines: {node: '>=12'} 454 | cpu: [x64] 455 | os: [freebsd] 456 | requiresBuild: true 457 | dev: true 458 | optional: true 459 | 460 | /@esbuild/linux-arm64@0.18.20: 461 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 462 | engines: {node: '>=12'} 463 | cpu: [arm64] 464 | os: [linux] 465 | requiresBuild: true 466 | dev: true 467 | optional: true 468 | 469 | /@esbuild/linux-arm@0.18.20: 470 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 471 | engines: {node: '>=12'} 472 | cpu: [arm] 473 | os: [linux] 474 | requiresBuild: true 475 | dev: true 476 | optional: true 477 | 478 | /@esbuild/linux-ia32@0.18.20: 479 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 480 | engines: {node: '>=12'} 481 | cpu: [ia32] 482 | os: [linux] 483 | requiresBuild: true 484 | dev: true 485 | optional: true 486 | 487 | /@esbuild/linux-loong64@0.18.20: 488 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 489 | engines: {node: '>=12'} 490 | cpu: [loong64] 491 | os: [linux] 492 | requiresBuild: true 493 | dev: true 494 | optional: true 495 | 496 | /@esbuild/linux-mips64el@0.18.20: 497 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 498 | engines: {node: '>=12'} 499 | cpu: [mips64el] 500 | os: [linux] 501 | requiresBuild: true 502 | dev: true 503 | optional: true 504 | 505 | /@esbuild/linux-ppc64@0.18.20: 506 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 507 | engines: {node: '>=12'} 508 | cpu: [ppc64] 509 | os: [linux] 510 | requiresBuild: true 511 | dev: true 512 | optional: true 513 | 514 | /@esbuild/linux-riscv64@0.18.20: 515 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 516 | engines: {node: '>=12'} 517 | cpu: [riscv64] 518 | os: [linux] 519 | requiresBuild: true 520 | dev: true 521 | optional: true 522 | 523 | /@esbuild/linux-s390x@0.18.20: 524 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 525 | engines: {node: '>=12'} 526 | cpu: [s390x] 527 | os: [linux] 528 | requiresBuild: true 529 | dev: true 530 | optional: true 531 | 532 | /@esbuild/linux-x64@0.18.20: 533 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 534 | engines: {node: '>=12'} 535 | cpu: [x64] 536 | os: [linux] 537 | requiresBuild: true 538 | dev: true 539 | optional: true 540 | 541 | /@esbuild/netbsd-x64@0.18.20: 542 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 543 | engines: {node: '>=12'} 544 | cpu: [x64] 545 | os: [netbsd] 546 | requiresBuild: true 547 | dev: true 548 | optional: true 549 | 550 | /@esbuild/openbsd-x64@0.18.20: 551 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 552 | engines: {node: '>=12'} 553 | cpu: [x64] 554 | os: [openbsd] 555 | requiresBuild: true 556 | dev: true 557 | optional: true 558 | 559 | /@esbuild/sunos-x64@0.18.20: 560 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 561 | engines: {node: '>=12'} 562 | cpu: [x64] 563 | os: [sunos] 564 | requiresBuild: true 565 | dev: true 566 | optional: true 567 | 568 | /@esbuild/win32-arm64@0.18.20: 569 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 570 | engines: {node: '>=12'} 571 | cpu: [arm64] 572 | os: [win32] 573 | requiresBuild: true 574 | dev: true 575 | optional: true 576 | 577 | /@esbuild/win32-ia32@0.18.20: 578 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 579 | engines: {node: '>=12'} 580 | cpu: [ia32] 581 | os: [win32] 582 | requiresBuild: true 583 | dev: true 584 | optional: true 585 | 586 | /@esbuild/win32-x64@0.18.20: 587 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 588 | engines: {node: '>=12'} 589 | cpu: [x64] 590 | os: [win32] 591 | requiresBuild: true 592 | dev: true 593 | optional: true 594 | 595 | /@fastify/ajv-compiler@3.5.0: 596 | resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} 597 | dependencies: 598 | ajv: 8.12.0 599 | ajv-formats: 2.1.1(ajv@8.12.0) 600 | fast-uri: 2.2.0 601 | dev: true 602 | 603 | /@fastify/deepmerge@1.3.0: 604 | resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} 605 | dev: true 606 | 607 | /@fastify/error@3.3.0: 608 | resolution: {integrity: sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==} 609 | dev: true 610 | 611 | /@fastify/fast-json-stringify-compiler@4.3.0: 612 | resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} 613 | dependencies: 614 | fast-json-stringify: 5.8.0 615 | dev: true 616 | 617 | /@istanbuljs/load-nyc-config@1.1.0: 618 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 619 | engines: {node: '>=8'} 620 | dependencies: 621 | camelcase: 5.3.1 622 | find-up: 4.1.0 623 | get-package-type: 0.1.0 624 | js-yaml: 3.14.1 625 | resolve-from: 5.0.0 626 | dev: true 627 | 628 | /@istanbuljs/schema@0.1.3: 629 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 630 | engines: {node: '>=8'} 631 | dev: true 632 | 633 | /@jest/console@29.6.4: 634 | resolution: {integrity: sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==} 635 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 636 | dependencies: 637 | '@jest/types': 29.6.3 638 | '@types/node': 18.17.11 639 | chalk: 4.1.2 640 | jest-message-util: 29.6.3 641 | jest-util: 29.6.3 642 | slash: 3.0.0 643 | dev: true 644 | 645 | /@jest/core@29.6.4(ts-node@10.9.1): 646 | resolution: {integrity: sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==} 647 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 648 | peerDependencies: 649 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 650 | peerDependenciesMeta: 651 | node-notifier: 652 | optional: true 653 | dependencies: 654 | '@jest/console': 29.6.4 655 | '@jest/reporters': 29.6.4 656 | '@jest/test-result': 29.6.4 657 | '@jest/transform': 29.6.4 658 | '@jest/types': 29.6.3 659 | '@types/node': 18.17.11 660 | ansi-escapes: 4.3.2 661 | chalk: 4.1.2 662 | ci-info: 3.8.0 663 | exit: 0.1.2 664 | graceful-fs: 4.2.11 665 | jest-changed-files: 29.6.3 666 | jest-config: 29.6.4(@types/node@18.17.11)(ts-node@10.9.1) 667 | jest-haste-map: 29.6.4 668 | jest-message-util: 29.6.3 669 | jest-regex-util: 29.6.3 670 | jest-resolve: 29.6.4 671 | jest-resolve-dependencies: 29.6.4 672 | jest-runner: 29.6.4 673 | jest-runtime: 29.6.4 674 | jest-snapshot: 29.6.4 675 | jest-util: 29.6.3 676 | jest-validate: 29.6.3 677 | jest-watcher: 29.6.4 678 | micromatch: 4.0.5 679 | pretty-format: 29.6.3 680 | slash: 3.0.0 681 | strip-ansi: 6.0.1 682 | transitivePeerDependencies: 683 | - babel-plugin-macros 684 | - supports-color 685 | - ts-node 686 | dev: true 687 | 688 | /@jest/environment@29.6.4: 689 | resolution: {integrity: sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==} 690 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 691 | dependencies: 692 | '@jest/fake-timers': 29.6.4 693 | '@jest/types': 29.6.3 694 | '@types/node': 18.17.11 695 | jest-mock: 29.6.3 696 | dev: true 697 | 698 | /@jest/expect-utils@29.6.4: 699 | resolution: {integrity: sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==} 700 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 701 | dependencies: 702 | jest-get-type: 29.6.3 703 | dev: true 704 | 705 | /@jest/expect@29.6.4: 706 | resolution: {integrity: sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==} 707 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 708 | dependencies: 709 | expect: 29.6.4 710 | jest-snapshot: 29.6.4 711 | transitivePeerDependencies: 712 | - supports-color 713 | dev: true 714 | 715 | /@jest/fake-timers@29.6.4: 716 | resolution: {integrity: sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==} 717 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 718 | dependencies: 719 | '@jest/types': 29.6.3 720 | '@sinonjs/fake-timers': 10.3.0 721 | '@types/node': 18.17.11 722 | jest-message-util: 29.6.3 723 | jest-mock: 29.6.3 724 | jest-util: 29.6.3 725 | dev: true 726 | 727 | /@jest/globals@29.6.4: 728 | resolution: {integrity: sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==} 729 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 730 | dependencies: 731 | '@jest/environment': 29.6.4 732 | '@jest/expect': 29.6.4 733 | '@jest/types': 29.6.3 734 | jest-mock: 29.6.3 735 | transitivePeerDependencies: 736 | - supports-color 737 | dev: true 738 | 739 | /@jest/reporters@29.6.4: 740 | resolution: {integrity: sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==} 741 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 742 | peerDependencies: 743 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 744 | peerDependenciesMeta: 745 | node-notifier: 746 | optional: true 747 | dependencies: 748 | '@bcoe/v8-coverage': 0.2.3 749 | '@jest/console': 29.6.4 750 | '@jest/test-result': 29.6.4 751 | '@jest/transform': 29.6.4 752 | '@jest/types': 29.6.3 753 | '@jridgewell/trace-mapping': 0.3.19 754 | '@types/node': 18.17.11 755 | chalk: 4.1.2 756 | collect-v8-coverage: 1.0.2 757 | exit: 0.1.2 758 | glob: 7.1.6 759 | graceful-fs: 4.2.11 760 | istanbul-lib-coverage: 3.2.0 761 | istanbul-lib-instrument: 6.0.0 762 | istanbul-lib-report: 3.0.1 763 | istanbul-lib-source-maps: 4.0.1 764 | istanbul-reports: 3.1.6 765 | jest-message-util: 29.6.3 766 | jest-util: 29.6.3 767 | jest-worker: 29.6.4 768 | slash: 3.0.0 769 | string-length: 4.0.2 770 | strip-ansi: 6.0.1 771 | v8-to-istanbul: 9.1.0 772 | transitivePeerDependencies: 773 | - supports-color 774 | dev: true 775 | 776 | /@jest/schemas@29.6.3: 777 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 778 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 779 | dependencies: 780 | '@sinclair/typebox': 0.27.8 781 | dev: true 782 | 783 | /@jest/source-map@29.6.3: 784 | resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} 785 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 786 | dependencies: 787 | '@jridgewell/trace-mapping': 0.3.19 788 | callsites: 3.1.0 789 | graceful-fs: 4.2.11 790 | dev: true 791 | 792 | /@jest/test-result@29.6.4: 793 | resolution: {integrity: sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==} 794 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 795 | dependencies: 796 | '@jest/console': 29.6.4 797 | '@jest/types': 29.6.3 798 | '@types/istanbul-lib-coverage': 2.0.4 799 | collect-v8-coverage: 1.0.2 800 | dev: true 801 | 802 | /@jest/test-sequencer@29.6.4: 803 | resolution: {integrity: sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==} 804 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 805 | dependencies: 806 | '@jest/test-result': 29.6.4 807 | graceful-fs: 4.2.11 808 | jest-haste-map: 29.6.4 809 | slash: 3.0.0 810 | dev: true 811 | 812 | /@jest/transform@29.6.4: 813 | resolution: {integrity: sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==} 814 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 815 | dependencies: 816 | '@babel/core': 7.22.11 817 | '@jest/types': 29.6.3 818 | '@jridgewell/trace-mapping': 0.3.19 819 | babel-plugin-istanbul: 6.1.1 820 | chalk: 4.1.2 821 | convert-source-map: 2.0.0 822 | fast-json-stable-stringify: 2.1.0 823 | graceful-fs: 4.2.11 824 | jest-haste-map: 29.6.4 825 | jest-regex-util: 29.6.3 826 | jest-util: 29.6.3 827 | micromatch: 4.0.5 828 | pirates: 4.0.6 829 | slash: 3.0.0 830 | write-file-atomic: 4.0.2 831 | transitivePeerDependencies: 832 | - supports-color 833 | dev: true 834 | 835 | /@jest/types@29.6.3: 836 | resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} 837 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 838 | dependencies: 839 | '@jest/schemas': 29.6.3 840 | '@types/istanbul-lib-coverage': 2.0.4 841 | '@types/istanbul-reports': 3.0.1 842 | '@types/node': 18.17.11 843 | '@types/yargs': 17.0.24 844 | chalk: 4.1.2 845 | dev: true 846 | 847 | /@jridgewell/gen-mapping@0.3.3: 848 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 849 | engines: {node: '>=6.0.0'} 850 | dependencies: 851 | '@jridgewell/set-array': 1.1.2 852 | '@jridgewell/sourcemap-codec': 1.4.15 853 | '@jridgewell/trace-mapping': 0.3.19 854 | dev: true 855 | 856 | /@jridgewell/resolve-uri@3.1.1: 857 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 858 | engines: {node: '>=6.0.0'} 859 | dev: true 860 | 861 | /@jridgewell/set-array@1.1.2: 862 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 863 | engines: {node: '>=6.0.0'} 864 | dev: true 865 | 866 | /@jridgewell/sourcemap-codec@1.4.15: 867 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 868 | dev: true 869 | 870 | /@jridgewell/trace-mapping@0.3.19: 871 | resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} 872 | dependencies: 873 | '@jridgewell/resolve-uri': 3.1.1 874 | '@jridgewell/sourcemap-codec': 1.4.15 875 | dev: true 876 | 877 | /@jridgewell/trace-mapping@0.3.9: 878 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 879 | dependencies: 880 | '@jridgewell/resolve-uri': 3.1.1 881 | '@jridgewell/sourcemap-codec': 1.4.15 882 | dev: true 883 | 884 | /@nodelib/fs.scandir@2.1.5: 885 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 886 | engines: {node: '>= 8'} 887 | dependencies: 888 | '@nodelib/fs.stat': 2.0.5 889 | run-parallel: 1.2.0 890 | dev: true 891 | 892 | /@nodelib/fs.stat@2.0.5: 893 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 894 | engines: {node: '>= 8'} 895 | dev: true 896 | 897 | /@nodelib/fs.walk@1.2.8: 898 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 899 | engines: {node: '>= 8'} 900 | dependencies: 901 | '@nodelib/fs.scandir': 2.1.5 902 | fastq: 1.15.0 903 | dev: true 904 | 905 | /@sinclair/typebox@0.27.8: 906 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 907 | dev: true 908 | 909 | /@sinonjs/commons@3.0.0: 910 | resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} 911 | dependencies: 912 | type-detect: 4.0.8 913 | dev: true 914 | 915 | /@sinonjs/fake-timers@10.3.0: 916 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 917 | dependencies: 918 | '@sinonjs/commons': 3.0.0 919 | dev: true 920 | 921 | /@tsconfig/node10@1.0.9: 922 | resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} 923 | dev: true 924 | 925 | /@tsconfig/node12@1.0.11: 926 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 927 | dev: true 928 | 929 | /@tsconfig/node14@1.0.3: 930 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 931 | dev: true 932 | 933 | /@tsconfig/node16@1.0.4: 934 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 935 | dev: true 936 | 937 | /@types/babel__core@7.20.1: 938 | resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} 939 | dependencies: 940 | '@babel/parser': 7.22.11 941 | '@babel/types': 7.22.11 942 | '@types/babel__generator': 7.6.4 943 | '@types/babel__template': 7.4.1 944 | '@types/babel__traverse': 7.20.1 945 | dev: true 946 | 947 | /@types/babel__generator@7.6.4: 948 | resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} 949 | dependencies: 950 | '@babel/types': 7.22.11 951 | dev: true 952 | 953 | /@types/babel__template@7.4.1: 954 | resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} 955 | dependencies: 956 | '@babel/parser': 7.22.11 957 | '@babel/types': 7.22.11 958 | dev: true 959 | 960 | /@types/babel__traverse@7.20.1: 961 | resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} 962 | dependencies: 963 | '@babel/types': 7.22.11 964 | dev: true 965 | 966 | /@types/body-parser@1.19.2: 967 | resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} 968 | dependencies: 969 | '@types/connect': 3.4.35 970 | '@types/node': 18.17.11 971 | dev: true 972 | 973 | /@types/connect@3.4.35: 974 | resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} 975 | dependencies: 976 | '@types/node': 18.17.11 977 | dev: true 978 | 979 | /@types/express-serve-static-core@4.17.36: 980 | resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==} 981 | dependencies: 982 | '@types/node': 18.17.11 983 | '@types/qs': 6.9.7 984 | '@types/range-parser': 1.2.4 985 | '@types/send': 0.17.1 986 | dev: true 987 | 988 | /@types/express@4.17.17: 989 | resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} 990 | dependencies: 991 | '@types/body-parser': 1.19.2 992 | '@types/express-serve-static-core': 4.17.36 993 | '@types/qs': 6.9.7 994 | '@types/serve-static': 1.15.2 995 | dev: true 996 | 997 | /@types/graceful-fs@4.1.6: 998 | resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} 999 | dependencies: 1000 | '@types/node': 18.17.11 1001 | dev: true 1002 | 1003 | /@types/http-errors@2.0.1: 1004 | resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} 1005 | dev: true 1006 | 1007 | /@types/istanbul-lib-coverage@2.0.4: 1008 | resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} 1009 | dev: true 1010 | 1011 | /@types/istanbul-lib-report@3.0.0: 1012 | resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} 1013 | dependencies: 1014 | '@types/istanbul-lib-coverage': 2.0.4 1015 | dev: true 1016 | 1017 | /@types/istanbul-reports@3.0.1: 1018 | resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} 1019 | dependencies: 1020 | '@types/istanbul-lib-report': 3.0.0 1021 | dev: true 1022 | 1023 | /@types/jest@29.5.4: 1024 | resolution: {integrity: sha512-PhglGmhWeD46FYOVLt3X7TiWjzwuVGW9wG/4qocPevXMjCmrIc5b6db9WjeGE4QYVpUAWMDv3v0IiBwObY289A==} 1025 | dependencies: 1026 | expect: 29.6.4 1027 | pretty-format: 29.6.3 1028 | dev: true 1029 | 1030 | /@types/mime@1.3.2: 1031 | resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} 1032 | dev: true 1033 | 1034 | /@types/mime@3.0.1: 1035 | resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} 1036 | dev: true 1037 | 1038 | /@types/node@18.17.11: 1039 | resolution: {integrity: sha512-r3hjHPBu+3LzbGBa8DHnr/KAeTEEOrahkcL+cZc4MaBMTM+mk8LtXR+zw+nqfjuDZZzYTYgTcpHuP+BEQk069g==} 1040 | dev: true 1041 | 1042 | /@types/on-finished@2.3.1: 1043 | resolution: {integrity: sha512-mzVYaYcFs5Jd2n/O6uYIRUsFRR1cHyZLRvkLCU0E7+G5WhY0qBDAR5fUCeZbvecYOSh9ikhlesyi2UfI8B9ckQ==} 1044 | dependencies: 1045 | '@types/node': 18.17.11 1046 | dev: true 1047 | 1048 | /@types/qs@6.9.7: 1049 | resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} 1050 | dev: true 1051 | 1052 | /@types/range-parser@1.2.4: 1053 | resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} 1054 | dev: true 1055 | 1056 | /@types/send@0.17.1: 1057 | resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} 1058 | dependencies: 1059 | '@types/mime': 1.3.2 1060 | '@types/node': 18.17.11 1061 | dev: true 1062 | 1063 | /@types/serve-static@1.15.2: 1064 | resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} 1065 | dependencies: 1066 | '@types/http-errors': 2.0.1 1067 | '@types/mime': 3.0.1 1068 | '@types/node': 18.17.11 1069 | dev: true 1070 | 1071 | /@types/stack-utils@2.0.1: 1072 | resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} 1073 | dev: true 1074 | 1075 | /@types/yargs-parser@21.0.0: 1076 | resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} 1077 | dev: true 1078 | 1079 | /@types/yargs@17.0.24: 1080 | resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} 1081 | dependencies: 1082 | '@types/yargs-parser': 21.0.0 1083 | dev: true 1084 | 1085 | /abort-controller@3.0.0: 1086 | resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 1087 | engines: {node: '>=6.5'} 1088 | dependencies: 1089 | event-target-shim: 5.0.1 1090 | dev: true 1091 | 1092 | /abstract-logging@2.0.1: 1093 | resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} 1094 | dev: true 1095 | 1096 | /accepts@1.3.8: 1097 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 1098 | engines: {node: '>= 0.6'} 1099 | dependencies: 1100 | mime-types: 2.1.35 1101 | negotiator: 0.6.3 1102 | dev: true 1103 | 1104 | /acorn-walk@8.2.0: 1105 | resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} 1106 | engines: {node: '>=0.4.0'} 1107 | dev: true 1108 | 1109 | /acorn@8.10.0: 1110 | resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} 1111 | engines: {node: '>=0.4.0'} 1112 | hasBin: true 1113 | dev: true 1114 | 1115 | /ajv-formats@2.1.1(ajv@8.12.0): 1116 | resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} 1117 | peerDependencies: 1118 | ajv: ^8.0.0 1119 | peerDependenciesMeta: 1120 | ajv: 1121 | optional: true 1122 | dependencies: 1123 | ajv: 8.12.0 1124 | dev: true 1125 | 1126 | /ajv@8.12.0: 1127 | resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} 1128 | dependencies: 1129 | fast-deep-equal: 3.1.3 1130 | json-schema-traverse: 1.0.0 1131 | require-from-string: 2.0.2 1132 | uri-js: 4.4.1 1133 | dev: true 1134 | 1135 | /ansi-escapes@4.3.2: 1136 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 1137 | engines: {node: '>=8'} 1138 | dependencies: 1139 | type-fest: 0.21.3 1140 | dev: true 1141 | 1142 | /ansi-regex@5.0.1: 1143 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 1144 | engines: {node: '>=8'} 1145 | dev: true 1146 | 1147 | /ansi-styles@3.2.1: 1148 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 1149 | engines: {node: '>=4'} 1150 | dependencies: 1151 | color-convert: 1.9.3 1152 | dev: true 1153 | 1154 | /ansi-styles@4.3.0: 1155 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 1156 | engines: {node: '>=8'} 1157 | dependencies: 1158 | color-convert: 2.0.1 1159 | dev: true 1160 | 1161 | /ansi-styles@5.2.0: 1162 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 1163 | engines: {node: '>=10'} 1164 | dev: true 1165 | 1166 | /any-promise@1.3.0: 1167 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 1168 | dev: true 1169 | 1170 | /anymatch@3.1.3: 1171 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 1172 | engines: {node: '>= 8'} 1173 | dependencies: 1174 | normalize-path: 3.0.0 1175 | picomatch: 2.3.1 1176 | dev: true 1177 | 1178 | /archy@1.0.0: 1179 | resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} 1180 | dev: true 1181 | 1182 | /arg@4.1.3: 1183 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 1184 | dev: true 1185 | 1186 | /argparse@1.0.10: 1187 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 1188 | dependencies: 1189 | sprintf-js: 1.0.3 1190 | dev: true 1191 | 1192 | /array-flatten@1.1.1: 1193 | resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} 1194 | dev: true 1195 | 1196 | /array-union@2.1.0: 1197 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 1198 | engines: {node: '>=8'} 1199 | dev: true 1200 | 1201 | /atomic-sleep@1.0.0: 1202 | resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} 1203 | engines: {node: '>=8.0.0'} 1204 | dev: true 1205 | 1206 | /avvio@8.2.1: 1207 | resolution: {integrity: sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==} 1208 | dependencies: 1209 | archy: 1.0.0 1210 | debug: 4.3.4 1211 | fastq: 1.15.0 1212 | transitivePeerDependencies: 1213 | - supports-color 1214 | dev: true 1215 | 1216 | /babel-jest@29.6.4(@babel/core@7.22.11): 1217 | resolution: {integrity: sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==} 1218 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1219 | peerDependencies: 1220 | '@babel/core': ^7.8.0 1221 | dependencies: 1222 | '@babel/core': 7.22.11 1223 | '@jest/transform': 29.6.4 1224 | '@types/babel__core': 7.20.1 1225 | babel-plugin-istanbul: 6.1.1 1226 | babel-preset-jest: 29.6.3(@babel/core@7.22.11) 1227 | chalk: 4.1.2 1228 | graceful-fs: 4.2.11 1229 | slash: 3.0.0 1230 | transitivePeerDependencies: 1231 | - supports-color 1232 | dev: true 1233 | 1234 | /babel-plugin-istanbul@6.1.1: 1235 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 1236 | engines: {node: '>=8'} 1237 | dependencies: 1238 | '@babel/helper-plugin-utils': 7.22.5 1239 | '@istanbuljs/load-nyc-config': 1.1.0 1240 | '@istanbuljs/schema': 0.1.3 1241 | istanbul-lib-instrument: 5.2.1 1242 | test-exclude: 6.0.0 1243 | transitivePeerDependencies: 1244 | - supports-color 1245 | dev: true 1246 | 1247 | /babel-plugin-jest-hoist@29.6.3: 1248 | resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} 1249 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1250 | dependencies: 1251 | '@babel/template': 7.22.5 1252 | '@babel/types': 7.22.11 1253 | '@types/babel__core': 7.20.1 1254 | '@types/babel__traverse': 7.20.1 1255 | dev: true 1256 | 1257 | /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.11): 1258 | resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} 1259 | peerDependencies: 1260 | '@babel/core': ^7.0.0 1261 | dependencies: 1262 | '@babel/core': 7.22.11 1263 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.11) 1264 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.11) 1265 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.11) 1266 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.11) 1267 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.11) 1268 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.11) 1269 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.11) 1270 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.11) 1271 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.11) 1272 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.11) 1273 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.11) 1274 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.11) 1275 | dev: true 1276 | 1277 | /babel-preset-jest@29.6.3(@babel/core@7.22.11): 1278 | resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} 1279 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1280 | peerDependencies: 1281 | '@babel/core': ^7.0.0 1282 | dependencies: 1283 | '@babel/core': 7.22.11 1284 | babel-plugin-jest-hoist: 29.6.3 1285 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.11) 1286 | dev: true 1287 | 1288 | /balanced-match@1.0.2: 1289 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1290 | dev: true 1291 | 1292 | /base64-js@1.5.1: 1293 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 1294 | dev: true 1295 | 1296 | /binary-extensions@2.2.0: 1297 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 1298 | engines: {node: '>=8'} 1299 | dev: true 1300 | 1301 | /body-parser@1.20.1: 1302 | resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} 1303 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 1304 | dependencies: 1305 | bytes: 3.1.2 1306 | content-type: 1.0.5 1307 | debug: 2.6.9 1308 | depd: 2.0.0 1309 | destroy: 1.2.0 1310 | http-errors: 2.0.0 1311 | iconv-lite: 0.4.24 1312 | on-finished: 2.4.1 1313 | qs: 6.11.0 1314 | raw-body: 2.5.1 1315 | type-is: 1.6.18 1316 | unpipe: 1.0.0 1317 | transitivePeerDependencies: 1318 | - supports-color 1319 | dev: true 1320 | 1321 | /brace-expansion@1.1.11: 1322 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1323 | dependencies: 1324 | balanced-match: 1.0.2 1325 | concat-map: 0.0.1 1326 | dev: true 1327 | 1328 | /braces@3.0.2: 1329 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1330 | engines: {node: '>=8'} 1331 | dependencies: 1332 | fill-range: 7.0.1 1333 | dev: true 1334 | 1335 | /browserslist@4.21.10: 1336 | resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} 1337 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1338 | hasBin: true 1339 | dependencies: 1340 | caniuse-lite: 1.0.30001524 1341 | electron-to-chromium: 1.4.503 1342 | node-releases: 2.0.13 1343 | update-browserslist-db: 1.0.11(browserslist@4.21.10) 1344 | dev: true 1345 | 1346 | /bs-logger@0.2.6: 1347 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 1348 | engines: {node: '>= 6'} 1349 | dependencies: 1350 | fast-json-stable-stringify: 2.1.0 1351 | dev: true 1352 | 1353 | /bser@2.1.1: 1354 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 1355 | dependencies: 1356 | node-int64: 0.4.0 1357 | dev: true 1358 | 1359 | /buffer-from@1.1.2: 1360 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 1361 | dev: true 1362 | 1363 | /buffer@6.0.3: 1364 | resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} 1365 | dependencies: 1366 | base64-js: 1.5.1 1367 | ieee754: 1.2.1 1368 | dev: true 1369 | 1370 | /bundle-require@4.0.1(esbuild@0.18.20): 1371 | resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} 1372 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1373 | peerDependencies: 1374 | esbuild: '>=0.17' 1375 | dependencies: 1376 | esbuild: 0.18.20 1377 | load-tsconfig: 0.2.5 1378 | dev: true 1379 | 1380 | /bytes@3.1.2: 1381 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 1382 | engines: {node: '>= 0.8'} 1383 | dev: true 1384 | 1385 | /cac@6.7.14: 1386 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 1387 | engines: {node: '>=8'} 1388 | dev: true 1389 | 1390 | /call-bind@1.0.2: 1391 | resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} 1392 | dependencies: 1393 | function-bind: 1.1.1 1394 | get-intrinsic: 1.2.1 1395 | dev: true 1396 | 1397 | /callsites@3.1.0: 1398 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1399 | engines: {node: '>=6'} 1400 | dev: true 1401 | 1402 | /camelcase@5.3.1: 1403 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 1404 | engines: {node: '>=6'} 1405 | dev: true 1406 | 1407 | /camelcase@6.3.0: 1408 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 1409 | engines: {node: '>=10'} 1410 | dev: true 1411 | 1412 | /caniuse-lite@1.0.30001524: 1413 | resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} 1414 | dev: true 1415 | 1416 | /chalk@2.4.2: 1417 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 1418 | engines: {node: '>=4'} 1419 | dependencies: 1420 | ansi-styles: 3.2.1 1421 | escape-string-regexp: 1.0.5 1422 | supports-color: 5.5.0 1423 | dev: true 1424 | 1425 | /chalk@4.1.2: 1426 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1427 | engines: {node: '>=10'} 1428 | dependencies: 1429 | ansi-styles: 4.3.0 1430 | supports-color: 7.2.0 1431 | dev: true 1432 | 1433 | /char-regex@1.0.2: 1434 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 1435 | engines: {node: '>=10'} 1436 | dev: true 1437 | 1438 | /chokidar@3.5.3: 1439 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 1440 | engines: {node: '>= 8.10.0'} 1441 | dependencies: 1442 | anymatch: 3.1.3 1443 | braces: 3.0.2 1444 | glob-parent: 5.1.2 1445 | is-binary-path: 2.1.0 1446 | is-glob: 4.0.3 1447 | normalize-path: 3.0.0 1448 | readdirp: 3.6.0 1449 | optionalDependencies: 1450 | fsevents: 2.3.3 1451 | dev: true 1452 | 1453 | /ci-info@3.8.0: 1454 | resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} 1455 | engines: {node: '>=8'} 1456 | dev: true 1457 | 1458 | /cjs-module-lexer@1.2.3: 1459 | resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} 1460 | dev: true 1461 | 1462 | /cliui@8.0.1: 1463 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 1464 | engines: {node: '>=12'} 1465 | dependencies: 1466 | string-width: 4.2.3 1467 | strip-ansi: 6.0.1 1468 | wrap-ansi: 7.0.0 1469 | dev: true 1470 | 1471 | /co@4.6.0: 1472 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 1473 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 1474 | dev: true 1475 | 1476 | /collect-v8-coverage@1.0.2: 1477 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 1478 | dev: true 1479 | 1480 | /color-convert@1.9.3: 1481 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1482 | dependencies: 1483 | color-name: 1.1.3 1484 | dev: true 1485 | 1486 | /color-convert@2.0.1: 1487 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1488 | engines: {node: '>=7.0.0'} 1489 | dependencies: 1490 | color-name: 1.1.4 1491 | dev: true 1492 | 1493 | /color-name@1.1.3: 1494 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1495 | dev: true 1496 | 1497 | /color-name@1.1.4: 1498 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1499 | dev: true 1500 | 1501 | /commander@4.1.1: 1502 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 1503 | engines: {node: '>= 6'} 1504 | dev: true 1505 | 1506 | /concat-map@0.0.1: 1507 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1508 | dev: true 1509 | 1510 | /content-disposition@0.5.4: 1511 | resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} 1512 | engines: {node: '>= 0.6'} 1513 | dependencies: 1514 | safe-buffer: 5.2.1 1515 | dev: true 1516 | 1517 | /content-type@1.0.5: 1518 | resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} 1519 | engines: {node: '>= 0.6'} 1520 | dev: true 1521 | 1522 | /convert-source-map@1.9.0: 1523 | resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} 1524 | dev: true 1525 | 1526 | /convert-source-map@2.0.0: 1527 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1528 | dev: true 1529 | 1530 | /cookie-signature@1.0.6: 1531 | resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} 1532 | dev: true 1533 | 1534 | /cookie@0.5.0: 1535 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 1536 | engines: {node: '>= 0.6'} 1537 | dev: true 1538 | 1539 | /create-require@1.1.1: 1540 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 1541 | dev: true 1542 | 1543 | /cross-spawn@7.0.3: 1544 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1545 | engines: {node: '>= 8'} 1546 | dependencies: 1547 | path-key: 3.1.1 1548 | shebang-command: 2.0.0 1549 | which: 2.0.2 1550 | dev: true 1551 | 1552 | /debug@2.6.9: 1553 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 1554 | peerDependencies: 1555 | supports-color: '*' 1556 | peerDependenciesMeta: 1557 | supports-color: 1558 | optional: true 1559 | dependencies: 1560 | ms: 2.0.0 1561 | dev: true 1562 | 1563 | /debug@4.3.4: 1564 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1565 | engines: {node: '>=6.0'} 1566 | peerDependencies: 1567 | supports-color: '*' 1568 | peerDependenciesMeta: 1569 | supports-color: 1570 | optional: true 1571 | dependencies: 1572 | ms: 2.1.2 1573 | dev: true 1574 | 1575 | /dedent@1.5.1: 1576 | resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} 1577 | peerDependencies: 1578 | babel-plugin-macros: ^3.1.0 1579 | peerDependenciesMeta: 1580 | babel-plugin-macros: 1581 | optional: true 1582 | dev: true 1583 | 1584 | /deepmerge@4.3.1: 1585 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1586 | engines: {node: '>=0.10.0'} 1587 | dev: true 1588 | 1589 | /depd@2.0.0: 1590 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 1591 | engines: {node: '>= 0.8'} 1592 | dev: true 1593 | 1594 | /destroy@1.2.0: 1595 | resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} 1596 | engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} 1597 | dev: true 1598 | 1599 | /detect-newline@3.1.0: 1600 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 1601 | engines: {node: '>=8'} 1602 | dev: true 1603 | 1604 | /diff-sequences@29.6.3: 1605 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 1606 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1607 | dev: true 1608 | 1609 | /diff@4.0.2: 1610 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 1611 | engines: {node: '>=0.3.1'} 1612 | dev: true 1613 | 1614 | /dir-glob@3.0.1: 1615 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 1616 | engines: {node: '>=8'} 1617 | dependencies: 1618 | path-type: 4.0.0 1619 | dev: true 1620 | 1621 | /ee-first@1.1.1: 1622 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 1623 | dev: true 1624 | 1625 | /electron-to-chromium@1.4.503: 1626 | resolution: {integrity: sha512-LF2IQit4B0VrUHFeQkWhZm97KuJSGF2WJqq1InpY+ECpFRkXd8yTIaTtJxsO0OKDmiBYwWqcrNaXOurn2T2wiA==} 1627 | dev: true 1628 | 1629 | /emittery@0.13.1: 1630 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 1631 | engines: {node: '>=12'} 1632 | dev: true 1633 | 1634 | /emoji-regex@8.0.0: 1635 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1636 | dev: true 1637 | 1638 | /encodeurl@1.0.2: 1639 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 1640 | engines: {node: '>= 0.8'} 1641 | dev: true 1642 | 1643 | /error-ex@1.3.2: 1644 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 1645 | dependencies: 1646 | is-arrayish: 0.2.1 1647 | dev: true 1648 | 1649 | /esbuild@0.18.20: 1650 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 1651 | engines: {node: '>=12'} 1652 | hasBin: true 1653 | requiresBuild: true 1654 | optionalDependencies: 1655 | '@esbuild/android-arm': 0.18.20 1656 | '@esbuild/android-arm64': 0.18.20 1657 | '@esbuild/android-x64': 0.18.20 1658 | '@esbuild/darwin-arm64': 0.18.20 1659 | '@esbuild/darwin-x64': 0.18.20 1660 | '@esbuild/freebsd-arm64': 0.18.20 1661 | '@esbuild/freebsd-x64': 0.18.20 1662 | '@esbuild/linux-arm': 0.18.20 1663 | '@esbuild/linux-arm64': 0.18.20 1664 | '@esbuild/linux-ia32': 0.18.20 1665 | '@esbuild/linux-loong64': 0.18.20 1666 | '@esbuild/linux-mips64el': 0.18.20 1667 | '@esbuild/linux-ppc64': 0.18.20 1668 | '@esbuild/linux-riscv64': 0.18.20 1669 | '@esbuild/linux-s390x': 0.18.20 1670 | '@esbuild/linux-x64': 0.18.20 1671 | '@esbuild/netbsd-x64': 0.18.20 1672 | '@esbuild/openbsd-x64': 0.18.20 1673 | '@esbuild/sunos-x64': 0.18.20 1674 | '@esbuild/win32-arm64': 0.18.20 1675 | '@esbuild/win32-ia32': 0.18.20 1676 | '@esbuild/win32-x64': 0.18.20 1677 | dev: true 1678 | 1679 | /escalade@3.1.1: 1680 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1681 | engines: {node: '>=6'} 1682 | dev: true 1683 | 1684 | /escape-html@1.0.3: 1685 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 1686 | dev: true 1687 | 1688 | /escape-string-regexp@1.0.5: 1689 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1690 | engines: {node: '>=0.8.0'} 1691 | dev: true 1692 | 1693 | /escape-string-regexp@2.0.0: 1694 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 1695 | engines: {node: '>=8'} 1696 | dev: true 1697 | 1698 | /esprima@4.0.1: 1699 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1700 | engines: {node: '>=4'} 1701 | hasBin: true 1702 | dev: true 1703 | 1704 | /etag@1.8.1: 1705 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 1706 | engines: {node: '>= 0.6'} 1707 | dev: true 1708 | 1709 | /event-target-shim@5.0.1: 1710 | resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 1711 | engines: {node: '>=6'} 1712 | dev: true 1713 | 1714 | /events@3.3.0: 1715 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 1716 | engines: {node: '>=0.8.x'} 1717 | dev: true 1718 | 1719 | /execa@5.1.1: 1720 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1721 | engines: {node: '>=10'} 1722 | dependencies: 1723 | cross-spawn: 7.0.3 1724 | get-stream: 6.0.1 1725 | human-signals: 2.1.0 1726 | is-stream: 2.0.1 1727 | merge-stream: 2.0.0 1728 | npm-run-path: 4.0.1 1729 | onetime: 5.1.2 1730 | signal-exit: 3.0.7 1731 | strip-final-newline: 2.0.0 1732 | dev: true 1733 | 1734 | /exit@0.1.2: 1735 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 1736 | engines: {node: '>= 0.8.0'} 1737 | dev: true 1738 | 1739 | /expect@29.6.4: 1740 | resolution: {integrity: sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==} 1741 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1742 | dependencies: 1743 | '@jest/expect-utils': 29.6.4 1744 | jest-get-type: 29.6.3 1745 | jest-matcher-utils: 29.6.4 1746 | jest-message-util: 29.6.3 1747 | jest-util: 29.6.3 1748 | dev: true 1749 | 1750 | /express@4.18.2: 1751 | resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} 1752 | engines: {node: '>= 0.10.0'} 1753 | dependencies: 1754 | accepts: 1.3.8 1755 | array-flatten: 1.1.1 1756 | body-parser: 1.20.1 1757 | content-disposition: 0.5.4 1758 | content-type: 1.0.5 1759 | cookie: 0.5.0 1760 | cookie-signature: 1.0.6 1761 | debug: 2.6.9 1762 | depd: 2.0.0 1763 | encodeurl: 1.0.2 1764 | escape-html: 1.0.3 1765 | etag: 1.8.1 1766 | finalhandler: 1.2.0 1767 | fresh: 0.5.2 1768 | http-errors: 2.0.0 1769 | merge-descriptors: 1.0.1 1770 | methods: 1.1.2 1771 | on-finished: 2.4.1 1772 | parseurl: 1.3.3 1773 | path-to-regexp: 0.1.7 1774 | proxy-addr: 2.0.7 1775 | qs: 6.11.0 1776 | range-parser: 1.2.1 1777 | safe-buffer: 5.2.1 1778 | send: 0.18.0 1779 | serve-static: 1.15.0 1780 | setprototypeof: 1.2.0 1781 | statuses: 2.0.1 1782 | type-is: 1.6.18 1783 | utils-merge: 1.0.1 1784 | vary: 1.1.2 1785 | transitivePeerDependencies: 1786 | - supports-color 1787 | dev: true 1788 | 1789 | /fast-content-type-parse@1.0.0: 1790 | resolution: {integrity: sha512-Xbc4XcysUXcsP5aHUU7Nq3OwvHq97C+WnbkeIefpeYLX+ryzFJlU6OStFJhs6Ol0LkUGpcK+wL0JwfM+FCU5IA==} 1791 | dev: true 1792 | 1793 | /fast-decode-uri-component@1.0.1: 1794 | resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} 1795 | dev: true 1796 | 1797 | /fast-deep-equal@3.1.3: 1798 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1799 | dev: true 1800 | 1801 | /fast-glob@3.3.1: 1802 | resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} 1803 | engines: {node: '>=8.6.0'} 1804 | dependencies: 1805 | '@nodelib/fs.stat': 2.0.5 1806 | '@nodelib/fs.walk': 1.2.8 1807 | glob-parent: 5.1.2 1808 | merge2: 1.4.1 1809 | micromatch: 4.0.5 1810 | dev: true 1811 | 1812 | /fast-json-stable-stringify@2.1.0: 1813 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1814 | dev: true 1815 | 1816 | /fast-json-stringify@5.8.0: 1817 | resolution: {integrity: sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ==} 1818 | dependencies: 1819 | '@fastify/deepmerge': 1.3.0 1820 | ajv: 8.12.0 1821 | ajv-formats: 2.1.1(ajv@8.12.0) 1822 | fast-deep-equal: 3.1.3 1823 | fast-uri: 2.2.0 1824 | rfdc: 1.3.0 1825 | dev: true 1826 | 1827 | /fast-querystring@1.1.2: 1828 | resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} 1829 | dependencies: 1830 | fast-decode-uri-component: 1.0.1 1831 | dev: true 1832 | 1833 | /fast-redact@3.3.0: 1834 | resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} 1835 | engines: {node: '>=6'} 1836 | dev: true 1837 | 1838 | /fast-uri@2.2.0: 1839 | resolution: {integrity: sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==} 1840 | dev: true 1841 | 1842 | /fastify-plugin@4.5.1: 1843 | resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} 1844 | dev: true 1845 | 1846 | /fastify@4.22.0: 1847 | resolution: {integrity: sha512-HLoBmetdQ6zaJohKW6jzUww8NnwHzkbIbUEyAzM+Nnf7cZVSXRuUV+6b2/xLmu6GGkruIFJ/bIQoKWYRx4wnAQ==} 1848 | dependencies: 1849 | '@fastify/ajv-compiler': 3.5.0 1850 | '@fastify/error': 3.3.0 1851 | '@fastify/fast-json-stringify-compiler': 4.3.0 1852 | abstract-logging: 2.0.1 1853 | avvio: 8.2.1 1854 | fast-content-type-parse: 1.0.0 1855 | fast-json-stringify: 5.8.0 1856 | find-my-way: 7.6.2 1857 | light-my-request: 5.10.0 1858 | pino: 8.15.0 1859 | process-warning: 2.2.0 1860 | proxy-addr: 2.0.7 1861 | rfdc: 1.3.0 1862 | secure-json-parse: 2.7.0 1863 | semver: 7.5.4 1864 | tiny-lru: 11.0.1 1865 | transitivePeerDependencies: 1866 | - supports-color 1867 | dev: true 1868 | 1869 | /fastq@1.15.0: 1870 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 1871 | dependencies: 1872 | reusify: 1.0.4 1873 | dev: true 1874 | 1875 | /fb-watchman@2.0.2: 1876 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 1877 | dependencies: 1878 | bser: 2.1.1 1879 | dev: true 1880 | 1881 | /fill-range@7.0.1: 1882 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1883 | engines: {node: '>=8'} 1884 | dependencies: 1885 | to-regex-range: 5.0.1 1886 | dev: true 1887 | 1888 | /finalhandler@1.2.0: 1889 | resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} 1890 | engines: {node: '>= 0.8'} 1891 | dependencies: 1892 | debug: 2.6.9 1893 | encodeurl: 1.0.2 1894 | escape-html: 1.0.3 1895 | on-finished: 2.4.1 1896 | parseurl: 1.3.3 1897 | statuses: 2.0.1 1898 | unpipe: 1.0.0 1899 | transitivePeerDependencies: 1900 | - supports-color 1901 | dev: true 1902 | 1903 | /find-my-way@7.6.2: 1904 | resolution: {integrity: sha512-0OjHn1b1nCX3eVbm9ByeEHiscPYiHLfhei1wOUU9qffQkk98wE0Lo8VrVYfSGMgnSnDh86DxedduAnBf4nwUEw==} 1905 | engines: {node: '>=14'} 1906 | dependencies: 1907 | fast-deep-equal: 3.1.3 1908 | fast-querystring: 1.1.2 1909 | safe-regex2: 2.0.0 1910 | dev: true 1911 | 1912 | /find-up@4.1.0: 1913 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1914 | engines: {node: '>=8'} 1915 | dependencies: 1916 | locate-path: 5.0.0 1917 | path-exists: 4.0.0 1918 | dev: true 1919 | 1920 | /forwarded@0.2.0: 1921 | resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} 1922 | engines: {node: '>= 0.6'} 1923 | dev: true 1924 | 1925 | /fresh@0.5.2: 1926 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 1927 | engines: {node: '>= 0.6'} 1928 | dev: true 1929 | 1930 | /fs.realpath@1.0.0: 1931 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1932 | dev: true 1933 | 1934 | /fsevents@2.3.3: 1935 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1936 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1937 | os: [darwin] 1938 | requiresBuild: true 1939 | dev: true 1940 | optional: true 1941 | 1942 | /function-bind@1.1.1: 1943 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1944 | dev: true 1945 | 1946 | /gensync@1.0.0-beta.2: 1947 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1948 | engines: {node: '>=6.9.0'} 1949 | dev: true 1950 | 1951 | /get-caller-file@2.0.5: 1952 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1953 | engines: {node: 6.* || 8.* || >= 10.*} 1954 | dev: true 1955 | 1956 | /get-intrinsic@1.2.1: 1957 | resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} 1958 | dependencies: 1959 | function-bind: 1.1.1 1960 | has: 1.0.3 1961 | has-proto: 1.0.1 1962 | has-symbols: 1.0.3 1963 | dev: true 1964 | 1965 | /get-package-type@0.1.0: 1966 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 1967 | engines: {node: '>=8.0.0'} 1968 | dev: true 1969 | 1970 | /get-stream@6.0.1: 1971 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1972 | engines: {node: '>=10'} 1973 | dev: true 1974 | 1975 | /glob-parent@5.1.2: 1976 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1977 | engines: {node: '>= 6'} 1978 | dependencies: 1979 | is-glob: 4.0.3 1980 | dev: true 1981 | 1982 | /glob@7.1.6: 1983 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} 1984 | dependencies: 1985 | fs.realpath: 1.0.0 1986 | inflight: 1.0.6 1987 | inherits: 2.0.4 1988 | minimatch: 3.1.2 1989 | once: 1.4.0 1990 | path-is-absolute: 1.0.1 1991 | dev: true 1992 | 1993 | /globals@11.12.0: 1994 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1995 | engines: {node: '>=4'} 1996 | dev: true 1997 | 1998 | /globby@11.1.0: 1999 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 2000 | engines: {node: '>=10'} 2001 | dependencies: 2002 | array-union: 2.1.0 2003 | dir-glob: 3.0.1 2004 | fast-glob: 3.3.1 2005 | ignore: 5.2.4 2006 | merge2: 1.4.1 2007 | slash: 3.0.0 2008 | dev: true 2009 | 2010 | /graceful-fs@4.2.11: 2011 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 2012 | dev: true 2013 | 2014 | /has-flag@3.0.0: 2015 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 2016 | engines: {node: '>=4'} 2017 | dev: true 2018 | 2019 | /has-flag@4.0.0: 2020 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 2021 | engines: {node: '>=8'} 2022 | dev: true 2023 | 2024 | /has-proto@1.0.1: 2025 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 2026 | engines: {node: '>= 0.4'} 2027 | dev: true 2028 | 2029 | /has-symbols@1.0.3: 2030 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 2031 | engines: {node: '>= 0.4'} 2032 | dev: true 2033 | 2034 | /has@1.0.3: 2035 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 2036 | engines: {node: '>= 0.4.0'} 2037 | dependencies: 2038 | function-bind: 1.1.1 2039 | dev: true 2040 | 2041 | /html-escaper@2.0.2: 2042 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 2043 | dev: true 2044 | 2045 | /http-errors@2.0.0: 2046 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 2047 | engines: {node: '>= 0.8'} 2048 | dependencies: 2049 | depd: 2.0.0 2050 | inherits: 2.0.4 2051 | setprototypeof: 1.2.0 2052 | statuses: 2.0.1 2053 | toidentifier: 1.0.1 2054 | dev: true 2055 | 2056 | /human-signals@2.1.0: 2057 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 2058 | engines: {node: '>=10.17.0'} 2059 | dev: true 2060 | 2061 | /iconv-lite@0.4.24: 2062 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 2063 | engines: {node: '>=0.10.0'} 2064 | dependencies: 2065 | safer-buffer: 2.1.2 2066 | dev: true 2067 | 2068 | /ieee754@1.2.1: 2069 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 2070 | dev: true 2071 | 2072 | /ignore@5.2.4: 2073 | resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} 2074 | engines: {node: '>= 4'} 2075 | dev: true 2076 | 2077 | /import-local@3.1.0: 2078 | resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} 2079 | engines: {node: '>=8'} 2080 | hasBin: true 2081 | dependencies: 2082 | pkg-dir: 4.2.0 2083 | resolve-cwd: 3.0.0 2084 | dev: true 2085 | 2086 | /imurmurhash@0.1.4: 2087 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 2088 | engines: {node: '>=0.8.19'} 2089 | dev: true 2090 | 2091 | /inflight@1.0.6: 2092 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 2093 | dependencies: 2094 | once: 1.4.0 2095 | wrappy: 1.0.2 2096 | dev: true 2097 | 2098 | /inherits@2.0.4: 2099 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 2100 | dev: true 2101 | 2102 | /ipaddr.js@1.9.1: 2103 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 2104 | engines: {node: '>= 0.10'} 2105 | dev: true 2106 | 2107 | /is-arrayish@0.2.1: 2108 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 2109 | dev: true 2110 | 2111 | /is-binary-path@2.1.0: 2112 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 2113 | engines: {node: '>=8'} 2114 | dependencies: 2115 | binary-extensions: 2.2.0 2116 | dev: true 2117 | 2118 | /is-core-module@2.13.0: 2119 | resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} 2120 | dependencies: 2121 | has: 1.0.3 2122 | dev: true 2123 | 2124 | /is-extglob@2.1.1: 2125 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 2126 | engines: {node: '>=0.10.0'} 2127 | dev: true 2128 | 2129 | /is-fullwidth-code-point@3.0.0: 2130 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 2131 | engines: {node: '>=8'} 2132 | dev: true 2133 | 2134 | /is-generator-fn@2.1.0: 2135 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 2136 | engines: {node: '>=6'} 2137 | dev: true 2138 | 2139 | /is-glob@4.0.3: 2140 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 2141 | engines: {node: '>=0.10.0'} 2142 | dependencies: 2143 | is-extglob: 2.1.1 2144 | dev: true 2145 | 2146 | /is-number@7.0.0: 2147 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 2148 | engines: {node: '>=0.12.0'} 2149 | dev: true 2150 | 2151 | /is-stream@2.0.1: 2152 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 2153 | engines: {node: '>=8'} 2154 | dev: true 2155 | 2156 | /isexe@2.0.0: 2157 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 2158 | dev: true 2159 | 2160 | /istanbul-lib-coverage@3.2.0: 2161 | resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} 2162 | engines: {node: '>=8'} 2163 | dev: true 2164 | 2165 | /istanbul-lib-instrument@5.2.1: 2166 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 2167 | engines: {node: '>=8'} 2168 | dependencies: 2169 | '@babel/core': 7.22.11 2170 | '@babel/parser': 7.22.11 2171 | '@istanbuljs/schema': 0.1.3 2172 | istanbul-lib-coverage: 3.2.0 2173 | semver: 6.3.1 2174 | transitivePeerDependencies: 2175 | - supports-color 2176 | dev: true 2177 | 2178 | /istanbul-lib-instrument@6.0.0: 2179 | resolution: {integrity: sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==} 2180 | engines: {node: '>=10'} 2181 | dependencies: 2182 | '@babel/core': 7.22.11 2183 | '@babel/parser': 7.22.11 2184 | '@istanbuljs/schema': 0.1.3 2185 | istanbul-lib-coverage: 3.2.0 2186 | semver: 7.5.4 2187 | transitivePeerDependencies: 2188 | - supports-color 2189 | dev: true 2190 | 2191 | /istanbul-lib-report@3.0.1: 2192 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 2193 | engines: {node: '>=10'} 2194 | dependencies: 2195 | istanbul-lib-coverage: 3.2.0 2196 | make-dir: 4.0.0 2197 | supports-color: 7.2.0 2198 | dev: true 2199 | 2200 | /istanbul-lib-source-maps@4.0.1: 2201 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 2202 | engines: {node: '>=10'} 2203 | dependencies: 2204 | debug: 4.3.4 2205 | istanbul-lib-coverage: 3.2.0 2206 | source-map: 0.6.1 2207 | transitivePeerDependencies: 2208 | - supports-color 2209 | dev: true 2210 | 2211 | /istanbul-reports@3.1.6: 2212 | resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} 2213 | engines: {node: '>=8'} 2214 | dependencies: 2215 | html-escaper: 2.0.2 2216 | istanbul-lib-report: 3.0.1 2217 | dev: true 2218 | 2219 | /jest-changed-files@29.6.3: 2220 | resolution: {integrity: sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==} 2221 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2222 | dependencies: 2223 | execa: 5.1.1 2224 | jest-util: 29.6.3 2225 | p-limit: 3.1.0 2226 | dev: true 2227 | 2228 | /jest-circus@29.6.4: 2229 | resolution: {integrity: sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==} 2230 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2231 | dependencies: 2232 | '@jest/environment': 29.6.4 2233 | '@jest/expect': 29.6.4 2234 | '@jest/test-result': 29.6.4 2235 | '@jest/types': 29.6.3 2236 | '@types/node': 18.17.11 2237 | chalk: 4.1.2 2238 | co: 4.6.0 2239 | dedent: 1.5.1 2240 | is-generator-fn: 2.1.0 2241 | jest-each: 29.6.3 2242 | jest-matcher-utils: 29.6.4 2243 | jest-message-util: 29.6.3 2244 | jest-runtime: 29.6.4 2245 | jest-snapshot: 29.6.4 2246 | jest-util: 29.6.3 2247 | p-limit: 3.1.0 2248 | pretty-format: 29.6.3 2249 | pure-rand: 6.0.2 2250 | slash: 3.0.0 2251 | stack-utils: 2.0.6 2252 | transitivePeerDependencies: 2253 | - babel-plugin-macros 2254 | - supports-color 2255 | dev: true 2256 | 2257 | /jest-cli@29.6.4(@types/node@18.17.11)(ts-node@10.9.1): 2258 | resolution: {integrity: sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==} 2259 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2260 | hasBin: true 2261 | peerDependencies: 2262 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 2263 | peerDependenciesMeta: 2264 | node-notifier: 2265 | optional: true 2266 | dependencies: 2267 | '@jest/core': 29.6.4(ts-node@10.9.1) 2268 | '@jest/test-result': 29.6.4 2269 | '@jest/types': 29.6.3 2270 | chalk: 4.1.2 2271 | exit: 0.1.2 2272 | graceful-fs: 4.2.11 2273 | import-local: 3.1.0 2274 | jest-config: 29.6.4(@types/node@18.17.11)(ts-node@10.9.1) 2275 | jest-util: 29.6.3 2276 | jest-validate: 29.6.3 2277 | prompts: 2.4.2 2278 | yargs: 17.7.2 2279 | transitivePeerDependencies: 2280 | - '@types/node' 2281 | - babel-plugin-macros 2282 | - supports-color 2283 | - ts-node 2284 | dev: true 2285 | 2286 | /jest-config@29.6.4(@types/node@18.17.11)(ts-node@10.9.1): 2287 | resolution: {integrity: sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==} 2288 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2289 | peerDependencies: 2290 | '@types/node': '*' 2291 | ts-node: '>=9.0.0' 2292 | peerDependenciesMeta: 2293 | '@types/node': 2294 | optional: true 2295 | ts-node: 2296 | optional: true 2297 | dependencies: 2298 | '@babel/core': 7.22.11 2299 | '@jest/test-sequencer': 29.6.4 2300 | '@jest/types': 29.6.3 2301 | '@types/node': 18.17.11 2302 | babel-jest: 29.6.4(@babel/core@7.22.11) 2303 | chalk: 4.1.2 2304 | ci-info: 3.8.0 2305 | deepmerge: 4.3.1 2306 | glob: 7.1.6 2307 | graceful-fs: 4.2.11 2308 | jest-circus: 29.6.4 2309 | jest-environment-node: 29.6.4 2310 | jest-get-type: 29.6.3 2311 | jest-regex-util: 29.6.3 2312 | jest-resolve: 29.6.4 2313 | jest-runner: 29.6.4 2314 | jest-util: 29.6.3 2315 | jest-validate: 29.6.3 2316 | micromatch: 4.0.5 2317 | parse-json: 5.2.0 2318 | pretty-format: 29.6.3 2319 | slash: 3.0.0 2320 | strip-json-comments: 3.1.1 2321 | ts-node: 10.9.1(@types/node@18.17.11)(typescript@5.2.2) 2322 | transitivePeerDependencies: 2323 | - babel-plugin-macros 2324 | - supports-color 2325 | dev: true 2326 | 2327 | /jest-diff@29.6.4: 2328 | resolution: {integrity: sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==} 2329 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2330 | dependencies: 2331 | chalk: 4.1.2 2332 | diff-sequences: 29.6.3 2333 | jest-get-type: 29.6.3 2334 | pretty-format: 29.6.3 2335 | dev: true 2336 | 2337 | /jest-docblock@29.6.3: 2338 | resolution: {integrity: sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==} 2339 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2340 | dependencies: 2341 | detect-newline: 3.1.0 2342 | dev: true 2343 | 2344 | /jest-each@29.6.3: 2345 | resolution: {integrity: sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==} 2346 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2347 | dependencies: 2348 | '@jest/types': 29.6.3 2349 | chalk: 4.1.2 2350 | jest-get-type: 29.6.3 2351 | jest-util: 29.6.3 2352 | pretty-format: 29.6.3 2353 | dev: true 2354 | 2355 | /jest-environment-node@29.6.4: 2356 | resolution: {integrity: sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==} 2357 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2358 | dependencies: 2359 | '@jest/environment': 29.6.4 2360 | '@jest/fake-timers': 29.6.4 2361 | '@jest/types': 29.6.3 2362 | '@types/node': 18.17.11 2363 | jest-mock: 29.6.3 2364 | jest-util: 29.6.3 2365 | dev: true 2366 | 2367 | /jest-get-type@29.6.3: 2368 | resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} 2369 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2370 | dev: true 2371 | 2372 | /jest-haste-map@29.6.4: 2373 | resolution: {integrity: sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==} 2374 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2375 | dependencies: 2376 | '@jest/types': 29.6.3 2377 | '@types/graceful-fs': 4.1.6 2378 | '@types/node': 18.17.11 2379 | anymatch: 3.1.3 2380 | fb-watchman: 2.0.2 2381 | graceful-fs: 4.2.11 2382 | jest-regex-util: 29.6.3 2383 | jest-util: 29.6.3 2384 | jest-worker: 29.6.4 2385 | micromatch: 4.0.5 2386 | walker: 1.0.8 2387 | optionalDependencies: 2388 | fsevents: 2.3.3 2389 | dev: true 2390 | 2391 | /jest-leak-detector@29.6.3: 2392 | resolution: {integrity: sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==} 2393 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2394 | dependencies: 2395 | jest-get-type: 29.6.3 2396 | pretty-format: 29.6.3 2397 | dev: true 2398 | 2399 | /jest-matcher-utils@29.6.4: 2400 | resolution: {integrity: sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==} 2401 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2402 | dependencies: 2403 | chalk: 4.1.2 2404 | jest-diff: 29.6.4 2405 | jest-get-type: 29.6.3 2406 | pretty-format: 29.6.3 2407 | dev: true 2408 | 2409 | /jest-message-util@29.6.3: 2410 | resolution: {integrity: sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==} 2411 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2412 | dependencies: 2413 | '@babel/code-frame': 7.22.10 2414 | '@jest/types': 29.6.3 2415 | '@types/stack-utils': 2.0.1 2416 | chalk: 4.1.2 2417 | graceful-fs: 4.2.11 2418 | micromatch: 4.0.5 2419 | pretty-format: 29.6.3 2420 | slash: 3.0.0 2421 | stack-utils: 2.0.6 2422 | dev: true 2423 | 2424 | /jest-mock@29.6.3: 2425 | resolution: {integrity: sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==} 2426 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2427 | dependencies: 2428 | '@jest/types': 29.6.3 2429 | '@types/node': 18.17.11 2430 | jest-util: 29.6.3 2431 | dev: true 2432 | 2433 | /jest-pnp-resolver@1.2.3(jest-resolve@29.6.4): 2434 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 2435 | engines: {node: '>=6'} 2436 | peerDependencies: 2437 | jest-resolve: '*' 2438 | peerDependenciesMeta: 2439 | jest-resolve: 2440 | optional: true 2441 | dependencies: 2442 | jest-resolve: 29.6.4 2443 | dev: true 2444 | 2445 | /jest-regex-util@29.6.3: 2446 | resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} 2447 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2448 | dev: true 2449 | 2450 | /jest-resolve-dependencies@29.6.4: 2451 | resolution: {integrity: sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==} 2452 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2453 | dependencies: 2454 | jest-regex-util: 29.6.3 2455 | jest-snapshot: 29.6.4 2456 | transitivePeerDependencies: 2457 | - supports-color 2458 | dev: true 2459 | 2460 | /jest-resolve@29.6.4: 2461 | resolution: {integrity: sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==} 2462 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2463 | dependencies: 2464 | chalk: 4.1.2 2465 | graceful-fs: 4.2.11 2466 | jest-haste-map: 29.6.4 2467 | jest-pnp-resolver: 1.2.3(jest-resolve@29.6.4) 2468 | jest-util: 29.6.3 2469 | jest-validate: 29.6.3 2470 | resolve: 1.22.4 2471 | resolve.exports: 2.0.2 2472 | slash: 3.0.0 2473 | dev: true 2474 | 2475 | /jest-runner@29.6.4: 2476 | resolution: {integrity: sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==} 2477 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2478 | dependencies: 2479 | '@jest/console': 29.6.4 2480 | '@jest/environment': 29.6.4 2481 | '@jest/test-result': 29.6.4 2482 | '@jest/transform': 29.6.4 2483 | '@jest/types': 29.6.3 2484 | '@types/node': 18.17.11 2485 | chalk: 4.1.2 2486 | emittery: 0.13.1 2487 | graceful-fs: 4.2.11 2488 | jest-docblock: 29.6.3 2489 | jest-environment-node: 29.6.4 2490 | jest-haste-map: 29.6.4 2491 | jest-leak-detector: 29.6.3 2492 | jest-message-util: 29.6.3 2493 | jest-resolve: 29.6.4 2494 | jest-runtime: 29.6.4 2495 | jest-util: 29.6.3 2496 | jest-watcher: 29.6.4 2497 | jest-worker: 29.6.4 2498 | p-limit: 3.1.0 2499 | source-map-support: 0.5.13 2500 | transitivePeerDependencies: 2501 | - supports-color 2502 | dev: true 2503 | 2504 | /jest-runtime@29.6.4: 2505 | resolution: {integrity: sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==} 2506 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2507 | dependencies: 2508 | '@jest/environment': 29.6.4 2509 | '@jest/fake-timers': 29.6.4 2510 | '@jest/globals': 29.6.4 2511 | '@jest/source-map': 29.6.3 2512 | '@jest/test-result': 29.6.4 2513 | '@jest/transform': 29.6.4 2514 | '@jest/types': 29.6.3 2515 | '@types/node': 18.17.11 2516 | chalk: 4.1.2 2517 | cjs-module-lexer: 1.2.3 2518 | collect-v8-coverage: 1.0.2 2519 | glob: 7.1.6 2520 | graceful-fs: 4.2.11 2521 | jest-haste-map: 29.6.4 2522 | jest-message-util: 29.6.3 2523 | jest-mock: 29.6.3 2524 | jest-regex-util: 29.6.3 2525 | jest-resolve: 29.6.4 2526 | jest-snapshot: 29.6.4 2527 | jest-util: 29.6.3 2528 | slash: 3.0.0 2529 | strip-bom: 4.0.0 2530 | transitivePeerDependencies: 2531 | - supports-color 2532 | dev: true 2533 | 2534 | /jest-snapshot@29.6.4: 2535 | resolution: {integrity: sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==} 2536 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2537 | dependencies: 2538 | '@babel/core': 7.22.11 2539 | '@babel/generator': 7.22.10 2540 | '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.11) 2541 | '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.11) 2542 | '@babel/types': 7.22.11 2543 | '@jest/expect-utils': 29.6.4 2544 | '@jest/transform': 29.6.4 2545 | '@jest/types': 29.6.3 2546 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.11) 2547 | chalk: 4.1.2 2548 | expect: 29.6.4 2549 | graceful-fs: 4.2.11 2550 | jest-diff: 29.6.4 2551 | jest-get-type: 29.6.3 2552 | jest-matcher-utils: 29.6.4 2553 | jest-message-util: 29.6.3 2554 | jest-util: 29.6.3 2555 | natural-compare: 1.4.0 2556 | pretty-format: 29.6.3 2557 | semver: 7.5.4 2558 | transitivePeerDependencies: 2559 | - supports-color 2560 | dev: true 2561 | 2562 | /jest-util@29.6.3: 2563 | resolution: {integrity: sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==} 2564 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2565 | dependencies: 2566 | '@jest/types': 29.6.3 2567 | '@types/node': 18.17.11 2568 | chalk: 4.1.2 2569 | ci-info: 3.8.0 2570 | graceful-fs: 4.2.11 2571 | picomatch: 2.3.1 2572 | dev: true 2573 | 2574 | /jest-validate@29.6.3: 2575 | resolution: {integrity: sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==} 2576 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2577 | dependencies: 2578 | '@jest/types': 29.6.3 2579 | camelcase: 6.3.0 2580 | chalk: 4.1.2 2581 | jest-get-type: 29.6.3 2582 | leven: 3.1.0 2583 | pretty-format: 29.6.3 2584 | dev: true 2585 | 2586 | /jest-watcher@29.6.4: 2587 | resolution: {integrity: sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==} 2588 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2589 | dependencies: 2590 | '@jest/test-result': 29.6.4 2591 | '@jest/types': 29.6.3 2592 | '@types/node': 18.17.11 2593 | ansi-escapes: 4.3.2 2594 | chalk: 4.1.2 2595 | emittery: 0.13.1 2596 | jest-util: 29.6.3 2597 | string-length: 4.0.2 2598 | dev: true 2599 | 2600 | /jest-worker@29.6.4: 2601 | resolution: {integrity: sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==} 2602 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2603 | dependencies: 2604 | '@types/node': 18.17.11 2605 | jest-util: 29.6.3 2606 | merge-stream: 2.0.0 2607 | supports-color: 8.1.1 2608 | dev: true 2609 | 2610 | /jest@29.6.4(@types/node@18.17.11)(ts-node@10.9.1): 2611 | resolution: {integrity: sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==} 2612 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2613 | hasBin: true 2614 | peerDependencies: 2615 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 2616 | peerDependenciesMeta: 2617 | node-notifier: 2618 | optional: true 2619 | dependencies: 2620 | '@jest/core': 29.6.4(ts-node@10.9.1) 2621 | '@jest/types': 29.6.3 2622 | import-local: 3.1.0 2623 | jest-cli: 29.6.4(@types/node@18.17.11)(ts-node@10.9.1) 2624 | transitivePeerDependencies: 2625 | - '@types/node' 2626 | - babel-plugin-macros 2627 | - supports-color 2628 | - ts-node 2629 | dev: true 2630 | 2631 | /joycon@3.1.1: 2632 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 2633 | engines: {node: '>=10'} 2634 | dev: true 2635 | 2636 | /js-tokens@4.0.0: 2637 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2638 | dev: true 2639 | 2640 | /js-yaml@3.14.1: 2641 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 2642 | hasBin: true 2643 | dependencies: 2644 | argparse: 1.0.10 2645 | esprima: 4.0.1 2646 | dev: true 2647 | 2648 | /jsesc@2.5.2: 2649 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 2650 | engines: {node: '>=4'} 2651 | hasBin: true 2652 | dev: true 2653 | 2654 | /json-parse-even-better-errors@2.3.1: 2655 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 2656 | dev: true 2657 | 2658 | /json-schema-traverse@1.0.0: 2659 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 2660 | dev: true 2661 | 2662 | /json5@2.2.3: 2663 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 2664 | engines: {node: '>=6'} 2665 | hasBin: true 2666 | dev: true 2667 | 2668 | /kleur@3.0.3: 2669 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 2670 | engines: {node: '>=6'} 2671 | dev: true 2672 | 2673 | /leven@3.1.0: 2674 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 2675 | engines: {node: '>=6'} 2676 | dev: true 2677 | 2678 | /light-my-request@5.10.0: 2679 | resolution: {integrity: sha512-ZU2D9GmAcOUculTTdH9/zryej6n8TzT+fNGdNtm6SDp5MMMpHrJJkvAdE3c6d8d2chE9i+a//dS9CWZtisknqA==} 2680 | dependencies: 2681 | cookie: 0.5.0 2682 | process-warning: 2.2.0 2683 | set-cookie-parser: 2.6.0 2684 | dev: true 2685 | 2686 | /lilconfig@2.1.0: 2687 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 2688 | engines: {node: '>=10'} 2689 | dev: true 2690 | 2691 | /lines-and-columns@1.2.4: 2692 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 2693 | dev: true 2694 | 2695 | /load-tsconfig@0.2.5: 2696 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 2697 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 2698 | dev: true 2699 | 2700 | /locate-path@5.0.0: 2701 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 2702 | engines: {node: '>=8'} 2703 | dependencies: 2704 | p-locate: 4.1.0 2705 | dev: true 2706 | 2707 | /lodash.memoize@4.1.2: 2708 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 2709 | dev: true 2710 | 2711 | /lodash.sortby@4.7.0: 2712 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 2713 | dev: true 2714 | 2715 | /lru-cache@5.1.1: 2716 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 2717 | dependencies: 2718 | yallist: 3.1.1 2719 | dev: true 2720 | 2721 | /lru-cache@6.0.0: 2722 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 2723 | engines: {node: '>=10'} 2724 | dependencies: 2725 | yallist: 4.0.0 2726 | dev: true 2727 | 2728 | /make-dir@4.0.0: 2729 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 2730 | engines: {node: '>=10'} 2731 | dependencies: 2732 | semver: 7.5.4 2733 | dev: true 2734 | 2735 | /make-error@1.3.6: 2736 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 2737 | dev: true 2738 | 2739 | /makeerror@1.0.12: 2740 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 2741 | dependencies: 2742 | tmpl: 1.0.5 2743 | dev: true 2744 | 2745 | /media-typer@0.3.0: 2746 | resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} 2747 | engines: {node: '>= 0.6'} 2748 | dev: true 2749 | 2750 | /merge-descriptors@1.0.1: 2751 | resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} 2752 | dev: true 2753 | 2754 | /merge-stream@2.0.0: 2755 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 2756 | dev: true 2757 | 2758 | /merge2@1.4.1: 2759 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 2760 | engines: {node: '>= 8'} 2761 | dev: true 2762 | 2763 | /methods@1.1.2: 2764 | resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} 2765 | engines: {node: '>= 0.6'} 2766 | dev: true 2767 | 2768 | /micromatch@4.0.5: 2769 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2770 | engines: {node: '>=8.6'} 2771 | dependencies: 2772 | braces: 3.0.2 2773 | picomatch: 2.3.1 2774 | dev: true 2775 | 2776 | /mime-db@1.52.0: 2777 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 2778 | engines: {node: '>= 0.6'} 2779 | dev: true 2780 | 2781 | /mime-types@2.1.35: 2782 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 2783 | engines: {node: '>= 0.6'} 2784 | dependencies: 2785 | mime-db: 1.52.0 2786 | dev: true 2787 | 2788 | /mime@1.6.0: 2789 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 2790 | engines: {node: '>=4'} 2791 | hasBin: true 2792 | dev: true 2793 | 2794 | /mimic-fn@2.1.0: 2795 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 2796 | engines: {node: '>=6'} 2797 | dev: true 2798 | 2799 | /minimatch@3.1.2: 2800 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2801 | dependencies: 2802 | brace-expansion: 1.1.11 2803 | dev: true 2804 | 2805 | /ms@2.0.0: 2806 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 2807 | dev: true 2808 | 2809 | /ms@2.1.2: 2810 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2811 | dev: true 2812 | 2813 | /ms@2.1.3: 2814 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 2815 | dev: true 2816 | 2817 | /mz@2.7.0: 2818 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 2819 | dependencies: 2820 | any-promise: 1.3.0 2821 | object-assign: 4.1.1 2822 | thenify-all: 1.6.0 2823 | dev: true 2824 | 2825 | /natural-compare@1.4.0: 2826 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2827 | dev: true 2828 | 2829 | /negotiator@0.6.3: 2830 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 2831 | engines: {node: '>= 0.6'} 2832 | dev: true 2833 | 2834 | /node-int64@0.4.0: 2835 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 2836 | dev: true 2837 | 2838 | /node-releases@2.0.13: 2839 | resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} 2840 | dev: true 2841 | 2842 | /normalize-path@3.0.0: 2843 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2844 | engines: {node: '>=0.10.0'} 2845 | dev: true 2846 | 2847 | /npm-run-path@4.0.1: 2848 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 2849 | engines: {node: '>=8'} 2850 | dependencies: 2851 | path-key: 3.1.1 2852 | dev: true 2853 | 2854 | /object-assign@4.1.1: 2855 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 2856 | engines: {node: '>=0.10.0'} 2857 | dev: true 2858 | 2859 | /object-inspect@1.12.3: 2860 | resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} 2861 | dev: true 2862 | 2863 | /on-exit-leak-free@2.1.0: 2864 | resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} 2865 | dev: true 2866 | 2867 | /on-finished@2.4.1: 2868 | resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} 2869 | engines: {node: '>= 0.8'} 2870 | dependencies: 2871 | ee-first: 1.1.1 2872 | dev: true 2873 | 2874 | /once@1.4.0: 2875 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2876 | dependencies: 2877 | wrappy: 1.0.2 2878 | dev: true 2879 | 2880 | /onetime@5.1.2: 2881 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 2882 | engines: {node: '>=6'} 2883 | dependencies: 2884 | mimic-fn: 2.1.0 2885 | dev: true 2886 | 2887 | /p-limit@2.3.0: 2888 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 2889 | engines: {node: '>=6'} 2890 | dependencies: 2891 | p-try: 2.2.0 2892 | dev: true 2893 | 2894 | /p-limit@3.1.0: 2895 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2896 | engines: {node: '>=10'} 2897 | dependencies: 2898 | yocto-queue: 0.1.0 2899 | dev: true 2900 | 2901 | /p-locate@4.1.0: 2902 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 2903 | engines: {node: '>=8'} 2904 | dependencies: 2905 | p-limit: 2.3.0 2906 | dev: true 2907 | 2908 | /p-try@2.2.0: 2909 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 2910 | engines: {node: '>=6'} 2911 | dev: true 2912 | 2913 | /parse-json@5.2.0: 2914 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 2915 | engines: {node: '>=8'} 2916 | dependencies: 2917 | '@babel/code-frame': 7.22.10 2918 | error-ex: 1.3.2 2919 | json-parse-even-better-errors: 2.3.1 2920 | lines-and-columns: 1.2.4 2921 | dev: true 2922 | 2923 | /parseurl@1.3.3: 2924 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 2925 | engines: {node: '>= 0.8'} 2926 | dev: true 2927 | 2928 | /path-exists@4.0.0: 2929 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2930 | engines: {node: '>=8'} 2931 | dev: true 2932 | 2933 | /path-is-absolute@1.0.1: 2934 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2935 | engines: {node: '>=0.10.0'} 2936 | dev: true 2937 | 2938 | /path-key@3.1.1: 2939 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2940 | engines: {node: '>=8'} 2941 | dev: true 2942 | 2943 | /path-parse@1.0.7: 2944 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2945 | dev: true 2946 | 2947 | /path-to-regexp@0.1.7: 2948 | resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} 2949 | dev: true 2950 | 2951 | /path-type@4.0.0: 2952 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2953 | engines: {node: '>=8'} 2954 | dev: true 2955 | 2956 | /picocolors@1.0.0: 2957 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2958 | dev: true 2959 | 2960 | /picomatch@2.3.1: 2961 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2962 | engines: {node: '>=8.6'} 2963 | dev: true 2964 | 2965 | /pino-abstract-transport@1.0.0: 2966 | resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} 2967 | dependencies: 2968 | readable-stream: 4.4.2 2969 | split2: 4.2.0 2970 | dev: true 2971 | 2972 | /pino-std-serializers@6.2.2: 2973 | resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} 2974 | dev: true 2975 | 2976 | /pino@8.15.0: 2977 | resolution: {integrity: sha512-olUADJByk4twxccmAxb1RiGKOSvddHugCV3wkqjyv+3Sooa2KLrmXrKEWOKi0XPCLasRR5jBXxioE1jxUa4KzQ==} 2978 | hasBin: true 2979 | dependencies: 2980 | atomic-sleep: 1.0.0 2981 | fast-redact: 3.3.0 2982 | on-exit-leak-free: 2.1.0 2983 | pino-abstract-transport: 1.0.0 2984 | pino-std-serializers: 6.2.2 2985 | process-warning: 2.2.0 2986 | quick-format-unescaped: 4.0.4 2987 | real-require: 0.2.0 2988 | safe-stable-stringify: 2.4.3 2989 | sonic-boom: 3.3.0 2990 | thread-stream: 2.4.0 2991 | dev: true 2992 | 2993 | /pirates@4.0.6: 2994 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 2995 | engines: {node: '>= 6'} 2996 | dev: true 2997 | 2998 | /pkg-dir@4.2.0: 2999 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 3000 | engines: {node: '>=8'} 3001 | dependencies: 3002 | find-up: 4.1.0 3003 | dev: true 3004 | 3005 | /postcss-load-config@4.0.1(ts-node@10.9.1): 3006 | resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} 3007 | engines: {node: '>= 14'} 3008 | peerDependencies: 3009 | postcss: '>=8.0.9' 3010 | ts-node: '>=9.0.0' 3011 | peerDependenciesMeta: 3012 | postcss: 3013 | optional: true 3014 | ts-node: 3015 | optional: true 3016 | dependencies: 3017 | lilconfig: 2.1.0 3018 | ts-node: 10.9.1(@types/node@18.17.11)(typescript@5.2.2) 3019 | yaml: 2.3.1 3020 | dev: true 3021 | 3022 | /prettier@2.8.8: 3023 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 3024 | engines: {node: '>=10.13.0'} 3025 | hasBin: true 3026 | dev: true 3027 | 3028 | /pretty-format@29.6.3: 3029 | resolution: {integrity: sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==} 3030 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 3031 | dependencies: 3032 | '@jest/schemas': 29.6.3 3033 | ansi-styles: 5.2.0 3034 | react-is: 18.2.0 3035 | dev: true 3036 | 3037 | /process-warning@2.2.0: 3038 | resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} 3039 | dev: true 3040 | 3041 | /process@0.11.10: 3042 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 3043 | engines: {node: '>= 0.6.0'} 3044 | dev: true 3045 | 3046 | /prompts@2.4.2: 3047 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 3048 | engines: {node: '>= 6'} 3049 | dependencies: 3050 | kleur: 3.0.3 3051 | sisteransi: 1.0.5 3052 | dev: true 3053 | 3054 | /proxy-addr@2.0.7: 3055 | resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} 3056 | engines: {node: '>= 0.10'} 3057 | dependencies: 3058 | forwarded: 0.2.0 3059 | ipaddr.js: 1.9.1 3060 | dev: true 3061 | 3062 | /punycode@2.3.0: 3063 | resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} 3064 | engines: {node: '>=6'} 3065 | dev: true 3066 | 3067 | /pure-rand@6.0.2: 3068 | resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==} 3069 | dev: true 3070 | 3071 | /qs@6.11.0: 3072 | resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} 3073 | engines: {node: '>=0.6'} 3074 | dependencies: 3075 | side-channel: 1.0.4 3076 | dev: true 3077 | 3078 | /queue-microtask@1.2.3: 3079 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 3080 | dev: true 3081 | 3082 | /quick-format-unescaped@4.0.4: 3083 | resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} 3084 | dev: true 3085 | 3086 | /range-parser@1.2.1: 3087 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 3088 | engines: {node: '>= 0.6'} 3089 | dev: true 3090 | 3091 | /raw-body@2.5.1: 3092 | resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} 3093 | engines: {node: '>= 0.8'} 3094 | dependencies: 3095 | bytes: 3.1.2 3096 | http-errors: 2.0.0 3097 | iconv-lite: 0.4.24 3098 | unpipe: 1.0.0 3099 | dev: true 3100 | 3101 | /react-is@18.2.0: 3102 | resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} 3103 | dev: true 3104 | 3105 | /readable-stream@4.4.2: 3106 | resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} 3107 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 3108 | dependencies: 3109 | abort-controller: 3.0.0 3110 | buffer: 6.0.3 3111 | events: 3.3.0 3112 | process: 0.11.10 3113 | string_decoder: 1.3.0 3114 | dev: true 3115 | 3116 | /readdirp@3.6.0: 3117 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 3118 | engines: {node: '>=8.10.0'} 3119 | dependencies: 3120 | picomatch: 2.3.1 3121 | dev: true 3122 | 3123 | /real-require@0.2.0: 3124 | resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} 3125 | engines: {node: '>= 12.13.0'} 3126 | dev: true 3127 | 3128 | /require-directory@2.1.1: 3129 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 3130 | engines: {node: '>=0.10.0'} 3131 | dev: true 3132 | 3133 | /require-from-string@2.0.2: 3134 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 3135 | engines: {node: '>=0.10.0'} 3136 | dev: true 3137 | 3138 | /resolve-cwd@3.0.0: 3139 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 3140 | engines: {node: '>=8'} 3141 | dependencies: 3142 | resolve-from: 5.0.0 3143 | dev: true 3144 | 3145 | /resolve-from@5.0.0: 3146 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 3147 | engines: {node: '>=8'} 3148 | dev: true 3149 | 3150 | /resolve.exports@2.0.2: 3151 | resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} 3152 | engines: {node: '>=10'} 3153 | dev: true 3154 | 3155 | /resolve@1.22.4: 3156 | resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} 3157 | hasBin: true 3158 | dependencies: 3159 | is-core-module: 2.13.0 3160 | path-parse: 1.0.7 3161 | supports-preserve-symlinks-flag: 1.0.0 3162 | dev: true 3163 | 3164 | /ret@0.2.2: 3165 | resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} 3166 | engines: {node: '>=4'} 3167 | dev: true 3168 | 3169 | /reusify@1.0.4: 3170 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 3171 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 3172 | dev: true 3173 | 3174 | /rfdc@1.3.0: 3175 | resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} 3176 | dev: true 3177 | 3178 | /rollup@3.28.1: 3179 | resolution: {integrity: sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==} 3180 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 3181 | hasBin: true 3182 | optionalDependencies: 3183 | fsevents: 2.3.3 3184 | dev: true 3185 | 3186 | /run-parallel@1.2.0: 3187 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 3188 | dependencies: 3189 | queue-microtask: 1.2.3 3190 | dev: true 3191 | 3192 | /safe-buffer@5.2.1: 3193 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 3194 | dev: true 3195 | 3196 | /safe-regex2@2.0.0: 3197 | resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} 3198 | dependencies: 3199 | ret: 0.2.2 3200 | dev: true 3201 | 3202 | /safe-stable-stringify@2.4.3: 3203 | resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} 3204 | engines: {node: '>=10'} 3205 | dev: true 3206 | 3207 | /safer-buffer@2.1.2: 3208 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 3209 | dev: true 3210 | 3211 | /secure-json-parse@2.7.0: 3212 | resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} 3213 | dev: true 3214 | 3215 | /semver@6.3.1: 3216 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 3217 | hasBin: true 3218 | dev: true 3219 | 3220 | /semver@7.5.4: 3221 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 3222 | engines: {node: '>=10'} 3223 | hasBin: true 3224 | dependencies: 3225 | lru-cache: 6.0.0 3226 | dev: true 3227 | 3228 | /send@0.18.0: 3229 | resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} 3230 | engines: {node: '>= 0.8.0'} 3231 | dependencies: 3232 | debug: 2.6.9 3233 | depd: 2.0.0 3234 | destroy: 1.2.0 3235 | encodeurl: 1.0.2 3236 | escape-html: 1.0.3 3237 | etag: 1.8.1 3238 | fresh: 0.5.2 3239 | http-errors: 2.0.0 3240 | mime: 1.6.0 3241 | ms: 2.1.3 3242 | on-finished: 2.4.1 3243 | range-parser: 1.2.1 3244 | statuses: 2.0.1 3245 | transitivePeerDependencies: 3246 | - supports-color 3247 | dev: true 3248 | 3249 | /serve-static@1.15.0: 3250 | resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} 3251 | engines: {node: '>= 0.8.0'} 3252 | dependencies: 3253 | encodeurl: 1.0.2 3254 | escape-html: 1.0.3 3255 | parseurl: 1.3.3 3256 | send: 0.18.0 3257 | transitivePeerDependencies: 3258 | - supports-color 3259 | dev: true 3260 | 3261 | /set-cookie-parser@2.6.0: 3262 | resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} 3263 | dev: true 3264 | 3265 | /setprototypeof@1.2.0: 3266 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 3267 | dev: true 3268 | 3269 | /shebang-command@2.0.0: 3270 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 3271 | engines: {node: '>=8'} 3272 | dependencies: 3273 | shebang-regex: 3.0.0 3274 | dev: true 3275 | 3276 | /shebang-regex@3.0.0: 3277 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 3278 | engines: {node: '>=8'} 3279 | dev: true 3280 | 3281 | /side-channel@1.0.4: 3282 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 3283 | dependencies: 3284 | call-bind: 1.0.2 3285 | get-intrinsic: 1.2.1 3286 | object-inspect: 1.12.3 3287 | dev: true 3288 | 3289 | /signal-exit@3.0.7: 3290 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 3291 | dev: true 3292 | 3293 | /sisteransi@1.0.5: 3294 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 3295 | dev: true 3296 | 3297 | /slash@3.0.0: 3298 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 3299 | engines: {node: '>=8'} 3300 | dev: true 3301 | 3302 | /sonic-boom@3.3.0: 3303 | resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==} 3304 | dependencies: 3305 | atomic-sleep: 1.0.0 3306 | dev: true 3307 | 3308 | /source-map-support@0.5.13: 3309 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 3310 | dependencies: 3311 | buffer-from: 1.1.2 3312 | source-map: 0.6.1 3313 | dev: true 3314 | 3315 | /source-map@0.6.1: 3316 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 3317 | engines: {node: '>=0.10.0'} 3318 | dev: true 3319 | 3320 | /source-map@0.8.0-beta.0: 3321 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 3322 | engines: {node: '>= 8'} 3323 | dependencies: 3324 | whatwg-url: 7.1.0 3325 | dev: true 3326 | 3327 | /split2@4.2.0: 3328 | resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 3329 | engines: {node: '>= 10.x'} 3330 | dev: true 3331 | 3332 | /sprintf-js@1.0.3: 3333 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 3334 | dev: true 3335 | 3336 | /stack-utils@2.0.6: 3337 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 3338 | engines: {node: '>=10'} 3339 | dependencies: 3340 | escape-string-regexp: 2.0.0 3341 | dev: true 3342 | 3343 | /statuses@2.0.1: 3344 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 3345 | engines: {node: '>= 0.8'} 3346 | dev: true 3347 | 3348 | /string-length@4.0.2: 3349 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 3350 | engines: {node: '>=10'} 3351 | dependencies: 3352 | char-regex: 1.0.2 3353 | strip-ansi: 6.0.1 3354 | dev: true 3355 | 3356 | /string-width@4.2.3: 3357 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 3358 | engines: {node: '>=8'} 3359 | dependencies: 3360 | emoji-regex: 8.0.0 3361 | is-fullwidth-code-point: 3.0.0 3362 | strip-ansi: 6.0.1 3363 | dev: true 3364 | 3365 | /string_decoder@1.3.0: 3366 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 3367 | dependencies: 3368 | safe-buffer: 5.2.1 3369 | dev: true 3370 | 3371 | /strip-ansi@6.0.1: 3372 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 3373 | engines: {node: '>=8'} 3374 | dependencies: 3375 | ansi-regex: 5.0.1 3376 | dev: true 3377 | 3378 | /strip-bom@4.0.0: 3379 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 3380 | engines: {node: '>=8'} 3381 | dev: true 3382 | 3383 | /strip-final-newline@2.0.0: 3384 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 3385 | engines: {node: '>=6'} 3386 | dev: true 3387 | 3388 | /strip-json-comments@3.1.1: 3389 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 3390 | engines: {node: '>=8'} 3391 | dev: true 3392 | 3393 | /sucrase@3.34.0: 3394 | resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} 3395 | engines: {node: '>=8'} 3396 | hasBin: true 3397 | dependencies: 3398 | '@jridgewell/gen-mapping': 0.3.3 3399 | commander: 4.1.1 3400 | glob: 7.1.6 3401 | lines-and-columns: 1.2.4 3402 | mz: 2.7.0 3403 | pirates: 4.0.6 3404 | ts-interface-checker: 0.1.13 3405 | dev: true 3406 | 3407 | /supports-color@5.5.0: 3408 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 3409 | engines: {node: '>=4'} 3410 | dependencies: 3411 | has-flag: 3.0.0 3412 | dev: true 3413 | 3414 | /supports-color@7.2.0: 3415 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 3416 | engines: {node: '>=8'} 3417 | dependencies: 3418 | has-flag: 4.0.0 3419 | dev: true 3420 | 3421 | /supports-color@8.1.1: 3422 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 3423 | engines: {node: '>=10'} 3424 | dependencies: 3425 | has-flag: 4.0.0 3426 | dev: true 3427 | 3428 | /supports-preserve-symlinks-flag@1.0.0: 3429 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 3430 | engines: {node: '>= 0.4'} 3431 | dev: true 3432 | 3433 | /test-exclude@6.0.0: 3434 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 3435 | engines: {node: '>=8'} 3436 | dependencies: 3437 | '@istanbuljs/schema': 0.1.3 3438 | glob: 7.1.6 3439 | minimatch: 3.1.2 3440 | dev: true 3441 | 3442 | /thenify-all@1.6.0: 3443 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 3444 | engines: {node: '>=0.8'} 3445 | dependencies: 3446 | thenify: 3.3.1 3447 | dev: true 3448 | 3449 | /thenify@3.3.1: 3450 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 3451 | dependencies: 3452 | any-promise: 1.3.0 3453 | dev: true 3454 | 3455 | /thread-stream@2.4.0: 3456 | resolution: {integrity: sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==} 3457 | dependencies: 3458 | real-require: 0.2.0 3459 | dev: true 3460 | 3461 | /tiny-lru@11.0.1: 3462 | resolution: {integrity: sha512-iNgFugVuQgBKrqeO/mpiTTgmBsTP0WL6yeuLfLs/Ctf0pI/ixGqIRm8sDCwMcXGe9WWvt2sGXI5mNqZbValmJg==} 3463 | engines: {node: '>=12'} 3464 | dev: true 3465 | 3466 | /tmpl@1.0.5: 3467 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 3468 | dev: true 3469 | 3470 | /to-fast-properties@2.0.0: 3471 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 3472 | engines: {node: '>=4'} 3473 | dev: true 3474 | 3475 | /to-regex-range@5.0.1: 3476 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 3477 | engines: {node: '>=8.0'} 3478 | dependencies: 3479 | is-number: 7.0.0 3480 | dev: true 3481 | 3482 | /toidentifier@1.0.1: 3483 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 3484 | engines: {node: '>=0.6'} 3485 | dev: true 3486 | 3487 | /tr46@1.0.1: 3488 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 3489 | dependencies: 3490 | punycode: 2.3.0 3491 | dev: true 3492 | 3493 | /tree-kill@1.2.2: 3494 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 3495 | hasBin: true 3496 | dev: true 3497 | 3498 | /ts-interface-checker@0.1.13: 3499 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 3500 | dev: true 3501 | 3502 | /ts-jest@29.1.1(@babel/core@7.22.11)(esbuild@0.18.20)(jest@29.6.4)(typescript@5.2.2): 3503 | resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} 3504 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 3505 | hasBin: true 3506 | peerDependencies: 3507 | '@babel/core': '>=7.0.0-beta.0 <8' 3508 | '@jest/types': ^29.0.0 3509 | babel-jest: ^29.0.0 3510 | esbuild: '*' 3511 | jest: ^29.0.0 3512 | typescript: '>=4.3 <6' 3513 | peerDependenciesMeta: 3514 | '@babel/core': 3515 | optional: true 3516 | '@jest/types': 3517 | optional: true 3518 | babel-jest: 3519 | optional: true 3520 | esbuild: 3521 | optional: true 3522 | dependencies: 3523 | '@babel/core': 7.22.11 3524 | bs-logger: 0.2.6 3525 | esbuild: 0.18.20 3526 | fast-json-stable-stringify: 2.1.0 3527 | jest: 29.6.4(@types/node@18.17.11)(ts-node@10.9.1) 3528 | jest-util: 29.6.3 3529 | json5: 2.2.3 3530 | lodash.memoize: 4.1.2 3531 | make-error: 1.3.6 3532 | semver: 7.5.4 3533 | typescript: 5.2.2 3534 | yargs-parser: 21.1.1 3535 | dev: true 3536 | 3537 | /ts-node@10.9.1(@types/node@18.17.11)(typescript@5.2.2): 3538 | resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} 3539 | hasBin: true 3540 | peerDependencies: 3541 | '@swc/core': '>=1.2.50' 3542 | '@swc/wasm': '>=1.2.50' 3543 | '@types/node': '*' 3544 | typescript: '>=2.7' 3545 | peerDependenciesMeta: 3546 | '@swc/core': 3547 | optional: true 3548 | '@swc/wasm': 3549 | optional: true 3550 | dependencies: 3551 | '@cspotcode/source-map-support': 0.8.1 3552 | '@tsconfig/node10': 1.0.9 3553 | '@tsconfig/node12': 1.0.11 3554 | '@tsconfig/node14': 1.0.3 3555 | '@tsconfig/node16': 1.0.4 3556 | '@types/node': 18.17.11 3557 | acorn: 8.10.0 3558 | acorn-walk: 8.2.0 3559 | arg: 4.1.3 3560 | create-require: 1.1.1 3561 | diff: 4.0.2 3562 | make-error: 1.3.6 3563 | typescript: 5.2.2 3564 | v8-compile-cache-lib: 3.0.1 3565 | yn: 3.1.1 3566 | dev: true 3567 | 3568 | /tsup@7.2.0(ts-node@10.9.1)(typescript@5.2.2): 3569 | resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} 3570 | engines: {node: '>=16.14'} 3571 | hasBin: true 3572 | peerDependencies: 3573 | '@swc/core': ^1 3574 | postcss: ^8.4.12 3575 | typescript: '>=4.1.0' 3576 | peerDependenciesMeta: 3577 | '@swc/core': 3578 | optional: true 3579 | postcss: 3580 | optional: true 3581 | typescript: 3582 | optional: true 3583 | dependencies: 3584 | bundle-require: 4.0.1(esbuild@0.18.20) 3585 | cac: 6.7.14 3586 | chokidar: 3.5.3 3587 | debug: 4.3.4 3588 | esbuild: 0.18.20 3589 | execa: 5.1.1 3590 | globby: 11.1.0 3591 | joycon: 3.1.1 3592 | postcss-load-config: 4.0.1(ts-node@10.9.1) 3593 | resolve-from: 5.0.0 3594 | rollup: 3.28.1 3595 | source-map: 0.8.0-beta.0 3596 | sucrase: 3.34.0 3597 | tree-kill: 1.2.2 3598 | typescript: 5.2.2 3599 | transitivePeerDependencies: 3600 | - supports-color 3601 | - ts-node 3602 | dev: true 3603 | 3604 | /type-detect@4.0.8: 3605 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 3606 | engines: {node: '>=4'} 3607 | dev: true 3608 | 3609 | /type-fest@0.21.3: 3610 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 3611 | engines: {node: '>=10'} 3612 | dev: true 3613 | 3614 | /type-is@1.6.18: 3615 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 3616 | engines: {node: '>= 0.6'} 3617 | dependencies: 3618 | media-typer: 0.3.0 3619 | mime-types: 2.1.35 3620 | dev: true 3621 | 3622 | /typescript@5.2.2: 3623 | resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} 3624 | engines: {node: '>=14.17'} 3625 | hasBin: true 3626 | dev: true 3627 | 3628 | /unpipe@1.0.0: 3629 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 3630 | engines: {node: '>= 0.8'} 3631 | dev: true 3632 | 3633 | /update-browserslist-db@1.0.11(browserslist@4.21.10): 3634 | resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} 3635 | hasBin: true 3636 | peerDependencies: 3637 | browserslist: '>= 4.21.0' 3638 | dependencies: 3639 | browserslist: 4.21.10 3640 | escalade: 3.1.1 3641 | picocolors: 1.0.0 3642 | dev: true 3643 | 3644 | /uri-js@4.4.1: 3645 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 3646 | dependencies: 3647 | punycode: 2.3.0 3648 | dev: true 3649 | 3650 | /utils-merge@1.0.1: 3651 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 3652 | engines: {node: '>= 0.4.0'} 3653 | dev: true 3654 | 3655 | /v8-compile-cache-lib@3.0.1: 3656 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 3657 | dev: true 3658 | 3659 | /v8-to-istanbul@9.1.0: 3660 | resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} 3661 | engines: {node: '>=10.12.0'} 3662 | dependencies: 3663 | '@jridgewell/trace-mapping': 0.3.19 3664 | '@types/istanbul-lib-coverage': 2.0.4 3665 | convert-source-map: 1.9.0 3666 | dev: true 3667 | 3668 | /vary@1.1.2: 3669 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 3670 | engines: {node: '>= 0.8'} 3671 | dev: true 3672 | 3673 | /walker@1.0.8: 3674 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 3675 | dependencies: 3676 | makeerror: 1.0.12 3677 | dev: true 3678 | 3679 | /webidl-conversions@4.0.2: 3680 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 3681 | dev: true 3682 | 3683 | /whatwg-url@7.1.0: 3684 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 3685 | dependencies: 3686 | lodash.sortby: 4.7.0 3687 | tr46: 1.0.1 3688 | webidl-conversions: 4.0.2 3689 | dev: true 3690 | 3691 | /which@2.0.2: 3692 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 3693 | engines: {node: '>= 8'} 3694 | hasBin: true 3695 | dependencies: 3696 | isexe: 2.0.0 3697 | dev: true 3698 | 3699 | /wrap-ansi@7.0.0: 3700 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 3701 | engines: {node: '>=10'} 3702 | dependencies: 3703 | ansi-styles: 4.3.0 3704 | string-width: 4.2.3 3705 | strip-ansi: 6.0.1 3706 | dev: true 3707 | 3708 | /wrappy@1.0.2: 3709 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 3710 | dev: true 3711 | 3712 | /write-file-atomic@4.0.2: 3713 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 3714 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 3715 | dependencies: 3716 | imurmurhash: 0.1.4 3717 | signal-exit: 3.0.7 3718 | dev: true 3719 | 3720 | /y18n@5.0.8: 3721 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 3722 | engines: {node: '>=10'} 3723 | dev: true 3724 | 3725 | /yallist@3.1.1: 3726 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 3727 | dev: true 3728 | 3729 | /yallist@4.0.0: 3730 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 3731 | dev: true 3732 | 3733 | /yaml@2.3.1: 3734 | resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} 3735 | engines: {node: '>= 14'} 3736 | dev: true 3737 | 3738 | /yargs-parser@21.1.1: 3739 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 3740 | engines: {node: '>=12'} 3741 | dev: true 3742 | 3743 | /yargs@17.7.2: 3744 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 3745 | engines: {node: '>=12'} 3746 | dependencies: 3747 | cliui: 8.0.1 3748 | escalade: 3.1.1 3749 | get-caller-file: 2.0.5 3750 | require-directory: 2.1.1 3751 | string-width: 4.2.3 3752 | y18n: 5.0.8 3753 | yargs-parser: 21.1.1 3754 | dev: true 3755 | 3756 | /yn@3.1.1: 3757 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 3758 | engines: {node: '>=6'} 3759 | dev: true 3760 | 3761 | /yocto-queue@0.1.0: 3762 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 3763 | engines: {node: '>=10'} 3764 | dev: true 3765 | --------------------------------------------------------------------------------