diff --git a/tests/k6/.gitignore b/tests/k6/.gitignore new file mode 100644 index 00000000..27fe9a8d --- /dev/null +++ b/tests/k6/.gitignore @@ -0,0 +1,8 @@ +node_modules/ +dist/ +results/ +*.log +.env +.idea/ +.vscode/ +.DS_Store \ No newline at end of file diff --git a/tests/k6/.prettierrc b/tests/k6/.prettierrc new file mode 100644 index 00000000..945ef1d7 --- /dev/null +++ b/tests/k6/.prettierrc @@ -0,0 +1,8 @@ +{ + "semi": true, + "trailingComma": "all", + "printWidth": 100, + "singleQuote": true, + "tabWidth": 2, + "arrowParens": "always" +} diff --git a/tests/k6/Makefile b/tests/k6/Makefile new file mode 100644 index 00000000..13466258 --- /dev/null +++ b/tests/k6/Makefile @@ -0,0 +1,59 @@ +.PHONY: help install build test smoke load stress reports clean + +.DEFAULT_GOAL := help + +API_URL ?= http://127.0.0.1:4340 + +help: + @echo "Acropolis K6 Performance Tests" + @echo "" + @echo "Usage: make [target]" + @echo "" + @echo "Available targets:" + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " %-15s %s\n", $$1, $$2}' + +install: ## Install dependencies + @echo "Installing dependencies..." + npm install + +build: ## Build TypeScript files + @echo "Building TypeScript..." + npm run build + +results-dir: ## Create results directory + @echo "Creating results directory..." + @mkdir -p results + @echo "✅ Results directory created" + +test-smoke: build results-dir ## Run smoke test only (1 minute) + @echo "Running Smoke Test..." + @export API_URL=$(API_URL) && k6 run --out json=results/smoke-$$(date +%Y%m%d-%H%M%S).json dist/smoke.test.js + +test-load: build results-dir ## Run load test only (16 minutes) + @echo "Running Load Test..." + @export API_URL=$(API_URL) && k6 run --out json=results/load-$$(date +%Y%m%d-%H%M%S).json dist/load.test.js + +test-stress: build results-dir ## Run stress test only (13 minutes) + @echo "Running Stress Test..." + @export API_URL=$(API_URL) && k6 run --out json=results/stress-$$(date +%Y%m%d-%H%M%S).json dist/stress.test.js + +test-soak: build results-dir ## Run soak test only (2 hours 10 minutes) + @echo "Running Soak Test..." + @export API_URL=$(API_URL) && k6 run --out json=results/soak-$$(date +%Y%m%d-%H%M%S).json dist/soak.test.js + +test-all: ## Run all performance tests (30 minutes total) + @chmod +x scripts/run-all.sh + @API_URL=$(API_URL) scripts/run-all.sh + +clean: ## Remove results directory + @echo "Cleaning results..." + rm -rf results/ + @echo "✅ Results cleaned" + +clean-build: ## Remove build artifacts + @echo "Cleaning build artifacts..." + rm -rf dist/ + @echo "✅ Build artifacts cleaned" + +clean-all: clean clean-build ## Remove all generated files + @echo "✅ All generated files cleaned" \ No newline at end of file diff --git a/tests/k6/README.md b/tests/k6/README.md new file mode 100644 index 00000000..2f3d2de6 --- /dev/null +++ b/tests/k6/README.md @@ -0,0 +1,136 @@ +# Acropolis K6s Performance Tests + +Performance testing suite for the Acropolis Cardano Node leveraging [Grafana's k6 tool](https://github.com/grafana/k6). + +## Prerequisites + +Before running the tests, you'll need to install Node.js dependencies and k6. + +### Install Node Dependencies + +```bash +npm install +``` + +## Installing k6 + +For more detailed instructions on installing k6, please refer to the [documentation here](https://grafana.com/docs/k6/latest/set-up/install-k6/#install-k6). + + +### macOS + +Using Homebrew: + +```bash +brew install k6 +``` + +### Linux + +#### Debian/Ubuntu + +```bash +sudo gpg -k +sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg \ + --keyserver hkp://keyserver.ubuntu.com:80 \ + --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69 + +echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | \ + sudo tee /etc/apt/sources.list.d/k6.list + +sudo apt-get update +sudo apt-get install k6 +``` + +#### Fedora/CentOS + +```bash +sudo dnf install https://dl.k6.io/rpm/repo.rpm +sudo dnf install k6 +``` + +### Verify Installation + +Confirm k6 is installed correctly: + +```bash +k6 version +``` + +## Project Structure + +``` +performance-tests/ +├── src/ +│ ├── tests/ # Test configurations (smoke, load, stress, soak) +│ ├── scenarios/ # Endpoint-specific test scenarios +│ ├── config/ # Endpoints, test data, thresholds +│ └── utils/ # Helpers, metrics, checks +├── scripts/ # Run scripts +└── Makefile # Convenient test commands +``` + +## Usage + +See the `Makefile` for all available commands: + +```bash +# Build TypeScript +make build + +# Run individual tests +make test-smoke # Quick validation (1 minute) +make test-load # Sustained load (16 minutes) +make test-stress # Find breaking point (13 minutes) +make test-soak # Long-running stability (2+ hours) + +# Run all tests +make test-all + +# Clean build artifacts +make clean +``` + +### Environment Variables + +Configure the API endpoint: + +```bash +export API_URL="http://127.0.0.1:4340" +make test-smoke +``` + +Or inline: + +```bash +API_URL="http://127.0.0.1:4340" make test-load +``` + +## Results + +Test results are saved as JSON files in the `results/` directory with timestamps. These can +be imported into Grafana for analysis. + +## Customization + +### Modify Load Patterns + +Edit test files in `src/tests/` to adjust: +- Virtual user counts +- Ramp-up/ramp-down durations +- Test duration +- Traffic distribution weights + +### Add New Endpoints + +1. Add endpoint definition to `src/config/endpoints.ts` +2. Add test data to `src/config/test-data.ts` +3. Create scenario function in `src/scenarios/` +4. Import and use in test files + +### Adjust Thresholds + +Edit `src/config/thresholds.ts` to modify performance expectations. + + +--- diff --git a/tests/k6/eslint.config.js b/tests/k6/eslint.config.js new file mode 100644 index 00000000..8dd8bbed --- /dev/null +++ b/tests/k6/eslint.config.js @@ -0,0 +1,33 @@ +import js from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import prettier from 'eslint-config-prettier'; + +export default [ + js.configs.recommended, + ...tseslint.configs.recommended, + prettier, + { + files: ['**/*.ts', '**/*.js'], + languageOptions: { + ecmaVersion: 2020, + sourceType: 'module', + parser: tseslint.parser, + parserOptions: { + project: './tsconfig.json', + }, + }, + rules: { + 'max-len': ['warn', { code: 100, ignoreStrings: true, ignoreTemplateLiterals: true }], + 'comma-dangle': ['error', 'always-multiline'], + quotes: ['error', 'single', { avoidEscape: true }], + semi: ['error', 'always'], + indent: ['error', 2, { SwitchCase: 1 }], + 'no-console': 'off', // K6 uses console.log + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/explicit-function-return-type': 'off', + }, + }, + { + ignores: ['dist/', 'node_modules/', '*.config.js', 'webpack.config.js'], + }, +]; diff --git a/tests/k6/package-lock.json b/tests/k6/package-lock.json new file mode 100644 index 00000000..62994791 --- /dev/null +++ b/tests/k6/package-lock.json @@ -0,0 +1,3266 @@ +{ + "name": "acropolis-k6-performance-tests", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "acropolis-k6-performance-tests", + "version": "1.0.0", + "devDependencies": { + "@eslint/js": "^9.37.0", + "@types/k6": "^1.3.1", + "@typescript-eslint/eslint-plugin": "^8.46.0", + "@typescript-eslint/parser": "^8.46.0", + "eslint": "^9.37.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "prettier": "^3.6.2", + "ts-loader": "^9.5.1", + "typescript": "^5.9.3", + "typescript-eslint": "^8.46.0", + "webpack": "^5.89.0", + "webpack-cli": "^5.1.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/k6": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/k6/-/k6-1.3.1.tgz", + "integrity": "sha512-q1abxgbSz9i/TzVSst/JeIJ5yW1QuWH0HRaU8kJv1mJ+OyjVPFpCyYoItSt/N1IBOothykoQ1n+5QPaAnS6qpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", + "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.14.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz", + "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/type-utils": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz", + "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz", + "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.0", + "@typescript-eslint/types": "^8.46.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz", + "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz", + "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz", + "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz", + "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz", + "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.0", + "@typescript-eslint/tsconfig-utils": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz", + "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz", + "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.14.tgz", + "integrity": "sha512-GM9c0cWWR8Ga7//Ves/9KRgTS8nLausCkP3CGiFLrnwA2CDUluXgaQqvrULoR2Ujrd/mz/lkX87F5BHFsNr5sQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001749", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz", + "integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.233", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.233.tgz", + "integrity": "sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.17.0.tgz", + "integrity": "sha512-GpfViocsFM7viwClFgxK26OtjMlKN67GCR5v6ASFkotxtpBWd9d+vNy+AH7F2E1TUkMDZ8P/dDPZX71/NG8xnQ==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-loader": { + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", + "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.0.tgz", + "integrity": "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.46.0", + "@typescript-eslint/parser": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.102.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", + "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.26.3", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/tests/k6/package.json b/tests/k6/package.json new file mode 100644 index 00000000..db413a77 --- /dev/null +++ b/tests/k6/package.json @@ -0,0 +1,34 @@ +{ + "name": "acropolis-k6-performance-tests", + "version": "1.0.0", + "type": "module", + "description": "K6 performance tests for Acropolis Blockfrost API", + "scripts": { + "test:smoke": "webpack && k6 run dist/smoke.test.js", + "test:load": "webpack && k6 run dist/load.test.js", + "test:stress": "webpack && k6 run dist/stress.test.js", + "test:soak": "webpack && k6 run dist/soak.test.js", + "test:all": "npm run test:smoke && npm run test:load && npm run test:stress", + "build": "webpack", + "format": "prettier --write \"src/**/*.{ts,js,json}\"", + "format:check": "prettier --check \"src/**/*.{ts,js,json}\"", + "lint": "eslint src", + "lint:fix": "eslint src --fix", + "clean": "rm -rf dist/" + }, + "devDependencies": { + "@eslint/js": "^9.37.0", + "@types/k6": "^1.3.1", + "@typescript-eslint/eslint-plugin": "^8.46.0", + "@typescript-eslint/parser": "^8.46.0", + "eslint": "^9.37.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "prettier": "^3.6.2", + "ts-loader": "^9.5.1", + "typescript": "^5.9.3", + "typescript-eslint": "^8.46.0", + "webpack": "^5.89.0", + "webpack-cli": "^5.1.4" + } +} diff --git a/tests/k6/scripts/run-all.sh b/tests/k6/scripts/run-all.sh new file mode 100755 index 00000000..8db4510f --- /dev/null +++ b/tests/k6/scripts/run-all.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +set -e + +echo "==========================================" +echo "Running Acropolis Performance Tests" +echo "==========================================" +export API_URL=${API_URL:-"http://127.0.0.1:4340"} + +echo "Testing API at: $API_URL" +echo "" + +if [ ! -d "results" ]; then + echo "Creating results directory..." + mkdir -p results + echo "✅ Results directory created" + echo "" +fi + +echo "Building TypeScript..." +npm run build +echo "" + +echo "==========================================" +echo "1. Running Smoke Test (1 minute)" +echo "==========================================" +K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT=results/smoke-$(date +%Y%m%d-%H%M%S).html k6 run --out json=results/smoke-$(date +%Y%m%d-%H%M%S).json dist/smoke.test.js + +if [ $? -ne 0 ]; then + echo "❌ Smoke test failed! Stopping test suite." + exit 1 +fi + +echo "✅ Smoke test passed!" +echo "" + +echo "==========================================" +echo "2. Running Load Test (16 minutes)" +echo "==========================================" +K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT=results/load-$(date +%Y%m%d-%H%M%S).html k6 run --out json=results/load-$(date +%Y%m%d-%H%M%S).json dist/load.test.js + +if [ $? -ne 0 ]; then + echo "⚠️ Load test failed, but continuing..." +else + echo "✅ Load test passed!" +fi +echo "" + +echo "==========================================" +echo "3. Running Stress Test (13 minutes)" +echo "==========================================" +K6_WEB_DASHBOARD=true K6_WEB_DASHBOARD_EXPORT=results/stress-$(date +%Y%m%d-%H%M%S).html k6 run --out json=results/stress-$(date +%Y%m%d-%H%M%S).json dist/stress.test.js + +if [ $? -ne 0 ]; then + echo "⚠️ Stress test failed (expected behavior)" +else + echo "✅ Stress test passed!" +fi +echo "" + +echo "==========================================" +echo "All tests completed!" +echo "Results saved in results/ directory" +echo "==========================================" \ No newline at end of file diff --git a/tests/k6/src/config/endpoints.ts b/tests/k6/src/config/endpoints.ts new file mode 100644 index 00000000..6b611e8e --- /dev/null +++ b/tests/k6/src/config/endpoints.ts @@ -0,0 +1,38 @@ +export const ENDPOINTS = { + // Accounts + ACCOUNT: '/accounts/{stake_address}', + + // Assets + ASSETS: '/assets', + ASSET: '/assets/{asset}', + ASSET_HISTORY: '/assets/{asset}/history', + ASSET_TRANSACTIONS: '/assets/{asset}/transactions', + ASSET_ADDRESSES: '/assets/{asset}/addresses', + ASSET_POLICY: '/assets/policy/{policy_id}', + + // Epochs + EPOCHS_LATEST: '/epochs/latest', + EPOCH: '/epochs/{epoch_no}', + EPOCHS_LATEST_PARAMETERS: '/epochs/latest/parameters', + + // Governance + GOV_DREPS: '/governance/dreps', + GOV_DREP: '/governance/dreps/{drep_id}', + GOV_DREP_DELEGATORS: '/governance/dreps/{drep_id}/delegators', + GOV_DREP_METADATA: '/governance/dreps/{drep_id}/metadata', + GOV_DREP_UPDATES: '/governance/dreps/{drep_id}/updates', + GOV_DREP_VOTES: '/governance/dreps/{drep_id}/votes', + GOV_PROPOSALS: '/governance/proposals', + GOV_PROPOSAL: '/governance/proposals/{tx_hash}/{cert_index}', + GOV_PROPOSAL_VOTES: '/governance/proposals/{tx_hash}/{cert_index}/votes', + GOV_PROPOSAL_METADATA: '/governance/proposals/{tx_hash}/{cert_index}/metadata', + + // Pools + POOLS: '/pools', + POOLS_EXTENDED: '/pools/extended', + POOLS_RETIRED: '/pools/retired', + POOLS_RETIRING: '/pools/retiring', + POOL: '/pools/{pool_id}', +} as const; + + diff --git a/tests/k6/src/config/shelley-era-endpoints.ts b/tests/k6/src/config/shelley-era-endpoints.ts new file mode 100644 index 00000000..de1bfe04 --- /dev/null +++ b/tests/k6/src/config/shelley-era-endpoints.ts @@ -0,0 +1,14 @@ +export const ENDPOINTS = { + // Accounts + ACCOUNT: '/accounts/{stake_address}', + + // Epochs + EPOCHS_LATEST: '/epochs/latest', + EPOCHS_LATEST_PARAMETERS: '/epochs/latest/parameters', + + // Pools + POOLS: '/pools', + POOLS_EXTENDED: '/pools/extended', + POOLS_RETIRING: '/pools/retiring', + POOL: '/pools/{pool_id}', +} as const; diff --git a/tests/k6/src/config/shelley-test-data.ts b/tests/k6/src/config/shelley-test-data.ts new file mode 100644 index 00000000..2293abef --- /dev/null +++ b/tests/k6/src/config/shelley-test-data.ts @@ -0,0 +1,390 @@ +export const TEST_DATA = { + stakeAddresses: [ + 'stake1ux7s0nnn8dv3r6m90ea07hf4lzcxstlq8q8hvgd09w7t9acyrden3', + 'stake1uyyj72lkv2d5x83zk0lgymklf5ze8s24egl8vr0jnt78a5cus6rnw', + 'stake1u93qulynvngptq6x0h3z2ggj7h46w85dqyq538rmcvw9nfqacm4py', + 'stake1uxm48nqyepftjqz46tv7ju87yt9tmx0f56lt0a9asfuvlzqkj77we', + 'stake1uyjfqllc4wv65j6e68m36qqp0e6zchs8yygn20scg9xvp7qlaf7xt', + 'stake1uyjfqllc4wv65j6e68m36qqp0e6zchs8yygn20scg9xvp7qlaf7xt', + 'stake1uyjfqllc4wv65j6e68m36qqp0e6zchs8yygn20scg9xvp7qlaf7xt', + 'stake1uyjfqllc4wv65j6e68m36qqp0e6zchs8yygn20scg9xvp7qlaf7xt', + 'stake1uyjfqllc4wv65j6e68m36qqp0e6zchs8yygn20scg9xvp7qlaf7xt', + 'stake1uyjfqllc4wv65j6e68m36qqp0e6zchs8yygn20scg9xvp7qlaf7xt', + 'stake1uyjfqllc4wv65j6e68m36qqp0e6zchs8yygn20scg9xvp7qlaf7xt', + 'stake1uyjfqllc4wv65j6e68m36qqp0e6zchs8yygn20scg9xvp7qlaf7xt', + 'stake1uyjfqllc4wv65j6e68m36qqp0e6zchs8yygn20scg9xvp7qlaf7xt', + 'stake1uyjfqllc4wv65j6e68m36qqp0e6zchs8yygn20scg9xvp7qlaf7xt', + 'stake1u8d7dxgr64tlgmnz294my9nwxyj358w9h30dp00vjj9fkeg7n0ml4', + 'stake1uyuy6c372vjug39cwrynxyaek0v3jtm9asx6k2w58hx3qlcn9qunf', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1u9uwuqm6yva8uucfwzgffluypa8hlxzh7ug5pxm3pthr9pgx43dxn', + 'stake1uxdcdhngwe0xkfvgzg46t27zd064ygs4yylkpzeuph42hhq6a4fd3', + 'stake1uxhrn6uwxyn0hzh59znvg4ph60rq4h7t7zuw7sj5lp9ghwsrn0yj2', + 'stake1uxwlp0x4cph7hzw5mqlzzuwlg8dlc2q8nj2wgsmpvefgaucfqxe5c', + 'stake1uysngz6xq5tl5fttz47clga3zcxl9vurpwt5ezlhj3cculqzpq8je', + 'stake1u8y2zt83npl7yppgmyneevzxfshq6ty5g35zpmxcgevpdygs5pua5', + 'stake1uykca6g5lwpmfs55wv28mqrt63nucqxpch63jx4srzgmx2grwlrgw', + 'stake1u89ut2w675fkv85zhsp8wwwdzyyup6andqgu72kxz7kar9qtmkt4c', + 'stake1uyje4gleh4kqlgrsuvk5ks5zk9paqtv4mnkzg7dnl57uxtgukmhg9', + 'stake1ux3aw642359m9zprd76x7mdx0an2yj5z8300srzak40y0ds4ujd7j', + 'stake1u8l6j4f0hy86dw96d25zjqnm94lhdx2fwxtjs6n9r6mlzegr5ztj6', + 'stake1uynne6q6z4jzrxuavgjpevxgey8l4pzzl6zrhpxx2qnq8xcgls9tf', + 'stake1uyhfaa3h7n0xvzrv7gl4r5d9253758mk05p7vs5w6ry48dq0f7ae6', + 'stake1u8dzdd4v3lg39jwcrzldz87n03z45d4w67yh97u7dnl88ncwefwmp', + 'stake1uyxkp9elxkqulr2eyara95glaquja0j5872xhxy7z2ke29gs3uxw2', + 'stake1uxsrr2ekzkj082ztcv0n6vzkw8y07m2gxvhf8ssunajfxqszzj9q4', + 'stake1u8e2y3zk88jrnxxehaxgtwyqyhj3kf8025wwsujxyw0pj7gz0y633', + 'stake1uyww2n7wx3r2zupjru4cfjsrpj76k4us6as9j5wnv0c6mkqf7ac08', + 'stake1u8s57h2n3j9a6eyxevhzpy0c28mv9ukc5wmnr0ezvxw7u7qhp2ysh', + 'stake1uy3j8tegvjg777r43pjp39dhy8h87eyak6rxj7fz67ykpncygy9fx', + 'stake1uyzpfw4kfedetg3rqcpewehnycwpjy82ecrj9s8ajje5els59ngzt', + 'stake1uxa5ey84rnva7vk3uxzaq0xvtadnnldc63cxlx63m5ykzcc28avg9', + 'stake1uyww2n7wx3r2zupjru4cfjsrpj76k4us6as9j5wnv0c6mkqf7ac08', + 'stake1u8e2y3zk88jrnxxehaxgtwyqyhj3kf8025wwsujxyw0pj7gz0y633', + 'stake1uynne6q6z4jzrxuavgjpevxgey8l4pzzl6zrhpxx2qnq8xcgls9tf', + 'stake1u8l6j4f0hy86dw96d25zjqnm94lhdx2fwxtjs6n9r6mlzegr5ztj6', + 'stake1u8l6j4f0hy86dw96d25zjqnm94lhdx2fwxtjs6n9r6mlzegr5ztj6', + 'stake1uy7m5jn5aqlw0zy88d4udxqaapn69vd2sql8ujtxmyddhms3yml4y', + 'stake1uyg5r3ft7pkvzl5xznw023r0tfw8gm8ffhu2almvakqhyfcxsde65', + 'stake1uyww2n7wx3r2zupjru4cfjsrpj76k4us6as9j5wnv0c6mkqf7ac08', + 'stake1u8e2y3zk88jrnxxehaxgtwyqyhj3kf8025wwsujxyw0pj7gz0y633', + 'stake1u85y0u22r8qzxz644l4pk8c67tgy6q6nc076edtpa7as03guvjj3h', + 'stake1u97kzejdycq2vu57ez6ywch2jgwz7lvxkg402wxclm9ek8cxjvsnj', + 'stake1ux7k29qepjrfjnxyy77st5kt7lxlzf0vqntk529mcey5g3qkufp3c', + 'stake1u9j20zrc5kcjg4wdyzny5czjk8l9gehkv9aj2w3qswmm6hctj2cm6', + 'stake1uyxkp9elxkqulr2eyara95glaquja0j5872xhxy7z2ke29gs3uxw2', + 'stake1u8dzdd4v3lg39jwcrzldz87n03z45d4w67yh97u7dnl88ncwefwmp', + 'stake1u9m98hcwnfz06v2awrvex5phjg6utg07jlmwp6un5xj2tkqy8uktn', + 'stake1u860mr0yhfchcwldjx8wcmdzrnaycaryamlum8f4c8wzgsqs954jv', + 'stake1uxvfuakvdw3tawvrx8q06vtrtfmgzhzuaeyump99kjqm8sqdr9c30', + 'stake1uyeuwrtahzqjn9cjr6m9j3qe9j5f7rsujy2ycqt5fcvd0jcf3n6qz', + 'stake1ux5ra8w62mpnh5n8kashxqvxxufmwh0c2fcuxey26xjh2dquvkasn', + 'stake1uygdvrq5l4tgww8ypk50wp4l9acz4dtutnpw0mcyxnufv4g7u9mdg', + 'stake1uxea4rma2s48kp95v0dvc3vyujcyfgd0ayc9q8xxwax522g3etxvz', + 'stake1u9wmcs3ypdcftc2e9455s5k5p05400ts6ljsqe3fcea7fycqxyw9f', + 'stake1uyg5r3ft7pkvzl5xznw023r0tfw8gm8ffhu2almvakqhyfcxsde65', + 'stake1uy7m5jn5aqlw0zy88d4udxqaapn69vd2sql8ujtxmyddhms3yml4y', + 'stake1ux99cpnac2w2fr9c8uhtyu2vy34lfw9ujymevpju2as60hqy5yw5t', + 'stake1u8ue8wtnm8ehn4hrkfeurg2vhmwg9ahves5prz4vujupmnqlzm56v', + 'stake1u8negav3rphzvvjsvn65uuzlddp26etl50gny7f3aewtwpgx77nge', + 'stake1u8negav3rphzvvjsvn65uuzlddp26etl50gny7f3aewtwpgx77nge', + 'stake1u8negav3rphzvvjsvn65uuzlddp26etl50gny7f3aewtwpgx77nge', + 'stake1uynne6q6z4jzrxuavgjpevxgey8l4pzzl6zrhpxx2qnq8xcgls9tf', + 'stake1u85y0u22r8qzxz644l4pk8c67tgy6q6nc076edtpa7as03guvjj3h', + 'stake1ux3unlfuwl7wh65mp2tn0p6t4k5ukgqy96grrt8ny0re2tqv4ye4w', + 'stake1uyww2n7wx3r2zupjru4cfjsrpj76k4us6as9j5wnv0c6mkqf7ac08', + 'stake1uy4azmpppgzcy7kks6yn3w4ayfvup5xxmazh25yzkvg0x8szrwvxv', + 'stake1ux9n2tvg0npre36q98wzv4gmk7x22kw05h9wptg0kacleegz0qalc', + 'stake1ux9n2tvg0npre36q98wzv4gmk7x22kw05h9wptg0kacleegz0qalc', + 'stake1uyg5r3ft7pkvzl5xznw023r0tfw8gm8ffhu2almvakqhyfcxsde65', + 'stake1u935ynu2t2ljq9jwcevcuq60202q00f49uyy3yrrtntpkxgl02ddp', + 'stake1uy3rtnjdnqnllnvh7qkurecl9f5st2parlptw2ql8n76x0gzcwm6h', + 'stake1uxrsfnjngkh42hx8687l6fsymyraex0qhvg6edaa3pj9lvs99pn8j', + 'stake1uy2q57ta47cxrj4mfycwus3tj05c0ym82u7g7xyp9x8tqngxfy069', + 'stake1uy2q57ta47cxrj4mfycwus3tj05c0ym82u7g7xyp9x8tqngxfy069', + 'stake1uy2q57ta47cxrj4mfycwus3tj05c0ym82u7g7xyp9x8tqngxfy069', + 'stake1uy2q57ta47cxrj4mfycwus3tj05c0ym82u7g7xyp9x8tqngxfy069', + 'stake1uy2q57ta47cxrj4mfycwus3tj05c0ym82u7g7xyp9x8tqngxfy069', + 'stake1uxcxm804xyt3vhnxcanyfy3h7j9p5fm84y37p82eep5r06cnhzvwr', + 'stake1uxsz752m5as224myme8gx6x7fznfuqphqhr0enud5fmmkfs5ll8lv', + 'stake1uyje4gleh4kqlgrsuvk5ks5zk9paqtv4mnkzg7dnl57uxtgukmhg9', + 'stake1uyzqvqwrx99mqvr65c3f9xymgarfq2sx7ct7ncdn075u2dqk8tlx2', + 'stake1uxweqmv0m3ea2q620ykgtjdrk0y3pnuc6f8vys3c0m2sgmqqq7mc4', + 'stake1uxweqmv0m3ea2q620ykgtjdrk0y3pnuc6f8vys3c0m2sgmqqq7mc4', + 'stake1uxweqmv0m3ea2q620ykgtjdrk0y3pnuc6f8vys3c0m2sgmqqq7mc4', + 'stake1uxweqmv0m3ea2q620ykgtjdrk0y3pnuc6f8vys3c0m2sgmqqq7mc4', + 'stake1uxca2mpqveckvmdz7tdk9v69rr24zmfqtpzkk89haaq0ajcaal5cc', + 'stake1u9m2z0uhq5utqrma4warct98jy8tkrnhg8v3v4jnqej5y3ggkgh23', + 'stake1uy09jnq79r8470w63r44c5zdcpr9n60ndmszyzd2nzzxwqspqs36e', + 'stake1u9luxmucnukpkkghms3v9x7nrwln4l2908ca2xqkzm9py5gcxrvey', + 'stake1uyt39sqnekyk088hldfm82wsxxfllt52z72gcxlgg9f4m5cmf0v8s', + 'stake1uyvzj2zxc906pt432gvgzfnjtxr58q5k7yzq43pvg3w964camu7sq', + 'stake1uyvzj2zxc906pt432gvgzfnjtxr58q5k7yzq43pvg3w964camu7sq', + 'stake1uyvzj2zxc906pt432gvgzfnjtxr58q5k7yzq43pvg3w964camu7sq', + 'stake1uyvzj2zxc906pt432gvgzfnjtxr58q5k7yzq43pvg3w964camu7sq', + 'stake1uyvzj2zxc906pt432gvgzfnjtxr58q5k7yzq43pvg3w964camu7sq', + 'stake1u8pj6shvv500axyuzlq2zvqjk39zerh7q22uaj70w2n8y8qdw2cgm', + 'stake1u9dd2uptcg7fpvz6wkp08q2uhnlg6zsdxg5fqfcdqnzqg7su5fmcn', + 'stake1u97kzejdycq2vu57ez6ywch2jgwz7lvxkg402wxclm9ek8cxjvsnj', + 'stake1u94he3cahppzvmlzwr4dam5h2l96vtk2sz0y0tpmuv2a5vsq8acpw', + 'stake1u8ue8wtnm8ehn4hrkfeurg2vhmwg9ahves5prz4vujupmnqlzm56v', + 'stake1uywfmf2nu0u7zkskjhrrqcq9kq97k2ym8z40gls7j8ms7ych5dh89', + 'stake1uxh5tuy9xn2k03pam89wxx4qse3hnkdrym44as637rt9e0qnhukwc', + 'stake1u9m2z0uhq5utqrma4warct98jy8tkrnhg8v3v4jnqej5y3ggkgh23', + 'stake1u9tf836y5gsly2vnr7358r63dtv2qs4dyzu9yerzz3dvwvq6rlhl8', + 'stake1uyje4gleh4kqlgrsuvk5ks5zk9paqtv4mnkzg7dnl57uxtgukmhg9', + 'stake1uxg2jnkjxjvxy3mtamut6dvz86dlldaml6k3wmd5ptey5kc6ruksr', + 'stake1u9ps3vqfpq8l9dtat2ezknhrncn4hex9g7uma897qd4pdfq0mcd4j', + 'stake1u8negav3rphzvvjsvn65uuzlddp26etl50gny7f3aewtwpgx77nge', + 'stake1u92er29x3s08h7phx5q59gysp3d0jn2r3jka0t8y0mrap3qy7u0zy', + 'stake1uxhd3h3l9nzeh6rapl68x70ntjru6sz3eqmsjyrck87zess95nwk6', + 'stake1uxhd3h3l9nzeh6rapl68x70ntjru6sz3eqmsjyrck87zess95nwk6', + 'stake1uyww2n7wx3r2zupjru4cfjsrpj76k4us6as9j5wnv0c6mkqf7ac08', + 'stake1u860mr0yhfchcwldjx8wcmdzrnaycaryamlum8f4c8wzgsqs954jv', + 'stake1u9v07xcsv3n8m4t3h2xqntm5z0965n9ytejrfwa8ulhk0ag98e6r5', + 'stake1u8fpzphs0xsz4cma66770unphvzhz9x3ca85q3hcgr6gkkcwuq2u4', + 'stake1uyj3uhhds780zrd5wm0r6ymv8uww5x7sdr09ff5h5022ztsfs60yg', + 'stake1u8ue8wtnm8ehn4hrkfeurg2vhmwg9ahves5prz4vujupmnqlzm56v', + 'stake1u9tf836y5gsly2vnr7358r63dtv2qs4dyzu9yerzz3dvwvq6rlhl8', + 'stake1u8tg4wh7tjawydyx0d59epd2lj4qw8v8u6pg6gerj9xgdqgjagfhx', + 'stake1uxgzp5ws9hp9xdem9er24jegevrqqgk4fas0xln5a6n2fjc6ns22c', + 'stake1uyy9l5ds7qzyxasd5fqezqggaadl5qwcvt4sc2442sl04gg8mynjz', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyrt0pw4wvj9w4qsggdmxp06mt7jhxjax58mkjcz5n2kmqgcr49cl', + 'stake1uyqpndnp4dr6k3ys4uhdntqq45aujfc78qpyvyt9dyhlgkcrr0vgr', + 'stake1uxm7g5tk4umsle6d0qadcaqkr3j8vwgy8e3t680m967jv8gpp0d03', + 'stake1uykca6g5lwpmfs55wv28mqrt63nucqxpch63jx4srzgmx2grwlrgw', + 'stake1uyw0ld2gy2ql8zksyczw662lkchf62u482z80zwr44gwuaqhzu0us', + 'stake1u9m98hcwnfz06v2awrvex5phjg6utg07jlmwp6un5xj2tkqy8uktn', + 'stake1u860mr0yhfchcwldjx8wcmdzrnaycaryamlum8f4c8wzgsqs954jv', + 'stake1uxtawn9lpr3fzk3fm7wjzwp04rl9x5zjjv0jnwwaezxt9sq0afrvl', + 'stake1ux6vx59d70ez7qv79xf7g6kq84crfjjpnlas2v6tj5yzhucl96d60', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1u8pc48tvj4v83tlv9vyhw6md9m6xmfwuucdxl0schsf8mzgyam056', + 'stake1ux3d9k6m0gs5wm8u26grdcw3dr83mxn45ve0whwfr492u9gmwzcm4', + 'stake1uypeukuu0nz00la3anxk70ku5rlqj084zzh2zdt820q3mfgdnyny7', + 'stake1u84t3w8sqx0rye69w880m6t68kqpheuvfnk3y36nz6qp0zqkfvjqr', + 'stake1u84t3w8sqx0rye69w880m6t68kqpheuvfnk3y36nz6qp0zqkfvjqr', + 'stake1u84t3w8sqx0rye69w880m6t68kqpheuvfnk3y36nz6qp0zqkfvjqr', + 'stake1u8pwcdhtth7dva37jkvvrllsx6tma3rj204sn3rh5x4rz3geah8x3', + 'stake1u9eff5u9jur47c52cecp2vfusjkjf4wpnqmls3knxezu3ggd766wn', + 'stake1u9eff5u9jur47c52cecp2vfusjkjf4wpnqmls3knxezu3ggd766wn', + 'stake1uy25kqjyy574ftrta8ughg4l6jply96lw5qx5wvvvjmptyqfdlx95', + 'stake1ux3d9k6m0gs5wm8u26grdcw3dr83mxn45ve0whwfr492u9gmwzcm4', + 'stake1u8xhuglvjag8c3a7amqny99etupk0c62ah956lefs98d93gzfhydt', + 'stake1uxwkfjy98j6mzawmm3xgvjr85vap4v7xl0kdn76j7qrpnlc6ed2fr', + 'stake1uyvzj2zxc906pt432gvgzfnjtxr58q5k7yzq43pvg3w964camu7sq', + 'stake1u8j5vtyt490h74g0zld7d00re5xlcrcjc03j2567uj9nadcdjfmrn', + 'stake1uyu7uhw45vln0k80l7hw934vrgv9se87hhxcjmy4jsstydgj8v3yx', + 'stake1uyu7uhw45vln0k80l7hw934vrgv9se87hhxcjmy4jsstydgj8v3yx', + 'stake1uyw0ld2gy2ql8zksyczw662lkchf62u482z80zwr44gwuaqhzu0us', + 'stake1ux3yde6zlk0af7y7lasm7w8u667lnhscpej4v0v8sl2nxjghksu2d', + ], + + poolIds: [ + 'pool1z5uqdk7dzdxaae5633fqfcu2eqzy3a3rgtuvy087fdld7yws0xt', + 'pool1pu5jlj4q9w9jlxeu370a3c9myx47md5j5m2str0naunn2q3lkdy', + 'pool1q80jjs53w0fx836n8g38gtdwr8ck5zre3da90peuxn84sj3cu0r', + 'pool1ddskftmsscw92d7vnj89pldwx5feegkgcmamgt5t0e4lkd7mdp8', + 'pool1qqqqqdk4zhsjuxxd8jyvwncf5eucfskz0xjjj64fdmlgj735lr9', + 'pool1dmqzwuql5mylffvn7ln3pr9j7kh4gdsssrmma5wgx56f6rtyf42', + 'pool13gdtqme63jprkug3j4wzslhmu0yk4kdx323rtxpjuz7rqv3yyes', + 'pool1qzlw7z5mutmd39ldyjnp8n650weqe55z5p8dl3fagac3ge0nx8l', + 'pool16tcjctesjnks0p8sfrlf8f3d3vrp2fdn2msy80sgg3cdjtayu3z', + 'pool1qzlwlpcsgflr9z3f24fg836tyq45p0kf5cnrp20s8v0psp6tdkx', + 'pool1p9sda64t6l9802tsu2fj6phvt9xfqgcpjucyr3kek8wzurmn8rz', + 'pool19u64770wqp6s95gkajc8udheske5e6ljmpq33awxk326zjaza0q', + 'pool18xykgvvvxej2e5ap04ks72d8fdke4qsqeh30satznyrtj88634d', + 'pool1qqq6qqa0hpzvumv5p87ynczfmdj557xuwlc3289ke42g72z7f74', + 'pool1e556526sqwugxwnmeumt9lhj5jukklg8vv3ynk75xt9vs7adr5y', + 'pool124lm97s6f4satl7xz0ulzgg6tv30tskry3zcntwrz68n60v5yne', + 'pool1vx9tzlkgafernd9vpjpxkenutx2gncj4yn88fpq69823qlwcqrt', + 'pool13qzk5az6sx77lk2nt8zruu0t2tsyepu9q73yaz8l8j3uqxqh9wh', + 'pool1m83drqwlugdt9jn7jkz8hx3pne53acfkd539d9cj8yr92dr4k9y', + 'pool1krznhwu3h5pu2stuslr53z5rme50t6384macsmylcnljwc7yjky', + 'pool1v4wgyctxyxlcf90qtgflznv5f4fcm6cy0z80mchctekt20d3cww', + 'pool12584mjtgz3fhgpx823qht56gycnfnezg6aqqthazv4qdxkd5c46', + 'pool1jhzf2mm6zdlhl6w89uhgx8nq8p6ykcc86qq58vjy0ejyxrrksfj', + 'pool13wzpwavanfpkr4r4j30plrlc6dn6p822lkt22zdllmy7q8y7s90', + 'pool1df9rj4n0t3zlpak7xnh4ue6t3yh9zlw7a02w4l8askp77up25rt', + 'pool1q3xdrewrldt06rpjx6pzguzm847ujxnmajxrsr7dsthscz4htlv', + 'pool1u899yml96tf2cf4zkw4490mnhf832pk6fefnaluvt7487jmqzhg', + 'pool1fh4sh2telea0tfdy39h0drx6uq566yt9gf24edpz7335sclx39z', + 'pool1pk7cjkcdsawxf25dwml0ely8vhjx7wp7nqans3jwatanceyqae0', + 'pool14kg79f3v5lqfvp5etqvmy6m9kuzpnd80w5cl44qrl8tpuk00quc', + 'pool1lagcrwhhy24grdxpetj5vwwey6z8ncp7gx9gdd5p7gnd5f6urcc', + 'pool13n4jzw847sspllczxgnza7vkq80m8px7mpvwnsqthyy2790vmyc', + 'pool1ekhy5xsgjaq38em75vevk8df0k0rljju77tljw288ys5kumqce5', + 'pool1qqqz9vlskay2gv3ec5pyck8c2tq9ty7dpfm60x8shvapguhcemt', + 'pool1wz27a9pvd2jat98s375lxaaj7qxy405km4vzp83wn5vtwp59kvh', + 'pool1d70vllztcsgx3ku8h5vnukzz2a7lpzjxfjmuqqvxtj9kq27hygs', + 'pool130f7tnlumxe5yuzsqqphy00cal8yugh5x66zgnz48zqyypns0k3', + 'pool1qqqrutr85x04emqsnlacgz6drtzpvp8v3kmlkw8gpnzry67qeuz', + 'pool14hsxa2zfwzvy9ncdjwnx0xkcltjmdydeayxfju7suuuewv0dnke', + 'pool10capak8jppvj8h46e35xdth6h22pahtr3lcgscrpa06jzv0xn8w', + 'pool1a6ccp9fpgn40r2jl7fapjv3224swqf72z5gt4cgwctnk5etfjlr', + 'pool1qwa8x4u4a2pff0xdv0haxpgk3tyrvl5adl2lpf3ztcftqruhea0', + 'pool1h5jtxde8j86qrnqzj32ugn480u7gw5xw8wqy5d227rl3vfg58qz', + 'pool1378u3xd5h393n0dwqszfw4dmen5vlmnm2fsdczd3v92n6dlw6qm', + 'pool1gpz25s2aasmqnh9tg8a2rxmyxuvmj5s779htxk295e9ajnzjflc', + 'pool1jk25l2pejpdzq8vdjlxrr05th49v9tgd78fqrtxvuw3rumpfc6t', + 'pool1xxhs2zw5xa4g54d5p62j46nlqzwp8jklqvuv2agjlapwjx9qkg9', + 'pool16kus5xvdysgmtjp0hhlwt72tsm0yn2zcn0a8wg9emc6c75lxvmc', + 'pool10zdg2macln78u7h2uh3jxudxam6y0an8sa4dcmm5k86j536cmqa', + 'pool1ld9hkah2dkzh73pvh9tf6xr0x28us34msv3zcv2sase5vhvq962', + 'pool14ga7m2hv6y89u4jv9yf8mf28tjs078j43l5h4zgpxqp7q6ey4d6', + 'pool16fyda57p3c8gp5r6gmcq5tvqsp6mnzwvkxswgznkuh8wztrp6vv', + 'pool1dvla4zq98hpvacv20snndupjrqhuc79zl6gjap565nku6et5zdx', + 'pool10s3paykwusv3zpfn9wkrzfvw6pch5tlcklwftj00a79yc3h0tgx', + 'pool190a9js7lk9lvmrngre7w268z9tz9xs9yz77audvw8ag4jerfdhx', + 'pool1a3u8zuz7fqavxgl48s8k37w8w6njk7zevlzyfjdlzxfexjcue6a', + 'pool1vayu3mf4qgudxeelywy5jxjxaz56ycyr03trp4m4q7925mwv5ct', + 'pool1xh0kehvrn64azddplff6gfycc86cjcrjs6zlznfcdk3f6wj86ed', + 'pool1qqqyv9pn9typyqwcxqk5ewpxy5p27g5j2ms58hpp2c2kuzs5z77', + 'pool1v4adhelnswa7pwv2njn5h84atw08mlc79ll2ewl2kgxhv3cqwql', + 'pool1vxz0deezj5c2950e7arpzfqxzq8zd9kawsullrzjw5rsq0yhxgr', + 'pool15w4gpc2zyg634j5yag0xq790h326fzcg4cvq67nmck3kxq4m5m5', + 'pool1hqemm6x7d4w89yjswycn3tckze7a7mcw9g458pmuggy7jm26m38', + 'pool1ahl705cca5twdfmml0ksux606t8vmuemu9vsnf3g94mm7lhnhtv', + 'pool1smy2r8jdvgna5ykhe8rrch7h4qalyfafyzyh0rmanmq0jxptww7', + 'pool1k3sjc2sypvtrgne7gc7mlgv5pfu2pn4zdlyky9tkxzmckcp9mxr', + 'pool14mm59ntjqzphjr6chrww639cdr3yjce4qcwzc5jkk38y22u7uc6', + 'pool19f6guwy97mmnxg9dz65rxyj8hq07qxud886hamyu4fgfz7dj9gl', + 'pool1spus7k8cy5qcs82xhw60dwwk2d4vrfs0m5vr2zst04gtq700gjn', + 'pool1wll3vr4v605eap9hpjfpda5cjegqfkjt8hrz3kkxpnffqejhav3', + 'pool1u3v7s93f2d968a8kce6zgfmckfx56ly626jkml6jv7tgweplrn8', + 'pool1j2fvu8gh25ctsx7fkyvkxpjfllzukcvu9nlsc92uj4sjwy4qzdf', + 'pool1mcvq2z34f9cfdmkd97famsh20ekqtndw246ny5e8ug3mxfdf4zq', + 'pool1jx4ss2zjage3cw0wht3450328y82yeprmq4fr3e2qtac2rhezkv', + 'pool19uynx6nxcdksmaqdcshjg487fap3rs3axyhrdqa7gdqgzgxss4y', + 'pool1gtphgrdj8sluxm9e7ca2spcwcq2p0dxj9zf5v0yv3gsagzq704n', + 'pool1wm5quxelvgk8q50jyfznf9asvelp9zf0tk2wu4jazlw9yj4uctw', + 'pool1lllmq2jgcqrag5c77lpc5m34fsqn63leadyx9tzx842n66ly3ql', + 'pool104fdj0xdhr8cqedwn0lf8dk206ryn62kn8mtyym020nuxthjgvj', + 'pool13lvqv30e0zuk9kjextyhdemzpyefhjgd077xhmqy4gw4xuvcm5f', + 'pool1ft4xjlz9uw0r0ewcgtkgeakqrfc5azxmxwsm5pt94dv67mw4rgd', + 'pool1ljlmfg7p37ysmea9ra5xqwccue203dpj40w6zlzn5r2cvjrf6tw', + 'pool17ahr5ygy48vpdfnatqn2z4wfu2te4quapk2yx3k50ce6kd7feg0', + 'pool1xrrrr8gldqz8pjxj6j8c638a9py04xuv66kfgn2dlsx9g52te0t', + 'pool1x2h98z6e5xvrg5zw3v3dlu8hqdtj6lhp6r3w5ge7rvcqcx3pafq', + 'pool1hwlghkwnjsjk8370qt3dvp23d7urwm36f95fmxcz3np2kghknj9', + 'pool1nl74emh67vuyt8cgv6gwhjnrctxgrpqlrdzznj4l3lh5j8lj3ah', + 'pool1q66d2n39uvln4hazyzv8fyq977mpqus78sjd2369qfn7cptdeyh', + 'pool1llxh8l0h8g9ghz3nrzh7ndvev4x43vnk72nsemzm795vxqs6dp8', + 'pool19ejln2jcpg5dphc8m5nh8sya49sycsqj0v2cjxw6nku966cc8nu', + 'pool1pvu2zdexh8wr4ggmuz90jvqrua6an43qj9m9urs785p8kwjzqwl', + 'pool1etfar35l4tf6vam3gvqf5dnaq7levz32vgw4p00jzk7q7twg2te', + 'pool1a600v0jd2z3yajazd80phln3exekumm7g56d9yvlrh6vx8dx2fc', + 'pool1rd0cadxrmef8fl99e2ms3tytzq874m2ahraaexfrhpnr67d7s8a', + 'pool1jyutduy73e5u9877uns3k9rm0tf4r24j8lrn4xtkjpl3q5sn5mw', + 'pool1gwnu7f7qgaruxph8gn3u28qphvquvnj63elyd3r0nndacj9g9pa', + 'pool1sx4e8rvx2xdxgkww2fpjtmvrnaftfrtfge29xcn72hh7kch5snf', + 'pool1supp67ypelmgzuzqqvarc6czgmg3ggwpnrnfr90xpfcqqf8h05t', + 'pool173mzegwuu0pjcrt60ekelzj5haqr8r5e4e0n45qh9jdz7xm5kh8', + 'pool1h0524mtazrjnzqh5e4u060jsfk8lpsqqjfpa5gygjwuhqu34wvt', + 'pool104re5tajgh4mpp7c744khap56lf609cfjlna5ysjkum8qn8fel9', + 'pool1hsq2jrulgj97tna2femdhsfn2wurkkwt8uk9uvs42h9zs0a783p', + 'pool1wym4qkxsvqejxqn4l55y9z708mkxc36qge28qevrvp056fe7dxg', + 'pool1u2d3guvld9rk0586lyhk2n8kvkzmem7czwdltgem0mgczqd3ygu', + 'pool1gclysx2h7fndj0jdajlmwvqr8q9tzu3rurjknacu0ff954fsg9a', + 'pool166dkk9kx5y6ug9tnvh0dnvxhwt2yca3g5pd5jaqa8t39cgyqqlr', + 'pool1sffl322qgsrsmkcedzzwk05396dkmj56pcepqvj6px3n2re3qu4', + 'pool1s3z5qsg75dar26ykyzcz2u8wc2swgq7pyp7f9sdh5n06qh3jhq2', + 'pool1cuccvs6vdlrxw67kwvzdx3gcl3ha0402mkhhseqmre7u7vdkwev', + 'pool1jhh5u4q6r6ym8rl7lcf9qc8lgsds8sxh0kl6lajkh5wkgkq6efy', + 'pool144m894gswuy3se407ma5870nkaw5ylykrak73gf4kpepj50ulfa', + 'pool1z7n2ruhmxmv77f6cqhd3wsy6774h2wuay77agxuf2y9mj8q55vw', + 'pool12mmcc4rc2fzfv7gyv8h06nvnsrm3m7erzdv8x6gzvjxlu2lf09n', + 'pool1vnsfv2qpt5gxte9prupjey8kw7ap7t6c8lc02ks4s3gtqplhgd3', + 'pool13mgf226yj5a3kwcjfnguw2qpna2uv07w7gfn07g49kwd6tkmzsp', + 'pool1rkyc3ss904h066sffergss99r9p2kqa4k6ds0g4u5ud4x7yaajd', + 'pool19wr27r3dqt77nd0qv7zcwzajw8fl3y0v69x5pf63sznuugg9p35', + 'pool1py2uxkvuj926h42s40wxl26dh0ggaq882v4m0hkd99m86vzmwnz', + 'pool1ua0lx5ap5tj9f5l7tyjflp766ca5yu93djh5hqvm4e0kjgw5k7v', + 'pool16dxn8c697qrqtzl3xe695trtde2hvgw0qtd65208ruaq70hv4ud', + 'pool1uq8l234306m76unyz8kuwnkvmtvazaks6vuvyx3a3khngavvcw0', + 'pool1w8ham64lthvzzxzn5hknq4yrj8xt2nark409s2xmntlwvt4ag3r', + 'pool18vc3pleuqzejkvlkls7qqw3ps9gyygrenqpypma4yp0gjjrm3uf', + 'pool1jre4hpk3hwzlzh64nfsjkhe6gp4006sy2v8ktqre2qth7uswrtf', + 'pool17k0rf90x8qcre7nrw5x4mgsfgy49njyqdq884qunm4fkslu6nye', + 'pool1ddgcpgjcyawxw95se9x8qnc8gxgwjr4fqrk4vk6v9x47s0ggpjp', + 'pool183j8g5lmry5jsnua6mw5jhwdacwhkrnqfpga49v0qg6wjmwndfv', + 'pool15mv5w2vvfv2kplkrt40ylylyvdudv5axq5nyw6ln3v0gkd2auew', + 'pool13846y7q7tng3endxhet9qdcz5w0fjs09ytcye4dm5g54wmyqeqr', + 'pool1rshru8pm6y0jy7jncmt6qzfs8u4f5qa5gvyh38kgec767t20z3d', + 'pool1kkfkdces5mdcyc9dn2hgg3463jggjvw3h89nejjarkz25uavaqu', + 'pool18v9r8afalh50l4lstct2awdc3zspnvurcs7t45nv29uc2mnxc6c', + 'pool1h92047jmdgtp4ft2cw8gkf3a5745vffca97ay5stt72rkxm37kl', + 'pool1fu567g42mlv9f7enek7zeh94c0aht98w44du7s29t0elzd9yazz', + 'pool1cc76kmtcpf6vht32ya5ke9er74dnpy4jh5qpy4klqwp87ygdsu6', + 'pool1zsyqzr04g5pr3nv7vfk8ldc3uf0xljc8yftdsqpxxqpychpxj65', + 'pool1qqqq4md2rfdt75qvh3x9cgmkrgkl74ctcj3fnxpu3ylcudl22ex', + 'pool16qnvy60w5gwkr87qypaw2jrgndtr0cmwauv60m2p5lxzq5akftk', + 'pool1829u4wxz0hdatsc0sczd0r3362wxk82qlqncjw5ksx7ngne07w0', + 'pool1vmj2h5vwgc369g9v4lym57rg84t8sh6twn2sc75cr3pdjcg90gt', + 'pool1qqq9tqyj69j9kygpxza3h82ynh8d0xlueucnu2yqum8nse8hj7y', + 'pool195gdnmj6smzuakm4etxsxw3fgh8asqc4awtcskpyfnkpcvh2v8t', + 'pool108zdflss3ayqlm5c7vr6mtqj2uwl99vk28ur8dv4zswdzt6yauc', + 'pool1j6zqawj6f58lp4p00t26eqe58gxx4pa3cudlzpkv23y92nlxjzd', + 'pool1223lffkp6apdunf3prnfz5cra8fy2m2sdkazkls2wky3wdguw59', + 'pool15ccmgcc4k9t8auxw9v4dfjmrl2kqnuevawn8z6n7xv09utw9hh3', + 'pool1fxl5v404w7rjk6k4xlhxqp2mcp7t6quu7amyddmnqhy5vn40h5y', + 'pool14ngh35fdapsa5sdtvr88vysakvafu0es9ltpquqzr6h56r6dh0h', + 'pool1s046e0lj2tdmgydwye75h2yjgchzpa4q6jtemwds4wfh752gyr4', + 'pool12jz7ey8jtd9ek3x2ysxaxsgfyu62ppaljrc3rzs4z6ydvx9rcs8', + 'pool1vquhv3kh6xkklckaenl8alyuhfsld57ef5573aqauueyqacx4ak', + 'pool1swe9nsv8lzugakjkfv04dn38scmq48wzynmn0lxasupuzmqcgjm', + 'pool12ehtdu5hfffpeqg968gtpqcnjv7hwfj3tshxcw8lg37tqcquhaq', + 'pool1dpu6kslgxlg3ccrwxldl8e6r7ylnq0yalafmucp0yc7k6qegtt0', + 'pool15mfkj8sl7estcmmd5a07afrx5f4hlz3pcr6p6ay5pfmrjfl2hlf', + 'pool14g73qj0qz05ymqg7dp9kxdu8jr7uuzm6z6n3jwxpvqskghhmhng', + 'pool155cu3s06js3llfh07vnzepatfuvt3s5s7uwldt9rzz55wz7pugt', + 'pool1c89d4drtwn0048mekkdkzllz559ahnntxelyw2mppxnmc36hjlx', + 'pool1xt8ap3qu32mxan6kahesqx5kek4lw52u5hqp2zpsdgskca56ahe', + 'pool1wxn9nsl8rvxa6r8e5eaak0ml6etfxnz2n9vqrmsw5nzgyexgkrn', + 'pool1vemm9tq77upd9m6wtu7edw8wtju3ymnuq9wz43cfn35qk26ddqq', + 'pool1qqq0c53vaf5ju0n3fvujmyxwca0yhp65930evw9lngmr5705csz', + 'pool1a2nh3ktswllhwf07fjahpdg5mpqyq7j950pyftq9765r6t4cefl', + 'pool1p627hhec2ha6wu6ql377c3hv4mjd26w7ll0xyw2ezgnu6nyl0a4', + 'pool19vpp0udh6qtu5dv9dwssamqsttx7z7n9ml2wed67j0pdkck9vnj', + 'pool10quq4wlghwrvmhdzc7geq22pyhzegccwj56ax2g8hx0cjfahufs', + 'pool1mugxe86p0p6fzeesthdzkuk3h9xtndf4my9cznmxtmpvujzlw4f', + 'pool1kchver88u3kygsak8wgll7htr8uxn5v35lfrsyy842nkscrzyvj', + 'pool1pg2k7lp6w68vlvdycug2ycu3mkrt0z4ftxay4g8zchj87mw6ug8', + 'pool1g5gmej3cj67td4pmvmacnls8nuq0gjld2pwfeg3jwpxujdx6lmu', + 'pool10zyf32q3w3n9x940j6yqgkwuegzn77p94wcmpku6gvmrqw8a97d', + 'pool1vafsg5t78rnx3qr3fv7ys9h50pnvxqhd4l8tj629l5zk7tc39ch', + 'pool1vc8jhqtwjrjwsfk6a0enx47hd2ufg98c34ta6lvl0zv0uhpech9', + 'pool12nz4esgsex6zdq9q0208gw9zkdrt3f42rrkefzaxqaqzzlwjku7', + 'pool1e489239duee8dykj7ejx7dmazstwn6y6wfxc0kjaxw5hke5j4nv', + 'pool1h0anq89dytn6vtm0afhreyawcnn0w99w7e4s4q5w0yh3ymzh94s', + 'pool1v2rhtaxs55lspa2zm5ggeuhsave7nxtu800yng36nefs5jhzl80', + 'pool1j8nnq9j3ngh665tyxsfkjfxlqprj0ftq5aj38mlx7svhj0wm5s7', + 'pool1jgwu8lq3dqddnnx7prymcgcyrqy0fdlghg33he2hmw9t2gma3zd', + 'pool1qq2vm2xpcj9kf42z4cnw3djancv48sx42chwvgxkjq85ceu8k0x', + 'pool1dy7tz7eyf2qal2jcns4qwm4xqn34gc4rj9dz34kfs6zuju477k7', + 'pool14wk2m2af7y4gk5uzlsmsunn7d9ppldvcxxa5an9r5ywek8330fg', + 'pool1xt0z35f0ms6xt5r8swhtd2xcymqxvk42m8fk5q8fnw8hjhr6yax', + ], +}; diff --git a/tests/k6/src/config/test-data.ts b/tests/k6/src/config/test-data.ts new file mode 100644 index 00000000..1b236a63 --- /dev/null +++ b/tests/k6/src/config/test-data.ts @@ -0,0 +1,1175 @@ +import { TestData } from '../types'; + +export const TEST_DATA: TestData = { + stakeAddresses: [ + 'stake1u9ylzsgxaa6xctf4juup682ar3juj85n8tx3hthnljg47zctvm3rc', + 'stake1uyfmzu5qqy70a8kq4c8rw09q0w0ktfcxppwujejnsh6tyrg5c774g', + 'stake1u8mt5gqclkq0swmvzx9lvq4jgwsnx9yh030yrxwqwllu0mq2m0l4n', + 'stake1uxs70hw759k87fptvajc2w7erzq4pkq9u9gjf9g4h362h6seaedh8', + 'stake1uydhlh7f2kkw9eazct5zyzlrvj32gjnkmt2v5qf6t8rut4qwch8ey', + 'stake1u85jzzcp0dyl3xxqpjy5x7fqyadg9r2aq2r6lhhq4wnjwwcfkkn7t', + 'stake1u8c0855tmgsljs3sxpf52657ln7cwvtsdghv4u8zr3d4u2gjlugxj', + 'stake1uyxa895nulwuqe9m75g8ggqeu2a25dl4drh7mrujp3ms3pqhnnhuf', + 'stake1uxsgkz6fvgws5wn80vckwvghzapnhfmf0672nmmkm2tt9fcaau5sw', + 'stake1u8r9vvpvew8fkw3lzfq2ezk38xwpcktf8g6z6fml5ntz0scarzg99', + 'stake1uyy96h933597tjpld860xrzufp4z84wjpjnt7ts2npd80ps2ul2ev', + 'stake1u9z2msz0qr3lnt6q07fhv00vj5kp9dlfyjd9ax8v67a2nugfxvsxx', + 'stake1u9wzfeqfr7rwfmz7n0472rlv3pdxa4q3lnx02fy4hrp9z2qjk77xp', + 'stake1uydzg05hgy3vp6evchsxej7cz2le3h5jmq920qg9mk7prjcwlmjff', + 'stake1uy3zf0rcsx639y2d853v5fjat7v02lz5qq7d4rgmcd8qu4qfkvlvd', + 'stake1uxhy4f8ku0kgn9uwyfhagndt2t5ywpfcfdqdkya0jcnmcps75hxjj', + 'stake1ux3kq8q3qdm3jsv5je8te5pdgccvzu0ywxluvagw8257dqs8qp9m0', + 'stake1u8l40g9me24d5u4ku0tdjpzvggx34rwew72gsnfeqg03agcrkeva9', + 'stake1uy74w3j0rf95rxj7jhlal0wvxfywukylpqtxqgc7kkj395qszx6qt', + 'stake1uxsl0n7lhcrp6eya57zjq5s2q7ww020n44z3rfsf73868yqk97wp2', + 'stake1u93m96xh48q33x7vz2yvw25fgyct5g2v9skf73xnx2y8hactqk99v', + 'stake1u87vmjrxj7l9fj9ummgnp43fupyt62ly34gwl0gsw7n4n0cqdg6f6', + 'stake1uxjxartx3a0h6887835keqqprqsmcudsn2aksxzgvdmj52gdkpxzm', + 'stake1ux5n727gxnt6l2kkm25d8qn4g9cfv0an25j27mdueyh6lkcg5kwxa', + 'stake1uxkfnfx575pwaejqhmkru2rdv8kppk07fp2f2tdkqnvu9vgkrqhnz', + 'stake1uxglx5pg0y49td9djar0yts7z8xu9q70dwdahf4lwr0g64cd6d4ll', + 'stake1u9gudmdxqpflqfghvxgxsdztfd26uytt3quzsspujz63alca2wl46', + 'stake1u9nl7ejgnawwh5jhx3f6054l2qxyzl5r96q4c4rzwt3gucs2kauk8', + 'stake1u8zyzks8gnqqycje9hwvl9ywlge0mwv8ntnlvfrxje6354sl3r5aa', + 'stake1u83ehf9djmhnq4cnsuusnfyfxr709tj0gkhwuyj6qtay55qemfdeu', + 'stake1ux3d9k6m0gs5wm8u26grdcw3dr83mxn45ve0whwfr492u9gmwzcm4', + 'stake1uxr4uvsy3qvfdg8fpw83yg9x6t7gyxky9eahywa4hnjy0hq73ppk7', + 'stake1uxhnv488ektgthhmna8svg6h6fztke5ughlq4h9acetx5mczkm52f', + 'stake1ux5xyclsn3fs4lwycqt434dwqnvhcg06upl9umjh3hpqw4gfvw40d', + 'stake1uyfgttvkh8qaz6nnr8nkq56dy4x2kkynyt6t3afa84w65yqyh524l', + 'stake1u8f6wf94tcec7y585h9txjn4f6j56d0gns9sa5zzgrvlnyg0zdp6m', + 'stake1u88fzn2aefzgmekhkm3xjytf0xlgejk8fg64pacyyl6j04qkxsuuk', + 'stake1ux7pt9adw8z46tgqn2f8fvurrhk325gcm4mf75mkmmxpx6gae9mzv', + 'stake1ux4fsw5asfn6ezfzgpqwtryytcsynl6nqkff8zrda32sy8q7klm7y', + 'stake1ux6e0ew35npz6c9t4vs2zn5m7me0unscx7uwhcy6c59magcwczt0e', + 'stake1u8ufprlk3x5t9tkek68cxhccxajpdsgluec4cxpsgplrm5cjxr3z3', + 'stake1uyneeuvwqadjytcfxar0f7w2mxq06079lnzld80vaa8ea6gedt6gz', + 'stake1uygmdr44dcxs7qxzjqrdmrgv8ca0ht0eaglktvj3a73yqmqxkfklc', + 'stake1uxjt3e26jf7lpptucdqthg59j0y65jya9axep9p5dg8hu8g3j0pvv', + 'stake1uyekydym3v2r0swygv4hptx25jwr33sml3rttywh2j4l59swlcdxs', + 'stake1u99zwmn2zrx3vk40u9cadxrcc3g9g5f5tyq689ckzhjat4cszda2y', + 'stake1u954ajg56pa6fa3xv9nsetz4fdmluquevxlfwx93nz0x8qg2srugy', + 'stake1ux8z7w9g8d8657eqxp36ryzqhvvk0w37paza44hzqaf9m6cmp75sv', + 'stake1u8vxwd6tgxt9ez6uaq8ptlfxcw0h7kfxc308hn78f6a8qzg0p463u', + 'stake1uyd3qn9dqqjx5he88mdz4s7zhs77t2849rqsl53f4zdhuuc49j3qg', + 'stake1uyemx5ue08cyp8su6ul2fnr0fx4t92zylxnmp2ansrc6hzc9zx9gv', + 'stake1ux25vaxnp4tfafyuwqm99792z2tj38ky8a8g58dnere30tcw6st9h', + 'stake1u995wleqz494ea9vk6yttrkakv840hnc0snsgk8g4flvamc0764jr', + 'stake1u9eyagk2qhkknr5rsv7ljccv4h6xf6dxqwh39vc7zevgwvczlha7t', + 'stake1uxh7k35pcamqzthu6dvlf2wc3x0a7uvkwhjw9q6vvhhulcqkrr0pq', + 'stake1uylclheacdy50q6p9warts8t2nwq8kd8mw23pvwuhc2wn2srdmv7h', + 'stake1u8uj32ckrehq2wtnqapwq6qk3s0uvrt5g622spkpxmeem0sgp2u7p', + 'stake1u8jdk46ddj45kupjpy95cnkulg2ghpmq4a9aza2mlt969ucunrzgz', + 'stake1uxj5jx4dcte70dzjy29zx0tmefav8j0xg2ek57s2mgp82vckpdlj4', + 'stake1uxqtmvc62fy2pxp9344s5nxagts30fezhf7wjhhn3y93dkgcypcet', + 'stake1uy89kzrdlpaz5rzu8x95r4qnlpqhd3f8mf09edjp73vcs3qhktrtm', + 'stake1u9wgxxyae08fp5etm5mhuy7n54jakxtjlvvr84q8y2vmmsg6wz3u2', + 'stake1uykcn6sm5lpanff0gluvyjmgrm9rkgnnyqqh5t9clfa4xccy8a268', + 'stake1u8kfstzvw8af552w4t4gf9e9m9wc8vyuy8n8ylmp3le7cwqf5pn26', + 'stake1uygnagkf2rv267yh5knrqraqvqvhtq3j60qv8nwmn6gctzcv5j0sv', + 'stake1u8jaswaevwhcq7x63c4fnufr4jz7h344m78hxswrscw7ypq3kt6ux', + 'stake1uxvwxfrsfz230ss5h9kxd003fjfvg65e9s8an0gmctukytcz4jmvk', + 'stake1u845emtj9zyqh9dhyaemyf72feasfcrlczrre5ascjsjrkgaxuzvr', + 'stake1uxjucz3w4x9kac2x7plctapnw2vp7km83pg7vrrff4g4g3q3kenx0', + 'stake1u9qhe8kk8gwnys59c4m82v9xj9thk2x2j3rd65s7pqdumhs864arm', + 'stake1u9p8m2a2clx94q66xfwly6qja2ktmkn9j8j2crp4uxrxtgq9vuq4t', + 'stake1u8u2lhnhak7mu8m2nzn9d0hk5nr6gutrale3q2pzwjqcqtc023ej7', + 'stake1uyruvdz88v34kx3wu4zw87n8kn9kzgcluq7duv0efaxcn2skac3ry', + 'stake1u9q2cy9sp664nxmt8mqfl4jqr30vl4yl080m4myvwzugpyql0vk4e', + 'stake1uy0kwxjfw009t3sgta0qul9ra3uae5dct7zy0fa6at39u0qukr9gq', + 'stake1ux5u5s86rhdxy7sgqr7f4m9aexqp4gyyuwll68s54nejzjsadp46u', + 'stake1uy0jp4vyvfh394wvryaxck0yt8pt2g5mge5dqyz6urm7fxgmhtkuf', + 'stake1ux86z7c3e6vlfjrphwa8mfpfwegamlmsmeg0tvqe7hq4mas6keccw', + 'stake1uxamzecamllg2wn6e0vf4n2v4tt9etmvxp32fmkghvzt5sc5hnuxr', + 'stake1u92pkzu9qs6dhr52l4fs2tf6gl5yqr0wdkftd4d8zsnmy8st0uza3', + 'stake1u8e4gjtxyflsfkwty4yh8ead2rkutezh4c99sy27eaq4uuczkmgsc', + 'stake1uyuaus2dyups3ck83xjmeaf4t6f0t2ducp90zz4rcguunrsfj4sr0', + 'stake1uxdua6vp6e908hp4xe3fnnd07lsqa5dp3rlrycwetklz8gsfttnqy', + 'stake1uyamjcg330v9x038mjzrsc7hxmhm6menyhc84vvpvl9r0msn9tfmv', + 'stake1uynlfmqxu76felwwsg3ed06jc8aanyhjqxdytnutg7egw6c2dnct0', + 'stake1u9mf2e0axwy54h5l3pcnnw3yjhpqhpvmnecnyyfc8smah5g2pnj8l', + 'stake1uxxsa2rlkv728pve3ks7kn7c6v68luagdjgwa0medy6vp9suv96q8', + 'stake1uydcs3gfm3f77qt67k402xfsfulnecn58tpx4rvsrqfzz7gwue87n', + 'stake1u8wrrhmeepmnw34rgtdagz42edk235724w37k7zrhm72ldshr4pd9', + 'stake1uydsrwxmy82mj2t8ld0w74sm0cqrhk6syngs96hv80umdvg6szppp', + 'stake1uydphkd4dhtme8g4j56rqmhvxmykygtmzf4l07r4pp9kcnsja4hpe', + 'stake1ux24728lx6yx5u9x9x2cxlm07wu36zx4aml9ctx97az83zqzdvqa9', + 'stake1u9jxtv8fdnvp8gf87rvx5ckvr9346eg77gnclr55gfzjddsrfz384', + 'stake1u8zt4n4adfnz6c52pj99sk6du2r8rz2fe2m9spvmwme0gvsj8rzmv', + 'stake1ux28s4086w93k740aklds3vxquj5qfy8r4mwkx8hs90szfgdkln3u', + 'stake1u8ytgkdru6zhhwt9vrwe7w4604xsnc30npeq3rj4spjymysj9dnfr', + 'stake1u9q90mqwqlfhr9qv9vt2t3a2yavhy2tlq2qfpgut67a4w5scdfl8c', + 'stake1u8xefy50j9aks5nl0h5x2lpmwt805vh2q2kkterl5x2ecagq0mj5e', + 'stake1u8y3yn8qhepeug7y54w53ly6f8hg6htucrtw23sc7h5n66s6axt2v', + 'stake1uy44nntuqkqp7m7lm920lxvky8ea3t5q2k04g8n24ccrt7qet3n4n', + 'stake1u9whhyzzju9ty6lqe9m7e0afqttyzmq9mns3hqlc9gvmhncz0rzxj', + 'stake1u9m84n3zssw4zqlrss6700q22pfvy7d79jt6ww0at43ds8gwqcrsc', + 'stake1u9nqz4978j8tlp5mzhelfulk0dtfu5t0vpv8jlqtqskjk5sfw3urs', + 'stake1uxpum6axqp79quvg40q8jlj6ktcmpwtmyrumhr06ekpvc8gtx2z76', + 'stake1uy5m9ty5vxwuuw8qmsufkzvs3lqn3ydpzmvdsuezkgax8fsh53jld', + 'stake1u8hmsrawxdrvygpswhef6zauqzmq6nqnvyaqcdh9y0fukesnnm55d', + 'stake1u8n2jc7sh2j5ny3zy24ef0w3t8h22k9l9ul77thqv6s9uss2zld8t', + 'stake1u9xwx88t9jp7q2pfkeuzkh7ea6kglsk9dpncpj3mkvawkdg35fk0p', + 'stake1u90dfg8nuf2pdpzmz6aaar6mej8hzfgh9ktja08a0u8kuas3eal4d', + 'stake1uxjqd2nh90sd4d66xs2ewadw46t4xjdehw8jugyhyry79eqld43hj', + 'stake1uxnnknpf24ksw6drhhpls4yf8h0va0hpperw7lcle0h8rvqfmtf7w', + 'stake1uypvslxmxpullnzlsrsalcl642nxlw7z42hj5q0gpgzclaserdg22', + 'stake1ux20hsu5tdcd26xhrlu8fymlrjr9jqmsfs0c5zrspzw0qmqy65ffr', + 'stake1uyq706snjtkwt6qxggzeu397dlrq90hxpalg34v29cftxrgt8v4yr', + 'stake1u9y09mx6t4r3785ehwcs4vtwcwpsdl50j600dxeg8xug4ugunle7x', + 'stake1uyx0v6jv0j4vq3x0e5w8xslnpn7ejwmterz797cx6rfzn0grxpj3d', + 'stake1uy460g7568p5xx4nd7kg655afud3kmtgsewd6xlsl98kunq2rvj3r', + 'stake1uxyxdh8t235szsskhv363qhmyj3cgut8nxxrnlrhgyhamnsk86ww2', + 'stake1uyqh4w6a6jg84ahw3663vez62lfcpqpjz9qpexs056u326cvmfekr', + 'stake1u9w20uzsevkxe6vp2nlmqjjrcj4gvcf560tvufuvrcjpxvgqaqg0t', + 'stake1u8kvjx46xqyrtt8g7pmyaylp70wlnhq0uwzlk2g399vsz2q596pnr', + 'stake1u82a2t6z72tt0x3r7djzquaesq3gq5ldgulsngljf79pg0gptgddl', + 'stake1u8vl2pwaq2wj85wyp5hpwvdlxe6lehg377q3nj26kh0heecj9af6g', + 'stake1u8vt0qk5jqmze3276w94xljf5qaty63qkwfla5g59dn7aeqvpcksz', + 'stake1uxtp0yd5npvlz2urlnse495ndq28krw0qsyzvnrgy6wsg2qkk70xk', + 'stake1u9aff7tgze39cjcjk5mp5544t8298803cx7vhsxs5pr27eg09mrkd', + 'stake1u8v0649xlkm5j033yag6uupax5768lcwtgrle896nfn972gkztjs8', + 'stake1u9z6rt2zcdccycqtn8ns33r30dw07m0l83cqmz9pslnj34qejkztz', + 'stake1u93846yl3n2k2a2a406m66ktkv0wp9y45c8tr4hswugc5fcnujlek', + 'stake1u9s4h5wq7zz5gw0x42er8ugwjmkz5a6gx6cfj6sunelnz9qpdj5v9', + 'stake1u9zzujspwtxg03d4wrnwn49fxzj4c9qqw7dwfqygjmpxsyqqe2m5j', + 'stake1uxn6v52dj7hytwtdlgne2yfn5wwn2u79kh0p3y4u2suqzssf0n9w2', + 'stake1ux9n02hlhy926p4hj95hfk38qvs4k7526uq83aczwrjs7cqzm793l', + 'stake1u9eaprwdlzf3aung8w32k0j89asntwm0zu7nl0pnpsymuzckftvzm', + 'stake1u87zalqr8s4yxnlxynsrya77n3j9zawqx6v9e0sha6lc68sxjk07n', + 'stake1u8l06n04a5ypnfw4uy8wcfr6dp6nqs9gyntzj6ptt3echdc8g5002', + 'stake1u90p70eagmewu7h4nu0sm0fvhcnxt5umquvwv3hegsen9cgt2yfr6', + 'stake1u9ndmqdlm4e0mwmpy86vzd8u8c034n0h3k6uzmushmwfyxgmz3w3t', + 'stake1u8umpajsjaxt2u8zrmzt5xpd37yk58k2d0m0dwsjdtschzsmj3fks', + 'stake1u96ypvc320c86qkd33f8usz3gatcfr8979es4g7zq090rwqsmmwlz', + 'stake1uy8dl9rhw7s5geh0hfh0ql365pxs0a4vz5zy08wtxcrzgjqfdcf7h', + 'stake1uyj8xhlhgkjkwpdqm7mwsjf3n3j87ju4zzncvmz9ulhmwps8tp047', + 'stake1uy4k5lfv9ml33x8emwn2u6gdzk90jhhmx9ll5rkyhdrkmscldfkez', + 'stake1ux4nd3lt8r39l3d4knga49rcyxns8w0dyfnw049jt77s9hqhjfkqg', + 'stake1uyvq8d8zhstt8lph0e93kvm2gxp97r3nypqf78e738q364g4chxyr', + 'stake1uy2g0vrgegqed07tf9evnzq0lra608fddlu7sclhgd57q3q7js958', + 'stake1uxqpd2s03lynusdr37909350c9p9sdzvx68d9yj5us9hekcg55k86', + 'stake1uxg3v2xf6rxhg2vntvmsqk7ehv2gwwgjh99xmrvf47rjh5q07ys9w', + 'stake1uxh3eg9khpkdhl7973fqxrkgskwy84gu7xfhk7vf2gphm7qqecp2w', + 'stake1u98nnlkvkk23vtvf9273uq7cph5ww6u2yq2389psuqet90sv4xv9v', + 'stake1uxt38wc3nfv67q4sfcllg9nckp9apg0q8vww68jkskty6zskaxzlj', + 'stake1u8pwhkqpwyf7ranw8qyd7sqtlt5z9svluup5qhh6pgq6jpg9cr3vc', + 'stake1u9tlghh5al2fd2rk6exgewdst4ymaf46utt2qu7k45ltw2gs2vufu', + 'stake1u8va932lxwdky8mcuvxqjh3qlyghguklp7l46qgpf68hmwqewzy7r', + 'stake1uyatprrt5c2ujzgekr38egyshwyx09xfqa0s0tlm4t0798shlrxr4', + 'stake1u8w7d8shtmwzkapcv67fqyetj6hnxhzrsrkrc3um44yhzvclvg8ft', + 'stake1u9z4ge8aauchyhupk9swc8anchlmtrmm3aqdqqgn22wdlzqfg8n8r', + 'stake1uyxtg4zpvx5u8m620sp3m5v9y8q5f5482elhnekx9460tvg6fjpsg', + 'stake1ux2p6edp2z7q8amec9kn6uhps8dgwm35czp595uxld8dzcs3j4zs4', + 'stake1u8ms4q6m6zlrs35xgyak29z8y4agqyzu22gwsc2shl2e9rs8nv0z8', + 'stake1u9g5wnfj5zyjtvleq3c6tpj4ge5mn2eacfk6hdmfmdcs5qc9ulxwz', + 'stake1u8atpxymrqvjluf8hczrsf5fr65v22a2hqr0w9eu5tay6pqscdtu0', + 'stake1uxed203k55kpxeedfcs2vj2h4dn35yn6gzxyjjzaljh5ajs6cgvsz', + 'stake1uy4maqrs40sygrktt4mwzt57xx73hvhftlj30ahw9p58a5clymk20', + 'stake1uxesarw0fx5lnv8ht8k5uhc8zsrlvce53cwagpjn9pegg7gtxharq', + 'stake1u9wtyk6j8wktphfqyt55qju97k74yl4pn4zpvyvczsjcnags0f0hc', + 'stake1ux0wn2ucq26q60awthxrnhgerwk4fx9qmkekwskdrd2pfagt0u395', + 'stake1uxhaetfp0hsct0udm6d84q98t4ukzuh7a7m79u9fqvp9zgsruywmd', + 'stake1uyfmytqn38cqh4dk3qzj2pgfljujtk6gsrk3psmvtplyancthe0a2', + 'stake1u8cnnvkf0qkza88h9cmlvku8jplz2709xmsuqta7fmat9mse6hx56', + 'stake1ux3yde6zlk0af7y7lasm7w8u667lnhscpej4v0v8sl2nxjghksu2d', + 'stake1uxsus940j32npns393nazf6a6w7rs5nxc0gte5qd04r6gycra33hk', + 'stake1uxhz3srh58443mzkyyr7pgssa4d04d8zch52x4884un2jsgr9zv9g', + 'stake1u9skk7pmalyup5nwan7rrfg7hay7dx6k6wa5xms7srvgkkcqqn92d', + 'stake1uyacuruhne34456jh7vzuc9ly0rqmxanu9z4pzyly06z94gmm4a8a', + 'stake1uysv8ytv76maarn2fm9qwp6vmupd50858jaf8ndtzekl72gz4qqe9', + 'stake1uxyt5x2x7zqurzp52nuzpyr5fuyq59e6xqvmea52k07nvys74ll39', + 'stake1u8svhlnfeqqcjlv08q9qz54j94lr68g3hpu7ltty6xk4gwscc77x0', + 'stake1u8myh7ere2xm9nh469g4954yf9rhzgm3rrwaax3uja2tdvcehs4rd', + 'stake1u8sxgpvz9quaaz2y07zy84aghelpx6q8xzuzfnz8w8g7pcs8p79np', + 'stake1uxn7xa6asdmswcaacn7hewg64pqkt5jq734d0gyauzrkngc0292zs', + 'stake1u9mugug48am74e68hcy7kf2qmtx0g9swamyp828682swmhsusy6qw', + 'stake1u9kw4v52ssy8hpe0x42fpnss5cpsxdysjdp0nnqld42830cmmjary', + 'stake1u89kr5xq4uwf006lx308anmkjfkvqg7puy342s26aytt9eqg82lq3', + 'stake1u960tp5s6fez2qnnn6nfcnvhqd3wdx5n7x82jyc2p37wkjsrj7vf7', + 'stake1u88sl7hn6d64a4y7v53sepncq4ttk7p3gywr5r3cjpys5zgw2l9ys', + 'stake1uymxsmzd7j3yh90575jggg9348summ26w2vflg3z0ylpd5guxzg0c', + 'stake1u9afvwxlwf274aaf9gljz9tpuhtt30ppw4weetkqwljzdjcnvx7jn', + 'stake1uxtq694yx5aal56ndxnevghr0mev36vewn8tq22dxedeuqqx5yvu6', + 'stake1uyaemtpy75turh45mjslut9g2zerg2s8gmtcnkr7hdlwdcczjaf8t', + 'stake1u80kllnd9z0fyrm7ef727ec9k444ll96edy5nye4t4wh5lssev56y', + 'stake1uyzeq6kphnrw5va7duvj3qa40dqgyjjrg6unwkp68zs8trsv6m68y', + 'stake1uy0ast8weak5p0wgyghg30qtd4jwc76qt0jmsku9g8we89cce3n9q', + 'stake1u889kyshv88mvsacmrez8efy6wt6hra6ups0f43a5ejusksqetkjn', + 'stake1uypjx4cpa29rtkqu6vvvhn3f0vpvmuwjwa8h4u9f9tsg2fqpgymcy', + 'stake1uycj7mvz8v20swfy7g68czqjavwvqrj7wgya6zy83wuwcps9lv0a0', + 'stake1uya2ufr9ltzs268ayuxhg3hefe6kp442p5p8g5jyl9qru4sdc4rtj', + 'stake1u8crclpz452606y8gp6sdjr7wqg3j8yl9m5uy0zfqxqnjycmnl8vn', + 'stake1u9zx8crpkedpkrha0qay35c4py9009er57970kzhpqde6wswrjs42', + 'stake1u9wccfntp003jrq2cdaah4knkk0q4tmuw2qnkgwddym2f7gdcmsh0', + ], + + assetIds: [ + 'e992ef75f2367e6ecd93716ae88eba0d005dd91fd3a21f650b6496b55355524745', + '279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f534e454b', + 'f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b6988069555344', + 'e5a42a1a1d3d1da71b0449663c32798725888d2eb0843c4dabeca05a576f726c644d6f62696c65546f6b656e58', + 'f13ac4d66b3ee19a6aa0f2a22298737bd907cc95121662fc971b5275535452494b45', + 'fe7c786ab321f41c654ef6c1af7b3250a613c24e4213e0425a7ae45655534441', + '065c6b58d68f369bd951ad77a46f9d65f2f5ce259ef30853be11472b4348554e4b', + 'c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad0014df105553444d', + 'b3910d96ba88d2183fe33c67e69a48a25c9cce054eb7b95bb49dcb344d6563686120437261776a75', + 'b51ef6711febe15df7333a2ae0793291c9446dea6d33b3f12e6909e74a45543243415244414e4f', + 'b17c35b39e0a5a5765d4453919bb18d000aae00f12552dc8c6fc4c5159656574207468652059657469', + '8db269c3ec630e06ae29f74bc39edd1f87c819f1056206e879a1cd61446a65644d6963726f555344', + 'fdb44a54319fe4b35ada04bef740114aad764e46c8eb5c7af63bcef14962697a6120636861726c6573', + '29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c64d494e', + '5d16cc1a177b5d9ba9cfa9793b07e60f1fb70fea1f8aef064415d114494147', + 'ac597ca62a32cab3f4766c8f9cd577e50ebb1d00383ec7fa3990b016435241574a55', + 'd46dab32bd4b93aeae082358db2e094b5126b5541a40b3247cb8047a70616f70616f636f696e', + 'f6099832f9563e4cf59602b3351c3c5a8a7dda2d44575ef69b82cf8d', + '747f2d0d0a0e94aa6707e755003f5c9c60735ec90d17c6e18ee673ec426c69622054686520436174', + 'd628f6331d3536ff383b15de222bbf0792dacc0c9636aceda415de5942554d50434f494e', + 'a2944573e99d2ed3055b808eaa264f0bf119e01fc6b18863067c63e44d454c44', + 'a1ac8851f1585f2c45ac235cf6ab4ab08840a3055c2c0fc5d3bef0e34e5542', + '50abdba01a576f770690f1f0a7fc0e89d2cce9594a4bdea9e6b2ea604d4944444159', + '1511e8ab90b7bb4b4276b7aef8c959859f20a6fbf3e702e3be4367df64616c65', + '1d7f33bd23d85e1a25d87d86fac4f199c3197a2f7afeb662a0f34e1e776f726c646d6f62696c65746f6b656e', + 'e68d622005e8ba7bb8f58c7fcca891b3435be010e28d35f785590af3414441434152464945', + '2d9db8a89f074aa045eab177f23a3395f62ced8b53499a9e4ad46c80464c4f57', + '4fccd83d72d9096fb3b31e3341b9126f928b5e2fd67f8fd3f77a11284352554d42532043415420', + 'cee88309f7dc1a9363214071b6b0d70f1e9ba8a2ea965a1ec8604739474f4e203d09', + '533bb94a8850ee3ccbe483106489399112b74c905342cb1792a797a0494e4459', + 'da8c30857834c6ae7203935b89278c532b3995245295456f993e1d244c51', + 'bf4fc17abdd633c6691a8e9c44c954ccd10548f43258e105c268330643524f5744616e6f', + 'e312dc2a03928a20ccb56e0018221f906a9de6350bfc031e95365c2b434e54204e49474854', + '97bbb7db0baef89caefce61b8107ac74c7a7340166b39d906f174bec54616c6f73', + 'a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235484f534b59', + '560f27609545f8e46e9e3afda8f9f56ae0323881e2f1c0052a773ce3424f5a4f', + 'b9d24e5122d1969b052d165f0e3f3a320ee36bd306cabdbb5270e481474c415a4544', + '2ca973c0c6691d30c021c95c5076dd7d1b5a0d5fccc28925d6f09157536e656b54415244', + '6d06570ddd778ec7c0cca09d381eca194e90c8cffa7582879735dbde584552', + 'd11bdaa428a174f9316c02b8977a61767bd0f571d88e98159608138e52414441636f6f6e', + '54203f2b392256aea6caf2a0a58030cb43308a8fc08e0a77528a7a1842555244', + '62f42615c7c7d0fff552f329299fcc76179224bbfe6870756eff75ad4c495a415244', + 'b7ad841a400b6bf7999415c2f58e68deea6950b87a2fba0ff88da832205245444143544544', + 'f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b6988069455448', + 'd885ce163574495e49da8171cea68bc020f213b800a036dbf4f2ebce424f444849', + 'f98315fb9e9e6887c8ad90505ddea0cd42cd817cdb15fb3180e68fe348415747', + '10a49b996e2402269af553a8a96fb8eb90d79e9eca79e2b4223057b64745524f', + '3fd8a94cbd9f2a98dadec7c50c22b4f427b7e6e773ccbb8dba69204653796e61707365', + '78b399b33aea1bde8bcf386ad6e600dbd458a57104e3901e583519dc4c6f636f576966436f636f', + '555f2d0238237e38d6472305e1304841ceef7c84f68e5dcae6cf2847584c414253', + '016be5325fd988fea98ad422fcfd53e5352cacfced5c106a932a35a442544e', + '29ec4b4ad57b6bbd6bd3cc723435548422699048f81747784fdf724c424f444849', + 'b074123fefaf21b77a4c202f744df0e95c2e799b5de7b58e9507c256436861726c657320576f7274', + '53bb4d9424597efe25252110dac97eee0acf39b791acaeb3e2dc0e02517561636b537461636b', + '741083703502fe8ceaa384d692c924efb36d20da01f890c3416e712144494c4620436861726c6573', + '83ad0568e81e9d48d723560c6a3ef104c19bbbd303033b240c14f1eb4d69644b6e69676874', + 'f3fc8638cb9b0016c979cb5543d74264e798b59dce5a66e2c49b008847494741534e454b', + '1db0f9092d9aa1263349d7212ecefd1ea6cc21920cc8cd6d640a57454341505953', + '60faa64709fede8dffed0dccb69da337a5bf61eda0c773156ea78b4d534b59', + '82a6c3472e6e6b66fa548788ea50fb55a481425577428c59598b90f9536e656b20496e7465726e', + '5deab590a137066fef0e56f06ef1b830f21bc5d544661ba570bdd2ae424f44454741', + '8f6d4355962d809668cc1f1ebd63b22e8814e4a5ad659123f8cbb5c7736e6f7274', + '6a0f6c32b77596240ff8bc78e1c334fa9bd2131750f47f3afb36b1b24d4f4749', + '5c1c91a65bedac56f245b8184b5820ced3d2f1540e521dc1060fa6834a454c4c59', + 'ce308736daedff701a6cb9f1645a2d6c26715514d38e6f982f2c3fe44b75726f', + '78960c8a196991a60ce060fb0535f250d9aefa8ced5f506f94051f1c424f444849', + '51a5e236c4de3af2b8020442e2a26f454fda3b04cb621c1294a0ef34424f4f4b', + '94ba1270a9348f84bfa0cf867fbeb9b5ea230b1e10ce8fea4795a6b0534e4f5254', + 'b6a7467ea1deb012808ef4e87b5ff371e85f7142d7b356a40d9b42a0436f726e75636f70696173205b76696120436861696e506f72742e696f5d', + '2c840907ec9a9c4d89aec720345a68bb43ec7e20d5c19b32ba03d2dc46656574204f6e2043617264616e6f', + '28c71667a880e20e734b1024a5aa95f907f47f6a94c4e130172f3b7d484f50454c45535320436f696e', + '15963355dbabb3ec59b0c50b9a1f1610d25f39ccbc49e910b5bbd55843617264616e6f204e65787573', + 'b04a0975b27a273dd005b61870ef92eb4ae0cf7e508e12d4ea50f3ab424c4f4f42', + 'cb333aee18e0152fe3d1f4d3a820628fa516330293f9dba1dec98ed0504f4b4552', + '2ecb6c5b8582a6a32e840820c6a2d73d4b1211c5fb49f77392dcffdb5065616e757420427574746572204242', + '86abe45be4d8fb2e8f28e8047d17d0ba5592f2a6c8c452fc88c2c14358524159', + '56b8657479ba5eaaaa230a930fed717e81e2c50a1c977c369fd84a79447261676779', + 'b962d9c5affa6b5fb407beb2106daffef5abf7be75b8650f0aa3ffe14341505953', + '15f221ab7d7b3d6642ad07b73cfddc5a97dc14cbf53f88bea039fb9d426573744f707473416e616c797a65', + 'a44426f37c6a710f050f2e58d20c21f435ce87476332118fc1a7fefc44554d42', + '0b8e88ea059d4cc2e341e5ed4445ba65f3549405d6071f6ac5c2cefb466f7373696c', + '4610feb2f2ef828835e4e697642c37636079f5dac6d34afaac4b76b242415345442043484144', + 'fbecd8b54a5818300f575a70de6effd5b85914bb659eec45d9fa4151476f62626c654761746f72', + '0acdac5092baad7e2a3839e43fd7394ed2496ef9f96d962620701f374b454e53', + '9767d41f29df3617b436589acf6fec7a819d017cd4ea932f8950c49f4a61636b', + '2adf188218a66847024664f4f63939577627a56c090f679fe366c5ee535441424c45', + '20db074d491a67610e8cef9a50254273a59616373eb27a14c8d10fdb57554c46', + 'df602a753927d8fb8268a851d95ba06ab3dd6c7a10aec48c8d98d34650494d50', + '3d91bc93c53860b68ae4b7b7ed4393ba1d86346226200926588c15be535055444459', + 'a828473e3a338fcbdaa209ad676a06a76540ea48f604fa97f26cd5525472656e63685175657374', + 'b563f83cb576ecc008b559788cbe1ef3a1f66b4926af1d313d34d5944e49474854', + '72871e4fb554dc32dd5727c4f071e39a98a907726210e6e6f8aa2dff4772616e64706120424f4249', + 'd46bc171c72c066e35272b34942786230a64033ed62e4b18df4598164d6167696320496e7465726e65742024', + '6ac8ef33b510ec004fe11585f7c5a9f0c07f0c23428ab4f29c1d7d104d454c44', + '688bb6fd876852fd07525fd45d98edec7225192968238865c8363206437261776a752053697374657220', + '805010a66f0494fd0f63ddc5ac7c425b581cf5bb0caedf1e4efd3a5e4348494c44434154', + '52fe05e219233d648c15672050513ea55f87445d63e9bd39bdd6625b4d72204c6f7665', + 'b7872895e9ffb64c5ea34f163ae65e706f478da4ffd744ea0555605a536f6c697461727920536f636b', + '4aecd52cd87b4cd8897df4341aef509ae2028dc41a9bf40f47eca97b5550544f424552', + '63fa34b8a71996b3736bb2a0d5de4aad81722f6fa06536540b34c6124e41444f', + 'c863ceaa796d5429b526c336ab45016abd636859f331758e67204e5c4353574150', + 'd3a715c02f058cb89761a7b6603d469f2d94593a31e0a072a94c9dda574f4f464945', + '23bc285196ff78be8484c96944450f8ca92cf0ce684dd5425202cf02534e454b434f5720424f59', + 'cbec037e3207d2ef88b44a072c86ce4a612523abca09f5ec0521b8344d6964204e6f69676874', + 'fc7b6e61bf3f1c7efdff436650e5b355f6659c03e2ee3ca279ddcb0a48414e4b', + '4a163687eaf9dcd06e5200e0a31ef4798b71a2b60460087dd3c261844741544f522047524f5550', + '84aa7e04a022b2ecf4778c9a949ea9853071dc8a912ed656a56f71b54341505953', + '1e76aaec4869308ef5b61e81ebf229f2e70f75a50223defa087f807b436c61726974792044414f20546f6b656e', + '3d931c26320700f433e8c1a47177c5898fdab5326a28a80217234aed504f5354', + '4190b2941d9be04acc69c39739bd5acc66d60ccab480d8e20bc87e3763425443', + 'b32d462d18b39a75bb7d45caeceeceed4989884dd08dc66f220acd5f534c4f50', + '52162581184a457fad70470161179c5766f00237d4b67e0f1df1b4e65452544c', + '7fd20b10fd001edd109077e664ae0e71f32febe31a4ce72096a0d2c546534f4349455459', + '285b65ae63d4fad36321384ec61edfd5187b8194fff89b5abe9876da414e47454c53', + 'e9f04234b450c10e1cd031b41af2f9f2d944b9d82ffe143da7bb55a34d454d452764', + '5497312c9ce9799cdfe756a0156b407566150189c8a25d6ef75ff4714572696320486f736b696e736f6e', + '8fef2d34078659493ce161a6c7fba4b56afefa8535296a5743f6958741414441', + 'e9f2dce3997bd47b9366ae4bf0e7a1f4b4acb6553aae8e84a642bcc14f72636158', + 'caff93803e51c7b97bf79146790bfa3feb0d0b856ef16113b391b9975649504552', + 'e52964af4fffdb54504859875b1827b60ba679074996156461143dc14f5054494d', + 'b2b3988503348c1ddaeda90846f9678c6eac8ae44a9d178d516600e74d414e', + 'a8450a0409185929c966c0caf2d8b336c1b6c6ee95878ad2e88472865a6f6f6679', + '92776616f1f32c65a173392e4410a3d8c39dcf6ef768c73af164779c4d79555344', + '8417bd9f2ea53bd4234175e440c950f9d70a553a0bc62fe4ba6550424e49474854', + '577f0b1342f8f8f4aed3388b80a8535812950c7a892495c0ecdf0f1e0014df10464c4454', + '6e984240875918e0aac878e3b1ffe55091f07215232b81083f3817e647656e676172', + '766fce8055f39d40fcfc19721677b3deb2e7846950ae08dce757f1e753554741522042555348', + '2b29c6136b72d669b7c9b23961a6b471c3cd1368cbb168ab57361351556e6972656b74', + 'c6df41b141c02c0e8d816787f2e19b0ab8d1b27b1c6df178d18af52b426f6f6b206f6620576f7274', + '0e3b458314b43729b8ad07fb1879729e5c76cd76b28fce24c528f830504150', + '0e4d4d0a0f1519d283110b2bc8d08f6eb6027bd59c68bcbedff567364845444745', + '1d003d1bb448a8477ff83faf20875fd8259a82b6917875b607dfdd294e4f4144', + '2af046ec36587527c972a5e346b81e952b4fbaf2a8a9904bd8548a1c35354951', + 'd90a5fd7444d9140b7e4e46070904026e667e88711ece086dbe8269c4c4f4f5054', + '8e7df34f6b6db246f305eb1b67b0092f1ba8ea80af86afff60fe3aed677265656e7769636b', + '09f2d4e4a5c3662f4c1e6a7d9600e9605279dbdcedb22d4507cb6e75535046', + '7507734918533b3b896241b4704f3d4ce805256b01da6fcede43043642616279534e454b', + '2852268cf6e2db42e20f2fd3125f541e5d6c5a3d70b4dda17c2daa82', + '9d1477fedbac0a0d371a2f27bb6dfeb74afe87aa2396583c0b5da1a0424c554e54', + '117cd6befe8442fc9ea0ff7587476d72e5586f5fb92684cd3a9a5bae5448414c4552', + '4e98a288b7e15aff2c71260508190c45e8deded02a7533aa4d3125b64c6f616620436174', + '36b2d37740f1ef69c5a041cfe3c8e6b99ec200dcc018264ec842878f43415420494e20484154', + '2d51b5064ede9800413c8b50f6e639d7fe0168228387cd77004627bd4d554c4c4554206f6e2041444120', + 'f43a62fdc3965df486de8a0d32fe800963589c41b38946602a0dc53541474958', + 'f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b6988069534f4c', + '38ad9dc3aec6a2f38e220142b9aa6ade63ebe71f65e7cc2b7d8a8535434c4159', + 'ac015c38917f306a84748c2d646bed90bdd64421c592163e60702d735453555255', + 'ececc92aeaaac1f5b665f567b01baec8bc2771804b4c21716a87a4e353504c415348', + '95a427e384527065f2f8946f5e86320d0117839a5e98ea2c0b55fb0048554e54', + '148c684d2c140f3870795d271d128ec5fe02e50f75f6f21a3fd5e0ba594f44454c', + 'c8c711a3df70956c397cb92e1705b675b18652723cfb7f72ccd59f2d434841524c4553', + '9ee598e5146f55feaacdaacf947f39867a7547c5d56e25395774c7284e41444f', + '25c5de5f5b286073c593edfd77b48abc7a48e5a4f3d4cd9d428ff935444f47', + '77996c8838d2561b42a3d304b745a6a97d1f9e9e18fe375a6cc550aa56455244414e54', + 'c5d0bcf143f3c5db1af401843fe44dd92542ad5795ae0aa08e78f72d46616e6e7920626167', + 'f71b4cf652d8edb33a57928b8b8a546a3c954b7ba24db5583ac79b34534f4e474d41524b4554434150', + '7ba582f9c1970bc13d648e25013bd04e8869df8f945f5758ea7a4cd949474e495445', + '0ddfe14b081396e132c30ad2dda2dfc0222a84fc178b6a82bd50aa224b61666b61', + 'b7c5cd554f3e83c8aa0900a0c9053284a5348244d23d0406c28eaf4d50414c4d0a', + '1897c6078c5e8cf339e0c3a54cdbc6e3ef97de8b3cbf8ac24b2f608e42616279574f5254', + 'c6e6bd2fd8d96c660435595857110e1c7b085cc572334d688106d4834d494e49434841524c4553', + '27fa5cc3d1c2ed825f799ee41c04621d8b6703d86e66390748e7b2484255445a', + 'eaadb531e3c04f43eb1195e2084189fa518fd66b86f4a1436e626bf54d494e49434841524c4553', + 'a6782985acc48ab5780f06a9ab2df0967081640e9df196e8e2282f7c51554545464552', + '9abf0afd2f236a19f2842d502d0450cbcd9c79f123a9708f96fd9b96454e4353', + '964c0bf63a9b2c9fc62ee7ae44129ce55ec91f74b758ec6f73ba32f14e415341206f6e2043617264616e6f', + 'e3abd6055535133dfe8b4a33ab378b3d1de1a1975ab6aca1e7dc89ec4d54414c4f53', + 'b8a945419f00909ffec395e018a8ea7330586c650ba505960b370328416e64726577486f736b696e62657267', + 'ce799fd5cb502e3f838c8b89635350e05d26f59d7656513a3b70922742455247', + '277dfc616ab90a378ff572ddd1c9afda6abe6e6679cffdaf04a80a7d43595048455250554e4b', + 'a3931691f5c4e65d01c429e473d0dd24c51afdb6daf88e632a6c1e516f7263666178746f6b656e', + 'a967738feca0f92afa0f781f2db4ec318ee6f06cb515fecf988fabfb0014df105355504552494f52', + '804f5544c1962a40546827cab750a88404dc7108c0f588b72964754f56594649', + '9dc9663cc0a768ba72477b08785429f1feb19cdea5a499373db863e346726f6720414441', + 'ce5b9e0f8a88255b65f2e4d065c6e716e9fa9a8a86dfb86423dd1ac044494e47', + '75fcc276057db5fc48eae0e11453c773c8a54604c3086bf9d95ac1b743485259', + 'f7ec61b6c39109436f7a29cb61ad010d699022807f45ada367953cda54696d6d7920', + '94cbb4fcbcaa2975779f273b263eb3b5f24a9951e446d6dc4c13586452455655', + '6b5829c1f34f664613a77882253617f006a33904237c189112b07cee42414c4c59', + 'b970683a6e27a323285ebc97ad2b710d884593ebabab2a1edc4fc44a4c49205a415244', + 'ac9a166ce277edc13c095148d1483eee70feae59faedbd33dd5b68a84d45434841574f5254', + '5d9d3e29ada3edff54196ad1263dc65c4684ad196550813c79631be5574f5254', + '7ac1fbdc23238eb2c451d9e5a15bd666f741f8fd951dd54de454bcaf544541', + 'ab01a95c4a96ceae4e4683cbc9be9f655058c8e9670e1c315fdc9fe0424142592052414d49', + 'd9e3a45a4f5b8d4fce0cdfc93bc43f6aadb09425fc3588b14302f0cd4261627920436f636b', + '0d5db57c8785e51339d4ad064a917341cd77b39531373a6fee5dcc1c4241425920435241574a55', + '89c41cc4183a335ce9b741672c3b79e16edf65ff16d9766560ebaacb466f6d6f446f6e6b6579', + '50e9f130e1adcd74d276b0b13f6ee43b10636bd22a9b6c894870660c5374616b65536f6e', + '43b07d4037f0d75ee10f9863097463fc02ff3c0b8b705ae61d9c75bf4d796e746820546f6b656e', + '4ef5b24b703417ea70108662833a0d1e077ccbd32407aba95482749f4275636b6574', + 'fc11a9ef431f81b837736be5f53e4da29b9469c983d07f321262ce614652454e', + '590f6d119b214cdcf7ef7751f8b7f1de615ff8f6de097a5ce62b257b534841524c', + 'edfd7a1d77bcb8b884c474bdc92a16002d1fb720e454fa6e993444794e5458', + '47141777c7f93d1d4546b97bb37372c0d3dc7ad205a3b4234e6534674a45455453', + 'd8188aea8336d393aae9414e22278027951fc70e1a52963bf592dee854726f77', + '28d18e3b4e3c368d1527006c4e57d3647d7c0286d09c398a5321e563574f5254454c4c41', + '8fe8039d057c71fdfb1095e260f153f18a5834d85d9c868ddf7307bc0014df10414e47454c53', + '32e2e9543d3f007715b3738ae20519b7b7678a1bf49e1d35bd820ecf5468616e6b596f7543617264616e6f', + '7cae7edd947f038cc0669bf214a04c728ef11749a32260b5471dde874259534d', + '2eaf033edb24e05eea0a56426ebed40e8e6783608dd389fe963a6f535041424c4f', + ], + + policyIds: [ + 'e992ef75f2367e6ecd93716ae88eba0d005dd91fd3a21f650b6496b5', + '279c909f348e533da5808898f87f9a14bb2c3dfbbacccd631d927a3f', + 'f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880', + 'e5a42a1a1d3d1da71b0449663c32798725888d2eb0843c4dabeca05a', + 'f13ac4d66b3ee19a6aa0f2a22298737bd907cc95121662fc971b5275', + 'fe7c786ab321f41c654ef6c1af7b3250a613c24e4213e0425a7ae456', + '065c6b58d68f369bd951ad77a46f9d65f2f5ce259ef30853be11472b', + 'c48cbb3d5e57ed56e276bc45f99ab39abe94e6cd7ac39fb402da47ad', + 'b3910d96ba88d2183fe33c67e69a48a25c9cce054eb7b95bb49dcb34', + 'b51ef6711febe15df7333a2ae0793291c9446dea6d33b3f12e6909e7', + 'b17c35b39e0a5a5765d4453919bb18d000aae00f12552dc8c6fc4c51', + '8db269c3ec630e06ae29f74bc39edd1f87c819f1056206e879a1cd61', + 'fdb44a54319fe4b35ada04bef740114aad764e46c8eb5c7af63bcef1', + '29d222ce763455e3d7a09a665ce554f00ac89d2e99a1a83d267170c6', + '5d16cc1a177b5d9ba9cfa9793b07e60f1fb70fea1f8aef064415d114', + 'ac597ca62a32cab3f4766c8f9cd577e50ebb1d00383ec7fa3990b016', + 'd46dab32bd4b93aeae082358db2e094b5126b5541a40b3247cb8047a', + 'f6099832f9563e4cf59602b3351c3c5a8a7dda2d44575ef69b82cf8d', + '747f2d0d0a0e94aa6707e755003f5c9c60735ec90d17c6e18ee673ec', + 'd628f6331d3536ff383b15de222bbf0792dacc0c9636aceda415de59', + 'a2944573e99d2ed3055b808eaa264f0bf119e01fc6b18863067c63e4', + 'a1ac8851f1585f2c45ac235cf6ab4ab08840a3055c2c0fc5d3bef0e3', + '50abdba01a576f770690f1f0a7fc0e89d2cce9594a4bdea9e6b2ea60', + '1511e8ab90b7bb4b4276b7aef8c959859f20a6fbf3e702e3be4367df', + '1d7f33bd23d85e1a25d87d86fac4f199c3197a2f7afeb662a0f34e1e', + 'e68d622005e8ba7bb8f58c7fcca891b3435be010e28d35f785590af3', + '2d9db8a89f074aa045eab177f23a3395f62ced8b53499a9e4ad46c80', + '4fccd83d72d9096fb3b31e3341b9126f928b5e2fd67f8fd3f77a1128', + 'cee88309f7dc1a9363214071b6b0d70f1e9ba8a2ea965a1ec8604739', + '533bb94a8850ee3ccbe483106489399112b74c905342cb1792a797a0', + 'da8c30857834c6ae7203935b89278c532b3995245295456f993e1d24', + 'bf4fc17abdd633c6691a8e9c44c954ccd10548f43258e105c2683306', + 'e312dc2a03928a20ccb56e0018221f906a9de6350bfc031e95365c2b', + '97bbb7db0baef89caefce61b8107ac74c7a7340166b39d906f174bec', + 'a0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235', + '560f27609545f8e46e9e3afda8f9f56ae0323881e2f1c0052a773ce3', + 'b9d24e5122d1969b052d165f0e3f3a320ee36bd306cabdbb5270e481', + '2ca973c0c6691d30c021c95c5076dd7d1b5a0d5fccc28925d6f09157', + '6d06570ddd778ec7c0cca09d381eca194e90c8cffa7582879735dbde', + 'd11bdaa428a174f9316c02b8977a61767bd0f571d88e98159608138e', + '54203f2b392256aea6caf2a0a58030cb43308a8fc08e0a77528a7a18', + '62f42615c7c7d0fff552f329299fcc76179224bbfe6870756eff75ad', + 'b7ad841a400b6bf7999415c2f58e68deea6950b87a2fba0ff88da832', + 'f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880', + 'd885ce163574495e49da8171cea68bc020f213b800a036dbf4f2ebce', + 'f98315fb9e9e6887c8ad90505ddea0cd42cd817cdb15fb3180e68fe3', + '10a49b996e2402269af553a8a96fb8eb90d79e9eca79e2b4223057b6', + '3fd8a94cbd9f2a98dadec7c50c22b4f427b7e6e773ccbb8dba692046', + '78b399b33aea1bde8bcf386ad6e600dbd458a57104e3901e583519dc', + '555f2d0238237e38d6472305e1304841ceef7c84f68e5dcae6cf2847', + '016be5325fd988fea98ad422fcfd53e5352cacfced5c106a932a35a4', + '29ec4b4ad57b6bbd6bd3cc723435548422699048f81747784fdf724c', + 'b074123fefaf21b77a4c202f744df0e95c2e799b5de7b58e9507c256', + '53bb4d9424597efe25252110dac97eee0acf39b791acaeb3e2dc0e02', + '741083703502fe8ceaa384d692c924efb36d20da01f890c3416e7121', + '83ad0568e81e9d48d723560c6a3ef104c19bbbd303033b240c14f1eb', + 'f3fc8638cb9b0016c979cb5543d74264e798b59dce5a66e2c49b0088', + '1db0f9092d9aa1263349d7212ecefd1ea6cc21920cc8cd6d640a5745', + '60faa64709fede8dffed0dccb69da337a5bf61eda0c773156ea78b4d', + '82a6c3472e6e6b66fa548788ea50fb55a481425577428c59598b90f9', + '5deab590a137066fef0e56f06ef1b830f21bc5d544661ba570bdd2ae', + '8f6d4355962d809668cc1f1ebd63b22e8814e4a5ad659123f8cbb5c7', + '6a0f6c32b77596240ff8bc78e1c334fa9bd2131750f47f3afb36b1b2', + '5c1c91a65bedac56f245b8184b5820ced3d2f1540e521dc1060fa683', + 'ce308736daedff701a6cb9f1645a2d6c26715514d38e6f982f2c3fe4', + '78960c8a196991a60ce060fb0535f250d9aefa8ced5f506f94051f1c', + '51a5e236c4de3af2b8020442e2a26f454fda3b04cb621c1294a0ef34', + '94ba1270a9348f84bfa0cf867fbeb9b5ea230b1e10ce8fea4795a6b0', + 'b6a7467ea1deb012808ef4e87b5ff371e85f7142d7b356a40d9b42a0', + '2c840907ec9a9c4d89aec720345a68bb43ec7e20d5c19b32ba03d2dc', + '28c71667a880e20e734b1024a5aa95f907f47f6a94c4e130172f3b7d', + '15963355dbabb3ec59b0c50b9a1f1610d25f39ccbc49e910b5bbd558', + 'b04a0975b27a273dd005b61870ef92eb4ae0cf7e508e12d4ea50f3ab', + 'cb333aee18e0152fe3d1f4d3a820628fa516330293f9dba1dec98ed0', + '2ecb6c5b8582a6a32e840820c6a2d73d4b1211c5fb49f77392dcffdb', + '86abe45be4d8fb2e8f28e8047d17d0ba5592f2a6c8c452fc88c2c143', + '56b8657479ba5eaaaa230a930fed717e81e2c50a1c977c369fd84a79', + 'b962d9c5affa6b5fb407beb2106daffef5abf7be75b8650f0aa3ffe1', + '15f221ab7d7b3d6642ad07b73cfddc5a97dc14cbf53f88bea039fb9d', + 'a44426f37c6a710f050f2e58d20c21f435ce87476332118fc1a7fefc', + '0b8e88ea059d4cc2e341e5ed4445ba65f3549405d6071f6ac5c2cefb', + '4610feb2f2ef828835e4e697642c37636079f5dac6d34afaac4b76b2', + 'fbecd8b54a5818300f575a70de6effd5b85914bb659eec45d9fa4151', + '0acdac5092baad7e2a3839e43fd7394ed2496ef9f96d962620701f37', + '9767d41f29df3617b436589acf6fec7a819d017cd4ea932f8950c49f', + '2adf188218a66847024664f4f63939577627a56c090f679fe366c5ee', + '20db074d491a67610e8cef9a50254273a59616373eb27a14c8d10fdb', + 'df602a753927d8fb8268a851d95ba06ab3dd6c7a10aec48c8d98d346', + '3d91bc93c53860b68ae4b7b7ed4393ba1d86346226200926588c15be', + 'a828473e3a338fcbdaa209ad676a06a76540ea48f604fa97f26cd552', + 'b563f83cb576ecc008b559788cbe1ef3a1f66b4926af1d313d34d594', + '72871e4fb554dc32dd5727c4f071e39a98a907726210e6e6f8aa2dff', + 'd46bc171c72c066e35272b34942786230a64033ed62e4b18df459816', + '6ac8ef33b510ec004fe11585f7c5a9f0c07f0c23428ab4f29c1d7d10', + '688bb6fd876852fd07525fd45d98edec7225192968238865c8363206', + '805010a66f0494fd0f63ddc5ac7c425b581cf5bb0caedf1e4efd3a5e', + '52fe05e219233d648c15672050513ea55f87445d63e9bd39bdd6625b', + 'b7872895e9ffb64c5ea34f163ae65e706f478da4ffd744ea0555605a', + '4aecd52cd87b4cd8897df4341aef509ae2028dc41a9bf40f47eca97b', + '63fa34b8a71996b3736bb2a0d5de4aad81722f6fa06536540b34c612', + 'c863ceaa796d5429b526c336ab45016abd636859f331758e67204e5c', + 'd3a715c02f058cb89761a7b6603d469f2d94593a31e0a072a94c9dda', + '23bc285196ff78be8484c96944450f8ca92cf0ce684dd5425202cf02', + 'cbec037e3207d2ef88b44a072c86ce4a612523abca09f5ec0521b834', + 'fc7b6e61bf3f1c7efdff436650e5b355f6659c03e2ee3ca279ddcb0a', + '4a163687eaf9dcd06e5200e0a31ef4798b71a2b60460087dd3c26184', + '84aa7e04a022b2ecf4778c9a949ea9853071dc8a912ed656a56f71b5', + '1e76aaec4869308ef5b61e81ebf229f2e70f75a50223defa087f807b', + '3d931c26320700f433e8c1a47177c5898fdab5326a28a80217234aed', + '4190b2941d9be04acc69c39739bd5acc66d60ccab480d8e20bc87e37', + 'b32d462d18b39a75bb7d45caeceeceed4989884dd08dc66f220acd5f', + '52162581184a457fad70470161179c5766f00237d4b67e0f1df1b4e6', + '7fd20b10fd001edd109077e664ae0e71f32febe31a4ce72096a0d2c5', + '285b65ae63d4fad36321384ec61edfd5187b8194fff89b5abe9876da', + 'e9f04234b450c10e1cd031b41af2f9f2d944b9d82ffe143da7bb55a3', + '5497312c9ce9799cdfe756a0156b407566150189c8a25d6ef75ff471', + '8fef2d34078659493ce161a6c7fba4b56afefa8535296a5743f69587', + 'e9f2dce3997bd47b9366ae4bf0e7a1f4b4acb6553aae8e84a642bcc1', + 'caff93803e51c7b97bf79146790bfa3feb0d0b856ef16113b391b997', + 'e52964af4fffdb54504859875b1827b60ba679074996156461143dc1', + 'b2b3988503348c1ddaeda90846f9678c6eac8ae44a9d178d516600e7', + 'a8450a0409185929c966c0caf2d8b336c1b6c6ee95878ad2e8847286', + '92776616f1f32c65a173392e4410a3d8c39dcf6ef768c73af164779c', + '8417bd9f2ea53bd4234175e440c950f9d70a553a0bc62fe4ba655042', + '577f0b1342f8f8f4aed3388b80a8535812950c7a892495c0ecdf0f1e', + '6e984240875918e0aac878e3b1ffe55091f07215232b81083f3817e6', + '766fce8055f39d40fcfc19721677b3deb2e7846950ae08dce757f1e7', + '2b29c6136b72d669b7c9b23961a6b471c3cd1368cbb168ab57361351', + 'c6df41b141c02c0e8d816787f2e19b0ab8d1b27b1c6df178d18af52b', + '0e3b458314b43729b8ad07fb1879729e5c76cd76b28fce24c528f830', + '0e4d4d0a0f1519d283110b2bc8d08f6eb6027bd59c68bcbedff56736', + '1d003d1bb448a8477ff83faf20875fd8259a82b6917875b607dfdd29', + '2af046ec36587527c972a5e346b81e952b4fbaf2a8a9904bd8548a1c', + 'd90a5fd7444d9140b7e4e46070904026e667e88711ece086dbe8269c', + '8e7df34f6b6db246f305eb1b67b0092f1ba8ea80af86afff60fe3aed', + '09f2d4e4a5c3662f4c1e6a7d9600e9605279dbdcedb22d4507cb6e75', + '7507734918533b3b896241b4704f3d4ce805256b01da6fcede430436', + '2852268cf6e2db42e20f2fd3125f541e5d6c5a3d70b4dda17c2daa82', + '9d1477fedbac0a0d371a2f27bb6dfeb74afe87aa2396583c0b5da1a0', + '117cd6befe8442fc9ea0ff7587476d72e5586f5fb92684cd3a9a5bae', + '4e98a288b7e15aff2c71260508190c45e8deded02a7533aa4d3125b6', + '36b2d37740f1ef69c5a041cfe3c8e6b99ec200dcc018264ec842878f', + '2d51b5064ede9800413c8b50f6e639d7fe0168228387cd77004627bd', + 'f43a62fdc3965df486de8a0d32fe800963589c41b38946602a0dc535', + 'f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880', + '38ad9dc3aec6a2f38e220142b9aa6ade63ebe71f65e7cc2b7d8a8535', + 'ac015c38917f306a84748c2d646bed90bdd64421c592163e60702d73', + 'ececc92aeaaac1f5b665f567b01baec8bc2771804b4c21716a87a4e3', + '95a427e384527065f2f8946f5e86320d0117839a5e98ea2c0b55fb00', + '148c684d2c140f3870795d271d128ec5fe02e50f75f6f21a3fd5e0ba', + 'c8c711a3df70956c397cb92e1705b675b18652723cfb7f72ccd59f2d', + '9ee598e5146f55feaacdaacf947f39867a7547c5d56e25395774c728', + '25c5de5f5b286073c593edfd77b48abc7a48e5a4f3d4cd9d428ff935', + '77996c8838d2561b42a3d304b745a6a97d1f9e9e18fe375a6cc550aa', + 'c5d0bcf143f3c5db1af401843fe44dd92542ad5795ae0aa08e78f72d', + 'f71b4cf652d8edb33a57928b8b8a546a3c954b7ba24db5583ac79b34', + '7ba582f9c1970bc13d648e25013bd04e8869df8f945f5758ea7a4cd9', + '0ddfe14b081396e132c30ad2dda2dfc0222a84fc178b6a82bd50aa22', + 'b7c5cd554f3e83c8aa0900a0c9053284a5348244d23d0406c28eaf4d', + '1897c6078c5e8cf339e0c3a54cdbc6e3ef97de8b3cbf8ac24b2f608e', + 'c6e6bd2fd8d96c660435595857110e1c7b085cc572334d688106d483', + '27fa5cc3d1c2ed825f799ee41c04621d8b6703d86e66390748e7b248', + 'eaadb531e3c04f43eb1195e2084189fa518fd66b86f4a1436e626bf5', + 'a6782985acc48ab5780f06a9ab2df0967081640e9df196e8e2282f7c', + '9abf0afd2f236a19f2842d502d0450cbcd9c79f123a9708f96fd9b96', + '964c0bf63a9b2c9fc62ee7ae44129ce55ec91f74b758ec6f73ba32f1', + 'e3abd6055535133dfe8b4a33ab378b3d1de1a1975ab6aca1e7dc89ec', + 'b8a945419f00909ffec395e018a8ea7330586c650ba505960b370328', + 'ce799fd5cb502e3f838c8b89635350e05d26f59d7656513a3b709227', + '277dfc616ab90a378ff572ddd1c9afda6abe6e6679cffdaf04a80a7d', + 'a3931691f5c4e65d01c429e473d0dd24c51afdb6daf88e632a6c1e51', + 'a967738feca0f92afa0f781f2db4ec318ee6f06cb515fecf988fabfb', + '804f5544c1962a40546827cab750a88404dc7108c0f588b72964754f', + '9dc9663cc0a768ba72477b08785429f1feb19cdea5a499373db863e3', + 'ce5b9e0f8a88255b65f2e4d065c6e716e9fa9a8a86dfb86423dd1ac0', + '75fcc276057db5fc48eae0e11453c773c8a54604c3086bf9d95ac1b7', + 'f7ec61b6c39109436f7a29cb61ad010d699022807f45ada367953cda', + '94cbb4fcbcaa2975779f273b263eb3b5f24a9951e446d6dc4c135864', + '6b5829c1f34f664613a77882253617f006a33904237c189112b07cee', + 'b970683a6e27a323285ebc97ad2b710d884593ebabab2a1edc4fc44a', + 'ac9a166ce277edc13c095148d1483eee70feae59faedbd33dd5b68a8', + '5d9d3e29ada3edff54196ad1263dc65c4684ad196550813c79631be5', + '7ac1fbdc23238eb2c451d9e5a15bd666f741f8fd951dd54de454bcaf', + 'ab01a95c4a96ceae4e4683cbc9be9f655058c8e9670e1c315fdc9fe0', + 'd9e3a45a4f5b8d4fce0cdfc93bc43f6aadb09425fc3588b14302f0cd', + '0d5db57c8785e51339d4ad064a917341cd77b39531373a6fee5dcc1c', + '89c41cc4183a335ce9b741672c3b79e16edf65ff16d9766560ebaacb', + '50e9f130e1adcd74d276b0b13f6ee43b10636bd22a9b6c894870660c', + '43b07d4037f0d75ee10f9863097463fc02ff3c0b8b705ae61d9c75bf', + '4ef5b24b703417ea70108662833a0d1e077ccbd32407aba95482749f', + 'fc11a9ef431f81b837736be5f53e4da29b9469c983d07f321262ce61', + '590f6d119b214cdcf7ef7751f8b7f1de615ff8f6de097a5ce62b257b', + 'edfd7a1d77bcb8b884c474bdc92a16002d1fb720e454fa6e99344479', + '47141777c7f93d1d4546b97bb37372c0d3dc7ad205a3b4234e653467', + 'd8188aea8336d393aae9414e22278027951fc70e1a52963bf592dee8', + '28d18e3b4e3c368d1527006c4e57d3647d7c0286d09c398a5321e563', + '8fe8039d057c71fdfb1095e260f153f18a5834d85d9c868ddf7307bc', + '32e2e9543d3f007715b3738ae20519b7b7678a1bf49e1d35bd820ecf', + '7cae7edd947f038cc0669bf214a04c728ef11749a32260b5471dde87', + '2eaf033edb24e05eea0a56426ebed40e8e6783608dd389fe963a6f53', + ], + + poolIds: [ + 'pool1tll7ysfwe8cmsh7g336fh2qxf4jsxap5ssmhzrs9jpksg2g86zt', + 'pool1sydxpvsdhkn3rnk7d923fkwxhn9nwwdwcgmuqyh2q5nyunl0mgd', + 'pool1rqgmaq82p2l3j2jknc2syky2xtgylevss39c7ffgpp5x56s5pt5', + 'pool1lakvp73yzpuueyrhzr3sfyy0796gm53g95kapgnmsvv4k6apr5r', + 'pool1u8f87frd3k6cy9lp4uk5faj53wfzh8smxjdpt8ua45f0x8s5v58', + 'pool1wm5pnu72efdcvjm34r7ykkxx2h549swddjrn6r2aqy3tvjc4l57', + 'pool1sysgx87cwxnqy0pqn8g97gdhd0dmre9rw3jvpn2k7apuwa7cgkn', + 'pool14hk8kx2c8ukxcq7z3tqdedly9599f9sfhy5lfd3mp98txkdeevk', + 'pool1spakm5z76m4jvu3zn43yyw7659gj3zv5vtkgsvswdwm8q56zj5z', + 'pool1njs7jzx60aht6ws459434lsx37gfmqahwr0uu4y00dd3wwnggym', + 'pool1mvtxupzcgdtslv2sw0l3f4zlhd3a69fue6gu0vhqz47w7j5zryx', + 'pool1mdzxt5rl2sgnehedgnl0jwk8vumsglequrap26qgg0uwg4cuq52', + 'pool135y07cyqvw5tk55y336jtm28rae5rsgrsr6e4cwrzlvqz305cng', + 'pool19qgfp80d2sv3p2azmygfq87g7va4s3ewd6aaulas6eqsyz4r2yl', + 'pool1jldq2rf7y2ukm2t8ds8d9upzgdgv07jhkckl0mvedwhxx5nkugt', + 'pool1659knc82juzdqycvvwz0uzjsj5scxwewguhuzae93ed36xanxmz', + 'pool1q0c5nnpfpyl8ks0fdm0h2p833yxj0gll237z362yluvs2nt65pp', + 'pool1hkumvckq9l79akgge54ugnxa4n86s63j6jvhmvx5g7cgz7nc6cs', + 'pool1wun8t7nt4daw2zgv0vj7cmwru97vsw0fccucjzuvs7y0qlc8xyv', + 'pool1jtaquxknypnngdfuufgvx47pfvkkggvvnlwyxr62gcws7gym7nc', + 'pool1w3q90q8cmfv5l0nxettd9pafpfhews2ta57e6xvr6s96swfkrvz', + 'pool1zm5nqvrdwmslk682d9qemd9fn8htg2rxlprxjuh0ae5l6sqzz3h', + 'pool1r76pjed6q8k9y8lngcedqhv52zqzc2gczwzqc93x6kwq73xprtr', + 'pool19yf67fkanhu30qqdcug4gwfy7gpzy8jhq56llg5ua3g3kufg3s5', + 'pool1xznpgmkfkf4f5wzks85z778v2s94vhmjxc60m8tphvypj6jp2w2', + 'pool1k3nkfa5ugavrpd9nwd3s6yyx454qxnquxwmux4rzfunl7q0z38t', + 'pool1lu2luhmkyayq9njh848kfknn6evwzmn3gzsxar7z3sttg7grxcm', + 'pool1hju4yeclny559p5wrnpgprhs3wqpne8zg8glmtfm4muwcyrxju5', + 'pool1av640ert5ktadalakrc5lkgrf988tu0t0j58d9hptd06u57qlms', + 'pool1kl2vuauwfc5k0avf874ym5tcm04ywa22frleszhujeccj4va3lt', + 'pool1qtscx3ge0rgmpffgqen5uup8r8tnav7a2veduweskqx7gf8gjec', + 'pool1f776th42gqa5ammpj738evvnlga5jk4ll0gr4uupkrqnqpjsfyt', + 'pool1xpeupsjcwntlt78ak74kk9ymfhn2pac000yu9dp42qlpz58f0un', + 'pool1fhrhklkcqy5mlygak5hszc3phplq7qq5a6wn30hjrv4e6ydrl9g', + 'pool1v8gvy6tjp8x8wg5h4jw20p9up04lxgw0l0lgery9mz4h7h9x25n', + 'pool197na7w0h8hjc8wdvwys7nsalhtpctefa3m23udeqxpfk6nzq8l9', + 'pool1j6xfryctrxm4aplw3vnrtgfsvqdr35exenxqse5kzxmfue7qqmr', + 'pool1q5q3rld4nll02w8sqhf9582jcf22t99yt27z0pqksvpnv4rdra9', + 'pool1y6gnk7t3n6rvpr67f68mehxgqs5x24n0esz9l5j7m4aqzn4e0qw', + 'pool1095d0cr8yp0selmnrst5hnuf8jcl6vlkxlr2j6kq4x6qs4yxuwt', + 'pool10vgnav004xgw03qkqfy6864zq53lzjkcf0syeu4g3uj8xaytlm8', + 'pool1z4f2vmmwckcm6c4fmhn3vmymhsg8gjukx5905g54hlhqs9kaht9', + 'pool1n9sygh53tantskvg6fadljx95tt6s57y5d9wuahcke0lgkguyeq', + 'pool1m4njkh73pdj90xxkgaz9dnh7gffweeupft8nfurlntg6cgqfmy8', + 'pool1ra2su7cvnmr83pu9nvvz4a9carsgc9egc3e5fuk7h9pycyp5ela', + 'pool1fza7ms33y7mnq63etrgz0caqhaw2tsxme0gp52ltv9wwgwurged', + 'pool1q8fqknvzyj9p4ezhxqdghlc7rnmwvwuku9eevgvl25cpjy385gg', + 'pool1c3fjkls7d2aujud8y5xy5e0azu0ueatwn34u7jy3ql85ze3xya8', + 'pool18mtj9n5sgxw6jqsq3jzl732h6yalfkx8e9249z2d5rs8smduvcv', + 'pool1wr79nyuty7wjgkey5vlfx9rn0x5ecxgge5mq45fpftqhye2shc0', + 'pool1eg6k5zz4ndk6a3sa3z7ug97y84ghj0zljs26zkhthzzkw3p82ew', + 'pool12hhrd4azpps5jxppcqs2pgtylatg7xkhaqmnetgv2988k3t4drf', + 'pool1lx7hdfz430vmrwhkrdgxu8c0xclffltavmkejpqzzz4ax0lnfvd', + 'pool1j045vdrzmj3hl36p50c6mhhpwtu2q7cmecnrqjuqq0khja02sr0', + 'pool1a6wdglfp93m2z4nhptx9xhjazgyqusjpu387gdrp899cj98yuqq', + 'pool1c60f68y8406zjmacluvcu8c0krgngp6h2qkkqhdz4mtl62ns0dq', + 'pool1xlra52x2es7dmsvpmcp2922h89h346awe7yuu664e50yvrzaaqe', + 'pool1w3xys99a8xmwcwse4tqpqmyqqzykryfc4w7cvvjusej0vnxdlrf', + 'pool13nn6lk6dx5ww95h5qqeeazyp074j7en8e6qszq62rtj9wcx522z', + 'pool189lfh7azuvxu0hyskwahnp35rtez0mzhsmule3742p3jkza00cq', + 'pool1a0kp4vl4fh0p0rs8s08rm7qq3vkj3epwraayk3sdgm8sz0zwt7t', + 'pool1a5ld0eulnjxwpg6qyjs6hxzqwj0esft7k0qsf6nj8pkfxy5lml3', + 'pool1cxjqg6nn588ura2rx4uptwprgzw82j89j2gjguwhtun4ypw2sh4', + 'pool1j0ys5378p896epefs0q2ehx3h9rrd4gupd33adkza7g3q02f6np', + 'pool1e984zjl55jxym2v57f4axfss0geg0qundlhcmmwlj8ekqrk5e62', + 'pool1qeqylk3pnenvt3j4mah2dafcnd3h8uc3fqhvfzrxlxf3xuvdvvp', + 'pool1gn4vygcs9trs7pzzdcwv6djr69eq5ux8dmwy028zk5vhcpgn8ty', + 'pool10hua8csg69l59hv4v48fpzcap726l48g77kckdg27zm5v349p69', + 'pool1fuu0vcmzc28lqm09m4j3llg64ghf9j36tcsp9vcy3kpnz9pg9hn', + 'pool1kphkk90f2mculhcndpdd3a7ukvptzqrgyr9jtuvw6c5z2dptuph', + 'pool1ntlyr9hrrdg3gpdkmr267hq46ys2rlj5y25dzx3reuecgd7p5sh', + 'pool1hx4wc45qhhychdvquhem0q3madcs2mp4r0wllk70zkpxz7jhyf4', + 'pool1nffpy6r7l4ueeedzvvzsta2vty9g6mtet6huuhfzyvndkwd35dl', + 'pool158je65d93ghx2sedvazczpxjvnx0k6mwxwup8vv6uxnz2x0xal4', + 'pool10pd44d65586rldtdzuu88e7mn4sxjctvdksmt05nnqfzqu7g7hd', + 'pool1xmtmp6cmmmaatkn3jd9dlht8xjyf7xnqmrurs59kj2ygxuz2jkd', + 'pool14mhf0xtx45a8979mcnad8upas8apwal4nfqd95arv4wlsuk6m9q', + 'pool1k5a5e3ylva34qpmwdywv7fn75wt3gzv423e9uw2vmw5rqjc2q7t', + 'pool1p00qq8zftf8m2ll0r9d24fx6tq7yzxzy5teltpswl7zew5m7nqp', + 'pool1yu9y9qvqu2d399qvzcy2ugnrsw4vh8uzsufq8jhyfrsjk563jqc', + 'pool1qm06f4n2hwgeqzm9lsc3rdyqcsvtt2d7z76carwxjv0e274mu24', + 'pool12p907u2s7hh84cn8xn26h8ytdtftrv4u8fe6xznl4xasvckxd8r', + 'pool1m06dl8dfcy6d0475fanf0mtnnp2tzhw8rarums042q3jux23q0j', + 'pool15jh849vks9mctm28xe6kgz682vnlu0pzawvftl7ltjtvwpwp59s', + 'pool13xzckaj3srgldr67dksx874jxe3c9xnc245xyr44p7cdxh07hft', + 'pool1wlzug8x3xu6dy60pdj6mrkcpvc0fa0cjje6fzxegl4f8ua97dvw', + 'pool1ktkhv4sw2y68d4xgfg9sjw829kejnvnh5zajq6g7jycry6cd7h5', + 'pool130c3kgpkjctag540j7sxqfrlhsmpc6d8u0n7j6crm9ayy75mkpt', + 'pool1yyar66t9fw9dscj8huhredgwplcnf22zq7q7vugur0t5c9nzt97', + 'pool1hv59awqky90plv68xun2k3rd7jqfe5y2c4ry8f7p0x9pxhd7wqr', + 'pool1ht35ft8az9k9u7gnc2yut7usj96he5mqngthunyf2kmnsl2kmed', + 'pool18xu4fh88v4naq5u3x9ya5aevfkrfd7a8a4gw6sejdvjnsrpud2a', + 'pool1rf2q4a04tgrwpuj5xg4sf0dj737ytaqs8s6yuyps55r6s87x7v7', + 'pool153sc4fct34a680nyfj4084w8dpax6c0zt0js8zqvg3sj7wtk486', + 'pool1kftku3r6truhvjm75gsh9pm33zfv7nuwas88m5sxqqknyyj82gf', + 'pool18mnua97ndq302yw2c6aaw6msx5rgf79mfnk4xe5y92tvjl45etl', + 'pool1nhhsh9yhlrvj9e3nce0zpx0xm2xlt6tx7gqakhr6hjc8wy84sat', + 'pool17am8pt0vu7zp8du7edlnz7x9sq4pln22rsn802gkr062vtp6fdp', + 'pool1w2s88xpylulw3l8naaql9wzxqwra06n8c2lwklmph25zjkvwuvj', + 'pool1jvknf3dwtnqln5hcjrh5m7s979revuj5dlxr0337nwmm6p7250q', + ], + + drepIds: [ + 'drep1yfaaaaa270yjt6tu5skndugekprf5ykv5jshanl0c6gqx5qpstskf', + 'drep1yg8lwytwjymrjry2xqe7u6xavft6pharse7hnl4pjdqz5tsaexul0', + 'drep1yfkg5ryqwaleunwqg0dtcj8g8yw8sgd9kskg2zlzdr8355gpghcvv', + 'drep1y0j6kdexrv7kxcqd2ejkfpunwzh2qv02xyytpf4a3nh432shwau2w', + 'drep1yf2jzhuc4f7eu2yay9d9ta3dykxxcwn34wz8kak7nhd7vcgrxn7ns', + 'drep1ytwmwvtd0a8lr45ssner2tjxzv5y8q03w3606yeald9mdmgmwecja', + 'drep1ygkmm9yfrf99w63ystylklwnsky7vxhseech0nak7hd7vwgzjzxhy', + 'drep1y2csyxt7u2hl4674pl9cef5lknafaw5nraxvyx033kmd0es3awuv0', + 'drep1ytn29gxylzlrhzmkt4c75w7qmesxqc248r9089f0pvuysdqeva6ht', + 'drep_always_abstain', + 'drep1y25c4qx64mfs7m2vlgpyq0mcpl8r2xxk2wc7uvzv46pgu7gk23g28', + 'drep1y2kvjq7k603rsykhhtxd4ct2nqdvqxr0mrxhd9qdffztrwsn6zna2', + 'drep1ytqzml628shvwje0644x4fj5h0r4nzvqgl9j6f3xsp5tcpqgeregw', + 'drep1ygvg07c0ath78u25uf4qv8ksg54alm0cp6vmhnc7wv0642g20adsz', + 'drep1y22eh8rzfmnjw8m82hlcgxfm8tcmwqmdqy2mjupdduztq0s5s5dkk', + 'drep1ygj02llvuusnhphvhlxf7d2cxhs53twjnwwl5at3zwht4xc6xdgl4', + 'drep_always_no_confidence', + 'drep1y20w8vxwd3venlvp0muxwzmdlr7a006dpz580czmaj422sqng6fkg', + 'drep1yf8p623g9s0yxnlnjzealgajyxl57k7n6saeavc7azg0crcahnul9', + 'drep1y25xtvu3d0gaf6cxktr9pkfgnywmqsh4fum93s8m3hlp4aqj3uqdp', + 'drep1y233tk9k202g9l9950czsnv4zd5229zq78dwf7drpn069rsfygqks', + 'drep1y2jd3c4hgg0tdua58z6c64k9rf58lz3jlcjlxcjfeaspl6q2e9zm6', + 'drep1yf2aeluf52p8xsfzhj926f8tuv9jur9sv7hquysv52zhdfgsrljcn', + 'drep1yftc8zs7gjcj4a9nxzplz4wg6cwweya0kxp8adnw59vsyrqvrysud', + 'drep1yghesd363wu6lscav46nlrt7mt90vhzzkkdfh4n62l8guhs72dmd7', + 'drep1ygnh2uf4wkc8ldgfxwz7rzuga3m8jtqew9xh5g3n587mg6g3ge0sj', + 'drep1yfpazkd0aqex0kd3vrhk47sjy0jqgq3xu6h2zv9wevfequcxyynwv', + 'drep1yfhusw50g9ujptwg028zp38pmnnq80xa7l60g0vyhrsngsqns67xn', + 'drep1yfp7s40f0s90na5f4hnwj8lw828xy6f28e6kcpscyzggrkscyn474', + 'drep1yth940m0pp00t5005s8q0qs9nsgeu2scqjfurmczjxl3z8q8sgq3q', + 'drep1yfffe5kmskfgr9dsd2vusp9r58vafustu6lf85579c590gskc9j6r', + 'drep1y290s8rwsezxkct6urmqne8tc92wqtltal8dfxfk45xj6eqn2mgfx', + 'drep1y23gllhnq05qh74pzlnndyr3c8yyxhdfx92mu7a7mj3rjsgla9plx', + 'drep1ytjyvm958ywjkp57f8wm3havj72lc653tp7ajttxxt6ftgcmcmdk2', + 'drep1y26xglh8ruqjurm4vuxxs3xa3p56jdfp2azpu983mcnfseqeg60y8', + 'drep1ytc573ug2gx24r6kxzag0paefdll7lr48rakj8mnkws60fs6lj7fq', + 'drep1y28uwdrz2acyp4jka5fqp2fa3hp0klpme8wug3f5p2y45zsc0e8qw', + 'drep1ygttcya6jdd7k2tvt3lmfk0y0pg2xknvlkd34h0n20y7d9qvm46l4', + 'drep1yt57vz5uvuj08rp5jk0ndnw476qtsgf0r5dp64wy0jfat4qyvajvw', + 'drep1yg04a5ulpxkwsu9wyf535mdt2vzsyxcvqupmsu42ucufensqkaw4r', + 'drep1ygwscks2yt0na4fqpcdyqn0fare5v48y0mjgn2g478lnx8gue393e', + 'drep1ygny6qfdmretrjufrzr6kr72jqtaddqa90c367usrlgyjls7yrjw8', + 'drep1yge0mv24sxq550nhqj3vxmgmffup0hgjpv67fvc79wgwxdgskhpv5', + 'drep1y296z8tm7y7elwsmsewn4q2tdr5gu0fqztq97yttlpv7zycvsl554', + 'drep1y2u3wureq2gy33ajq09geg7n24dg8243v95w6wee5hhq45cvahwhw', + 'drep1yfhjdcteppvkff24ev9ew67eesgnu4euk2hyc7u422qr4zc996rvm', + 'drep1yfy7wx6kvxwfp2pyn057kz4gtl8dd70qmudmv3gxv9ntazcdx803p', + 'drep1yfcdzuag647evc9tmr5rawpl4t3x4qxlagyy5taj6al7wwqr8qye5', + 'drep1yffqtkqaxkmdv5wxjrtc0xgh7ymlylq9yt0t9w37tmx7hkq38lkrl', + 'drep1yfg6uekyj9mkvf9eyf6p04vufhmcw3tvefscqttdl6m7v3sdw0udf', + 'drep1ytkt0vvxqlwmws5n04ud2q3sk0yu9lh65arkp2suaqdgmgqgrza6c', + 'drep1y2j502uqsjl7ujrg5e73mxc2up2wu963r6eg44zdglzanncytjpxy', + 'drep1yffgdq6yj7rm46tse8y7ctk3yg5zun4rc9hd8kwjj6u4z0qaqtdnn', + 'drep1yt6l40htemepw0rwe5gtptm2en6xfepyvpfryltap0epnlq3jh536', + 'drep1ytj6kdexrv7kxcqd2ejkfpunwzh2qv02xyytpf4a3nh432shudd2f', + 'drep1ygtfufqpjlj4vn6nawc6vw6d89wu67xv43cz3z4umpsuj4sv76j9g', + 'drep1ytkzpmmukjy6qn6xd5skqm0ypcj5juw9rxddr5mmlzgjvtcghwqjr', + 'drep1y2cnrwkyg6wtsw9jm3tx7hj39nmnhwnmffup6v2sunjqvus4tlua9', + 'drep1y27rrajt9p52law0s5nx6nkzt9k6fvfrm28vlr7h2cdy8as89gxwr', + 'drep1ygwkyyf3a6gucvlk37rhcutlrtaheupgcd5rvfqc97v6tmsnaesgd', + 'drep1yts3qdjsqcnhld4r3uek2uu0n2tnh824tgnf75a83q3yhequuy54u', + 'drep1yg3gl27d62c6qdz4ffay9kkutywk2sxw2shvp4a8xjse0vg850rla', + 'drep1yfa8r8r36x7x05htftce7qhafrn5nzzr6vazy95pzy6y5dqac0ss7', + 'drep1yt35g6t3apv7k4526kqle54jmchuru439kyzuvqhwq584gcr3a658', + 'drep1ytw5tvdxpe39l9gm3g49gl0whwd2dgu4mcf5ml5z3zfuk3s8npegv', + 'drep1y296zyw2r8rcsy7slkd7l687hh88xc0m6ac2y3h2r3mvsdgc9q6yy', + 'drep1y2m0g4r66pyaw3p7u454wc0p4f0ygm8ueaev0mgd3tvwm7sskqwqp', + 'drep1yfz5v7qq7jjhdt83mk6lfcrfrmf5g84v0nlarrdc9f0qxasv6wlf5', + 'drep1ytfnmf4uftt4fe0h63xhadl0v402gr6nnhtcgrq2sas26kgaf3n5y', + 'drep1yfk9pcvlh2j8m4azy6s463338v4s3qz9k8lzz605q9wh6zqjrckq2', + 'drep1yg6ksg7d0nvpn40hclmyyzvvk062vf242uwyk0utladvlqq5npffx', + 'drep1yfj3fur4ru2frk7xjt3g0ycqsy73ypd5h2n3xe36h9v2hdcftv9qn', + 'drep1ythhhe3s0utzdsvjgcshqzxhfx6q3qy896ynlv555nmj45skec2ez', + 'drep1ytwk5agfmq6gcl445d0wk5u5dzyutz2h4f8nuktxvmltjycayek05', + 'drep1yg8vjs7ute7z7vyd8yez5tgjey6043djjfh8d3n7sjev35g064xxc', + 'drep1yfazn9u95ws2tmdgm3jtlhnngermcnrps5stje4aq96776g3vwgn9', + 'drep1y2anuetphncrua2ya46uwgw0rwkyzxr7jll0rv9259u0zvgrh3ng2', + 'drep1yfmmjfd8luqzuumc6tce0dhn39y752kgcye99amdxz7h25ga4ykrs', + 'drep1yt49c9gfsrhf3uzl0ayw0rwykhqssmc6akyhwa7lyvuhltgehnnhv', + 'drep1y2lddxrx33g6ws8xk3nhcuzzew0qualmkc763s3hvgn6wks7c94ax', + 'drep1yfrmyrf4twcxa0z3w63842ktmufdu06c3vdaz8rpkgzu8gclnyuh9', + 'drep1y2puqlfzl57a5z44qjnjpnxn938mrmcjxqvpsmxq8dxntrczq2yhn', + 'drep1y2zu74gt8sxtrxcngqsmrnupkzrtmlqshmvmm5qtuhxx6xqt7yhaw', + 'drep1y20sf6ql6azcz5f44ssejqgwf7lhgqqchhl2mags8tmkfwg8e6t84', + 'drep1y2k4exm56hlzv5dey8tgghlflks0ks70a9e4nu7q8xd45wsvpfmn4', + 'drep1yfkcs4npza5kvnrruwnjahs6ptj9g2zhuju6vu2xvsnx0mqvry3vp', + 'drep1yftygd96upvdnhfpjrmljj6rg2jja8lk4rt6sggxqa96xfc42fad8', + 'drep1yfm4z5u70l70r4yl98mlhfc03q2xz8y7y55ef5zh2qdmqpgsa57d3', + 'drep1y20fpc0f6qjl4edtl9cxzrvqzd8jkzr6ja7p0p2n7cxragqkurae3', + 'drep1y23wk4w6f2aumc92vl9m3x74xzm6jh4ha9wdq09yfq2sl6q8zlv4l', + 'drep1ytwrrcldyr7wlgywsz3zn0vyxxry7kv4nxzm07t49ee4udsmz3s9l', + 'drep1ygtvnwgsucstvesms2hv9vc8hw3tye5zhzldmszrxqd2rxsje5c6m', + 'drep1yg69ym562ef340hyayryfmppjlalrzwxq9j6dfan0kxadmgnr7n9w', + 'drep1ytd7d7m7kcsmd9hvj0fqsx236hhryv2zccugxw2dgua9e8qasp8jm', + 'drep1yf9z2h2v433ysezypurlrw8hfd9a3jfs4mj7esd0rwxnpasvvwwjr', + 'drep1yfh3y46ffal6gyuf42e26urg5yyjecrgu2qyaj6zr8amk2sx3yn8g', + 'drep1yteze88u2ck9wup8kr87qxf2tj736epvqr8cekaxxh5y5estsal7h', + 'drep1ytvslw2a9ww8jvd72zrgm59q9e865x9nf6nd8j4lpdgw93g42k3cr', + 'drep1yftt6vj6k5l4h0mhp7q5362uxmhepee0l9q6nly8fplttcgkzushd', + 'drep1yt2hzzh7t4u7xmunqapsvztx5468l30cfgzyvkw8zxwh2nga9vryr', + ], + + proposals: [ + { + txHash: '15f82a365bdee483a4b03873a40d3829cc88c048ff3703e11bd01dd9e035c916', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '59fd353253eb177e2104e8f23ea4c63e3d32ef95c7865d03e90d3884424dc1db', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '7fd6429add8f2611ad8d48c0cc49101463093aec285faea402e8cfde78ea58d7', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '51f495aa23f4b3b3aa90afde4a0e67823bb7ac4ac65f5ffbb138373b863f2f74', + certIndex: 0, + governanceType: 'parameter_change', + }, + { + txHash: 'b2a591ac219ce6dcca5847e0248015209c7cb0436aa6bd6863d0c1f152a60bc5', + certIndex: 0, + governanceType: 'parameter_change', + }, + { + txHash: 'fff0df644d328a5367212f45bab59060bde3c4091dc96c723062896fd6197314', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '0b19476e40bbbb5e1e8ce153523762e2b6859e7ecacbaf06eae0ee6a447e79b9', + certIndex: 0, + governanceType: 'hard_fork_initiation', + }, + { + txHash: '8c653ee5c9800e6d31e79b5a7f7d4400c81d44717ad4db633dc18d4c07e4a4fd', + certIndex: 0, + governanceType: 'new_constitution', + }, + { + txHash: '941502b0aa104c850d197923259444d2b57cab7af18b63143775465aaacc84f5', + certIndex: 0, + governanceType: 'parameter_change', + }, + { + txHash: '56f39054758f1a3cedc1de9225d66bf270b62dfdbfbc5399f1d6d43aceffc636', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '7f320409d9998712ff3a3cdf0c9439e1543f236a3d746766f78f1fdbe1e06bf8', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '9b62b3c632f329016a968ac25211825bb4f84b12461121c7da3aa11df92370f9', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '7d9fc9fe4cee64fb34e57783378ac869a85c78d6fbcd4078ed131ab6fa3c7db6', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: 'bd488931f792651fefa9c6fda185a2c6cec83245b51d994e33090ce36e29cc26', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '4840e305563327358cf70dae5015b2df8f8c35cef03f74521d4f117ac17bc384', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '637e3c256da9c1350847ca3211e8c44e3660a4471e8b6f68a8c537746b4aeb73', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: 'defbf15b06092718adf4befeab982e03d2966b9caeef93c19e470549ef75ea49', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: 'e14de8d9dc4f4ddf3fe9250a8a926e20f10e99b86bd0610b77d7a054981591ee', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '60ed6ab43c840ff888a8af30a1ed27b41e9f4a91a89822b2b63d1bfc52aeec45', + certIndex: 0, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '9d213a57684d7ddf6f3350c80d042639ecbed5ccccc4a05bf54959a086593e7b', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '495bd3cd44ea6bc0b4c2dbb1e4cdc7e214874c2c07490a4e2476a627ef911280', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '3cf29192a0ee1a77985054072edcdb566ac14707730637c4635d8fb6813cb4c9', + certIndex: 0, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 0, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 1, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 2, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 3, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 4, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 5, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 6, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 7, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 8, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 9, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 10, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 11, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 12, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 13, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 14, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 15, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 16, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 17, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 18, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 19, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 20, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 21, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 22, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 23, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 24, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 25, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 26, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 27, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 28, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 29, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 30, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 31, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 32, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 33, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 34, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 35, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '8ad3d454f3496a35cb0d07b0fd32f687f66338b7d60e787fc0a22939e5d8833e', + certIndex: 36, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '2c7f900b7ff68f317a7b0e42231d4aed36227660baf2ee9a4be7e880eb977313', + certIndex: 0, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '47a0e7a4f9383b1afc2192b23b41824d65ac978d7741aca61fc1fa16833d1111', + certIndex: 0, + governanceType: 'new_committee', + }, + { + txHash: '4ff43f1eab5252ef00ba6f1429dc23715e3899834f10c067e8065c8364d5559a', + certIndex: 0, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '1d6aea56e6a523b13e03ae30ff24ebf9852543b4f7d415c7e50f55f6baaa4e3d', + certIndex: 0, + governanceType: 'treasury_withdrawals', + }, + { + txHash: '207b226e110e13bb18b119fcd313520e0fcd060b2bc9fb9a5e5bc6e94ab10f3b', + certIndex: 0, + governanceType: 'new_constitution', + }, + { + txHash: '89e3a4f09122d669d6f6c82dd894e02826e8497be7eb036233bafc0ee4fc6665', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '90cf51975f9c19c291bac3e57364a89507e64daa0a2d35e356f87e6684821556', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: 'e5643c33f608642e329228a968770e5b19ef5f48ff1f698712e2ce864a49e3f0', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: '996edfe370b8e51be73541e75499a818461305e37c7fa0c1b193f2c587167cc7', + certIndex: 0, + governanceType: 'info_action', + }, + { + txHash: 'd2db60c5307cb517c735e2d0138d2b6f10fc5b221d610fa187719bdc82af9a03', + certIndex: 0, + governanceType: 'treasury_withdrawals', + }, + { + txHash: 'c882f194684d672316212f01efc6d28177e8965b7cd6956981fe37cc6715961e', + certIndex: 0, + governanceType: 'new_constitution', + }, + ], +}; + +export function getRandomItem(array: T[]): T { + return array[Math.floor(Math.random() * array.length)]; +} diff --git a/tests/k6/src/config/thresholds.ts b/tests/k6/src/config/thresholds.ts new file mode 100644 index 00000000..63098690 --- /dev/null +++ b/tests/k6/src/config/thresholds.ts @@ -0,0 +1,24 @@ +export const THRESHOLDS = { + http_req_duration: ['p(95)<2000', 'p(99)<2200'], + http_req_failed: ['rate<0.01'], + + // Endpoint-specific thresholds + account_duration: ['p(95)<700'], + asset_duration: ['p(95)<800'], + epoch_duration: ['p(95)<900'], + governance_duration: ['p(95)<800'], + pool_duration: ['p(95)<2000'], + + successful_requests: ['rate>0.99'], +}; + +export const SMOKE_THRESHOLDS = { + http_req_duration: ['p(95)<1500', 'p(99)<2000'], + http_req_failed: ['rate<0.05'], + + account_duration: ['p(95)<1000'], + asset_duration: ['p(95)<800'], + epoch_duration: ['p(95)<1000'], + governance_duration: ['p(95)<800'], + pool_duration: ['avg < 1000', 'p(90) < 1500', 'p(95)<2000'], +}; diff --git a/tests/k6/src/scenarios/accounts.ts b/tests/k6/src/scenarios/accounts.ts new file mode 100644 index 00000000..7266653a --- /dev/null +++ b/tests/k6/src/scenarios/accounts.ts @@ -0,0 +1,16 @@ +import { ENDPOINTS } from '../config/endpoints'; +import { getRandomItem } from '../config/test-data'; +import { TEST_DATA } from '../config/shelley-test-data'; +import { apiClient, MetricType } from '../utils/api-client'; +import { buildUrl } from '../utils/helpers'; + +export function testGetAccount(): void { + const stakeAddress = getRandomItem(TEST_DATA.stakeAddresses); + const url = buildUrl(ENDPOINTS.ACCOUNT, { stake_address: stakeAddress }); + + apiClient.get(url, { + endpointName: 'GET /accounts/{stake_address}', + tagName: 'get_account', + metricType: MetricType.ACCOUNT, + }); +} diff --git a/tests/k6/src/scenarios/assets.ts b/tests/k6/src/scenarios/assets.ts new file mode 100644 index 00000000..c04f2210 --- /dev/null +++ b/tests/k6/src/scenarios/assets.ts @@ -0,0 +1,68 @@ +import { ENDPOINTS } from '../config/endpoints'; +import { getRandomItem, TEST_DATA } from '../config/test-data'; +import { apiClient, MetricType } from '../utils/api-client'; +import { buildUrl } from '../utils/helpers'; + +export function testAssetsList(): void { + apiClient.get(ENDPOINTS.ASSETS, { + endpointName: 'GET /assets', + tagName: 'list_assets', + metricType: MetricType.ASSET, + }); +} + +export function testAssetDetails(): void { + const assetId = getRandomItem(TEST_DATA.assetIds); + const url = buildUrl(ENDPOINTS.ASSET, { asset: assetId }); + + apiClient.get(url, { + endpointName: 'GET /assets/{asset}', + tagName: 'get_asset', + metricType: MetricType.ASSET, + }); +} + +export function testAssetHistory(): void { + const assetId = getRandomItem(TEST_DATA.assetIds); + const url = buildUrl(ENDPOINTS.ASSET_HISTORY, { asset: assetId }); + + apiClient.get(url, { + endpointName: 'GET /assets/{asset}/history', + tagName: 'asset_history', + metricType: MetricType.ASSET, + }); +} + +export function testAssetTransactions(): void { + const assetId = getRandomItem(TEST_DATA.assetIds); + const url = buildUrl(ENDPOINTS.ASSET_TRANSACTIONS, { asset: assetId }); + + apiClient.get(url, { + endpointName: 'GET /assets/{asset}/transactions', + tagName: 'asset_transactions', + metricType: MetricType.ASSET, + }); +} + +export function testAssetAddresses(): void { + const assetId = getRandomItem(TEST_DATA.assetIds); + const url = buildUrl(ENDPOINTS.ASSET_ADDRESSES, { asset: assetId }); + + apiClient.get(url, { + endpointName: 'GET /assets/{asset}/addresses', + tagName: 'asset_addresses', + metricType: MetricType.ASSET, + }); +} + +export function testAssetPolicy(): void { + const policyId = getRandomItem(TEST_DATA.policyIds); + const url = buildUrl(ENDPOINTS.ASSET_POLICY, { policy_id: policyId }); + + apiClient.get(url, { + endpointName: 'GET /assets/policy/{policy_id}', + tagName: 'asset_policy', + metricType: MetricType.ASSET, + }); +} + diff --git a/tests/k6/src/scenarios/epochs.ts b/tests/k6/src/scenarios/epochs.ts new file mode 100644 index 00000000..fd39d7d3 --- /dev/null +++ b/tests/k6/src/scenarios/epochs.ts @@ -0,0 +1,34 @@ +import { ENDPOINTS } from '../config/endpoints'; +import { apiClient, MetricType } from '../utils/api-client'; +import { buildUrl } from '../utils/helpers'; + +export function testEpochLatest(): void { + apiClient.get(ENDPOINTS.EPOCHS_LATEST, { + endpointName: 'GET /epochs/latest', + tagName: 'epoch_latest', + metricType: MetricType.EPOCH, + }); +} + +export function testEpochParameters(): void { + apiClient.get(ENDPOINTS.EPOCHS_LATEST_PARAMETERS, { + endpointName: 'GET /epochs/latest/parameters', + tagName: 'epoch_parameters', + metricType: MetricType.EPOCH, + }); +} + +export function testEpochSpecific(): void { + const latestRes = apiClient.getRaw(ENDPOINTS.EPOCHS_LATEST); + + if (latestRes.status === 200 && latestRes.json('epoch')) { + const epochNo = latestRes.json('epoch') as number; + const url = buildUrl(ENDPOINTS.EPOCH, { epoch_no: (epochNo - 1).toString() }); + + apiClient.get(url, { + endpointName: 'GET /epochs/{epoch_no}', + tagName: 'epoch_specific', + metricType: MetricType.EPOCH, + }); + } +} diff --git a/tests/k6/src/scenarios/governance.ts b/tests/k6/src/scenarios/governance.ts new file mode 100644 index 00000000..555165bb --- /dev/null +++ b/tests/k6/src/scenarios/governance.ts @@ -0,0 +1,120 @@ +import { ENDPOINTS } from '../config/endpoints'; +import { getRandomItem, TEST_DATA } from '../config/test-data'; +import { apiClient, MetricType } from '../utils/api-client'; +import { buildUrl } from '../utils/helpers'; + +export function testGovernanceDReps(): void { + apiClient.get(ENDPOINTS.GOV_DREPS, { + endpointName: 'GET /governance/dreps', + tagName: 'list_dreps', + metricType: MetricType.GOVERNANCE, + }); +} + +export function testGovernanceDRepDetails(): void { + const drepId = getRandomItem(TEST_DATA.drepIds); + const url = buildUrl(ENDPOINTS.GOV_DREP, { drep_id: drepId }); + + apiClient.get(url, { + endpointName: 'GET /governance/dreps/{drep_id}', + tagName: 'get_drep', + metricType: MetricType.GOVERNANCE, + }); +} + +export function testGovernanceDRepDelegators(): void { + const drepId = getRandomItem(TEST_DATA.drepIds); + const url = buildUrl(ENDPOINTS.GOV_DREP_DELEGATORS, { drep_id: drepId }); + + apiClient.get(url, { + endpointName: 'GET /governance/dreps/{drep_id}/delegators', + tagName: 'drep_delegators', + metricType: MetricType.GOVERNANCE, + }); +} + +export function testGovernanceDRepMetadata(): void { + const drepId = getRandomItem(TEST_DATA.drepIds); + const url = buildUrl(ENDPOINTS.GOV_DREP_METADATA, { drep_id: drepId }); + + apiClient.get(url, { + endpointName: 'GET /governance/dreps/{drep_id}/metadata', + tagName: 'drep_metadata', + metricType: MetricType.GOVERNANCE, + }); +} + +export function testGovernanceDRepUpdates(): void { + const drepId = getRandomItem(TEST_DATA.drepIds); + const url = buildUrl(ENDPOINTS.GOV_DREP_UPDATES, { drep_id: drepId }); + + apiClient.get(url, { + endpointName: 'GET /governance/dreps/{drep_id}/updates', + tagName: 'drep_updates', + metricType: MetricType.GOVERNANCE, + }); +} + +export function testGovernanceDRepVotes(): void { + const drepId = getRandomItem(TEST_DATA.drepIds); + const url = buildUrl(ENDPOINTS.GOV_DREP_VOTES, { drep_id: drepId }); + + apiClient.get(url, { + endpointName: 'GET /governance/dreps/{drep_id}/votes', + tagName: 'drep_votes', + metricType: MetricType.GOVERNANCE, + }); +} + +export function testGovernanceProposals(): void { + apiClient.get(ENDPOINTS.GOV_PROPOSALS, { + endpointName: 'GET /governance/proposals', + tagName: 'list_proposals', + metricType: MetricType.GOVERNANCE, + }); +} + +export function testGovernanceProposalDetails(): void { + const proposal = getRandomItem(TEST_DATA.proposals); + const { txHash, certIndex } = proposal; + const url = buildUrl(ENDPOINTS.GOV_PROPOSAL, { + tx_hash: txHash, + cert_index: certIndex.toString(), + }); + + apiClient.get(url, { + endpointName: 'GET /governance/proposals/{tx_hash}/{cert_index}', + tagName: 'get_proposal', + metricType: MetricType.GOVERNANCE, + }); +} + +export function testGovernanceProposalVotes(): void { + const proposal = getRandomItem(TEST_DATA.proposals); + const { txHash, certIndex } = proposal; + const url = buildUrl(ENDPOINTS.GOV_PROPOSAL_VOTES, { + tx_hash: txHash, + cert_index: certIndex.toString(), + }); + + apiClient.get(url, { + endpointName: 'GET /governance/proposals/{tx_hash}/{cert_index}/votes', + tagName: 'proposal_votes', + metricType: MetricType.GOVERNANCE, + }); +} + +export function testGovernanceProposalMetadata(): void { + const proposal = getRandomItem(TEST_DATA.proposals); + const { txHash, certIndex } = proposal; + const url = buildUrl(ENDPOINTS.GOV_PROPOSAL_METADATA, { + tx_hash: txHash, + cert_index: certIndex.toString(), + }); + + apiClient.get(url, { + endpointName: 'GET /governance/proposals/{tx_hash}/{cert_index}/metadata', + tagName: 'proposal_metadata', + metricType: MetricType.GOVERNANCE, + }); +} diff --git a/tests/k6/src/scenarios/pools.ts b/tests/k6/src/scenarios/pools.ts new file mode 100644 index 00000000..5bee0cae --- /dev/null +++ b/tests/k6/src/scenarios/pools.ts @@ -0,0 +1,48 @@ +import { ENDPOINTS } from '../config/endpoints'; +import { getRandomItem } from '../config/test-data'; +import { apiClient, MetricType } from '../utils/api-client'; +import { TEST_DATA } from '../config/shelley-test-data'; +import { buildUrl } from '../utils/helpers'; + +export function testPoolsList(): void { + apiClient.get(ENDPOINTS.POOLS, { + endpointName: 'GET /pools', + tagName: 'list_pools', + metricType: MetricType.POOL, + }); +} + +export function testPoolsExtended(): void { + apiClient.get(ENDPOINTS.POOLS_EXTENDED, { + endpointName: 'GET /pools/extended', + tagName: 'pools_extended', + metricType: MetricType.POOL, + }); +} + +export function testPoolsRetired(): void { + apiClient.get(ENDPOINTS.POOLS_RETIRED, { + endpointName: 'GET /pools/retired', + tagName: 'pools_retired', + metricType: MetricType.POOL, + }); +} + +export function testPoolsRetiring(): void { + apiClient.get(ENDPOINTS.POOLS_RETIRING, { + endpointName: 'GET /pools/retiring', + tagName: 'pools_retiring', + metricType: MetricType.POOL, + }); +} + +export function testPoolDetails(): void { + const poolId = getRandomItem(TEST_DATA.poolIds); + const url = buildUrl(ENDPOINTS.POOL, { pool_id: poolId }); + + apiClient.get(url, { + endpointName: 'GET /pools/{pool_id}', + tagName: 'get_pool', + metricType: MetricType.POOL, + }); +} \ No newline at end of file diff --git a/tests/k6/src/tests/load.test.ts b/tests/k6/src/tests/load.test.ts new file mode 100644 index 00000000..24eabae0 --- /dev/null +++ b/tests/k6/src/tests/load.test.ts @@ -0,0 +1,65 @@ +import { Options } from 'k6/options'; +import { THRESHOLDS } from '../config/thresholds'; +import { testGetAccount } from '../scenarios/accounts'; +import { testEpochLatest, testEpochParameters, testEpochSpecific } from '../scenarios/epochs'; +import { + testPoolDetails, + testPoolsExtended, + testPoolsList, + testPoolsRetired, + testPoolsRetiring, +} from '../scenarios/pools'; +import { randomSleep, weightedRandomChoice } from '../utils/helpers'; +import { EndpointWeight } from '../types'; + +export const options: Options = { + stages: [ + { duration: '2m', target: 10 }, + { duration: '5m', target: 20 }, + { duration: '2m', target: 25 }, + { duration: '5m', target: 30 }, + { duration: '2m', target: 0 }, + ], + thresholds: THRESHOLDS, +}; + +export default function () { + const scenarios: EndpointWeight[] = [ + // Accounts + { name: 'accounts', weight: 40, fn: testGetAccount }, + + // Epochs + { name: 'epoch_latest', weight: 20, fn: testEpochLatest }, + { name: 'epoch_params', weight: 7, fn: testEpochParameters }, + { name: 'epoch_specific', weight: 3, fn: testEpochSpecific }, + + // Pools + { name: 'pools_list', weight: 10, fn: testPoolsList }, + { name: 'pools_details', weight: 12, fn: testPoolDetails }, + { name: 'pools_extended', weight: 4, fn: testPoolsExtended }, + { name: 'pools_retired', weight: 2, fn: testPoolsRetired }, + { name: 'pools_retiring', weight: 2, fn: testPoolsRetiring }, + + // Assets + // { name: 'assets_list', weight: 5, fn: testAssetsList }, + // { name: 'assets_details', weight: 7, fn: testAssetDetails }, + // { name: 'assets_history', weight: 3, fn: testAssetHistory }, + // { name: 'assets_transactions', weight: 2, fn: testAssetTransactions }, + // { name: 'assets_addresses', weight: 2, fn: testAssetAddresses }, + // { name: 'assets_policy', weight: 1, fn: testAssetPolicy }, + + // Governance + // { name: 'gov_dreps', weight: 3, fn: testGovernanceDReps }, + // { name: 'gov_drep_details', weight: 2, fn: testGovernanceDRepDetails }, + // { name: 'gov_drep_delegators', weight: 1, fn: testGovernanceDRepDelegators }, + // { name: 'gov_drep_metadata', weight: 1, fn: testGovernanceDRepMetadata }, + // { name: 'gov_drep_updates', weight: 1, fn: testGovernanceDRepUpdates }, + // { name: 'gov_drep_votes', weight: 1, fn: testGovernanceDRepVotes }, + // { name: 'gov_proposals', weight: 1, fn: testGovernanceProposals }, + ]; + + const selectedScenario = weightedRandomChoice(scenarios); + selectedScenario(); + + randomSleep(1, 3); +} diff --git a/tests/k6/src/tests/smoke.test.ts b/tests/k6/src/tests/smoke.test.ts new file mode 100644 index 00000000..6d3ee020 --- /dev/null +++ b/tests/k6/src/tests/smoke.test.ts @@ -0,0 +1,60 @@ +import { Options } from 'k6/options'; +import { SMOKE_THRESHOLDS } from '../config/thresholds'; +import { testGetAccount } from '../scenarios/accounts'; +import { testEpochLatest, testEpochParameters } from '../scenarios/epochs'; +import { + testPoolDetails, + testPoolsExtended, + testPoolsList, + testPoolsRetired, + testPoolsRetiring, +} from '../scenarios/pools'; +import { randomSleep } from '../utils/helpers'; + +export const options: Options = { + scenarios: { + smoke: { + vus: 3, + executor: 'externally-controlled', + duration: '1m', + }, + }, + thresholds: SMOKE_THRESHOLDS, +}; + +export default function () { + // Accounts + testGetAccount(); + + // Epochs + testEpochLatest(); + testEpochParameters(); + + // Pools + testPoolsList(); + testPoolDetails(); + + // Pools extended + testPoolsExtended(); + testPoolsRetired(); + testPoolsRetiring(); + + // Assets + // { name: 'assets_list', weight: 5, fn: testAssetsList }, + // { name: 'assets_details', weight: 7, fn: testAssetDetails }, + // { name: 'assets_history', weight: 3, fn: testAssetHistory }, + // { name: 'assets_transactions', weight: 2, fn: testAssetTransactions }, + // { name: 'assets_addresses', weight: 2, fn: testAssetAddresses }, + // { name: 'assets_policy', weight: 1, fn: testAssetPolicy }, + + // Governance + // { name: 'gov_dreps', weight: 3, fn: testGovernanceDReps }, + // { name: 'gov_drep_details', weight: 2, fn: testGovernanceDRepDetails }, + // { name: 'gov_drep_delegators', weight: 1, fn: testGovernanceDRepDelegators }, + // { name: 'gov_drep_metadata', weight: 1, fn: testGovernanceDRepMetadata }, + // { name: 'gov_drep_updates', weight: 1, fn: testGovernanceDRepUpdates }, + // { name: 'gov_drep_votes', weight: 1, fn: testGovernanceDRepVotes }, + // { name: 'gov_proposals', weight: 1, fn: testGovernanceProposals }, + + randomSleep(1, 2); +} diff --git a/tests/k6/src/tests/soak.test.ts b/tests/k6/src/tests/soak.test.ts new file mode 100644 index 00000000..4bb5430d --- /dev/null +++ b/tests/k6/src/tests/soak.test.ts @@ -0,0 +1,63 @@ +import { Options } from 'k6/options'; +import { THRESHOLDS } from '../config/thresholds'; +import { testGetAccount } from '../scenarios/accounts'; +import { testEpochLatest, testEpochParameters, testEpochSpecific } from '../scenarios/epochs'; +import { + testPoolDetails, + testPoolsExtended, + testPoolsList, + testPoolsRetired, + testPoolsRetiring, +} from '../scenarios/pools'; +import { randomSleep, weightedRandomChoice } from '../utils/helpers'; +import { EndpointWeight } from '../types'; + +export const options: Options = { + stages: [ + { duration: '5m', target: 30 }, + { duration: '2h', target: 30 }, + { duration: '5m', target: 0 }, + ], + thresholds: THRESHOLDS, +}; + +export default function () { + const scenarios: EndpointWeight[] = [ + // Accounts + { name: 'accounts', weight: 40, fn: testGetAccount }, + + // Epochs + { name: 'epoch_latest', weight: 20, fn: testEpochLatest }, + { name: 'epoch_params', weight: 7, fn: testEpochParameters }, + { name: 'epoch_specific', weight: 3, fn: testEpochSpecific }, + + // Pools + { name: 'pools_list', weight: 10, fn: testPoolsList }, + { name: 'pools_details', weight: 12, fn: testPoolDetails }, + { name: 'pools_extended', weight: 4, fn: testPoolsExtended }, + { name: 'pools_retired', weight: 2, fn: testPoolsRetired }, + { name: 'pools_retiring', weight: 2, fn: testPoolsRetiring }, + + // Assets + // { name: 'assets_list', weight: 5, fn: testAssetsList }, + // { name: 'assets_details', weight: 7, fn: testAssetDetails }, + // { name: 'assets_history', weight: 3, fn: testAssetHistory }, + // { name: 'assets_transactions', weight: 2, fn: testAssetTransactions }, + // { name: 'assets_addresses', weight: 2, fn: testAssetAddresses }, + // { name: 'assets_policy', weight: 1, fn: testAssetPolicy }, + + // Governance + // { name: 'gov_dreps', weight: 3, fn: testGovernanceDReps }, + // { name: 'gov_drep_details', weight: 2, fn: testGovernanceDRepDetails }, + // { name: 'gov_drep_delegators', weight: 1, fn: testGovernanceDRepDelegators }, + // { name: 'gov_drep_metadata', weight: 1, fn: testGovernanceDRepMetadata }, + // { name: 'gov_drep_updates', weight: 1, fn: testGovernanceDRepUpdates }, + // { name: 'gov_drep_votes', weight: 1, fn: testGovernanceDRepVotes }, + // { name: 'gov_proposals', weight: 1, fn: testGovernanceProposals }, + ]; + + const selectedScenario = weightedRandomChoice(scenarios); + selectedScenario(); + + randomSleep(2, 4); +} diff --git a/tests/k6/src/tests/stress.test.ts b/tests/k6/src/tests/stress.test.ts new file mode 100644 index 00000000..33e971d3 --- /dev/null +++ b/tests/k6/src/tests/stress.test.ts @@ -0,0 +1,73 @@ +import { Options } from 'k6/options'; +import { THRESHOLDS } from '../config/thresholds'; +import { testGetAccount } from '../scenarios/accounts'; +import { testEpochLatest, testEpochParameters, testEpochSpecific } from '../scenarios/epochs'; +import { + testPoolDetails, + testPoolsExtended, + testPoolsList, + testPoolsRetired, + testPoolsRetiring, +} from '../scenarios/pools'; +import { randomSleep, weightedRandomChoice } from '../utils/helpers'; +import { EndpointWeight } from '../types'; + +export const options: Options = { + // These are just some hypothetical stages for a stress test + // They need to be adjusted based on the actual system capacity and goals for the + // Blockfrost API. + stages: [ + { duration: '2m', target: 50 }, + { duration: '3m', target: 100 }, + { duration: '3m', target: 200 }, + { duration: '3m', target: 300 }, + { duration: '2m', target: 0 }, + ], + thresholds: { + ...THRESHOLDS, + // Relax thresholds for stress test - we expect some degradation + http_req_duration: ['p(95)<1500', 'p(99)<3000'], + http_req_failed: ['rate<0.05'], + }, +}; + +export default function () { + const scenarios: EndpointWeight[] = [ + // Accounts + { name: 'accounts', weight: 40, fn: testGetAccount }, + + // Epochs + { name: 'epoch_latest', weight: 20, fn: testEpochLatest }, + { name: 'epoch_params', weight: 7, fn: testEpochParameters }, + { name: 'epoch_specific', weight: 3, fn: testEpochSpecific }, + + // Pools + { name: 'pools_list', weight: 10, fn: testPoolsList }, + { name: 'pools_details', weight: 12, fn: testPoolDetails }, + { name: 'pools_extended', weight: 4, fn: testPoolsExtended }, + { name: 'pools_retired', weight: 2, fn: testPoolsRetired }, + { name: 'pools_retiring', weight: 2, fn: testPoolsRetiring }, + + // Assets + // { name: 'assets_list', weight: 5, fn: testAssetsList }, + // { name: 'assets_details', weight: 7, fn: testAssetDetails }, + // { name: 'assets_history', weight: 3, fn: testAssetHistory }, + // { name: 'assets_transactions', weight: 2, fn: testAssetTransactions }, + // { name: 'assets_addresses', weight: 2, fn: testAssetAddresses }, + // { name: 'assets_policy', weight: 1, fn: testAssetPolicy }, + + // Governance + // { name: 'gov_dreps', weight: 3, fn: testGovernanceDReps }, + // { name: 'gov_drep_details', weight: 2, fn: testGovernanceDRepDetails }, + // { name: 'gov_drep_delegators', weight: 1, fn: testGovernanceDRepDelegators }, + // { name: 'gov_drep_metadata', weight: 1, fn: testGovernanceDRepMetadata }, + // { name: 'gov_drep_updates', weight: 1, fn: testGovernanceDRepUpdates }, + // { name: 'gov_drep_votes', weight: 1, fn: testGovernanceDRepVotes }, + // { name: 'gov_proposals', weight: 1, fn: testGovernanceProposals }, + ]; + + const selectedScenario = weightedRandomChoice(scenarios); + selectedScenario(); + + randomSleep(0.5, 2); +} \ No newline at end of file diff --git a/tests/k6/src/types/index.ts b/tests/k6/src/types/index.ts new file mode 100644 index 00000000..4c9d0ea2 --- /dev/null +++ b/tests/k6/src/types/index.ts @@ -0,0 +1,27 @@ +export interface Proposal { + txHash: string; + certIndex: number; + governanceType: string; +} + +export interface TestData { + stakeAddresses: string[]; + poolIds: string[]; + assetIds: string[]; + policyIds: string[]; + drepIds: string[]; + proposals: Proposal[]; +} + +export interface EndpointWeight { + name: string; + weight: number; + fn: () => void; +} + +export interface CheckResult { + passed: boolean; + endpoint: string; + statusCode: number; + duration: number; +} diff --git a/tests/k6/src/utils/api-client.ts b/tests/k6/src/utils/api-client.ts new file mode 100644 index 00000000..a005a57e --- /dev/null +++ b/tests/k6/src/utils/api-client.ts @@ -0,0 +1,97 @@ +import http, { Response } from 'k6/http'; +import { checkResponse } from './checks'; +import { metrics } from './metrics'; + +export enum MetricType { + ACCOUNT = 'account', + ASSET = 'asset', + EPOCH = 'epoch', + GOVERNANCE = 'governance', + POOL = 'pool', +} + +interface RequestOptions { + endpointName: string; + tagName: string; + metricType: MetricType; +} + +export class ApiClient { + constructor(private baseUrl: string) {} + + /** + * Make a GET request with automatic metrics tracking and checks + */ + get(url: string, options: RequestOptions): Response { + const res = http.get(this.baseUrl + url, { + tags: { name: options.tagName }, + }); + + const result = checkResponse(res, options.endpointName); + this.trackMetrics(res, result.passed, options.metricType); + + return res; + } + + /** + * Make a GET request without metrics tracking (for setup/helper requests) + */ + getRaw(url: string, tagName?: string): Response { + return http.get(this.baseUrl + url, tagName ? { tags: { name: tagName } } : undefined); + } + + /** + * Track metrics for a request + */ + private trackMetrics(res: Response, passed: boolean, metricType: MetricType): void { + switch (metricType) { + case MetricType.ACCOUNT: + metrics.accountDuration.add(res.timings.duration); + metrics.accountRequests.add(1); + if (!passed) { + metrics.accountErrors.add(1); + } + break; + case MetricType.ASSET: + metrics.assetDuration.add(res.timings.duration); + metrics.assetRequests.add(1); + if (!passed) { + metrics.assetErrors.add(1); + } + break; + case MetricType.EPOCH: + metrics.epochDuration.add(res.timings.duration); + metrics.epochRequests.add(1); + if (!passed) { + metrics.epochErrors.add(1); + } + break; + case MetricType.GOVERNANCE: + metrics.governanceDuration.add(res.timings.duration); + metrics.governanceRequests.add(1); + if (!passed) { + metrics.governanceErrors.add(1); + } + break; + case MetricType.POOL: + metrics.poolDuration.add(res.timings.duration); + metrics.poolRequests.add(1); + if (!passed) { + metrics.poolErrors.add(1); + } + break; + } + + // Overall metrics + metrics.totalRequests.add(1); + metrics.successfulRequests.add(passed ? 1 : 0); + + if (!passed) { + metrics.failedRequests.add(1); + } + } +} + +// Singleton instance +const BASE_URL = __ENV.API_URL || 'http://127.0.0.1:4340'; +export const apiClient = new ApiClient(BASE_URL); diff --git a/tests/k6/src/utils/checks.ts b/tests/k6/src/utils/checks.ts new file mode 100644 index 00000000..ee565621 --- /dev/null +++ b/tests/k6/src/utils/checks.ts @@ -0,0 +1,30 @@ +import { Response } from 'k6/http'; +import { check } from 'k6'; +import { CheckResult } from '../types'; + +function hasResponseBody(r: Response): boolean { + if (!r.body) return false; + if (typeof r.body === 'string') return r.body.length > 0; + return r.body.byteLength > 0; +} + +export function checkResponse( + res: Response, + endpointName: string, + expectedStatus: number = 200, +): CheckResult { + const checks = { + [`${endpointName} - status is ${expectedStatus}`]: (r: Response): boolean => + r.status === expectedStatus, + [`${endpointName} - has response body`]: (r: Response): boolean => hasResponseBody(r), + }; + + const passed = check(res, checks); + + return { + passed: passed, + endpoint: endpointName, + statusCode: res.status, + duration: res.timings.duration, + }; +} diff --git a/tests/k6/src/utils/helpers.ts b/tests/k6/src/utils/helpers.ts new file mode 100644 index 00000000..596c0b14 --- /dev/null +++ b/tests/k6/src/utils/helpers.ts @@ -0,0 +1,31 @@ +import { sleep } from 'k6'; +import { EndpointWeight } from '../types'; + +export function weightedRandomChoice(choices: EndpointWeight[]): () => void { + const totalWeight = choices.reduce((sum, c) => sum + c.weight, 0); + let random = Math.random() * totalWeight; + + for (const choice of choices) { + random -= choice.weight; + if (random <= 0) return choice.fn; + } + + return choices[0].fn; +} + +export function randomSleep(min: number = 1, max: number = 3): void { + sleep(randomIntBetween(min, max)); +} + +export function randomIntBetween(min: number = 1, max: number = 3) { + return Math.floor(Math.random() * (max - min + 1) + min); +} + +export function buildUrl(endpoint: string, params: Record): string { + let url = endpoint; + for (const [key, value] of Object.entries(params)) { + url = url.replace(`{${key}}`, value); + } + return url; +} + diff --git a/tests/k6/src/utils/metrics.ts b/tests/k6/src/utils/metrics.ts new file mode 100644 index 00000000..022408f8 --- /dev/null +++ b/tests/k6/src/utils/metrics.ts @@ -0,0 +1,32 @@ +import { Trend, Rate, Counter } from 'k6/metrics'; + +export const metrics = { + // Duration metrics per endpoint category + accountDuration: new Trend('account_duration'), + assetDuration: new Trend('asset_duration'), + epochDuration: new Trend('epoch_duration'), + governanceDuration: new Trend('governance_duration'), + poolDuration: new Trend('pool_duration'), + + // Request counts per endpoint category + accountRequests: new Counter('account_requests'), + assetRequests: new Counter('asset_requests'), + epochRequests: new Counter('epoch_requests'), + governanceRequests: new Counter('governance_requests'), + poolRequests: new Counter('pool_requests'), + + // Errors per endpoint category + accountErrors: new Counter('account_errors'), + assetErrors: new Counter('asset_errors'), + epochErrors: new Counter('epoch_errors'), + governanceErrors: new Counter('governance_errors'), + poolErrors: new Counter('pool_errors'), + + // Error tracking + errorRate: new Rate('error_rate'), + successfulRequests: new Rate('successful_requests'), + + // Counters + failedRequests: new Counter('failed_requests'), + totalRequests: new Counter('total_requests'), +}; diff --git a/tests/k6/tsconfig.json b/tests/k6/tsconfig.json new file mode 100644 index 00000000..8cf0f2b1 --- /dev/null +++ b/tests/k6/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "lib": ["ES2020"], + "outDir": "./dist", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "moduleResolution": "node", + "types": ["k6"], + "allowSyntheticDefaultImports": true, + "isolatedModules": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/tests/k6/webpack.config.js b/tests/k6/webpack.config.js new file mode 100644 index 00000000..470a5e4f --- /dev/null +++ b/tests/k6/webpack.config.js @@ -0,0 +1,50 @@ +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +export default { + mode: 'production', + entry: { + 'smoke.test': './src/tests/smoke.test.ts', + 'load.test': './src/tests/load.test.ts', + 'stress.test': './src/tests/stress.test.ts', + 'soak.test': './src/tests/soak.test.ts', + }, + output: { + path: path.resolve(__dirname, 'dist'), + libraryTarget: 'commonjs', + filename: '[name].js', + }, + resolve: { + extensions: ['.ts', '.js'], + }, + module: { + rules: [ + { + test: /\.ts$/, + use: { + loader: 'ts-loader', + options: { + transpileOnly: false, + compilerOptions: { + module: 'esnext', + target: 'es2015', + }, + }, + }, + exclude: /node_modules/, + }, + ], + }, + target: 'web', + externals: /^(k6|https?\:\/\/)(\/.*)?/, + devtool: 'source-map', + stats: { + colors: true, + }, + optimization: { + minimize: false, + }, +};