From bfb434ae578dd8390f600abac19e9ce59319303a Mon Sep 17 00:00:00 2001 From: cte Date: Tue, 18 Feb 2025 01:21:44 -0800 Subject: [PATCH 1/5] Code indexer --- .gitignore | 7 +- .vscodeignore | 5 +- package-lock.json | 553 +++++++++++++++++- package.json | 10 +- .../code-indexer/__fixtures__/indexFile.json | 50 ++ .../code-indexer/__fixtures__/search.json | 94 +++ .../code-indexer/__fixtures__/test.py | 9 + .../code-indexer/__fixtures__/test.ts | 15 + .../code-indexer/__tests__/chunker.test.ts | 43 ++ .../__tests__/code-search.test.ts | 72 +++ .../code-indexer/__tests__/uri.test.ts | 79 +++ src/services/code-indexer/chunker.ts | 201 +++++++ src/services/code-indexer/code-search.ts | 115 ++++ src/services/code-indexer/uri.ts | 22 + .../tree-sitter/__tests__/index.test.ts | 173 +----- .../__tests__/languageParser.test.ts | 208 ++++--- src/services/tree-sitter/index.ts | 14 +- src/services/tree-sitter/languageParser.ts | 47 +- src/utils/fs.ts | 12 + tsconfig.json | 5 +- 20 files changed, 1437 insertions(+), 297 deletions(-) create mode 100644 src/services/code-indexer/__fixtures__/indexFile.json create mode 100644 src/services/code-indexer/__fixtures__/search.json create mode 100644 src/services/code-indexer/__fixtures__/test.py create mode 100644 src/services/code-indexer/__fixtures__/test.ts create mode 100644 src/services/code-indexer/__tests__/chunker.test.ts create mode 100644 src/services/code-indexer/__tests__/code-search.test.ts create mode 100644 src/services/code-indexer/__tests__/uri.test.ts create mode 100644 src/services/code-indexer/chunker.ts create mode 100644 src/services/code-indexer/code-search.ts create mode 100644 src/services/code-indexer/uri.ts diff --git a/.gitignore b/.gitignore index 211d06aa199..8fc0387dcda 100644 --- a/.gitignore +++ b/.gitignore @@ -23,8 +23,11 @@ docs/_site/ # Dotenv .env.integration -#Local lint config +# Local lint config .eslintrc.local.json -#Logging +# Logging logs + +# LanceDB +lancedb diff --git a/.vscodeignore b/.vscodeignore index 19d2ddfe364..cb18c7021fc 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -41,4 +41,7 @@ webview-ui/node_modules/** !src/integrations/theme/default-themes/** # Include icons -!assets/icons/** \ No newline at end of file +!assets/icons/** + +# LanceDB +lancedb/** diff --git a/package-lock.json b/package-lock.json index 36619b8d43c..3bea7c2340c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@anthropic-ai/vertex-sdk": "^0.4.1", "@aws-sdk/client-bedrock-runtime": "^3.706.0", "@google/generative-ai": "^0.18.0", + "@lancedb/lancedb": "^0.16.0", "@mistralai/mistralai": "^1.3.6", "@modelcontextprotocol/sdk": "^1.0.1", "@types/clone-deep": "^4.0.4", @@ -49,9 +50,11 @@ "string-similarity": "^4.0.4", "strip-ansi": "^7.1.0", "tmp": "^0.2.3", - "tree-sitter-wasms": "^0.1.11", + "tree-sitter-wasms": "^0.1.12", "turndown": "^7.2.0", - "web-tree-sitter": "^0.22.6", + "uri-js": "^4.4.1", + "uuid": "^11.0.5", + "web-tree-sitter": "^0.25.1", "zod": "^3.23.8" }, "devDependencies": { @@ -79,6 +82,7 @@ "lint-staged": "^15.2.11", "mkdirp": "^3.0.1", "mocha": "^11.1.0", + "nock": "^14.0.1", "npm-run-all": "^4.1.5", "prettier": "^3.4.2", "rimraf": "^6.0.1", @@ -551,6 +555,19 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, + "node_modules/@aws-sdk/client-bedrock-runtime/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@aws-sdk/client-cognito-identity": { "version": "3.699.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.699.0.tgz", @@ -3907,6 +3924,168 @@ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", "license": "MIT" }, + "node_modules/@lancedb/lancedb": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@lancedb/lancedb/-/lancedb-0.16.0.tgz", + "integrity": "sha512-p7m7MfBDH7+4OrfhCUi/BhcpOiuZi8RDOggLohSTImZWazhGDt/ROi6a+tjTuapSYbK9dqIFjSvjGAKOvgPHEQ==", + "cpu": [ + "x64", + "arm64" + ], + "license": "Apache 2.0", + "os": [ + "darwin", + "linux", + "win32" + ], + "dependencies": { + "reflect-metadata": "^0.2.2" + }, + "engines": { + "node": ">= 18" + }, + "optionalDependencies": { + "@lancedb/lancedb-darwin-arm64": "0.16.0", + "@lancedb/lancedb-darwin-x64": "0.16.0", + "@lancedb/lancedb-linux-arm64-gnu": "0.16.0", + "@lancedb/lancedb-linux-arm64-musl": "0.16.0", + "@lancedb/lancedb-linux-x64-gnu": "0.16.0", + "@lancedb/lancedb-linux-x64-musl": "0.16.0", + "@lancedb/lancedb-win32-arm64-msvc": "0.16.0", + "@lancedb/lancedb-win32-x64-msvc": "0.16.0" + }, + "peerDependencies": { + "apache-arrow": ">=15.0.0 <=18.1.0" + } + }, + "node_modules/@lancedb/lancedb-darwin-arm64": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@lancedb/lancedb-darwin-arm64/-/lancedb-darwin-arm64-0.16.0.tgz", + "integrity": "sha512-FL70HVAODMcu7SNxNOGK2z7XdWjb2zcFl7AUwK9QnPXds1h1pNT2uCJgrrvpDzPgVMzPEBH2+FTNT8iBvc3n7g==", + "cpu": [ + "arm64" + ], + "license": "Apache 2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@lancedb/lancedb-darwin-x64": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@lancedb/lancedb-darwin-x64/-/lancedb-darwin-x64-0.16.0.tgz", + "integrity": "sha512-q0Tgk30SuhGZhWaSjlM9Gu6Z9zygzicGubJtls51rm0d7lx9qoYP3hUAmCqJgG65uZtwxdZ41FRomKOuuVgSYA==", + "cpu": [ + "x64" + ], + "license": "Apache 2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@lancedb/lancedb-linux-arm64-gnu": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@lancedb/lancedb-linux-arm64-gnu/-/lancedb-linux-arm64-gnu-0.16.0.tgz", + "integrity": "sha512-WHWx65tC13xvXjW6yqDqHO0GHXxxl+yyOalUI/sLGHcEqokI+tJY8CRvkVgwTOPBjVpibz34eSknaKQFKewT4w==", + "cpu": [ + "arm64" + ], + "license": "Apache 2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@lancedb/lancedb-linux-arm64-musl": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@lancedb/lancedb-linux-arm64-musl/-/lancedb-linux-arm64-musl-0.16.0.tgz", + "integrity": "sha512-RiIpWF+aJqgbPAaxkPVO1NuXFNZxVyl4aqif0aA9i7FntSrLAUheDU5TD/J9rD2HGgUxHwbkVb6LGwoq+KDpSw==", + "cpu": [ + "arm64" + ], + "license": "Apache 2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@lancedb/lancedb-linux-x64-gnu": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@lancedb/lancedb-linux-x64-gnu/-/lancedb-linux-x64-gnu-0.16.0.tgz", + "integrity": "sha512-P4UnXgkhODg4Br9QzJJszbkbk4o4HfoC8prn28sH3UqBdOXbUNQz+23OSFj+xFrBMbpUWuhU6N43G9MtS30e8Q==", + "cpu": [ + "x64" + ], + "license": "Apache 2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@lancedb/lancedb-linux-x64-musl": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@lancedb/lancedb-linux-x64-musl/-/lancedb-linux-x64-musl-0.16.0.tgz", + "integrity": "sha512-8O2m7zwL3HdW+OimD7U/itdx/cyOKsP35ssrcy0p6cLEuljDunMqsj66pTggI2fmlu9KxloqYqjwczktB/mZLg==", + "cpu": [ + "x64" + ], + "license": "Apache 2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@lancedb/lancedb-win32-arm64-msvc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@lancedb/lancedb-win32-arm64-msvc/-/lancedb-win32-arm64-msvc-0.16.0.tgz", + "integrity": "sha512-Kfo7drJX2jNQ3ojH0JTctwwOQeRGyEpAqJFkVN3uRMXyT7RotjCmSAKcLI0gIS1+0HveA5V8Z6wj7c7SNIboWA==", + "cpu": [ + "arm64" + ], + "license": "Apache 2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@lancedb/lancedb-win32-x64-msvc": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@lancedb/lancedb-win32-x64-msvc/-/lancedb-win32-x64-msvc-0.16.0.tgz", + "integrity": "sha512-n7D9tvkE17FLs5Knoj9CL12IxBiLotnQu/qXHhfyLmh7DsTj4/21Jf2trhfD9L3eIKZnIdwUxTaY/hsQrrnDeg==", + "cpu": [ + "x64" + ], + "license": "Apache 2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 18" + } + }, "node_modules/@manypkg/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", @@ -4077,6 +4256,24 @@ "zod": "^3.23.8" } }, + "node_modules/@mswjs/interceptors": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.6.tgz", + "integrity": "sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@noble/ciphers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.2.1.tgz", @@ -4151,6 +4348,31 @@ "node": ">= 8" } }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -4777,6 +4999,19 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@smithy/middleware-serde": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.10.tgz", @@ -5854,6 +6089,23 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@swc/helpers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "peer": true + }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", @@ -5905,6 +6157,20 @@ "resolved": "https://registry.npmjs.org/@types/clone-deep/-/clone-deep-4.0.4.tgz", "integrity": "sha512-vXh6JuuaAha6sqEbJueYdh5zNBPPgG1OYumuz2UvLvriN6ABHDSW8ludREGWJb1MLIzbwZn4q4zUbUCerJTJfA==" }, + "node_modules/@types/command-line-args": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", + "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/command-line-usage": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.4.tgz", + "integrity": "sha512-BwR5KP3Es/CSht0xqBcUXS3qCAUVXwpRKsV2+arxeb65atasuXG9LykC9Ab10Cw3s2raH92ZqOeILaQbsB2ACg==", + "license": "MIT", + "peer": true + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -6313,6 +6579,7 @@ "resolved": "https://registry.npmjs.org/@vscode/test-cli/-/test-cli-0.0.9.tgz", "integrity": "sha512-vsl5/ueE3Jf0f6XzB0ECHHMsd5A0Yu6StElb8a+XsubZW7kHNAOw4Y3TSSuDzKEpLnJ92nbMy1Zl+KLGCE6NaA==", "dev": true, + "license": "MIT", "dependencies": { "@types/mocha": "^10.0.2", "c8": "^9.1.0", @@ -6623,6 +6890,7 @@ "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz", "integrity": "sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ==", "dev": true, + "license": "MIT", "dependencies": { "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", @@ -6786,6 +7054,34 @@ "node": ">= 8" } }, + "node_modules/apache-arrow": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-18.1.0.tgz", + "integrity": "sha512-v/ShMp57iBnBp4lDgV8Jx3d3Q5/Hac25FWmQ98eMahUiHPXcvwIMKJD0hBIgclm/FCG+LwPkAKtkRO1O/W0YGg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/command-line-args": "^5.2.3", + "@types/command-line-usage": "^5.0.4", + "@types/node": "^20.13.0", + "command-line-args": "^5.2.1", + "command-line-usage": "^7.0.1", + "flatbuffers": "^24.3.25", + "json-bignum": "^0.0.3", + "tslib": "^2.6.2" + }, + "bin": { + "arrow2csv": "bin/arrow2csv.js" + } + }, + "node_modules/apache-arrow/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "peer": true + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -6797,6 +7093,16 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", @@ -7403,7 +7709,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7415,11 +7720,26 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "license": "MIT", + "peer": true, + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, "node_modules/chalk/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, "dependencies": { "has-flag": "^4.0.0" }, @@ -7732,6 +8052,58 @@ "node": ">= 0.8" } }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.3.tgz", + "integrity": "sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^6.2.2", + "chalk-template": "^0.4.0", + "table-layout": "^4.1.0", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.17" + } + }, "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -9072,6 +9444,19 @@ "node": ">=8" } }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -9170,6 +9555,13 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/flatbuffers": { + "version": "24.12.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-24.12.23.tgz", + "integrity": "sha512-dLVCAISd5mhls514keQzmEG6QHmUUsNuWsb4tFafIUwvvgDjXhtfAYSKOzt5SWOy+qByV5pbsDZ+Vb7HUOBEdA==", + "license": "Apache-2.0", + "peer": true + }, "node_modules/flatted": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", @@ -9390,6 +9782,19 @@ "node": ">=14" } }, + "node_modules/gaxios/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/gcp-metadata": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", @@ -9678,7 +10083,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -10238,6 +10642,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -11366,6 +11777,15 @@ "bignumber.js": "^9.0.0" } }, + "node_modules/json-bignum": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", + "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "peer": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -11396,6 +11816,13 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -11823,6 +12250,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT", + "peer": true + }, "node_modules/lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -12467,6 +12901,21 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/nock": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.1.tgz", + "integrity": "sha512-IJN4O9pturuRdn60NjQ7YkFt6Rwei7ZKaOwb1tvUIIqTgeD0SDDAX3vrqZD4wcXczeEy/AsUXxpGpP/yHqV7xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mswjs/interceptors": "^0.37.3", + "json-stringify-safe": "^5.0.1", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">=18.20.0 <20 || >=20.12.1" + } + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -13008,6 +13457,13 @@ "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", "dev": true }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" + }, "node_modules/p-filter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", @@ -13506,6 +13962,16 @@ "node": ">= 6" } }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/proxy-agent": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", @@ -13550,7 +14016,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, "engines": { "node": ">=6" } @@ -13770,6 +14235,12 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "license": "Apache-2.0" + }, "node_modules/reflect.getprototypeof": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz", @@ -14494,6 +14965,13 @@ "bare-events": "^2.2.0" } }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -14785,6 +15263,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/table-layout": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", + "integrity": "sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==", + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^6.2.2", + "wordwrapjs": "^5.1.0" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.17" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -14948,6 +15450,7 @@ "version": "0.1.12", "resolved": "https://registry.npmjs.org/tree-sitter-wasms/-/tree-sitter-wasms-0.1.12.tgz", "integrity": "sha512-N9Jp+dkB23Ul5Gw0utm+3pvG4km4Fxsi2jmtMFg7ivzwqWPlSyrYQIrOmcX+79taVfcHEA+NzP0hl7vXL8DNUQ==", + "license": "Unlicense", "dependencies": { "tree-sitter-wasms": "^0.1.11" } @@ -15150,6 +15653,16 @@ "node": ">=14.17" } }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -15276,7 +15789,7 @@ "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" } @@ -15292,15 +15805,16 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/v8-to-istanbul": { @@ -15345,9 +15859,10 @@ } }, "node_modules/web-tree-sitter": { - "version": "0.22.6", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.22.6.tgz", - "integrity": "sha512-hS87TH71Zd6mGAmYCvlgxeGDjqd9GTeqXNqTT+u0Gs51uIozNIaaq/kUAbV/Zf56jb2ZOyG8BxZs2GG9wbLi6Q==" + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.25.2.tgz", + "integrity": "sha512-QfQdqcxIBDUn221amRY4A/KK6dBL3NjBOEP40QqHlkRBVGbeO0CHg4zpvtVcF4qC+cUefqZF4aSY8BSnnazlUA==", + "license": "MIT" }, "node_modules/webidl-conversions": { "version": "3.0.1", @@ -15666,6 +16181,16 @@ "node": ">=0.10.0" } }, + "node_modules/wordwrapjs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", + "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.17" + } + }, "node_modules/workerpool": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", diff --git a/package.json b/package.json index 9b9fc5a86b9..fadef45b00d 100644 --- a/package.json +++ b/package.json @@ -286,7 +286,7 @@ "lint-fix": "eslint src --ext ts --fix && npm run lint-fix --prefix webview-ui", "lint-fix-local": "eslint -c .eslintrc.local.json src --ext ts --fix && npm run lint-fix --prefix webview-ui", "package": "npm run build:webview && npm run check-types && npm run lint && node esbuild.js --production", - "pretest": "npm run compile && npm run compile:integration", + "pretest": "npm run compile", "dev": "cd webview-ui && npm run dev", "test": "jest && npm run test:webview", "test:webview": "cd webview-ui && npm run test", @@ -308,6 +308,7 @@ "@anthropic-ai/vertex-sdk": "^0.4.1", "@aws-sdk/client-bedrock-runtime": "^3.706.0", "@google/generative-ai": "^0.18.0", + "@lancedb/lancedb": "^0.16.0", "@mistralai/mistralai": "^1.3.6", "@modelcontextprotocol/sdk": "^1.0.1", "@types/clone-deep": "^4.0.4", @@ -344,9 +345,11 @@ "string-similarity": "^4.0.4", "strip-ansi": "^7.1.0", "tmp": "^0.2.3", - "tree-sitter-wasms": "^0.1.11", + "tree-sitter-wasms": "^0.1.12", "turndown": "^7.2.0", - "web-tree-sitter": "^0.22.6", + "uri-js": "^4.4.1", + "uuid": "^11.0.5", + "web-tree-sitter": "^0.25.1", "zod": "^3.23.8" }, "devDependencies": { @@ -374,6 +377,7 @@ "lint-staged": "^15.2.11", "mkdirp": "^3.0.1", "mocha": "^11.1.0", + "nock": "^14.0.1", "npm-run-all": "^4.1.5", "prettier": "^3.4.2", "rimraf": "^6.0.1", diff --git a/src/services/code-indexer/__fixtures__/indexFile.json b/src/services/code-indexer/__fixtures__/indexFile.json new file mode 100644 index 00000000000..14c28fcd70f --- /dev/null +++ b/src/services/code-indexer/__fixtures__/indexFile.json @@ -0,0 +1,50 @@ +[ + { + "scope": "https://api.openai.com:443", + "method": "POST", + "path": "/v1/embeddings", + "body": { + "model": "text-embedding-ada-002", + "input": [ + "class TestClass:\n def __init__(self):\n pass\n \n def test_method(self):\n return True", + "def __init__(self):\n pass", + "def test_method(self):\n return True", + "def test_function():\n return 'test'" + ] + }, + "status": 200, + "response": [ + "1f8b08000000000000038c5acbae2d570d9cf31547770ca8fcb6f32b8c088950108f011920e5e791f7be8174f9a0700777d0a777f75acb76b9aadc3ffde6e3e3cb3fbefdcbf77ffaf1cb371f5ffefac33f7ffcf2dbbdf6dd1f7ffce3976f3efef09b8f8f8f8f9f5eff3feefcfe6fdf7effdd773ffcfdcfafdb5f7ffce1efdf7dffaf2fdf7ce03f57fe7bd3cf4fda7ff83d0421d199bffde545159894e97f2ffe6e6fcd36643d2f62221a95746b8f893e9e298941c73c2e22f65acef3d75ae5daf4489d9c463d1f8ab6ee113b0b8dc2c8f3fd31a6a6cff7abb98fa9d39e441d3395f400534f6dbab72544a49e8ffd6c039848cf7e6e405d7ce27909d9adfe5ca8b858a437dd3ab08ab3a4aaf0a23395285439ef341adab426b801e2c6eb97aa50e1b749f664a93d975b6919e6cfe74a78fa8cd3ce3a559dd24ab3acdb9cd3aa33c4696156c8298f1344a9aea6cb62a3ae1594465913c1f9eed699f1bcd5d0e64aa905356913aa218d3479e6104a6d22838b48ac22fa9c78a6b517f8726b64e3242d32ab286d52750b870f57857fee5bda9c741b3013ca399f2d2f5e934a667418ef403b5043d9213992c6911147259ea76812e5e0a29774fb651ebe8295812e460243f4a4309474649e031c410f1fb698460923842d6e4c1ad54d239c02dede3554e1187360f84d8af0a19ad1341d1d42a2927289e7db4d2b758680080817a59f03403a685108f771424df8a85b3ccfda4c3aca8b16e5d656071da72c4ea4a7229381a4466c52f9098cf0af0788418a6f0d8d1aa314302924ffbe54734e00a40de617313ecb00844ad353334d037c04be4034dc370d1a3a9cae40193db445164a0e6e678f2541a939063e67fd05336e328d12a71448d51e5a80a6aa2565c5a88a0cc3ca844db89eb6117057ea05b3ed70e2a0c8d424f77373b1e4b3d24e170563b6aa6652e7de8e2831cde0e493db6b99a654250121aa1d796184f7fb5a80c5c69b6320ed9ec18dcb3a9b7a499648159d777a642bb8d19b9ad4613f5189e83e2d66c3cb195393d938ddb053a8e675b6e208ddd4c454f39c2b7cc41889b6453a23796a16e8b03caafbd4b1aa9a8d9e782f2f8370e7964dd1e70adcb24228b05e11c31713a80c7071598fde3a12cf4394dafdb47885bb351de0ee282298d0f8e03087406b371140d8f464179d75bab710cf52d7a5bb1cab41ea038a5f61a90eb5f915747ba113a647b88c3b124c9cd05d22c2192c5da20cfa3216365c84988aadb7936e9e32c500bb0423507c151596c935f7995e9028ad4b8273ab23a88a2091440a17ccd50e4f4a5371102152774d2649abcab49ca99b148a334eb20b46d44967fb2428e134f7bc8a12deaa22825b1c2a5d922497c858c2383b75491d3373043c238e9473a91826d1856ccfb30615db747e6e2dca1bd207772c46cf89bbc370b2c351c3698719f1e85f53b8afd576575085b5052249e0a9a24ef79eae6675342b2318c91021dd7ed328a6dba8ee45cd239803efe64d9a1ab062552a23ffd227466e930d2e2926496bf1791e55dab22da6753a1b416134d065b18cdb296e45c06b8b9aa4db4d204308798ae86b27483dc1f7b44a0e14666b83bb0e3ce041b79658481e189a00ad1dea706b6ed1088f31e64f16915684b056930deee68739bcf9c8a42a3397c47881958aa43ffc9d77334734e38dafa6e46a1fb7b9810e9712ca28998e18a68ff0c84d6b42bcad80618a30e5935c2b193ade1c575d19ad9c69eba6f4053149a5beafb10609255f96e6ed4f15854f2c1659adc04bf5c2b39b7fcd4b55b7e697d5c891fbe5559664316164bc0e2eb8854e1783f3eeeb74b22d2c65c320140f0479777e24887998b8c4a1c95ea8387c50a6a48ec5034cbb5e46b05da7832f6b444d1491f565dbec294a4a1bf3b47547da8df12e4c8b2d4189194e6db44d70bd207d7932a706223809443b5c867e9fa8d6e1430134a7867bc6d5156f77615b29eb0a095f240ece6ef3e6e4d2ec7e5a09ef4d743d1d96f755f3e8614f6e85f03863d1763de30269d7912646e2884a32a097618cb299711ce0f7fb67da9a0e1c235dd3b7923ec94fe929344517d6ed6b8a9cca6f633f0d62a956a437e4a5bc59f249a72769abc508b645e12e7a3dd8cfdc1083990a794c163110964099fd58e6d794eb35fce34476bc1341bbf2d5215c47b662bcfda49118f7ce2574b27ad68f696d3e75ae625cfdc8f909b123fd3bba4ae868cbdabb5961ad05567a20710c38145443363a4c40a42aa9a26d4d95224301be7ae12a9c52bb7669f9ba604c616d7d0ae55c708f1d15508d88c7832dbf8b713b1ba7b2abaa0ca90e98871835419996645f4a6b151d475c251cdcec346295a7feaaddf669b379c3bfa23ae79870d6e6cc4eac03537694935ab60adb70c81a568930afaa63d3af973d9843e6668449335e0c798a45f0c4c8d61a1fc5cac2be6e9c6e7f3a7ee2e56e58e6c8ee8c444a286b7b8d95d1cc53a7538691416a3da3e34320872f76a71fc3641bcb7c32198c4a3d26e12ab263738acfce7c4e914485b3a90cd39e906bbf8e61d2ec57b6f6ae934165e5ff9338d801df9c1ea99b4fc6a56abacaec685bebb139dcfe131358b3d769397cd3acda98be94740e05dd4c35ec10f62db6612f2056463189568dc18383fe4c4aba5833984870e7096db7e019dda7926dc395765e05b30a39e6bcb67890100c4b1f1e1ae966823138ef78c28a9ddd578ec905801d672deefb31750ac7cb2ef4ad7494c6581f2814373bfe342aade292801acd3870aaa53b14204da7b58c85dde82ef13393ab76bd1420e64cea90e2c3a6a1d854895cf3c4bd99a0c24b720d7c7e5b887a7107ffb4278a254a890961525d8c4788969a34ea58f5953cec92b28e50b6151085633a9e8a7abd7e5c98e66f0e94f111ae979dce74fe53aa7087d35fc553749e65d54e2085e4f296637af2bccf162f9dbfa80884495e1ea6727dbcf4f23cd27647f7c20ee7e7b3215be7f68aa05ef6cd13a31de3b16497c595e1f1a8183a88086eb4aa8acdb99dc45e99a033902bc07a0917a365479ebe897c4dac58e7c05b9f0b700d1bdca9f9a7e31eb3a73bf4ee2c510d1ec5eacafdf0a3d8b3b90fbe06ccca44d61d53c3d9dd0928f14d53450bd7b1c5a21685aac2d07e86ced6157994834680a745626a6568fed22475980ce83afad7e0e28f7dfe97c2b883d4b76b05af3ed9d2b66e10ab6dd59929fe74c2bcf2d8231a08913399592bb78e704973e9fb1196b4044f054e1f7e139412f6ff453312d70741197dd7a3ba68c6868b6312ecc6360ee8dd71df5ba1ad694eeddac7d1253c67d98fc84ef3ed9cccc3fbf64c83def5b9412e33deceec48676ca7ec4c5f53ebec6b7100654740fb64f1171d819dc673e380a55215bb2cb7620b64fb346bb6b1ccc764f3eba44b1c0cadb65f25cd9937b205f3ded59a40133ce5c85cd57842ab4f47fd7d841538d3c19da3ee48e0c02b628e484556da14a9ab9783204c113f697e5f6725157598233a767a7ce77bbe3361b6f1bb320bdc6732768c423d5c074aeea3f8badd3c6ec2462d1fe8f916cb954a939dd7505f950db54befdea6209a5d4d91757268fa0fcb4cf01c6e83767c2b4897eb3081dfafdef6034216ae1577b61332caf3779b1a393d1d093fbe7042eb0c2edd978631e1e229defb8399d64376643981f3c716213b0b655f62bfe9fca542fe37000000ffff8c9d5b9223c98e435774c79c2f27b9ff8d8d41a1fe4820ca32fbbb4b150af983040e58ffe1a7aedea29f0461c487c1cc08f4f42e7b29acf92abf7e1eb6a193ca6e7a7bd9a720abf2ae81e718c115ba9fda6ad61ebc660ee364f8cf2aca0564f5f533625d45e17210a7b8005bca25786e439b1c5eb8edd322b8d6dd2cd6a9de501075b59e2e0c36490b64538be5137c6bd5a476463555ed2ce4f4874be26b7fd35b38dfc69fa7658e1a6beee1b59b753bfec6cd564f8bb59c3b6ddab71ef09d1ef27ff765e1f9bfc622b9a65d1b41163d8f9eb690fbc05c168394032ef9e75131d6021878ecb2829115166c18b655bce166905092a1ea3286d7e102a3f6601f74ba2cd45d3600e4d2f9d70580ce37cb264e3616d92c675f8a62a853ec6c0980fe452cef9e2b85c2617f1992edc9e4132806fd79c8878e0b927280a69fc3b56ef94094e476058b8e2bad9cb87959c575f0ee7c913a1a1e9665d250d5695ec066f8db9e328f102bb2d2f7ca811be061053285bb57bc11ce5cb049f4974d1c77bb422e5ac09e6292ea5c3684fd9af5ba300dd733c5219d9dc823122ac4446ebbde651dc3ad7d594d7f27b8fdde152476f1d29331785b7c0fa18a5b78cadc01f927f86da559cd5ff6824d48e9657707d03d1fb3fa556d03253fed7c68a4992cc8ce1e263f4f3ac82cd91e5678012c8ee38ffb7099956563d473bdd7cb10299052492168e2e8a2dd0293987f28de5efd3d6b73e31bc1af65067fa8fbc2a79193a3ee6561eeccc6294e04f9e7ba663fd950573347ef9696237110c0f972a23aeaea62f562726fb93a45b35724b0c26fdb477abc4601c5cbf3ad250e144962440c50b0624a2f2c465af72a6c91107bf2de16abdde15699ac83e85094ddf2dc2de645eff14abd70412d30de8063ca59d4865ee261ce7a6e554d8a832c48dcd7df8b3601b7c16287360806804ba434eb0dde0faa9a7d7bfb7b5f28714f0262ceddf4602dd07cee69725e3e85c0713e53c6b34b6ab78f8dc695875b15e00dd6e2f2968ba80cf7971f36a63b56d0f30180cf9bcc406bb1350898993d1ec8e2ce7fd39b40e8199deae7d6865d690df686df17ab5ed32ade1f1298d3556557f26542773ce724968bd6bed08c9a411df1f41e7908403337489133cb7e14e382cfcf7adc580eb638b1262ed9696f7e57eaf33dcdcaf64d859ed3718b88139b99c259419357f287b23d8f4e702309e679ff4ca0a237a5570aec38b9020dd5ca61e16e76db4be0c406fdc4dba8dd7001685e2725d389579339ccb84ca607ede457f9dc7b72c4897ecd7c556e35cb71b64084e4a07f5d4553339cc4faf0b673354ad633c6c5a4a16516afe2cd04b60b6a3af4152eb74086f465e5fd03516555eecd96db149283522e7857f2364c204dac9c367c12eee0a07d8694dd1ef712081b76fdf21ac60dc56833acea8ae0a2dbe213c191e30d62dd1dfb0d9d783667cd942bc8b9eb12fb4a473262f878cab3ecc1a02dec96d6c1fb4ef07594dbed5cad98f94c6b3f2189d2e757400896541a75d73eea00fa3231e7052f78472c3e5d02ae3ee366f1eecfaaf3a9bcd198310c6bc8244a6d9719522e7deba2f803f93af9127ed84a6e400d1a9ae0a16f9933e0b92e717387c77fd8450b7870f1ab2df03ce81d638cd66b2f7758300583fd877307f7964bc412dcf3683b182fa893f595ea7e7cfbb4f2a664c73f1feb1b3f98df6f6d1c3fe5c37f8e0c80cb5e1d978970709ddcc10fc2affb6bc0ee9ba4bfb83824ea028158109fc606952326ee91fbf053c21a23f4ef04fa296b3f6ac370a9f2d98783d723d2f9ada3ac02b82809cb20b6e523799503e68b6a30649805323e710b4a19bf9bbd99125ff4719b642b8a21e3078ee90d7989e809cf119ea77aaf37cb8f1e15366ca0a07362e3348e02ffbef7cc308135c87f720986762a8ecaff83a68765f66cf39df8154bf8ba9fd913faf751d5fe6cb34e55a70b1c8db8aae980ebc5c7ca1bc98f6b7b27f9633dcb36a587767479cbac64f7a6a6fdfca477484c3eddc4ae0834c6acd294a118e63897884c0f8602db5038ab055d20efcb005cb0e01a5e63ea95febc2c9e63dd473c2fd4b1e66219dd88d6da20060dbff4b435eb77b977615ff611dd61874a567f3e3b924bc9ddcb3e10eaeb344eda4b78fe31448042988a4494b87c601eb7564e7a8ffa2c07a312ecf0e099d78830ea8092bd008f111fc1d4435f8f928b689030e5d2f342be62d5e46d16c8fb4416f868f7664af41548b273b6ebce9a42d1f049a3547a47e8ac6540464f0bfffc5aa922bce0a63565a1436d0dac30c2f3f4b25e2ebc5765d71a37c3d31152ef072e2ea98b07d0a8068c1c1d5f4a0623b72e27f5dee3e511b1dae4a78ff17dfc862ec2de4333c8467232ab81b37d4b1a749952f1ed9afb84e409c291c993f46cdc4e97dff733ab659d5ba90af8bebc57633a959ffee8ea72904b3bfbc453a64ec83c0287fc2c1b10a7e8f292f6cf261edeed376a39517fd22d4599ba6e9e9c883f519f8344e9d85312dc76e4af46b22c9f59512eae0d7e501e99010e95e70e796687715571172b9411a119c830526bec4f9ceb7b32f98ce0e28e6655160e86f61c06432a32e6a8b35920b00480439293f9f8d7095086d6837e470373cf015b8328c04aecbf00ffc2b809dea3b7409a49620f2e99ff695e065caf31c97f3d78104b0b1894a4824d77041f13ebda69bfce240884ce576c90c2ac2cbecb3ada6e730386a3dd827dd581e6c1fe6501900e9e67b33dbb47ac8dbedbf20875f7c809e6a019f83bc43debc6a7cc7685749030805da1f4776502e32d565badc48389197f30f1a12e8f2d3b1b7eceaa26eaa3770e0b2c1f05bb90de94b13e8dab80d662633f1173097b9c0f71c7c0b0bda2caa36967c1641647357f29d856bc38e17d05eb209edd47eb32cc6a32c1b95ed43c152e9fe328771492eeada89f2aa9fe845fab7466c516b976c378961ca607ada03a3b875fe02b08f9d1998f4cffc95c8cf8084e21a23695194c17c492f8f85d7e6442ddde6a75b62fd246c3b24da3af56beb49297e0017d93fda270f515cbc9f6ed983f857922924cae899f29bee740036461429982e0131c221b2867fee6233f5074371a53d949f7f81bfe3c26b4f05b68bb301082e1caea8a604d0a415be7798b3223e2c93c229e697cb36fbd4831305b737525c51c520adf78ab0f935bbb254f307df22fa3b00cf363749c980742c90ac4bd668220a31f099d9f4a748fa51dd5198c471489438b7b8f38c985b9356e77dee807b398b8b00778b63a9930b0c02ecf0f6997611d8697789802322c5a89ff4d25e84f4aad07a871c96cbfeddd7fcdb0bbb9613244ceddc68ecc6ad829f984b7d128312811e411167331347c02c84ae657e5b59168d422d2c7471514c42359a1f301ac567513e157bfd7330c52b6cd63f6ba0cfbeadd105f0b49db6e319e715e778a273059a32ac36d8c7e919967b06b6464ea7b9067cb519d7208d8ac94cdc8b3152d561a505505afbdf733ca546621d8f230dad701ad98665751526b0841f0bf7fb703b07d6e5e9998e9f723814adadb43083b3f9ba5d3a816c60bb1337b5abc0c073240bfceb9d70f8b06488eaee4057210a5d1e1a0c0f6585aeaca8f47c5c471dafd53e412e3f37838cefbece4800b902b096b54b1923e7b4b366872e569b3e0aa4b4824edb01d84ed8785ef9a73a9b6e8970690b4eda737ee9e9461bd0ebff3c50b0800fe1cf8daf12dadfe4deee0d7918598e69a5c8a7d86afde96e11196792e63e29f07601717ef26c5c8c74a5c490bbdaeefde5d93ad3be6a09d788517de02ffbe8c0cff579f9d910c8e5a42cfa53c38f3e496b9e70d3b43fb20fd31b46da840022062bc80043a175d8818f2174c1d83da0e1138c50adc911450b51f591f18897195227a4b54c0e431ed1885fef8f63bd7798a291a80d16cef4529244036eed52b7341f7a2e3e10eb936ad984ead9e121d4ea0b3ef540b8ce81ac6e67cb97c7f4d8aea35f2deb07de12458ac9c614a60f8d2ef60a64fcaa326f236bfa952ff3bff6717b3f058d38117c22ebbc3d4d3c93373110d60b615a08c122c70c93944e4a8e8a55bfaa096211a314fc9fed7b34272f59ff3f11e1f603153430a8a9d337c391986bb846e2fce6abe8f4bfa76929bea70c0515a4eb819da0a8ee19e4dcc85a47938f7e322ca40664c5ce15fe175209b4cd87ace5f148dc22564683cee13d794398b7bfb8a52feeea5bc27dcb5c57e686a007172b10dce5ae1a1e3c2c7643d1a151d1f7290546496d7ad0f7925fc28cd74feaa5725f73ecec2c17790e595cdeff6638c5c06f284c77e7ae6be47548ab5c568c0df69b6d8b84250200cff1158e9a1406a0ab9fd3a81f3140084fb5b88e221802b443af171a0385490be556960325bc033f4cacd4f651f22938bb42c24008ae97b88e6cc0cbdc634dfc17140e66b2515e1db857230938f8d92572fdfc04ef2d0d91383d8b9242217f34a59a7ba9632d7e3754cf0ab5f0599caed28cd60d5badeada3c89271fccb133332e305552e099b81d3bc4efc62507eafc9c1912c23f9306f237f891f3c2751bae08798aa31f770dbe9016c80530d8178b490c19da591aeef78f7a331f73cc5a99db1686e81721d538e9dd50200988257c7de5b57123e67eeff030000ffff8c9dc16aa43710845fc5ccdd2075b7a4965f25ec6563133690cd258740c8bb8792fe0d992a4d3ca70563bc9edffaa55677d5576a9ec2ff242dbd938fd1401b11ee6949d4a687830e4fb23de3e158bd2067708c0ae8f648d94228a1c7c31aa4b060c2a6417ea28b165d05b3468eaaa3a3b53ad441b4bc4fd23355f0ed99746d32bd06493443eaf31845dc9d150544b2601a9022f9636b90cdeb718fbb362eafde389302dd56b4a8a8d8a8001ee8dbdc5d4eb4e3a40817adde521be7ebe6cf43f8d95d387780c654a1d927420de4625771f890240f1d36d1ab9ec64c07bdea1e7480c3c86b0b289a83eebcebe801f100ceed2e0a28ba36a3c5b613cc1f7af37a1709871a5d1856108da9ca0fcb58aa92186682aaf6de0adfa71c770c599d36a1a756a7439b167a2303379daf0eb0a0a38bfbd92e792db909562b77ba30cbe41bd99afba61c2ba84d98aec541363b55620c91c2a24f36353e01123dc1f77bad3565c60db2a424503888c554999ce77d1ee874c948e840e1c22438c51beab83b091bfad03f8be9ad09dad9a3a79c9f107d5757b9ec81ca371a4c60d2be44155d244807b614e77293c8097bc01e318c05ee6856b62165fc5ca9104c2001f15bd2798010e49f0af8d5bda8f5f551196f2da6820156a64397563dc09c2137a493ea0f247ee3e1fa415b770def3ad3e5358a698f612347e79307cf5516bb94fc7bc78866ac4eb2ee506ac4133ef5d2d2747f431338c7819d79d0bf407e83982ea16ae0e0522575850e597ab057cd273a071420126673a445812d3c7c2a4037adf1a162f8cf843377b6a27a99d5ef5002fb5b31c9a197f438b3a9a838d85669cb95c850f8840b4564c438d6229f622b76741bdaf8649e75fdd987a2774a8e915d0daba77196798cc674561884c3a50f0118e598aa1e6fd5a60af379d881af82a8e6934d0b91b1c6e1fcf6e4bd397fbf91a35bcac4e9a4f93dde62955eb19f579d8aef04f9f62e486a23d4517648c550fa481e11c03461401ef3763bc33a1f21cd53b0a0cb49d1bb4e510fb973350c2a4f5edfd97c28279c3fc3f6f9d83d827dab3c7be75f156e96c2efe75a9c45767bfcbde641b709eca63410e5fef3b043d4ad571eae8dbeb46a52cab5d9a4369ac035896dd8b185ab8ee5a8d1eab00032dc65622222294858de32508598a04aaa23d40fe942674476099b744fc9239035f719f9dc94f624dd52e3ec65b2f131b59d037a717c0239bd0658a888158a3cc75011087a6f124aa2c2d77dea6278aa3cb00e0287b4cd5b8e29a660a4c5c94ac0d605d0b7785fb81d7f297531659c726f0f77b99e9c71e9868a861d6240c7e47d90dfc51cc1e3a4b64a4416a69ba0c5ae8cebd3b049c9ea57e31d94c22a4f175334314139602a4d37c61121b7a65ae17493eb4d5df8716e30a647976bd740222737531d7b2b5fb0020b5229c1270cdc0f099402c06112a3bb40030ec068fd3710ae8a2495d69953831dd08d1339676f4384030de45d4e0d594b467c7a757a0d29cc547bf83f4bb4faf4a14d90d991be2496fad38738138b44a0bddf60ccad24b362c0ef90f90c9646d39ab650a82c74280bf74093124edec19f61100d7bfb4cc27aadfc9912a2a334ccd7c799d0a7cca743c7642b3006888dfeb902e3e80fa9d96049af6a7818a6067e0b4c07449ae5982a4a5581d455cd94c38088bb77e26cbf16d87d1ffff1141d3dc275675623659138a92ccd8a4b83c64d4489a5379f9e62b91f4023b29393c9bcfb1a3bbc49258c036aaa13c44668a8720494acf268abc3d6dd45c09ee15e3f6b693dd4852c0d6a3b50d13906e2229d57a549b6068305cbb7ad4b2f062335591ad8d882930947a25c11a44b83c6900ebd89d4cef914d2a5aee04cee174383d74c1565beda6f6ccd86395ee3b680f46398f276f257f1cf89e9e16a2fe3e389ba063324190c024f5445cd044a8284bee9beb40b8526e16e0b473cab44158c5e8dfd4327ca26369ad488a0792fd7bf783f5114ce26c49d13d1e3fa4d67860c4e12d33ab6f31cd8550a9b7f3da8991fdb9c13603a9e68c1083b25137700f5a54c47eb9395aa78f653fadd57c49360a03c26a7532ec8870b4cf9b0c7b635cb52a13de7fd6cf1ce08b19bd8926171f5885e9069cb06aad39e7e7df1cbfaf7effd3d7f5d5fbcfdfef5d78f9fffb8bdbddc3e7efbfaf1fefeedfb2fb71f3fe6f6edfbfbc79fb7b7977f3fee7fbee9ede5279652e3f226327114bb5576dfb01cced333c38a4d5e5ce8ef1b3f1d40be60d666318235e9894d70805912027f6e111a3446fcf7e6d82d5a4b7db600cc767612a26312f26e776b29e928d0976517804ac566c602539c5420e7f1506fa5afb31a60564192003f2e4345e41db39519baf79862345fc87b653e07427ff504c604b0f2695f4b658b66cd8641132f7034beb80428de673944092c0924b332d18d5789dffe6d656d80ca2800382488857627e07a766ea8419028ce6018a1bba822d123438a254f0490a22bc57ec05fc78242440970c481258c9332d91c3e44a76c1da326be106338ca2a01287c474803135adee19a578af06ae902f782029ebd4e01351b2def2c71d8ab6b73b32562f9070000ffff8c9dcb8a654976447fa5c87980fbf6c776af5f113d6955d1b440ad890602a17f17cbef09d161e65711a38220c9acb8f71c7fd8365b26bfd9243ea343db9ecb28f74c158856a98098abbaecbd1317aad5cb9636ec5eb0a9faf2e0cb2ea627e1142cfeed7207524d6ce09cb309f55a8711aa53df187a032194b1ed1274fe028259c3904848bbb7f4a76ce36dac6a6de123cfbd53b6f61859ccef3f07a506768c2a19530f0c35f6f4f92ecff1aa5654c619d7343d2c66d5268e4c32b7bd0aab6da5b8efddcad29d025f3f232bc70f354d2b43c7196ebdee7b2c53cc7936a9d8336a769f78d0953a0d9dcd70093b4c67a8786bbb85e13bd43273480f8e323a3b996de8bf4e33a482bc2b8527e238a2caaf1a759ce3e6582ae3df765a8e0570d8a6adc7ac5ca6beacaa599d9a70a195b3121d7692dd05e0929aa323ce24c5d6fe5dc363e4d46f53c3a9022c16af61d4b89c665ea4baf856a4eaeb5065ef301c085a13de39553807040a250cf20ed920b2ccbd57559b1e47b90b2709d67335c18b920288e0b6f085ba452adaa0b62cc4deec6006866960434cb05e6df3d6e893d89b05be918fb69e9e219985e310736f0bfac498599d2f343b335379edb16454b7c391e3d220fbf4bee83349e81e828c2cdb3a250abbd4b6f5bce4d814f82af868f7e560663e440fdee0ee494b2b17a568777694691748de85bded5edbe66a699df1e5346b6a5c89039a027207d6083b51d397b2acad8fa5dfc747876b4f83ae9363f926cdddc016d24c2228edd03cad746ba3eab886c430b399501bc5db639b43b24b8b43885681b12dc53554a8d5cd5a8cc87dea865dd958b41f1b6cc8b6f3f7debb58de19f16a696201c5d0d001497ba04a800db382f938fa98c532270d8d4005165a4da74d77490ad4ea48785e0663f023eb9bc91886a1c50a5a75a73ee3bb32cbc5eb1ff6546023d9e9fd8530c49a51c85a707bb79d81a671ad044fb61675e0ed659ed9c8c352338cc732e023feaee8763e6528a80569f5e41d7c2c18589254fa995509628d36a4292bc19b03c3690934b3e4040fe3af31a982d81e513271b855c40573e8a04c9a21a1ed3ddbd4e863ad98a7fd12d900059a4f2b47f5a81b9e30e742aff23553fd4230c2a7d3690de99ae1ee6dc8dc0a0ac24d65052e8d90d6b6b94ef13e36d49c6a4a385b28232b157257ba2bef26919c549fd9e241cbcda53916ced336e664085dab0d864ff2674e1bfd33ac55e4098ba64f3ffad85d618f75710ab221c1a026b95ae6a5ef6678f189cca3caf28e5acda05cce4fcd3d418d818358ca9ca9f0a0d313278b436f6606efeb525e0dbbad4e3bda914c69be75c6c25563c1c6398d037a4cda41a79d2ed20cc72c51363a916be5eb551e5935cb64864f4e50b7b377472ae670f3779dbc63d308908b7e60f562ce59bb013e37cd8a96ba6e7bc674de1dbe5135d8ea4ef57924afdaf17c30ccebebaff68a988fba4a734e6b4d839192dc31505b6f20dcf47b00e99a7a652ed4c24cd77916c9fd69553c7deee91162c194bdce169c0de6772bc2c7f590f8596ed3edffeb9cbf7545202ed096a204638651f919cda9c281abdf04c043222d062947d55b3acfa5089129b68e6a263e11f36e4d16e676a9160f6d00e4854ccb45dd2ec3b5e6f228fd8261641e91b520f0eaf96c4751ef2d77f1d4605a3b516fa3fd5f855c3fb03cc710561f95773721d36d0fe1bef44ef6799c44fa7ec49ec3c0a9781bca1e8e66c8e203f84ef9a60e4e5109bca40ee1a6d875808638bb1fd79666adef9043c21c9fd499e89460556b0066559f4ef7409131317d7602b9a6319120937b07fe94549b5d85abef94a05326e5ea323650eb086750b4edea509aa3aced8af4a0a9be4ec81f3d8d2a0d2d266666a85334fa0f9a05bd80c29462d6e911aed9575acdf4716ddb24137ecdea04553cc7a128b79213d9c5b660aca24aa19eb596486fbc182d2d2a470b9f454b0a63264d77ee6e4733a07163a6d51e625db40eb988e3f2b6e3429e01d805af695e22687c1ab787fcbb3dd6ce28d71dffbbceae8b564b1c09df4f433e1d37d1aa51bc32c21de11d384175e2edec33dceb85bfb81b40ea0c54969dd2308a5f8c8e0c841572b0607818968f0bf3722b1fdd2356ae098abf5835cd6ed37ec800ab9af08d963e4beae28b16ea503924f2b21dbb12e67e3a1d07868f43fe9a06908a58ad5b074cc71a6fba076ba5f61462bac192a84b128baf996906292a8faf5228e8d8fe0d6049d78adeebb4cc19ed1ddd168018782d6d7ecd51598f2d6486d3414c3629787b1623e1915360a52ddbae97807694544ff375445a193515af5d1ecb6791a08c520d001d91ba5c7ca5e04e756b26c9d47458c0646778bc61956b65cbb284771eafaa09a125b59d94d41abe8ffefd010980511bca43987cacaacedefe794a4d46d13ec2eb88fa766c3fd3683fb471f5a8c3b2ca31aa654f2bbbf5a8de269bada663d874daf4f1197134c37fddab4ead8b6b6df3742ef3fe8cddddb1bc46a65a625b64b37a03501f7b38332efd79893697f79f4d887896caa538d623f654a1a8619986c2a6164290375dcdd9a7eb78180d7a14dd9b37017b9b7d10bbf4922d98fedbb4ce4d40653b0fc1951b365c662a2ab79e2886da1fea2caad0349e2dbbf88c7e8645f2124c1a2e74d6854c67b3746c2cb5189a26096099883dbc3eedb48a864df6b2ced53c589eb9e7b2dda49f09964e8a6653f358c730aa2e334ce14b77f9925d1973b7337f3df9ceee27e68bf2179d7bb30d8e3a96361305063dbed61d0fbdab15d3eeae6a31fa90493623909ef4d654d6c5ead78366447d2f363048210ec55a61b2c668d19aa541e9e80aa7cd2c1a5d8af7c7e42a66a4ed60df9427eeb3af57d47bceed55208d134537f01211ecaeb19d580c0015348b47dadc1b3b4088e967b3cb52bb7e2354561cfc1a63592ae57e85e75faa43c92a5f4f5f2fd649b12e83d27189370bdfd9b1f27c8298dcad2befbc5943cf8aad0112502a19141727b320e2380595477378a666afaf37c5c7eb53b6254c617a7829c629dc1d8aa1839361aa423ff31c731bc9b5f46e12010458ca8fb4b933b32f1aada7d5a0299e17d65cd1f9ceec4059ed42d856f469137790e3eefe9986c907d43f96cd22570d2d72a626c04b4de6b8581320eedae65c283f52877b0dfc8c4adb04dddfc33888956057aa2325033f8d2365ebcc6a27fdfb6a8c8e693d677d8e617cf90e0327bf7bdacfa693a3293a86ffa56dee6a206dd517a671eae70c8ed87153b8056c1904f0242ab423f634ac9a948c37dc169b8da5484e083358c2f469615d5560f175d0902d4ad50f4fe7750fda89e4bcba8c70e6173b753221f6aae64c4d5c6d5a39bc15faf013449323e667a68a8dc549c3bf76e4794693d93d407d701b267907ef8a3ed4b44138456311ccf64cefe5992c08657ac0c3a6dc3592580e716d99847bbde8b2b984c139d6e04e253e9e8630dabc26a725c7673d37001893131ecc5308c136b25c258b413bf039873a9db9d058ddc7cd6c5868bd1dc3fa83d6d7d3e4eb8409025ffb46c94a4f9bbb408ad0725512b6a3fbb4ad33de94577830d15a3e0e69d896f207427ccd3934df728ef45fafd52f1d150b8b1a13411f85ddde40812c43894623c06592fdd887486e11aee5d526d88e9b968df966f86ccf4774d1a0245444fd6e07644dd3d2a1acaa144d1ab84f8545e5ce916e89bb5f41f33ccb9721471dba74d12f300d7885dfdde64765cd5db78b7a30002d408430390d2ed5dad0be8fd5267673a55a54b0dc2afa50b568d26a047538f6d0c41e398cc60699cf084e3c053abf47e1f09c249b7f6cabc2d394cb8bb5d3b989d8d8b9d31765bea7d16f35b5116659d9a37cb52d3df9e21886c73ce800732db1fab6123fcbb4707c19c3639d885776860d2ae1fdb0800bdc74dc0dd5cdb7acd391a287be3aa84bec1e9a2777a748cd59ec143eb9418ba38859f26a55ef4c95d7b1ff681439eaab48c900497df6b27f221fdc4edd2822bbea59387735ca7674d00bf6b1acec3baacfbcc6a6e7413f43fc02766cbd7bce99c39462bf6ec35e38bf9780189223050f0fe58517f390bcb0c95d25d8ee96cbb6c001e83987bddcc13a747616a33f512b678cc74b4c0298fdee2ac475d8d397abc67ddc42efd6b2eebfbeab2306a2b51e62da3b28413b6370f85c910690e85426d8290586972e36ad31a8b0e15d2b3e9d6a6b556f3ca0e7d0dc5620a2dcf0457aa5a921861a92da6d027cd051ddfa420a45bae61a61dc1afe5357e32a18f68b0e03b0bc2a32acf7da72987f88c999b69776e0666a40a26aa0771944b5ce1c5d353d1c82a14408334d3cbc30a0f1d64b00646f5af121a28d9914b10d0cdff444d67ffd948ea765cf41338dac0eb0297a4e82f954cd0fcfa64350ae5a68a7b807dbedfbd739d62792379abdce953cb7a392677c0dec5fafed2fb57a19e88f5b57cef6ad6fe0b305bc573f7c149003d33cfd80092d65061ed6fc0cac94e3bba1eceb0bebedc2bb1e90be4c975d617d71384a78cf55fbc04f60d1480a3f87d75300a9b24cdb21df356dc7bb5c9f4b7f41532c573d9442c4993fc6f21d0f77b42df64729d51a51108ab92c8c0a58d2289218ffbacdadd896966157af62835f465edb3629f2b437f796ea05f8b9943919c14cb6fd24ebc6419e2b865ee96069fab43bf65c9707c43293f729c96389482ea632299a13479db52575b0822a3b532f2eabede8ad3437b5b3d8a55557ed17cecd46d6345c0c73cd4c2f2ac19fb474276b0400b6d53291b99bdb7c7659158a53c7e98bb2dfe13478693b439b086fe679d95c5eccbec1ed4b4d8915fff9540ce44d4dac3b7731e988f4d2b68b034192b5dd5025feda470eed86800fea6d7af13ec035d7b2c1f77d5042338cbd7b3892ad73fce2a044cc29fa7df518533f14ec3b9713b40efd3fedd0a32f736394bd4c687e1394ea78f0ab9dc2453b7d779e2b873a607dcb382a974dd2296d4f659590049a2af371a56c9706c9bd27c701d53acf97ab67ac3c6814793f5b0f6f5707391a669f83709796a41f8012f434c491c38cf55f4dd7cf5f99e939fcb69180edbad1b238a9c9e2481fcf017c677807cec5c1474ceb108cbe73af7c5cd7c307e459735a909e116b1dc62fd31be9a39e6190f236b6b47db09f42dbb092fbd31ca72b6a9c6a7693df823bbc07988245add950778d1d3ee4c10ea630ded156752819ed9ad34ec1d4b8a7232b26ce70b542d54cbdc493bce8535de9f7343c18fa342f5500a7d3e07ee779b0028ebe23eda66c47a227ee1ba9df63a5dd3935675ae1d037fb006276eb62e3779a3ae31c7b172565afda87c28f2a8aaf4d3d6dd67f6755bcb43b48b176159c31b62d3da5e759823daecb57ab40d5b55a5f967e69359140ed2a93713a30540eefc35ae6b8a83b3f7ace3d6d2acb0a58865d89c554fe19735db820db773be6eb8b1cc3f0f6f7759534f96a175aecadd6efc9c41a8a1cd85a7c6fd5ab938c9d6ec489789536f26eaff6221568b0d5e951e07532b6ab08eef60b0878357bf37bc28b5dce1e9b97bf60cdb6a7996a0e1d57678117f5fffe306e5aadd3ec6303d945a7585759b2755e34bbb9719fb3e59e8d41f380f7710f1e0d9ddb1b27e071714f9cece225a02f5165c66ca34f6d61bc07abf8faaa7a23df3018e04dcc74b9635c2a713bd088e2fda1a013edebda31a6b9ded9a02505fcceb53e263f531758ddd39a46b92b59ffef9bb59258b146a02e91e7d7edacf9a341607a2cd9eb3aa60a75ad46cd5dec79c3c44550c33d87f4408575770369362a36594d3b534dc66b96702340da358cecc9a29778b8670ce3d8dd55b63e08fd9a327bec5646d6c4a76c679f55294c54b3c248335a33352886ca44daae33bfa7f51c26ced799f443e0cc5c46f50279114b37e351e6d86e62aac33a76f150cc3462f1a0a05e1fb07b587324c521e197c1ea1d1da793d470d981fe596c93bf3b3571105f7a1fa98136f6bc79b95e893a2bc33ac06eef34e522d0771179a511578f4b92b5564d54048948b5d502ec09bf6693d2d5c9a305715e62d628532bb65d807d06c5f61cd31611bbfec809e4c49c47caefab171f47f28585656e5bc8ce420504e30c59bd3873343b69b7a5fd545448f56576c64a76bbfba19c9e031b7bc2dc819569a4b03c56545b24e01bc89b3ff1621b462e9a19665dd5787a7dda5cb6dcd7993d8bfd1abe565e7d419f9d7b698547bd0eef543b255d45bb89d2ed02b36d3118bf8e83b45e56338ae1e0b4a78ea53a2c27411747bde00b61b65bd77bfd2a4dbcd6cfb07abfbbdd6a72f4b267b6f02a6aff1a7990f446b343c5328258a3aedea00b2561f174a3f6f0633d16cf55f72a0a5860fe6e32f6c8bd7c8296b5189dfa18d24d62e42318cd1201ec0a0eb29e73e9da7b73e40398a2425577907eda577435583d6c3d41a41c4020fdb3e5f6ea49aabedbb4f9e2843fab7e50a0b4e6a72da02f4a9af9946048fd8159bd4ed2c496660518e3fde296dcfc7fd883376e5ae75866e5c5574befe94b53fce261a40ea769936cb4a14aa300cdd5af9a6b378b6ed632a998b3329f0968488f6aa79e76b8ba41746498037baf62a1b268735c4e5a91517c4859fb2e8a5ae5221036835fa1b966aa12aa1de47b1467686d7c638ee6281ddb953db62bba69e6f77ce61bd4132199ae9ddd6d03ecdde6d70c2b7f020737d3129e716a4534d2449ce612bfa2376d5d0c7c5c2a5509e6f5531324abb0b9436b742273b64997bd21bf2c1db8c7b2427610ff9153ed368d7a15a30d112354e20781863164b0d462b796cd1c80474cd1876e5ac2bccc01e7409112ab66b5c93eae5973da98cef70813d56c5fb42fa6579c2b43e43a117e3a4376f1bb98baec1e3e675936fd8e012240c5748afe8a36f6d4decac5a2cd52a9b1ffbec29351b9620fef3ce7fc3d6df51b332fadbc34f5d9665e493e0cc7256e5870b6708c2cb29af4de788aed3ca6d1ffabd8fcd2b00fea5df3d33418effd5d5efc8198349d9fd51ef00a3dd0b01dac7f3d832b11f7b5f08de2dd6c6d83bd748f3595739adfa69993d213795f89c72950d634b3c7f4b2876eccabadbdcd2d3b06138e6e4a456d3648ee1cdf4d728343a34007cc2d4d4b1370d00e6f2cd724ebebbe0a98dfd03a44eed677d9898f77e6e256e92eee362b4c7f3128bb0b1fd642c2b327d850461feffe2d54c834edf9eabb3c456dfbbbb3e83526f26c9109f9d5c47e75007fbc1b81d61da7745cbfd760eeaf87599484e908ae4d25997c05d9a606a820a2ac62a061422de9538c202ee534f3db249f0900ad19fb072f47d41c7aeb3ee0a9a2cff61e7ba752aaae40db20d5664fac0b0467753c9315dd0cb373e8d47bc65afb6bdbd593a01fee7c0df2fb61a6de9db34e9bfa2477b50b18816fe207d36de771bc63e756b235f327ac4dea6be0f689c03c23b48594931a13101d78d314b3ed020891a46af441901baff03ec5c9daae188b9c7e37952ac6d08a8da0af705abb62fbda7afb88b0dd1c6e37122e588d66f37e0a57aad141aeee4592cc5f6b4f3eaef8b5e7f83a56a88830fa2a1acca9c091dc21f326743896f592814e6ecbf8f43c2c4e6757a2d953da9b6a3242d16b55e7d6c42b347c5f931646cfc9ec39344788e1381d583407ad775a13281caed7e8295678096e07cca3590e92b9bb4da74ae4defab1364eca75b6ef917097d293972b0d19cabc5773143bd1e327f514568ed3bfa6fbaef04baf59c0cfd6cde69e91c001ab01a4d6b34e759a610632e30fd565845444a8de19ddbbc446e029fade64d4595adde5b5f6e949b78c32037233f05e68b52cf8debd768ab29be1e098ca99e3852168decef42b0d3578dbe40d0bfbb27fb569f60b3731bedf9e4eb022fd2ebf79660d5fb45b1b45dbc1b8057bcad848bc0fc5d14772589b15dd7623f51d6c4d53130ed3fd5489f554e5ad61a18a9ad5484f8d9a89b431f08ee5c00e745359739dabfb718d959d736669d6514448633b9c06c5c45189185ce55939bf919ef2d66998302cc657cac22d8dfc3409517ae167965ca003d5cba1fcc597ac78882d16d09a754d3b225ea8dff72c451d2ccedec6a7d1dbcf06c650cf02d202d315b55a12bf512989c4a6090ed63cf1f14ecbba468701d7f566939ac6bc27edd487d3d1fc1520bb8785addddcf449fb4d634ff5ec5f21e74f89b60f7a21974f7364df46c2841baab32e8ac9e3b51dc8fcfc11579383d752e110437ab330498c58bb1a258baeb0a524eec81bdb7a743565ba29eaa941e738a9d355fa0e96e715d2a678cf0dd2228dbb75732eea54ec5509b3aaa6b25a838e64c35d74e6619dbcd14bb733122bc6b68c4dab9be1c7b7faf7ab30092fb2da91a2ccd481d020ea6fd1d61e28d0164c9b7d188494b3eb1efa60f0c5966d80dc5196e1943cabf0ec443d54484207badcdf2c1bfb3c8530afed4ec55f6a978a7974332509eeda5a9d2e5131e1f0e0cdeec5b84c7be0ba9bdfe4569ee17f6f4375ab49822bbd89956867f3aade35aad5bdf4d9a3d8598bde0eeb36b5ece375bef13cb71c29ac9ae0e655e22d99ab8b4e732f5183723e34beedf55fefe75fb1c73292b77582bdf305c4699e350d3b030150356c8e9523adefdca7f79f20b6fe831364e9146ce8f8ae349b8693ea5896b46f09caa26b7ebeb74c03fcc1e4b1933d4911270496595d1e29afa4bdc218d798756912d0c68aef0b8e9849f66aafd2bda80b26496e7d346ec5299d4e351d0802f64a573bafa3af982c34eac4b95d1b838b67f3b01969b76ead68cb2be8a8db73b114e89a75c8c68ebe7552da0e3dd4bfb033cb5eaee3df9c21d48ba68aabb1e00d9b83180a55b10402630763f7adddbc7fd9385e4fb91d781a85e2330a2f163b5c6d1673a0dd2785cceeaa25b19362e394334bd060b9c26b667b902a3031fb52407274256bf6b180ca7ba246e746b9edcf92ae4883fddebb1baea541080bc6e43d49c2184acfe069b65fe1d69d016d25874d2b0b97f56a6e35307ca6cfae558be588e57d7e80e6b9a7879f9288763a24488211ef53969d1399462072d372ebf51714855811c28d3b0154affa5ca9cd2897c1c4a46ad680f9d7503cab38ae13eb5c1933cd8d784d9ff3200ca38d5d79615e9f74e7983cf1f36c8a02447aa2e9e7bb6fed88fd33f4bad011845dd4e5b86c488c363396d98fdae688f0f53b9f904dbafead93ea720b5019abf7e3be8fbc9cbd6536b33fccea70f9d8b3afa20fdd2d23f3c6b1ec29e0f3c38672a30de5ad596dc4061faa57eeb1760ed3cf695c75f22795bc435b5bd74477d0a77842415497eb35241f1bf7807a63e0526d2f87d9ab777b43eff01296fa69e4a24d90463dfa88497a7cf759f0830aaed5dbe238628d656ef65b83558742bf4dec7d0346c0c0ba94bd794d93d3af3d35aa46107c8dee647aa8d1f2c874bcbe611e90b266774077d2b193dfdda79f40fc8e983f700550ca3eadcbf3f67457dc0f6e37e9400ddcada78d141fd751d45b9298ef960f137eafaeca1c9a6c9ae47dce38753a567e8da2f037c626755b141d328e3160eb62c332550393a96d990517f2d752d4f391b30769c65e9ba91e6d398d4c158c237678951920574536a0f8b9effe1ae44616e151480b48b7b4db6845cad606d7e818d3c29e304ea67a36efd92d155b121244318eeb25e97535dbe28dd6180a24b4dd9bf6628cb22c98e73bc56711345fae59b238eb5a612ec49c3efa4f626d9120b0d41acc165ab48ba592d6da66e690f3c6333e729fd642c4522fca534b65e76f58e5c669a138d5eb366ba38dcc181fb1770d2ff2a231b3291d6c478ca24f0c6d0ed3fc5fe080c7050ed6b216e79b7547aedf4d3d18807a0b5fae739d06b9e7a77f39fffd9fd71ffaefe787bffee3affff6e7bffee7afdf7ffbf5e7bffff5cf3ffef8fb3ffef6ebf3eff9f5f77ffcf1e77ffdfafdb7fffbe0ffe90ffdfedbbf68646cf24beb65754c8b33b2c76657f5ae0f767e73a49e7e43452ab18cdac208d04cd1ceaf0b5d19de8548f8d1d154a70dcf56724e956ae2878e3dcc1e46d7b61d3e8206b9e6222a9648db22599894ea06926d199eab1b8ca7d7b4ece48b5daf934f24d1a6bdda8db46e749716b652490b9977dbb3d10a88f3a84fb78e52d4be015fdc6835597ad95fb325ff0b0000ffff8c9d518e233912434f3480a40849a1fb5f6cf164371645aad1f53ba8e972d9ce4c45907cbca15c423e9e8c20043cf521106b3f6805c125a264834141bda1bd82d5b8293c6cfec28de020b09a3b45d15e4d126c35ecc04e6fd7f674f4ea34f8a88b61f1e0d61e12d43f67c7b765d53984911c77531c1c4c37a183622882705f81669a4e98cd0c7d735ecaaf092fb9540ae094d7ecdc12e7cc69751b0567cfa8006d450cbb153051930dd3234a1a8081f46d95fd478ce1c6d22878e80e79ef67dbaab4e0061b67933371b399e57242b4972f69b83a1623ac611f0c1a9139c3d9e66dd537d6bcca8db28d564d1d70e3c2abbaaa41db7f51204b3b6f3638bc3a0e14a8ce6c92a249fa70ac08f9367a1bf82ef812d9fee4f0b8b4a36bbc1c23d81c8f7d09664c4375af0073ea97bc9a73c83a0f335d5d06c638560f92679c6df7729c34de32742e8246cd2158cb2d6a17772360bba6fdf35cf08977f6630bb35b6ba899b611e42eecae89dcae23455b3f45cdafc72ebb4e0913b48af59ed23eb01f00f171b299da0fcd309c8c14ee673c9fd8bfae7efae32c8b04b0b70570f2ac9fb4a1cfbc07dbce9647c9f9c3d4dacbe1dd3fbf5d5f2b34f284f733eca145dfa8b8f41ed828b9db9e462f04536384e2be6b35ad25ba4a61b746666e5c6bd898cd55d6ba477509d6b9a655d81f9463b9ca8eeb3ee57330f2431829051cb79aa46ca91db897e0d066f3b67588eb06951d44b0cd3f13f806fc300b0147ec91934e3c63cd10acde7a3c24fa6696fecbaa1edae70809cf617a77aeb20ccf45f8742f8c8f610c23b07db5dc9f1c6c1e75143da794508a7d7e968ee8736eabe06d2ce2341a3f3a6f9f1abfd99fcfa3026e3e16667d27d2b62972130dda6e1e8428cdd432d64e5bc9f70bbfd5db7f8f580e40dba7bac3af5703a3a45bb403b358efa91c2cec8c8b43778639f3820f511f00d90732883777815a94c7f82d80532804f9c3ed79dcf26a1d20a2e6d8fbe4f9741eaa2b4a28a0b5508c4d87a21254a91a03dc72b98c1c3c9aed214e639199980abdd42ac483e0987a0e76b79bc9752f2fe35fc4baddb246b3de7cefec99bfaf6463a7d19de49edc6296cbb8440b3ba5bee3f897ad7a798e4fe9a3dc4f90aefa99d3206aac80ac590dc37818b6a973fe2cfd34a94e32e81285be6819d2b24b784501301cd54dbb1fe84043c3ce849abba45c56aff2c23ad0725d1704d7fe917d3e82b321420422b965d683a1420b8d66ed33e703137bca70d86c2dc3b474dc178401bc9608778ec6186b0d0f0b22449bb1e5e3d6edc6afd9634335b40937d630e07952eba3bf2ea9833fdbc18ccb38ea9db22a7554f1ff86060a82f2dd630f3702a65bdd39d7476b9d133d3191a8d1802d47b71e075a988c0fd7983af50259fb348787ad71d2f29dacda291f54fa025b5e9d394f8cad8d6b73dddf277feace31f5b55e176e0b77c3fbfa0673ea18cb559b354b440f0848c7080538dd62f9ed6b0e46544d864d92af8ab1bbc4f8f8cdc84310ee2837aa1541441b83d8a72c4d441008d66776aeb9fc340a29e28459137b2de7290eb63486d3aa183a32d25463bd38bdb73954406d73e5b1581670690ff2250e7b2578f43397c9ca9de9d463c331e6d26f1b60038d02348eb2d6d5ba2091297c6e933a354022d84be711af03fec8261dd61e164aea0783987bf49aaf4571cfa47123c6e51bea46a9e51cda4a9a54892dfd8ffc7e594544e01936d6c8997d86437a6381f37143cd2ee3528fb1da29734adef2080390e4022c6f035f4c1c4b7ac4da6d999b8be2e9a31a0cace97db6d9c99240ed3601384b7fb4d65aead4bc6cc5d26138680af718167956db40be36c9dc9cba852b0fbd118fcad25a6a95f455dd877abbcb57bbc47afc8cba41ffe8187dbb11967a072f29d4e6da4cc2ea7ad5c083db16b51e57f9d4902c73bf0a61cf69f3f9bb48f4342fe3eaf892cc4b81a2ec4595401bbb023600c818fd6e8c5b68ed7529db9c33a4b34637292fe70cd7bf27bc588f96f49f4ca5cf2b88fd3879272c1d4d7d517e6d781d72152d9bd5f6ce9c362b61487c04c699210d1c82d57e692bf8f5c69ef688dcffe4fe7e4cac9c64ed80f9bc98628e72be400772a108a77123ccc682784e469009739943997a2bf545ed24546aa53385cbdc42b871bafa82a8811fe5d5131cd83c833ad300bb6f55a79ff913c3f87d5ff6a907e9644dc34ab719d7efa917d9ce6321eece96c6bc9af4b676bb20519f877d9961b48d6661c75a314cacd9fd52c22dc38837d5cde6c4cdca48b014bd6edbff40b7569f34a73e4d6a3d1fe4841d57f859704e583c8f5ee3e6706ce0a826b8c4a04741c967c0657c36acaad48b244e8ff47c2ba29357643d8ea377d55d3e089e437184d1aa020b8e1e9d931dad9643cdecce8008b6f0262e8c62b0b360d05947fd9bed66aa9bb57467469a65e0caeaadf9017a91549679384ba2787f88597cc6f2e9d435e93edc1732b07c7eb69f654cca05e4bcdb6a860a72fdd02715bbe6f6a6af525184e4366de6c5c1bdba8d8739ee915776177b477f6ca76845576f2b68be2e534c0e9036db952b48da1a3fd9949a79208222bc3cb6b67a3f524fab68c723797412ab9e71615e6664dc043e4d8b2f140e77404facd58ed958b89cecb481c57db825e074f308717f679faf4c439e5236a950d5d73ddbd736ad783ac0f4c1da5f956f169e9ae5792dc33ac0cd6d49ec3c3f3d464fd1f6bb20d237f2a5b87d7718d3c0c234920e6d071e0456b5471bb7b81f4f99d38de404eaee7473b560d6d08a000030c778626d05152f320ef049f5a152429c9ffc94fb8464db5c1ee727a2a5b308c1275bf9c79ab15da1c6ca79545d24a4b5acd7ecedd3e8674f764e4207edd0912d8d8c895075139a9435e28c9bf5671feaf7baa32f57e3fc63fc8c5e7db4f0e53e115d837d1738f913e7fdc7aedeb706a4c620b7a4c794800d638e36e8bf43d9a2980a116ae63fc45cbe193339fe88cd8e6e127b02ed9956838c40a4055dfeb8bb5fac69dae1b9c63bbd29ac571dc7a608e7c1c29aaddca3bce6c5a4db5a81d20633335ca6a74e99c7de9376abeea6ca33510415d3025bdbdcae3c4f46d34f1a36b95e57092f33dd0eee5d3ef342461d318101f698bda04c77c47a790c724a71959d81d0a8a7edbcf9e16ccb7cee51f3a74dfc6b0887a8a721b278f072900ece342321d0e10acb7c54d0536ef435423776ba5a4580b234a43d7eb6cdfc790da8ba6964494ce9ba43a975ccbd81d6402fa8234575eefb43d66365a28f2e122d7adb99336a1b12acedd986cf26871e31ab8ee41a3762ecbe844ebbfd031d9c6e001d114df1a5eb387cb853796c482fce20c7cf1a18289759f60f15c0faa1751ca0d39ce233f486447d7958d93a4dc32d6de923e3d9b7f79173aed9ce0e03781803ad59c06154356b5240469ada0cc82e2f8d100cfd8758a52e4c662cebd91c9d43902f3fa92f19d680b2e90650851ce3db5ed398288f1d576cdc641670b8e90f91926e4e655bf00e79cc037d04debc123c66cda1aa0f45b0165ac0400ee2db8c0abdf7169ace7ab6c0f3b4b72cecfb2aeb54e76ab941b237d2b08ef901bef5e563f7eef9865cc31f050bbaaa63b7c77c7eeab52c3a779bbff472e23c1ddb36f48fd5f6e5c8aae1141a1fde712b89d81b6b9f7df5abd2babb9fef224e09332f73a3d9dd4ad41f878ccebcd5ccfc6cf2f2e736b1cdc5d350486c8fef83f797628956a83ef5b6777997030edfe18501b1d29acedb66391de1b88fd8ddba08834e1d6bb242e0a755d35216b9cb1e5b3bb8f634d571a8c4307dfb5476ff17b0dd34c3fc5c78ba529d51ecb62343eeb1d6bee4abadf2ba8b5c48c4ba18843133cc959bdb63d980e8f6cf76a3af16bb72989990c0776f1e573b1716a31aab1aa33ee66c28be46969dc18ec27629e00c0d21d4af0d54eeafea51fc9ca7714079556c52fe32f58b3deb8cf05a1a1a01f544ffdefdfce5a695d82a9d734d50a099888ed13e144c4865b96e4347d299715c2a2410a96f04872b0befef38bcef61da5b33452c38ffdaed85608ab9e17851e155d9cbfb40df219856d725ae1bb8e0816f76de6ba7b6fed781275489973d610274e768fe64f77e4f2c95bd7959f663498ca367567bc80033d57430c69db9ac0d939a3bddfa9853e71bdb8e52431b051b31c4429f2b01db993fa2aed5ef5f8ed7aff18cfe3eaba12475accb18646b13ade940d41b530c282e16c41b75b619ad3b3e451b8e084d6eaf1c1b5933ccdb5560e3cd411ebd2c3d8a33d3d8363b775819284c30c75d8f8e4a6584cc9639ca30e2ef012f72525029d748f5c7eebb2f4a9ef44e0e6c2b9a176b7742b87a4f6ab935e9b9264cd769d31d193a559e0e505bed2889d3bd98918ea3ecc322ed98e1ecc30dc68dca7ff9673eb69cd2e77c449f1e9bb9ea94fc55f4d286852959b34e3f81f44973a73e7050a16b3caad1a66d5f28c13c5dbb8cd788488ddfa5a73edea2080579d39a752f746f39036354eda6fb8f5c59566f1cd7c1af5f2cded9fc85539490ce5c1a70094e0db3794941182fb901c3fa31d07c53b9db70c97888467789216945575d39ce3418ca5f3411083ea835fa122ad2643b2ab63434da217f752baecacb6f5597fb8d059b8eef36d933098a9966b701e75baaf80628b2ca5f6ddfda8d09766f1b5fa4b1c1322b80ed663f5ea10a3bc59c3a7eebbc59faa53b4f9262cdaabb48064ee37b0c54d634f894ecc5bee691ae1d2aef4b86fa8461c5f49c16cadb3d4f6ec3925d17b562d5c66d87ca5fc479de2af3ba814bf53541e5ed76d8e1c9a5d06f2271564dd2ee1a257cbff9daf0306ce05a3083dca10fd16b8c57ed727816e6a8d94c90bd26dce5d9196c0b6115909a66f93e03592a3b046c0f133f997c7278e1183f9c46c17907b4faa97edc07c321a1ad0a5d1d6c82b13a0cbf4c209750d17c13a6d1b18f1df900c8377fe6ed4350ebb24dc25f71faa4119de62041a85a24867d5f9961593130e22b9a4b46dbe42948bd3f1dd91f2105a2923db79775b9b709cac2922e7020b6da4ec7ea982935ed4311b01e6660090d6bd4ea00d66afb6afd0c0db8d18a3dcb8afaa2380f2ccbaed35e61f559d8168ed5b01c326a66b38ab38612f973d2ef733c01b34a3f84602d6d923037a715becd78588271b8ee346c3755ecc7f9367430f8e5f4fcc3dc16f281c064d3b5768c73e5621b90e051873ee22490f7dd802f372872aaf45168404db4fb04994f65ade42edef3dfd883a86229dfdd42b1b012915d695f9858678fe18d8079fd63fa67bd92c394464ee7ebf693230d014b1f5069331a4ec451f10f71fcafcb368819960a05321fba2bb82ac038dac3c8cd338f1d3478fa4e1d6fea965ba88a37f3746b9b65d97f6c4e4f2cff9af05ab5a3d6c85f1c583bc49ba14a4c6276ee8ff2682030ba75ca79dccef278593826c3320f031f945e49bdcd3db6f22d2148d0baa0dfae73651fbd923a5aeaa361a49bff2fd61c46cea3b1a1aaac77b9e63a7ae6b50dc2f3b8f9ff760725ebb74b5174b91309c0af2552067a374992a5bad3671cf4f13f572b0f567106b50079f4b58c2299505d95eec1d34e712c280dde57b00ae38bfeabe3b2a3958ef170adb2d2a57e55de41164876868080be5465ecd089cafabf6f5fc4c38e0b0b442fcf8e4dc898546776af6419978e51bfdbc100fd4d47ee4e0c39fa7a67bc76bd0792705fbff8d33a839339882415f3b9ba1e3749e4dfd03b41835a3dbaddb7283959f91b9c4a30cec6efecc0b7435dcd2aa0b7b3755b5b9247ecff70f8fef737fb25dd29d9c7f23684977d62b000b6ed6d273b71744c3dd9c2c1cb7ba201eb771964a40d1c31f63184fa5e0f2a0ec1aa9f0cb28f8f1e51d6db6ff7b45696676a90e2bda644586ebeb32dfd76009c5f657c4cd88195d3b9c7c7519a64b92acd2a422375b7032d787ab156352a15ac347afeac58fb1c0c489ae8f00104d9d683fdae0fecfd46ea32bae622656108830ddcdeba7be73ea32cba6d9fe2b7d22ee6d61d862dc03f8fc51c5e058b976819c460dc161e49cae2b9d256874f57c6b046615608c602cd8be2f49681b334537b8f46bb5930e721a43014f6a9df823b7be8dd8096b75d26da20dc2ecf0b291ae14b615fd39b3d3033ba5b689f63a6e5a41650dbcf20220ef331b8a7e68faeed47ff4d8ee921e444ea71e10690b745fa607144ea13db0f689f7fb7eee6493f1bc4555bf180093cd6ec461c7c3a1004efc50a973de422f92c2fd26cbc54e37525410c40405df7511d329df1860dc3f6771996a31b0d2165fc59925f66fc5613e2f72800ff42efa0858f35e2176be477ea9486bab9a6d7387790013fee14a37ffaaae4daeb40f5f50f63b2688aaf9272e9efdb55d02d55b5a97e426f1e1cd467337ad27cd46dbc12986cc00c0e7d2b41cddf46a4d13b42d7997afb7f5e499d20985b126e776937004ef5b21538f588b6c27f44961bfcbb0c238bce4bf754bd80bb862df0f25c53c43f97aa7fbace8c9eb048757a4f02c51e6543ec42cb137732a705cb91751cfefb71c975c55ebf037ad426366fb79e7056eca3c58b6b4d459c2c5024f31f11ccbfa9499c1596a1cb9912cc379cd5d6324bd3da0e941f135699491b6d9db1b4d8f9f9ac6543747cf8b033e3df185b241781b7e8ba126ca307ad328ea10f6e8b9c0a8fda92fadf33e2f871bfb48c65ce1e1c1e5b320270638615a6509eb4b43b9519673dbc907c6397792c79655d9b62e7ee334da7ee6622a0c22b7444c8318f510cf7dedc61f42fcd7372183c947cbb327da04bfa5cfce995d29c2a8167c4875f0cf1f48255e975cc0a365698c043359b95157cd7613a115df9565ddb2cb88e5e85e4f9dd308d737c0e7bb5c4901d55ba82963f937076e5b6707234da460dea197ba65bcf884d9ef8c5aad1e83d1fbd7eadb3e7a3b1b59aed5dd8420f2fbe2002b27c1fd46b55390575cfb3bd98b04e94ee595eb0cd3e7691f0f91f000000ffff8c9d5b6e042110034f14699ae6d1dcff6251b151a4d8acb2bff95929330ce0b6cb726202a561b13a0029eb3183e33e1ab7c9d6180ee5437bb60f5d27d1e71ad36e0acfa6f9b6544f880a2bfbd97d61f3d077747996273865fb247d8306b0a139bdec0a8b4ce84c9a78e883bba1be1da3b3fce62717696069b4837e36acb9e25f7cc77d09c475400066155c0c36cdcad5e75e9ac76c50ffcdf5b5e8bad08e543a9bbaa56ad69ee986f4b6b7697394fb8d7296e82d0619a758da8f7919194dcb24fb38ea9a3968b39459f4867e0b2242c3c531c80c9a25ef8ae9e3a292a6869edaf66173fe56782ec356c9e61fac5f2b3a062d84cbbea1b7592661f0eb2cc2435d92170eb3739a29af3da5412698b6a9ea5c031c34bc20bc9e5059e754c0992397209a3b2b274fbcbbfbae47987b1780bcc29ca2f2198f25f881afba9e4b34d99a6f5659895f6f19d34b0fd923bb0f085992f608e639bfc9e65f6d8551ef22164c2bafbc3b403e9d0331861087119566912a95036f6fba6adeeca57a177fff1e9b8be5e56e4d5a62cc014945cdfe4478bdc741291a0af35891651f5e6d970ced755a402cc1b8fc38b49ef6bf20fc75c5b4fef46e35185aba8fdd208ca79ad384de607d9533399408f8233955a8f409c5aa2fcd661deea7a93a970bf55578a5693dd33ef574b3fa579dde6b6b9235e2db0b37465f92390e28a434bc5dc71cdaf564b9a16ceb9e4db58b9a9cb2cd320b6116f275f94f81b15946b77942ff76bbb5b54e1e525767e380dfed51ddd974c46de7f604e7e145fcfdb10964550ba57795b6dea288b5b9637c10d081b49ff17ffcf3a5d334af83e32af5b76cf57cb530a43b2465ac6c066f21ac42e7a01a31c67ad2ba4e31bf5b1a237fe174df000000ffff8c9dcb8a654976447fa5a979803ff6f647fd8ad0a4558568815a130d0442ff2ecccf49d1d7968732470d497564e4bde7b8ef87d9b27fa8260d79f05c085b701f2b5df3a83071a529a21726827a02ca5003e48c0654cc754c21aacdc05e4442b2ede024121ade38e03a710ee81328ce532c3384d8830b417d81ef35249b492759dfe7ffba6402216b759e5b9c0fc71c5884f5e89288a038d24ef66712dfa705eaf26fb9995c0398700f9d64c36b4ef70b64dd2ed7ca2d3173a0ec4cb23e958d9b0de97f42aeda0baa50988215beb2df2a1f98ab3c55b626a9e67c3e29782098dbad97eae3aa5c3d31c8dd7b5e7418b240830b867eefade344455cbe910d192920b45730374acea1b43dd716ecdc9cc58a583de64ff594efe73219f12b115b7360ecde27db11f2d4f321e293d9ab2f901a9cb9f42c9c4699783b4e6eb3a93925dc415c98ba01901e35b75711032f4b2afbd3e59c638a04fbf91334dcfc3c64bfbe13eb5f41da2563e6ecbfda9489c8ecf5d255ea9ea31e2b851b7ad71eced81392df39c7d78c862a19c7744996f236b703483c04e9ebb61f7d47a64d89583eca1df929067a0b20796e3c52ab2bd10f71077d277356246b28f0fd5685a03189748b89e422d32d547430ae770e878977d1dee0657ca14cfe755f40f902327046a2ef545214ec00f7c237d386844e7e596b97fbc9af7fe6e1da8b81c4ba12fcb7bb917faab266a2860302de68f91c9b8002099550aeb15cba8518d55d156547d2e5ea613b9d7cd65d56977aa2cb730868a1e251d62b17b64432f432dd1572ae1ff2f105afa2bc7fb4c6c81ce4d929aecb7c2c72f99994fc2c286e70a8dc2924a7573940d93f1281c2a1aafa2d5da7bf70eb9162f3c41cd4859873e6373c33c6b23b00fb50423d2fd02eb0c265df179d7b935908910cb2437883abbe72795ad7ee73556088f1a74f13993bfccb72e8d6d73523e1e5cd494ee7557dc4aab930849fbb26b3d034ce68016d54975ad38799b2eca6e3009bbc6c88bd159716a64c3922730d46f7468b02eb7f93217a5b9d12b307fca65d649a86b72376c2d92a3a07e9655a7fc17c785701a9e749d851fa21c8b98eeac7cc3ffebf21c123776dd319a577c9f2ed63bd72ab6f62f69aeaf9e1c5bbb01f6fe589149a01ebaa889c34b4de73b9345ae8fd27aecb1fb2e45a5d45c7e9ffeb5f920d0dfde2b15e0247db9afe61be3e9c222920f1f74298bc25f195a13abf0c64ad088e3c5891b78280bab2d79066cdebec132aebb7eb5cbbe2cbd68187375e999f73ba848b7746cb5cbb7a957ec7e90e39e3bc9e2f53a20dbfaf5536928eadd00e58b86f8679809a0e3f25e4b97298c13560aa49c44e8c9532623fed755fdfd2048abc494ef42344e59dc80193d76257d431dfd80baf4e425d45649f5c66b517d7c2d78ff8e070a372dfaa662b86fb66507c51bccb852427be180ec0a318ad40559a1de559e644070ca56903ef917da269948148f6fa647c03d3b67b7a34ec7704c7bb9e4911291d1539f7be5f7793c4f31f570d18004fae2d775da0034a8ee0f6dbd547b10fe22255ae1173038c53624782d6d875664cb25483bfa83e43883eaaf0440148932ce4cae584eeb38e847e4bc342d745cbcef8498a7ade394559f8d97f032fddd086b51c7f3d292a77c2fa85b523bfbda797f515276ee817d0969ab0f942aecedcabd8011b4a76f22cab4c256e70709834022a1274413d3e05adc73f33f55bcd5fa9932397e034fe033ca9f4611db5e1d38eeb89790f6c51e0493ab1ae6962845b7bec855088abfaafeea619295ee04c5748bc154a42843371b4f7ad53c18d110a54a83f0d6f7aab43210ea1a558732106c7cd99cf0247f38b8bd7b97cc60b3d3d65aa72f79aa1ee9c73215da56b3506f7993cb2902c4de5c63bfdcd33e6beae5aecc72ca184354cd41580450be2a27a164499e77ad952633813cb06facfdf74541fae47ec270b07d64a87707f1345f41a8c6af369302aeae725d64384b144f90cfdf97eb9773699fbf08dbc2038bb481f255ece71d2e3dfe550681dea394f6ac40b84a58552c9eb4b5314834c89595b19ee6d944c71fabae69b267cce994e587605ecfbbd847cafe1226ca50b4fb038ead8d30d597d5db8f175f7cf43fb8d861463a5fecac3b5a439197e91a4cccf08b96873fa8879ee28206e081c4e28a1c820db87536e31f89e2d9b5bf63fc86afb99b88128242e1366e4357b24b796f2a6f26959ab5ce8589fa2efd7f494b11cf2a23e7d75d4daca585f5e0097a57d899fbc3af5fca3516b9b60e369d130cb8438395ba5e7f516b750a31fd19b5fa76757ff33d8d1933dbb9319474bbc5bf75baadba10571c9bae68eec6bd3dde7ee39e2fdb37f3efffb3fcf7ff2dfef1ffef61f7ffdb73fffe53f7ffbfd2fbffdf9ef7ffdf38f3ffef6f77ffdedc74ff9ed6f7fffe3cffffaedf7bffcdf5ff60fffd1ef7ff927eb99b34d6f8dead249e419474fce927d82823dd37dbe6394cda94199089b09b96efdea5176f9a09a4b81397ea169f95d7d1eaed6b28100afdf36196aaf20c042ab8cb6ef7330db6648918eb9c19e630fbf56d50722bb55578d0bbfdb594315546b4d1f23b128cb77d7c7253e37aa8d180bb983fbc02ce0a15469e2e2985059ba28c62cc7a88cf1e5587e270a804bea7a39e5e57444435fa9585dfc627ba28eee11d273c2ab27ef98338e75fc37884f35ee074e522f8202dab00dcbcf07e4f1551c181546ce81e9b0b811421624c42ca10e1e95d06e0d2a841915df99e26457c79328e526c08d1aec006cd2f783e7f5da46f448d7feb439c3730aca21d297097e9bfc1a984e4a95e58aa6d69be680909e1fbab73db6f2fa2583dfe6f012b34419823ffb91d2c0ee17bb0cdf40d35e7f302c789d4286aacb9d08563c77abf75e63a84dafa8e7237a82f8ab445edfde4a32de39732ddb839c55462a52dcf1a793eba43c9e42b05d77af0b84a129c484cd219574311774e08abaa476b8f7e0c0742a1ab517a8f9e535bf9cbd53c66ed8225b835e71f64997a1a21abaf749753568d6db898040cda9a900b47ec28955f02d149501afa8d242269cb8439b5e5c563ba28f19ec31e8d5180aee06b33eb7765dbe0fd05b0801997edde6334709d3a70dde4fa201a84bb37dfea66f705789e165a08c08311918aa41ec85b49ad9c0446d2d536a56207f4aacca33f2c069f0a7538aa84b7cb91c14f05f6bbc887252c10af88728d21dbad59edaa2d02da7f012c8b8b54b5e9bc9eac2b82edf81c5c95b76b1d44355c6085b3b3ce4b7f671c8b7feb789f8cc40f09d747c64976efff34fe3b046f998a8bf75ec98422f5c917ab6432b48db5813c62e0d43999021c861cfe4d7a32acdd6613df360a01d97a515a77f8fda83389349aa1ef456354e32ae67ef8dedb60135fc2e0c3b452a489bb5a6c8eed490756251d788dedd3420518e437f74a93554a88ac05e4c5a3b9848ab0b525caee9f3ccbe2f808c4ca44a6b87da9834a7bccf8d1746414983f8ab63a770e56c1b1d8dc28a911d49333a7736fae8a69d957fd6e550930178387ec301e06c3d5e56a0fb944d0d33183b186d833d174953b21d904c2ad81b9028c1b3908226ac789a2049fbc6e68bc83ac76c897198c2467a2ef0a8d410218f6ec774efbcb6686d9018dcb0a66835750680d0919f33f537127917c65948c75a3a0ed2a97ab54100bd457a85d3bf64055f593cc2d57d3fb9e448b4374ec65fa05ecb3c295ec0f0b61db89645ffce8a87a04b5b087b864078bbbaff51da0b284167f4816896e2c04f2d50d453daf7522be29f8fd4ceae9621294901f6646a01e745a818fad8ea359d6caeaa52f0c11c484451ea10d0333a5a3b21656b246219b5f4dd9b29161263c3022b5f2d63fb96403538b16216b4bfecaf5e5d910e4876d5534e2dcc9da6ccb970e577f9bcfded3a487228d6b2ed060badba579f1784ced7205e59e859672c4ef9b788703b43e9e591393bd70ea44a2dbac2d4f5c4063b6c48c51205d17f657219b59527efd5b88a247fbe8b3c9a155120c229da2bafe0b5b21c0124fece681761d605f4a9e52617036d34fc564dad1751d42d946b8d9217bdd3734ace1a7ef4ab239c7407ea9e0509a3e929707f60893d8fcad3eb97da6159101ba12f0e05630c00e76a3bd03bea25c4144104631dcb29fa43f5c6ba08130639972218379ab9e3737dfa233eaa4fe4c4a8b442a3a50d83dcbe8e14c668f471baee310219078210ed4ed8d78c1cf5b2677209c3c8f82c57deb3a3779786ebcdcb0d19b874c51bfc62b93c07cc4aaa4d30455d4201227bfd5a1b696c5e9dd1a7f77eb94a4f4dd670b481f83dbd41822dba821b370e58ad38ebb8eef3f6236c3b7ac18a624b4b8f85bd505f411aaf34033efb5ba167168a73addc69d3dca590c61d32063bc17245775c5bd755e8b98d717a1e93c6c75ecc07b8f7e0e739ae4ed094f5a8f919511f0634798c7b39c34732d1441eae1ccc40922dd14a6158eb127e2636c37255f9b3a63b25211e1d0713e9f28ab60b98b96ce5941d3e0380e436c3e30204162c0c6b2ec220d23dd6d4b2dae64d1111185cbeff7a3c54aaae171c0bb289a195988258f93246e108034ceda99708a9b115611aea59b251a8582b742ca2df8c707d8dd42d2487f6563e83e91f99dec8c56f75d59cb5fa3cb4ceb327acf423c327d54fc001e47b72210e0c7f9bb06740111f16e36436a7ba240e91eaa81e3f5ca61016fe6c2ff5a30e2d98fadbfc365a59b5167359624b38345a1d2cb7942e5e071097ba5299c878589098d0f5f37331ceaba527f5e9edf08cfd278c9da3315ef4c0235c36ace68d33be5afb5ab038d6b5e4a1c01e56501a1c3d359b47f1489814a4da953d2469f05aaaab8ff67254ffe2ce624c6fba235705c58801ed6db48b0361e94e2928993488c53ba9182f86b78bbce2af4e55a62c766a55c365ffda5301db7efceaf9a0644e2cc5e62e1c416982f263fd554e894c25e82d0e4d6282c920ad4a5fe880747bee869e732ed25cc4da64737e3b3daa729a20ca5eca5e2e44ccaf014971592aa8214a567cfdb64b5c909985fc298d376bd036a7801b6c3b475b89b85f71503ec9a0af9da9ab48c41cfdc49278a19d7a10919b528e1209120e4dc1b1026c0a64f116648a2031988528c613f445b939d8e462eb850bb52cae1fbe376d425ac93b63048325ab158c232dd335b1cadf6b15c2e24c8b14f9f62611422c27f4aaa8275fbcd99e30a1d5aa928a5b95b50682dae4fde13255180f8850a716763e161b1dd03519e3e843ed298f3804651d063c85f240571d55e9cc2e3811d4a8f976f8bb159cd6a81bc8939a4e2aba143ead4b0d063af98cdd5d6c2b6c5e3450a814cd01e1a1f86b008d6a5c5a3770885d0f4a7329c0ca028d6055f3d94c8ee7bbbea7ee8f38cb1d1780dafffd47b846e600367827956fda49ce3238ae9b7ad6717d28e2dbd44972c2afd291ba2631c076b5eb5cddefb454ab0aa98baad7ea3b1b6de23337e99763b9cbe68c3609a0db0700e72afa3e6fa18c8773498486fcb6beb48e03106552b08ea70dce411532d5bfb25c259c1fa11d9f8bf3a542afbe33d3fad385277ea73fbb487d81ee2e57ec0b0c494344693068bbbbb1ee8f553b4560e3d253983d60fff3c225d3308f70fcb3f387b5045a8ae7b80f0c5aa3ea1ef4fffbd410c90e6bb9d1ba0bb0fa6240a49c0dad00840475c9ab554b50234ec87075febc94a790f7e8a4de30f9091c8ed4caaea0125fee6a57bf63d004bd8b5b50eac92a85582dca49ee85524ce32a9898d58e39f74fecd4bd02c5760b92e5c6acda24d82be1b3ccef0a3259f2967b68046abbc4a029966c363a4dcbc600c5f7302fd0449f978b36e70080edbe8c5d55bc22f65c511be3c7a7869bbedf2e11938a86db04ac4f2275df592106cf7b94cb2390c95b5c96af8a618b6ea18e972d175ab03d7b0557d48bf767a15157d97071acdc8cac147fa8c1d93014d8001b791f27dbd8b72a636b1f9b3f9dca888cde1c84a07aa9106e505263b9e4086dcc933084a527e33405d59bc8195484387457a38cda10fa9c8a2007004f3185ae33947c3d9864a991abfbbadb8a4efaae643589ef464b0d18d424236dbe50e821e0a90f874569ab8d510382154d9412f54c7bec35c8bab65b839fd4bb06b4930c1b383466b640e5afdc43a74b5db5b802da6864850f46b938f816a537453e9f18cec80398b2f3f893b80f78d7d57743317c08031170d97f2a85c78f2c48a5f6760dea1864a96b5724ca18c24fca2c1b3294b36d5a15f80ad90830203c2b701853759fb8c94548189f72ab534186c39a237d18f1d0efcbcc5f18085509081a1eef9c6b0fc6aa6ec94bb1c1be9c7e5d82b8023650153f0682cd7df6f8beecca7569b6668f71c996bf8e48f597656d68e4b7786f08f85527063595c07448a0d4381358b7aee36363ae2e084799282144e96a109d6cd90930e39cb5388242dccbdab02f99878086d17e5f3de927d6090a2ad8216b6076fa9d1e267a4e14386217b604b8a465cb64aeb2684fc7c36a1744e818f3e9f224f5606a4e8b2f7335c90531673d99a49725d5d008c0e9dd32fab1faca481ea427e3bd717a782a6364c05e777d5386115c5ebafae608ccc8c6b118fb5c53ac887539fa4348354e72748b8e5f11bec8609a651547aace0b475c1c98b91afbd33abb8f39ee5584be8ad895434f753eae0bd54884239d90da10bbb8252f24c0ebd226e6801d32b30aa7e0abf22dca62c064b7ad1068a13128df4f97303deed37ae144d73ea6df094779038fa6a6be30c5caea2fa60b2aac5870cd29b98948685522c3db0478ab1e37e1ce0464a455097c91f6a20f86f9c57b35e88b9bf499ed127cbbd39dc99caabc53300170364eef827fed0122777707dc053552c67f8a9a9eda37ab27399583b4a9d8aac6b13e0e477609fb0064eb1ad08c9ced3db22225662df037c8483e0299ebfdc8b580ff9815001cb1d54bf4f5333deca37b1932013b866a6e55c08470971140d4ba98f0dda5b581c23ee741a8b8a0a703735c8f5f1993ecf34f403527e97942b7297503563b53f772c065b226729786f66b58312a3d2c3c05462934388b0e96c67b15094cd31fa2ba440ef12fabe7eecdeda3a1480484808aa13a0ab23663e6f03a48696d851e346d2db931eb0a30f126505212ac48a77a53340ad2ed14601e2593f2f966ddfa1d1aba92becaa677a40afec24ce3f8cc3c7db48cad70eeb154097aab711363a892e4064b66caf80c50789eb74e1bb172865b624c272cb66f4e9ba619e14938d132cb2d5365a909ea5882b5b56151cc18a8e9b5294802244e9a206a1f5512b8acaeb508b72dd7bdd6bdf03d9e0f55289505a3e2297c5be306c1d748a6498dbbc1e10e799e1911ee9dee212a594dff688552ef8b899b434efb4a8ac542ba85de9db50be4dd2dfa1ce0c9dec7f5d20123e4439214fafa43f9e9053c99321bc3fc8631767e64b804f2ee9bf6831323c3a5dd69f159b6c8ca0bb8b5ea8d77d595ef690759146fedab80d94726361ba1c323b96f2f276d18569712648464ddd51fc55d93e2869ae92aa488e8b3309d5be9165e8a49f5611bfcaec3ec72a7d5addd31c6199152aa62f37ce96e6b93d505ccf15cabe25ea4c8e5199aafda0899157e1f02114d3d3147941223e1f0be4aaef220bf0764871791a9aee06a5236050762e4a95e7003dfa389ebdaf015dd6c31f58823f0690d0505434fd94617191638175184c0aca85aff607ba93da74d7e4354dd35f07a0f919d6afeecc67c3cc3beffad0ae206278721d4c795ca55b55262dcd9dc8bf8b5010dc8d2b80e50db5ef7801a16f8826754b7c1c354d1aa03f216ee4a38856cb9a795fd1559444d79998bfb6555e15dd2873d6d54a8dd01f4e3f9b087ebd039357ece7d8db4fcc7b6d90bb61245ffdd247b51751f2b67670fbc2bf896c8ff8ba363f76868a5a096e26b69a92cb72b4869a3796fc55e0bb3912e434fc50480477231a63c8d55c854e1a277f965a81cd222d30fc49b904589801d357955cb3d3ca9fed5c679499ccbf339608bb99b2fbeae8ece7b4df0faa007c014a1c1cb9c0d68a2596185bb211904e7f2054e390424cf18949e95e03dc5bb422516bb512023133749e212b1c35fd725d6eb606caf32f4d6a34496c5019a43757fe16bf77a86fc9ee12057ff50bbd8b196e8a382e9a62acc15c32726ec22fdd6ee1d72598927f625b37228adb86322725e12ffb9974eb49e49ff05b8b9d29f5a7e975f3fe20ffb6af83a05c1033bba35f8dfb63e1aec49a7865dae36d2cd3ee242eecd60e2d099b2ba2aa815fd737d6e61dc94af6fc129f59c27bec39952383a4454eb4c7781b79197702889b913633d250bb9c35ffecd527929dc7e4253d78d525047fa76cbfb65725475c661c179ce321823e538cfb110aa335bf36144534a2cdad59d07c40faec3059b528f661393a7ebae485918e26ee08d913c0f767c4d391043a46e151e7f65ba745c14d771230745cf5bb0b7ef26ae82251a639e1faa64a00214aa685a1898f631f6f65aaaa97da273ba0b011c44f4ab90f070e3729cf68b25a6d4bbd8419cf58dc81bbe578aa6d81e00f17331424c0381f0f6a848d449bfba74627beff113bbf0d71544f1962329fd1aba740d1b38c70139e851208afff1b34fede911892994f888de66b55c3ea4ad479051f1195eaa4ad5aa0b319e5778097741df7f61e2abe910bc8cd226763962e154e232157932705e651b2b021d9e705fe0f485e4eec8dc7c2ec3fc99ccfceb5b7cc651cde10daa72fdbb0646ac40f85c35535e4c433ee34fdbfb1cd85759bf302bd07ad27c585f57a7eb1b5fb4d31175290507563c6a9499a62a2926fa8b21d5ee2f09f5f30c147d9122d1eac77fd9ca52cfe5d2285969fc89d73b183e47d48c036cd65008e8729ecb596ae08bd2deb9fe14a6f4327e7738775abfbc6b5b9bfc2ede17d5ec226ac0b2aa32c245e73ab31253f2fbaae59cea836aa9ad52d7bb4ec9581774b37257223061a80bf1eeae4af5d6709a8e1e9f3a9b171f2278156770bb17677d6c2d751be5b81ae652bf33cfc7e6aab17af42b9fa771d44a36688f3641806c193db0c56037fcac6cc4d2b3396488e032389558637ba84e8628e43ed49174341c23177bc42ad68a75e9d111c22554cb70347d931728d1b55e3d30d7694f3d0c2f977443fcf8e8ada6e09a542848ad5d21ab56901bbc66714cec8815d686cf6bc5265df520811992ad571554ebc2dba77934bcedf7374a8769051672cf0d62755b2a0c1a4d17399d197ae77fdd402ef2af4e6aa0962c9d361a12abb2877f0da1359f57d67238698d8d1555eda57923a2460c26dc0b11aac8548cb9900c431d9112faba2b9c0dba8d1a79d7d102a287a6212d6b85cbef7fddb00964ba5601243ee6a714e2018295ee061f39f830439bfaa4d8885f1bfcad5add1be136faeed4d76dc177ab47dce9e470a09362e3169af6941b2d3a95f4918b99ccd7d642258492329c3f754547b0737d9e8e3280dd2b7918206efc89986523bfe0e08b1cdca0511eb5b9370c5ed321037736f04fdfe9641ef0209399a5e4e3a0253437f395ff58549ade8bfc365b874bb7c9cde0aa0ff5a163fe921b48245922afaf24d89398593b527b34d6f7b7566f7dbfeca10cf678a7a5bc9b8181d19a3cf7e5426c3ee6dd5d219895ee242ecb898d214c992a875da3ad2b1f7e1bbdbb497a8f9e1a60ff549e8c4173a149017ea87aceb80268a7de1ca6260fd1407d71c37b91f7f16ef2f5d0c42f586fcb12390f0a855ebbec51e02d68038ab1823f215fdf79a6d452302f588baf028e733bfa800a8ba7ce5677a7d5b1d0b2cb9cd703483bcd7586cf5895c2000953e803c72cab2d2970bc5dd0eb5451c55f177ae5e816a0dd5ee214707236576fd1415c8eb2b6b566723996853578170d1b655adfb56d0e7aab84e9762a745538a82a75dcaab8772480de13c6828b41e453c5aad909bc9a6568cde3a20ca15e7b5410b9f2e82869ec6bb31017347210f1a9e1d9f899eae7f9c5baf2a39dc7acd70f7288aa521a4b1d3afe5e5b4e4e44d4671f6a9e021b147313bf0bbf02038c36e46574aaa9c5b860a32e2aa83fd28a3ef278c36b05a6a17b99de37c87276886b5658edc214bca958692e76d4bb2144ada98ecf802aac8d1a3079468a3fe9d7dcee0947e395f123b58bd4793eec14baeb53c7f246e4e9c9f1557bddc3d9ae9c7a1945f77f010000ffff8c9ddd6a5c471084eff51462ef17667a7edbef62828216136259265e8740f0bb879a33016f55af25df18848456e7eccee99faaaf7eaefa6b5674c67a98f02f8a58a5581208faaaa125d44860c15defa18968f86c61a1b314d756592f083b672bfcc8599c680dc9e4a084bdd2ea7064928ad167d6b4b6a5af7259ef8ec1b15600a30ac25b4c2a77bc9831e008f2e62a56279c39263c83a4f2998ac227d95b70c103c9dd4d1880adf9182e9fc01e35c77c9b767670714d97e9add620bf1b520f2e89c5cc7e1c37d5d54e4fe2939008baaf4acd027dc27b4fe7850d3030095a6358f0ddda2a2375a2f637113d3bea7c7ae3a606bb7d0e7acea301d4e0bfbe2b5b8cd26a9603c16b4e2c898292e336ade0f08ca29155ebc094f62becc9eaa4466f3fc720f715699b2c13f6a40df18bec1d800e928f0af381fc43a12ce0919399d0436ec7734879d89a09af8a418ff6a1207cd62909f471271e5e44c4bc0f0e048ec78266b308b908273afb250daa7d8e928dc03ab92f931dbfad0296a06e4cee096f43dab8da54f61e67c2b9cc2fca3cd7c6a86cf8e3aa9cc938053bc74d185248d40d88b80bb1328f043386d4211d4358a564cc6591e35d02307bf4ada32ff613a7618dc9948070e35216a491ffd8c5c4613d32bce3ec3cc9b0171affa2be6651a2de00fe87efcb4acef1f7b06670a62719d7e3dd8fb982aee987ecd821354c019144489f31e772cfcbe13e0f84c770c0f75fa379cef7a14f50ec249e53c2d0622267ce7322c9497069c1f2c9b09169427cc6cc86dd5d988d0b6e096213377551411ea9eb56a4e4767db9bd7aa77aa0403061323582a765aaa5bc0e4c378604aeb7717bc58e752b06ff0af51bbdb6cec774c4a784181686d77779bde37ca6d2aae521f8a135ca97120c020d75a461d896353770cc5c59251345168d6c9e255537341e0b4de77c8feea80fcb7308445df777781269b7c3e83a79531420e1071c7d01fad5e15494e77dc3843aa9e1a674199b2f02a24a85d4afbe0d11184d4a21822c57165e8ee96250e0c484988b7338dfacca815060ff90e2167594517f9b1715483c1a3a9cdea874c8b0f5e1d4fcd69c7a776d6a754e49c8963b7e7c108ae9843e2f0bb26898f11c72690fc19696f0c5506914c14733c44393519c9862f37c0b27ea280cfac01696972cc22fdea11763c8fb02c4bd2c0f61b462a4b38a59e48a0a3e4e3864473254d6c7a81c8f9ce18663641a122f78355cd6dc8594ab1909005517163c2e383ca9131e6036f3d1d8e48082226c5b0164b56954409aad4ac9989c983adb7beec582003ee02264d48e7fdc8b4259855139bdff87783c65db1c0be0f7d184e9a682b95b2eae8b10e0ba8537c60ee00377989a8b321f231f9679374c626502899949620958eab39422c933b18b6d49117429cc8bbee3a9854827b9e148282f0144b948a04a9c5a091626bc2b5c0ce2706543a5e12815967c48a85c6e449dd114c4258adca5e1e6c8ce4678bce7bbd06e11671ee3d23abb8b942fbc08a1e20c8ed25939556eba84cf00f987718798789b40af5724d0e42b50d1d6278956c2983f31bb303e2171c3d9c386dea7a426471c96592d4b90d8dab2f1decaa060619d625ec7acacbd5139f34b68786e084c65398e8b58903085291c27824592e0add9c01aa6d51d17b6771ebf66c4ecb08aada08ed61d38dc5b220e449f2599e2b1380e762276622cd3462ed27884e019f81833f79a3c963d1c58bd0e9e00ac755561f460bb9d55ed9eb2f7521407377a809f701c055c8082f3c7350eae6a16d54488fd42508f0b57b5a589768ea11e15c0108e66ec3325e5b347e10d71d693748ee7d075bf99164150fc0a569463602d6818a08b7da1c4ae02bb2093e9f08f0d81d62867bc48a58cde576cc361685cf8a7a6d9cc7486d0567ebba628df013046ed731c97907ab5e953d36f6a6b594ae08c9e98f6f2422cde7d0c78388adb7067a05a20633b2495e0ff0b71c45b1737655afa3a79b1d190543fb7db7a0a91871cc691527fe609a9302f397a2ddc1e01a3a59f7038448d9571602c4ba623f6568537852b7099ab9d0a398aec8852ab5d4975b61e69423e367c965898b62a85d1a53ece9e055485216b91bb88ea388bb31a1410f4487cf8342439bfc71c87915aa123d900b4ae4538590629f11b16f48d01f3cea9b6a9c1d8dde4c200d4da792f207e9e18d674afae5aeabadb4ff3dd754daab0d1f1071f43a78c72e17da18fa1f5130544298a6339a2006d4a8eb9835dc09d9521659ac1c6a0853675720706a23bf664b6821f9bef3a34d8a619d42bbcf55c2e0eee95102e673aecbc857b6c174bf71a84a847a3bba53542dda7e035e72f16bcf334b90f9218a9cf6691f7d2221ebb2cce3bf46d42918d08e5092f55b1180bd966225133b0e3ba98814a11fd7b590248d6c3408852929c294196c7807f42f8c440665b20c26a80b48be50b48b096f7173faeff7f3c3c3e7ec4f79d5e5e9f2f9f4f1f1e4fd7cb3fd7f3e5e5f7cbf3f31f5f3e9d9f9e9fce29d9f96f3badeffbfeede9d3e5f4e1f1dff5f3a7af7fbdbe7cbdfe767dfdf3f2e5dbe9c3e3ffb5d5e9fa7a7dfafcf3d71ff0db7e3cfc070000ffff0300443c0a67ce080200" + ], + "rawHeaders": { + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-Request-ID", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "cf-ray": "913c001639657cdd-LAX", + "connection": "close", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Tue, 18 Feb 2025 06:36:00 GMT", + "openai-model": "text-embedding-ada-002-v2", + "openai-organization": "anabasis-llc", + "openai-processing-ms": "79", + "openai-version": "2020-10-01", + "server": "cloudflare", + "set-cookie": "_cfuvid=DeAAr6qBXehyZ.BOlCIZlX668VaqO0Ry.TMmqKwSrow-1739860560611-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "transfer-encoding": "chunked", + "via": "envoy-router-d7b7bbd6d-4j6gm", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "34", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "5000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "4999946", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "0s", + "x-request-id": "req_1053baeb1e6d8c33043ba1c5fa2e26b3" + }, + "responseIsBinary": false + } +] diff --git a/src/services/code-indexer/__fixtures__/search.json b/src/services/code-indexer/__fixtures__/search.json new file mode 100644 index 00000000000..eeedea6e888 --- /dev/null +++ b/src/services/code-indexer/__fixtures__/search.json @@ -0,0 +1,94 @@ +[ + { + "scope": "https://api.openai.com:443", + "method": "POST", + "path": "/v1/embeddings", + "body": { + "model": "text-embedding-ada-002", + "input": [ + "class TestClass {\n constructor() {}\n\n testMethod() {\n return true;\n }\n}", + "constructor() {}", + "testMethod() {\n return true;\n }", + "function testFunction() {\n return \"test\";\n}", + "() => {\n console.log(\"arrow\");\n}" + ] + }, + "status": 200, + "response": [ + "1f8b08000000000000038c59cdae66470ddcf31457b34e22bbfc9f57619530231404614116487979e4ef6608a77c11cc62167dcfd7a7db2e97ab7c7efdc3dbdba7bffff8972f7ffae5d3f76f9ffefad33f7ef9f4cdae7dfee1971f3e7dfff6c73fbcbdbdbdfdfafafff1e497bffdf8e5f3e79f7efef3ebf1d71f7ffaf9f3977f7efafe4dfebdf2fb435f77da7ff29d00e3edf6cd63cd75049dbf2f7e2bdf89b4430dfe5c855629a26955043e8f4d3505958dc7a298589b9d575546abe87355c3a74cceb13447ca68550723d546673004f4b1663ed53d6757c4e47f5ef6752c936e9c67a33bba349f418c72a4d0b9d4141641f19e4276075f417a3a329e57282b133ad8c791510c4cfc792c1d6d3f31ac9269e737213286b2a8535d3a946e771f110a80e57481cfe43df9dcd32ab5dacee9dd6a9c565d4b2285426501d572d051116e4278351155af2218867477f0610d1da0646965546a30b86b1c146af70acbe7cf45c2da53f855526e668ce2c809c9e7b632e956e5072e1a181d82aca444646451c6d26b2628382eba582274c206dacf7d37de09a1887b8784149d4c33cbbd95cf0bcf128e39cc331eb079e12b023e1cb3f290a4fb7ab98a155da102551c8228b11a3eac08e212529a4c809e45c14dabcfc5bad42836026d3df9f5859218ed606a0d2a1258f580608b980e0de6d4ccb2102adce989603e533cb9fb1580c929055faa4ddcd5b97273e8f7d2e92f8e631078567035a2342392312066cfc2795f8dded2a5d37621876a2c51a57d4822430f9d8ad5028ea161aed143a534d578f0d47be5877160df3b12e8f7dd1a87106dc4a5868151b361a1c87ed815c590b33cf1844b6f2d1a578c624c95f012b5ed871627365fbc6966aa5de231ed694aadcea4e0740a20d1088a8c3d61f4fe7ba42617adb9b5f1abc46380323e816d672e4acd9ed629046aae9e6a240c227d9c0b617a0b890f9bd6c3787174a32887c08c95d45151d1063a5528a0d43f4c96dd82497e7290a75e30ce146d299ddcd2a2cd92dba78f86761191564aea73d1c5e4f4ceed23e599442ea6e2ea5c58d11854b202189d9c39d7d2dece7c4877503dc59211b6daec79def13149e2526999521271ba75a86e17f159cead36dc265a6835bb3612dc3a4c97a7a9a9e6b47b0c63ab46460ee6bd23825221e18e5627cc7727ab082bf127105ebb62298ee0215eda36cc66b12284d23b01b1497eb28f62158105cab48ec970291c3ba19b312aa5ac658e0e16a88176c6c16e107108a237e6a435324a42587315d48683657b5b6d52467069321e3259a9241a65095a86325898e831d6979597ce252343f4a8798d1215e7d24d5304b5cf44a78b52be55c585ae95159adc7b7af14635f3d50f8165f3a483f0e65dce146999cff8bd78df6a114b92483161c7cb748670df1075d41e8d29c6027c28c95704b8cfed92db307556a480ad1fd28634a8d4ea3f56800a43cd4810c9af2522a9b2a41763dca82bd7ea1a95d7741b2b40c83cb9ecddd29a97308df8589b2afba994e2b42672fbcce356991b029609a599614600acb20003db2597de486c621618c4622338beab7495f9797d8d9fb6eb7262af6b564e23311f80159de70a2fe390d647cc9a861e30b72fdbf4919fa82526ba7eac4a394dbe539fa0fcf6a308bcd8cacb9732583e76cbd367bf7bbe1acea0bae4914edb62d39daf2012ea29a44a650d75710d41b21880db45aa84778dd2621a90f1c4f5b7bd268208a34d6c38892a666043ef5ac132cb2d9e1eff9d02273d0f574cc2bab980916bb78ec977cd7950e36b26143ac37c3b6653355cebdaae72c7472f7b48a2eec52bdcc8ca6aa68ad4fe2a7027518b51096ef02b49cbb34e7fec14671ffbc164d02a64fcfc5a4a8dd4fbf2adab13b5fa9a631cca1facd8e48ab3891a9e9f4d5624b9ebb5554fedf8ee58a326d83fecfcec0cb0b6eb0711b316c43b4ecf37859e0d5c8033eb5a0b8b601add019c1fb834d48d359ae50c7857ac590aeeefda7b55b563da67f7e5f6e863a95cf11eb1139d23e2a57970f0a170c2744349629941e78cd01c3b5be4292c7a329b95e3f8fa9323a9c5f150f5ef5918b4b246b0283c94df3bb66cf514015eb7951e1f3b2ea424807cd6f6c72ef8371a75c5610cd7641af9689464d571c5f42ee71c58c82a5465b78c0a367195d861969f39bcdb0a4f96129bc1d3a2bd3fc0caaed7b639629d406d37e2747da833058338be33d352e3ccfa965fa4998fb46bbb0f3bb6972ca3446c854ae8fff14dc51290878bfa6dd826e338c3b2f678e0fb5d2a15e0dc3d234b5319cad89967b108b2c28a00ca90602458c26ece32784cd15a21c75b55e7b5b29e0d334699745549f2b79a29883053aec1ee33b31db81b77a542bae5f900d158797ab680e13c2cd9b9d3e043754b3fc311739d212da8dde6c5ed6e0c67ee2d3ba7b8e3495b876575f25892ac23a01665a466b1f34da50296ee543da82bc93508fc6947b0c3fe23efd625c75986433d5c791edbb713df09c2d7af5e8d0b1199b5496ccb9135963c001f8ffb6de2c0e9dbffa61dd5dbb6d659a6215bebcc1ebb5b22fee7a0f515cb9519779a541eaf6f554794f50aeb1388765b60332663e2a9eedf754d77e46934917d4ed12b008b64304c950647da127d66f3da30e18e6c664be904c899501eb7a7cd633af21bdd99a1b9c76ad4d3027cb51bb1423259ebe0cef1772428ec38f0d2cb3cfe8b59dee67198cab311bc77182dc3fd288791335addf9a1853e33fe2f000000ffff8c5d596ee5480e3c5101c99dbcffc506f1f4fa438cf4d8fd5968b85c522e8c559fdfb6cc8cc8710118cbfd13643074ee5f221263c07ae4e9fedeeecffbb6aebd34026b8b208eabbf5fee43d405119847bd9331924a9797efff17205949f82f4832b415c289e612339f4d7c48b40352af155f59bdb42b8dd3da9b8d38a991bf109ddfd1da69ae148903396b5b1c32de3ac097d595f7ea7e649fb91cf7127364130ae2c7db8be0a81d48f11bca9d98da4f05624ed08a1d88c52244890d5855e219a0e0d276f6d359b36776c70d63749a995b1d42caae2abeb00426f6b758f8f03a7e926f7929ad5873af991a6f1903722211f74af83a488d28ff830e1df01eec211b6ab1f5c26e0657cdece571da8fed770e4926f74bd07019dda48886429323a1a7d4f7182c93c9343878f4ad75c22bc47c37a41322406c26cbd6cf340ccc4ebb1baa2e69a59007929465627f98d67e6053e76cf149a17dc9d27d44c6d3f688d63db3998b5335cc1e81bdcbb3398ee0777719c5be7f1c462c8328fe052634bb62a9eb4278533cd4631475234ee594e5f87a046a01f0bfaf436debad014010dc1bd0c5c865c414c1f3b7e3d8dc074e7a97cd562bc6b3f7e8a1aeae87b9cee0510b9494d4214d1894ad9510614a34febf1f0d3ced5a355b43c7a0459b98a8969f00dbd5eac5e608bceeaed6539bd683aabd81b354406a5fcfdb738f541690f88818860c62a17b690bee0ca50775a19feee3ae460fbbbd8eb507b0f06fecea23b6871cf2130574f9a21fdc5527084e248c1c74a5ca09ab2dc8dd061d3dd324cd9f3a1543460a01142722d7015a37b8756be9f15fd0cc17f24abd8c745ff064be9fa124f414a101468edbc6b01225ca8a1adc66647e3a5d9d45f4a65b268d2ae91626fbdcc269e2c4f0ab4bed23e6e0ee6552a7db49e81133983e84615a1dd987f71c66e9434220d9af294e60b4daff2f1862b22f3d2ce2ba66d4fcfdc21fa1a70b57d266277b7bf004d44f3a6d1a8c554db34bbac6ec5b3e3e6866af8d063d996c52add0d93ebe2bf76fd11f3e72edd0883e41b4458c9f6605f410c38b5163c0276e0f5bd050013806ea62df35587022db441791aeb4436d74dfcb821fbb99ae4ce3f98bc792efbb19339a364e16d96f80b8301bee37ae7037fc415a5470af2cd6b5480e415f0cc1a49404b455254a6014c2ccde33817fd862060d9eaae9dc93a1676f5b1198dc2e46781fcbe2be2afb82f561208b594485b92788273a0fc748e1fd3c46103fdb62b16c360faa87ea9a6457bb4c1c868b7d36fa23d2f6ca003eef66fab07916547b6f17d974ec1900b34ea5f56f17cdf3c24f9fa48b02c769d1108449b069d13bf0dcde493f505630af8490ee2919c36e21f71ceb4d7383b32152d012464b727863f07472295ac017b2e1df679ab16482f7905b4815d223a9130987f5d9381c8c49123fc3c4ed67f63cf566473fbfee9498b3b7a518b2ab49b66d7aa54330acafeb39c2658f1dc7a7dbf7512310de9a508cb7350b0306afbf2ef2fb7b30afb7a3267e6802ed68a2c352c02a921c17f576ea7fa8c28953bcca3b8e6e1ee263475f82964ac140bab965afb3ddff0a547ec820d73341c00473ea3ea7ee0392d9b81fa119d39835872a8ef5460b63002ed76513904f49c7028faedbf2e5e24e7718b49220161bc68eda53aa3828a6adfe6a406add046a84d83b5cf3ef3b624d920afec06323ef5716dbfcf2749c261b6980e49f6d05e977d2e1ff5866f164389d6370cfd3f81a66b6612be9815f1d7fde3bfc19aac19cd0c9d3c057fb9c4b8bb381859617035900b4d8a39b4c94ee35a751f029ed3b28cc678f32d0488b4ea89bd151643eeeb9758799a73a2b48a0d8729f71e687f1d6fd5e3100cf93243d9abd4dbfff815c116956dd8bfce0676688e838535e9afabbcf0858c775dfcfd2a3db2302e7089cfec4c1b61a31b044237fd1b461d1ecb3d74e32bb6c697e6ca3054ceae485808aad9187162d23414df826b6f2097371fa9f52349187fdc5379fcd47c7afda64e1dd4c602e95bdc00253e99f978893b6b70752947722c8523926fb97ed42ee68fd55d6deeca1932c27ba1966a74bd6c0f2b2ef52c73874e35634049c7ec680edf8f4f764f1dc2afec63b1f1468f9f67a3d36503cec228f7a988ab04671999fc54646080b2b5e84912d457a84635347df07f597884f23fa0494c6b1fdc2463727a3e1f3cac6fcac474177d122ed4a5b8224c4c45d47a19f29988d76f4ad3acc37e7eb89d0056d99a400a00218518a45e17cd7ada6f7c00f3d644f0c08a3e4eb92eaa1fbaf01f0f938429694f21253caded713155364473dae43e7b1c113b03628bc56b45c2235f7ee9cb46ca550221c45bea195557f1c8e742d6afbc6c751d39407bb69e6026b5b1e8ae4354cde6b8c2a90246b1168d851523a2d98cf3908ed58141b4febad427f4e53a445da38f7544d88f1a4f5614244f2c37cd49ed1d59b11ba95bfc3a14f4a2ac3653d0660273d45ab208666009dfa4459f7903bed5b72559f4c77ff2daef823b214fc56be0947c142a65d734b950b346b29a213cc3e615c9aaf94ae70acc47eaf8f2f9e2f8ba14319a43e6dbbefb1be9de8b7308c59e2aaa123e512f7860a137d611ae0cca0fd842c82920dc4907ba54bf06a6456d1dae972dcedb3352b50b4381777966330346c4e6370f4e45fe835c9634aa606a996f730f628df83c837d98bdb5a4937b58afd6730c744b361b7de6afadd13f9642cea94fe21b3af31c53e018354428ee3f4e83df67dc8e8d813c3497b570efcbb6654be0688745dc28a99cca6214563de34f955b0fb1afe06b4cb06806f77d2332eb9e98a48491d50267b8c2b89dc900e6a82cdda4277791ff1411742e101d325f14e6e19bd07f4bbcb02d6463b4a425ce85bf6ff2e561c5be42ecb0cb27fc019789ce671c4bf8d66648318d9345c4c4d6e9e1fff04b1d26dfe77cfb5159f08d761784e89ffe74d0c3bacef793f52869e1b1bb990edb10b10ac441e819076829b550d60b9c5923a340c4a87c28cc50e00be14d069a2aa14c129d56dc3b93fad83c9b748af31ac46660812eff24f3e37d8282636fb2e0aed8f46728fcff8f207c78864088609a29951d04201ff6dcbfdf7b3e60397936d5de09b64defcaeea9c35d18a22eaba63cc8a65a77b9f9d2ee1c691638d438db33c5ab06eebb6e3c0194f4447c5fba13fb4eb27d1f49b49e4d96535a769c618e8a7348e04da642835f08c54fb4f319b5af138d21db6f35f38428a3c492722946449f02d49399feb6b13784aab7808b578c7603fcfac4fb38d2702ccfa0e6fc0efb27e5b98bab276d4be6df074e8327208aefb0c838182a0a3e3ea138abb459c21dc356262749d22b3bcb934387575fbab05b5044d533fccd468ec69b610afdc2ce60c0fae2889f6b794fce53bf0df762afc805535c9828f846306ed750824be256af8ede552ba949e424e0351fcd378d9a4baeeda2147a307cdc1788fae42ca0fa4949dd1fba88841580d3c1d4566d2fb8c2651629f9eaba63f47fd461e1aa6e11117b6f07d6cab5b2a5163a64a3af17ffec54ef343921df058292b278ed99522dbf56e417928d3db3809a5858c18d7fcc79d2611dc8041a9f17bdd8822c6e7bb3c8974b9709de618c1cd3b84646af4af29dc2f9920ef58e397274bbbac8e700d7055b451520df2da7e62f646505f0ecc8180fab7c8e15d737aa24ba782ec989daa643201c6260792c0196f9425388e27b4d55401dd435a22da83e855601a2a5b76a51f8c6f7baf3e3445d710b2b9f6ce38426c877a2d3cdf4547ff6ec56dcf09e4f9f6cb3f8442ecfe0989d037c9feb0b6188de8dab17a074c9f01222b29be7e9190cc66c8b8d3837067b0bc688bc152d8dd6691d39816372588bb292d63c793ab98fe429a07dcec268635dfb545cfb5a01a545014e3e82aa1b1f9c28fc3b984cc486cb80ebcb86df96d6fb2efdbc102116fcbf130c452d289d3955f85c03cc81877f7b8ea717b95bbdc298b6f639a64ed8d2163e3ec0e9ce341ea9e56ce48fd4191d60445dfeceb477c9058070a727e51a423f2f8be9e1b33d8ce34d13e7c02c5706bedeceb2da3733f74c6e1cf23049817671c9223db3d61a9979ea36ea57b324298fd3b8e4ec9edcf245ffc7f09340c28843aba912da0083eee0f420d2858e1309f7ef2fe644adaccfd974eefedccd0087f2b860f4fa8421541985e77ef5100952ea79a86535f1cbc23a0fdb76c3f642638a341656bfe38fe775bcbc61457c3e7370330a7887b55fb30e9db95120b7efc184efeb8a4b781e5c474520fd0c90056d8d4c8c070b9dc73982a3395ba619a47b5074d8f508d0d684ef2b2a2696033b29af6b6153edb5d1c59574aef5f4dc257d55e2bac7cb74c4614c588f1dbbe6d75cfbd0b1f92d29633f8d436d6416f0c5b32d43232d93736788e341de64062a0e88379c9e62bedf3dcf76d979fea39eead432086dedb1d378acf681f1286b2b9d444b172743f76b0a63b3f04d30f4a5977ae3ef3ec2d757bbc8a45be89c242d7d37e3b9800fd6c74094c45913f04276a975d7217dcbd7ee9c7fcd1fdf202b47cd7ec7e5dec88ba07b9efe05e2001ca916edcdafd994b8f69b4bad3eef7ee73e857d04f6e9bf653e231acb14b6b8c4a3c557a2e9e8648cb43a4465ec40488a115c1ca8357ceaf50faeb64b77787cd57ec429d1c99d6c5dfecfb7335a2a376fbdafa712cd3b974a24840d28972b2e1a9a05740e8224ecc11d49d0a1b0551156838d2fddaafc1b98239f9d034a7b675d7bb1d164d8187ba41f8cef97a6170e0ed12449f3a4341fb409489ebeba8fde2d9bda20459554be9c0159b3abd59761363080a137466514b3542439b6313a9a9bca4d46f45ab401cb3771482195af413d00b62fb5c31d45f7186d00f38663aaf21f5ca104de14165593668713bd49aacdc2c0b21b2e92e3268ac7ab62d765f5b8f1ee6355c7d790d80a11ef99c45550868a51dbd6ae46d77b47306d9e98d1a3f69871df6c09419c4c99813a71bd36c7ce775f80d71cace8d4d39d964d17b2354c68d55e145ae1900fe9d43ba37bddb0793d07d8dd0d1b0c9b6860868f4fa0df572490d152ea326f5ed827fae6ba1d4bf85cda589f39661856c1c3b82cab5a3df42a1be6570b4e1d4da1da3d301404f520697946bd7bc7fc25d917dbc4f0d286ce4f86826261b9decec37cc4b07318a7436305539a8e7fb0b59094deb725f372a09e85ebc8a96d70a10ec8e8ea4f0998aa0719e9d8c434d03243e3dfbbd2ba9dc0343e6b60f20d047842d5c3fef3ea5af3882bf7d7357d73a4d3dc99a279cb35db16c117e90110f5e5d301112a9e8a4211e54b3a86e9e9ff1ee49002e0e930578b67dd5ba7ebe3b40b802d59ff4b46f9e7dfe90c0539463c6361e3468397559c7fb9efd9a4de4ad19fd1f37538a5773ad3ee2015408e0526c2a30e95b7b3af9dd9e3ebee02f95e0a6450bd7867d2dc9a9c46eb8db3796d44f8b2a391b5abc7453b3577f0eec1500bf3b680ec296745870c3b9bb1a0d4addfe020954e322dfcc99e97743ca23205a5325dd7df815432bd6f6d7438175b21a1bee7ae295c0ba72d664c030e75f5c46f288d4bf16687d3f23924855efd35ed05493d49911a832a3b7833b6b73df86500ad17b3629e9dbbeda2887dfe28e886da905cbeef3450272431eaaa7c4d98b2f1aac1feadee4bdf9819d290d74b96f9b2622c11bb91ed420eceee846457cffa5e2038622ce11e1a9929be76a7081a568b66b1e48a5cf5cbc903030ec014312bac47a0538d23643fa5128c9f16d001af4bafb1391fdc37c8c0602c49ee8230dc61d40c4a75c9582e706c2d743f6d1a569c5d623d34f9114a9520508b7a7598fcf2627b9262edfc8c9191a5d356157b19d33d4d44aaa133d1927f7f08ee430ca2bb6782a874bb62ca169eff256d04abb5506c77f9bf69f0a1260e0d53757fcf58bb9e7a6e029abf8180f93197c6bb1b789e5871890c0cd641b55381262e4e57b2c8ad417e3584dd9db53851babb99135adb614099f6ba777fe0584287ad1c8ea8bca625d6c4d42c4dfd384e3633264a90a8ff69de16c1cd3b3f70d88cf22ad1e1872a8f813ef80ae2048b4a719b59fc6525ad3844fe044d9f9fc662b1f741414c4d05d813c1ad5d872edf0d54af1ef679e126330757f42c03576f3b9019dc466f39682fcbd8af35615f1e15a28f7834c18d132a62c92215a724b57de3edf86273633bb51204e73f4c9cec8fbe3218fe9bae00fde176c1e54cb0b7f7320dfa993af5323b8612e4ebcab0ebfff8a40fbcbf68a811a22226a4af98b221f7c417ae9fd832099d8d95bb9a64cd1bf1f7374a6863934fe62c2b9d5fe5fcc41cf358f3acd3dfc648411637515b971f5a504f120278b6ccaa3fd6e26fe7735b07ceb83e1d0dd1c3f10d1c6fb5c46f2acb01ee1fe61eb2cf2a587d8cd9e0739bee4f7e22d9941d8963e6036a9b1e9447c3aeb9ccdda39404ee41f2a467ee833a014c6b55be9c70f7d1d74a72ad5f43dcd737bd6517479ee1446c2ad4f879a9bdf3e7375351179db21d2e6aafcdbe7730d3b236f7094e6fed804b9b79f9b041f0ea4e2d0990cdd67daadcb5b1cd06b795aff070000ffff8c9dcb8e25c971447f8598fd10e11eeef1e0af08da5033102840d4460b0182fe9db0c86c49e5276a6e7343a031e8c7adbc91e1e666c734c5fb651dfa8aaf759811e700d871945bbc4d7cdb7a1dd9152ddeb33e3302b0a19741bb0c76b6f0a9bf1a37afb49d5fef98545dfbd3be16043d97f6d56ac24f37456fabdec46fbd4591c139d735a9afd93fab237375063f5de6c97a2d159583f3994c4f97375848ccaaa2c0411647800a7126a472c269b8a8938489928300725f4b9b851a4cf3cda098f473bff0066b62fe95248de6229d058dd59e9c5b9eef4c4eac4c6429c9ee6815800de7f5b379abd7b788ad400b6ca86db7da9be3ae75c360143e44502569419eb84a89ec0a2623ada32dbd61d21370dc80e8f45c017b2ac2e4bf7e0b2dd66be9b239baa56d2f7eb97708576d41dd2c9241f1ac259916daca6d04cb964c927171e908b9b76b2189de02f57575c5eb99e281f58c90e25de3b6776ed5ad7ac56cadaf81bf774def97278ee9a7a1fc32491582b4822e75533a6fee4ff867df4778ce0b26620d864d4e01d96e8c96cd8d6510d1697fb44ed264a3582f2c3a7dfbc0d8c76251aee95eed33da851d193e1c9dc6113967c7572e848c47400ea4b25fef72c1d3b8143aabc0d9f24bf05a2d408cbc48e31b3551183de4788140a3784dbf10146a7d8a9a15075c51076e32ea9d5eb61f4322e93418e357afd3ef3d73a3d7b8aabb3858087d02378f4ecf0483d3659c4140469500109299257862f1a258a211c3be0e16bf7e4bf679a4465834d734c8b522ae019aa1b025035816f23282f996bdafceb5c88d0079411277dbad514fd306e967b8551803cf7f384e9f12be8e4eea6c9bb117fa68d56610e0763dad9dbdee78b71234404eb414cdaf7a53342904eefa2cd07be715015c162e4fb26bf8c76cdb8b45eb123c5125d966bd955d6f4a6298a3e328a64b7dfa6c72bd7708823affc3106518fcb5ff629d48daa541f845ddd41f82f4f26af4944b163842eb3918be49cbce4221c19932abc6704e2e78b207eb6e488979338f4b61a5caed1238a5864ed2e4394a420ebf06149e1b437c6d71be56579d7fab5b4205b7dc62845506d285dee3ca0f26f77f79515ee6d64f30df5ffce7f3fffff3fc37fffdfee22ffff1d77ffbfd5ffef397bffce997dffffdafbffff6dbdffefeafbffcf86d7ef9dbdf7ffbfdbf7ef9cb9ffef783f97fffd15ffef44f25066d1b68c275fa2f16b49f15b05a88ee3140e71723613414e5eac906d552fee3cd1b8a1fdf268a5bb6988b70784a3e31486bab75183b461babddd603ad9669e28f7a6b33b32f32c6e43e98a0ae6b32a9a5457a25c56e757b2f7db24eedbe435209f64c0b3e78c9e21ddb01f739bd3a399b3abb1560fabf5fb53f77fd06b17fff75723dcc8abeb1e5628093a6cb3e574fffae0d1613b6db33708b685b4e4a54d00aca9f20fef4ee8e9f4497851a2c706d887351f0f2015f7157aa3950fba61d43b0dcd70487061ca821603e1499ab16647d86deb1b355bff280d7778b264582f1d64bacbe4557ce98c4bf9c5557bdd08930b24720902b883d00d95b352bb82766f73acdda386627148ff498985b7c8b18c7728e79c22935593ae7c0465e7373631fb0e89aab1eb92242cd51e700f1f13bcc022ab4c1f257d7a9b9027853c58f0756af63458d9fa95bc87bfdf9ba0aa1b955378dd951e3584aa843ec8e6d3b61468c9555baeced00fe2eaa8f676076f36d832666d57597bf559fb2b274f8e12752ef26316c905021231e22b74b82114e71660cb423def8e20ba0d517f66fd95043a954acd1897ee617bafbc6d2d612c3ab45ab854b0793c53957fd88ba2754f1768d0c3ce06bc9805c6fbab9730f74241c569575d4cee758f5c6bf4e8346fdc422b48aa82773285b58ae5f5da74f353708b93ae8b23ce61220966e8fa7c6565aa85b4c6d5ee1295e4b8e4c8491357cd74acdc3aacd592d5fe607530d13b56c1ba897d9e975e9a95b0d905416b1678547097bba0606246ba1a839bcb592b3ea872b8f2241235dbf4303ef413ae744db9f58452b025e8a980880eb601ed5f3a0337506ea49224566283a8a1fde79bd94a4a6d28a9c74adafea13eac7775dbd20720442903c468c648385ece534e9cfe851870909c3754f6e73f7ca93532a7e65bd80752502a069088283c6babd1631b5c7bf8a82e27e222b753ed1d181fd9fe83163d06f7baaafab6d451eb04e77b11e650ec3da686d2c5169cfd38269547b87943fefd1ab58e1c74f03ebfc84895757819e780575c56b30a586c88c155174caaba0baf5318c7efab1ac03deb436ee896a796ec45e2b4057159c1c68c6530c498dd0d833aa0aa7ee5aa32293ba20f5801069a99bc4072b582865aafcb6cae0ef3af1583aad894d2e598bea21d6ffbac38b29ef066d214d01bc7aa3554571955e42b385a173400bd06432b2edeab0978818333e1c9aeffb240244775182836697de13f02dcdfe5e0db9a692ed89abd11049bb8ab95d0d2ab5e15a221a577fd35ba5eb7d3720ab242a6b322a568c0e279342e1d545d9e748af88932e5e46a20359db929aa879caafbefe037401ca66c46b3554d8685bd58cf6bd311bf253f84f8f0942303f3c2b7a3da044c7420d0ee4e6722a940fb5d5edbb29d4593fbead8f255133302401532d1ecec45d0e96426846b27ae3f7298c3ca357f2e770b1e73bf686e938f644319d72170aff53ff04dadcfb94dc59ef59da23993540fce6aec7a0b88d4061aa8b7d56a9d64fc2c26aa8bf2ffa7b64e0e713b076ab08741f92f10320134d673842629571385246223260148474f23e76b67a8dc81909debd4a4cca5f494e78509845bc760472ad4622f44aced96e2006240454b4b954250b1e86af5d3fba53bb0b20bbfef5d5bb77192b1524dc7c55ad1eb6807474553e90d8b72b4aa08fd306cebab209fb90b689a3553091b8329565a894f66453fc50dd196a4a977caccc32ab7fbd1281bb2f187fd53bbaf99a9962e9d6fbc314bba282a8accd852ea5d0f304c2878e5316bead99976e8a982b1c54997ebc1808746f75753a543185831cc7d210d41299a57d28bd35af5fc481e74819c899dbc12854af789f72fed620c250dfb7934fdb3a8bcd4c1e2eb05805fb20cc75ecda0fb2944baad29b16bf01e851c688bd31491ca712073fadcb2a9353d457ab54b4aec54c2d46534a3e6cf347db65ad22374f3fdd7a0d2b93c02b0fad6189f6aa1c2c06b2a1849bd500f06e4c51abd708ba9529003de196d7d3b22ac2444080ac7be310f8167809f52dad2af87605be036c9e2d2b4a79e0e6e904283f8254b51bbea0de84c7bcf43ceab34165a73751d6f1d4eadd5af9cf528264b7ad572cfdc6a87df24d2ddbb6ebb740b3a53281ec5991589086ceb2ec32460176b8cfee8e3177b3e82874724513c1efbd6c0584c371e4b0c68aa008a0301cd6fd43f00cc8e17eea9febf12113296ab8d7d06abbfca222e559eb8dd6c9dc6200e5b0a65d5cb6f5593178ad59830de7fd7041b25e36b441c7e9ab4a0ff8d1d54a066f6ec4f29964b19d2576bd5575624d5cabc7567f5b130226102f1da23de30e5fdfa3af412a770058a645e3663bf850700b2cbf14bfd4197c75cfc4be656c472a46a74da42f18c7c6a573a6eb15db917fee105ecede6de37a7bdca16b393a29b4dc45efcf361054b5088fdaa0f58ddaa81d6e63c7503fb87bea298b250d8741098c93cdb0054f621ffa6ceb94da22fa825836f6844dc4baa2dd78738a238588d76d5fa30ca763dfa321dbb072723f6d85d510ac3512da4f43651bc16edcda886d4d6f4d5cb4f53725ab5d89e486be10cd24f54da6eb9061d37a9a196b19a6a53294d0ee53553248d2ee546d0fa6a2251876d510e5c1a7736ec96687d683aeaf580d16e967bb120ca769387eba2e8001f4b8b084f58525175847e2219520af390a1704dbf0225491e5a813acc9760cd3a72f532cbbf63664fb0a187859d5c3308868679883c4c7d9bce6c0141eda18598cd9fa2dba169676bbd17871c0116c3713bfa58a96e24c3baee06d2ec73241ef851d15fc795f14d363f1161ff47494774fc18ffc068a5fb8496866d71d96bc60d502e2c7102ac4a996eeaec5d0057e24335747886b249dd353b52fd5f6ea2af7022729433fb42af3eee53bb94f9c0bd89ca56108af78a13946d1899f2448cd2476ed5ae09e166faf5ae4d461a15e28c4fb4532005c4bdcea401fdd3c57f44a2892f6d68922c851c337628ed52cde093274acd53bfea9b2d25977a22abc67949343fec2b540d8516558d544acedb90d2b2cedff3b08c6eab430be9bb36b7feb17fa849c9c3571a5a221f800d45bdc2b12949e81e792a4821b006b55a147fba4680a58b22aa3d160f5d3c6a4f287d473e44082bb0ffae77a972f1c7abf9242f507211c04b88d2a9afd7a203c53b5548049bd5d9a0fb044a98d39d22b3a8137f8e1b243e010d6a49a35084b9bd7635774e1c1ea2e6d5a20b7615b33253871fa8a0dd09d96d0207d7ed6f80e9d50c538f53a218dce705261d7fb72987a4dedca0d91509e5a74d33ea33211b4beecf1c940f3a3cba4f7dc802d68e94e98d45214dd41a81db33ed0e6ad3624f7dc63b3fb22353aa1b4418016923d325a4d6a5c17c01a6e2608594fd41b488790e1085472ddb2c88ccf3106b28362215c3075a9742e5efdca90070398abb79f3ac235263ae06b2b3a9a9cee1aac9cd61323cb5d04b773dfad465d59369d12449ccebcfa7df6a338505bb70ba54b6b1d96939f3d163d43299221d0d8fa9281c491120ca08aa572a4355caf22bd4ef0acb00e950a61621327d85bbd0f04587c68c35bffac31bd6fc03ab7aa603a1e90d9d762998c820a65f073257fd9a2a2725664142e5b3b3325cc584febfae221127ed1a2a4002496766aec0eaa23aa91a98fbda814e01da6c25b75915b5796cf69d6225b95ed052110fdbee211ba24c160aba7fbc5fda28d0a2a94642bae21ce2decacc3053a460da7de2e84ba3b6e50995c77ac7af554ea7062e9e0c27d8058d9e69af535a1ef6c6f50bdc4abdc56355c016e70c57239d18019ca9bc470bc0475452ceb22327d226b093b0f59c8a6033b9691a3553f86ea176a0aec742c1104237848df48257e631036157cc1983af39005408615e99f1622454a783b10fe9e18010fddf9ebf3d546572b33daf094e9c08083d5ea5b2c9020a9c81aa1aecbf1338100d752a32aefa1fae3181f15c897bddbfbc4db29d4b482713debac3cbdf701bcedd4e782b6369b6a12af4b53f96376cd972d414099f29bb0bbaba27e51c9ef7a96c095972c5bf33eaaff59ecac587260c2dd6f3300f8bd7ab664338c4b805c2ff23609a1e5a1725f19a675dfe4bf5336ec7354b0a9fa1ac6c605ed10ac372a0b0568dfd50724eec62200fffc720d488b11840b8742046a472a73dcb2dd691a310172a88c8b23c0e877ec406aab8f54a90bf55fd57d82d1a5dc5ed539bb8a6fad166cec6db5b6fd2cd76cc15237a6c3408f4ccacbe0563f61ddf9a9ce04d75411be3cf905510466823938643f42c2419194c4b27ee99e88f874e861ac8fe71c80444a1201f9d77bcb06bd481b969c6dfe4476c4a68bb05e37557565f1fd86556c1cafc29d78205e2f527e92494efb408c961dc3865f0874363722d60767b6d97326b725e0d942db602e71ed57f8c92ae95889a51abbe17719ba8aa10cb6e5e2d2e56e4b536337cc0226057cb3336e498b633fa4b27a60cc0b0ce30d493d5baca3946537390a3295f34ac32a76ae0fb8fe1d5c0fc4da20ff08418d57f0cd49a8fdeee88e7695562828cfc5656423cc307763a9ae2db58a565d45afdb6aba13cf12edc79727d1c3b526ab752d12d66bf355d7f99274c6d4995f4e66a84fc7591b8cd2a807030a4bcb5eb340220d62353d04b1a97fbe4aeb5b25123cae7bcceb6dfa46834d7b4848b3aef7bfc9f7990ab19358184fadadeb154a00583c972b36661251c4179784ba7de37d7d70f5f59e2c4c8bead3f093b88c307a86dbe5f3a943e8db6c9eb34151ea8a9c6ee422c6b6fac0e9b79dc017a80dd5fa875ceadbb7aecb2016c32bd64e0c26b9206ab9a262e342f22d47dfb33a1b7b19c9f5752bf9acb8bc4d96b24cd106903d9a286b3b122413a13995ccaa2acf61fb82d6e271a9641921886b7c76c92a55360d2c4be95c7526ea22d4b37d474b00cc5472cf40c11b879f0a96e76539d5a7db57dfd3afdf0b5db1157f3756522df4e288f6228a105e1dd5eeffbd8e69876f34ea9c5292714fe4a58f80e62b46e142e80f61a4c71116b62b46e89b749fe8ff63541d74c74c03b26829d4d5e15f1be2bd22b6310426abe4786e703503cb9c0e96fa0ed8f27c8ac085364cc12146bdc5ec90df8ebd6e3327a558bdfcac52c44d2ef0ac37c47e4a36e9d8d1998698a7f7d98c12dc3e67305c382aa8a8269c299404b2622630e404d12a6a25afd233d28ecba253c24ef9c7de25a829b96810aa2f2b401593473bee0978acf6c0fb592b41f5d45496b06ccd363fa44cde6b5486d51f7917a670e3921a123dc1b5dcd9eae6302521e2da99d91bf3ec5329f71a889fda1b5611ed3a34db34e17eecd39f759dd5deafed5cf05f2b71c98e3dd5accc0ff3c0b361ec5f7b829e6f8cb00a4eee48b1aa3fdf7ab550007222c80cb9cdb2efeccb72ad9ec9cfd939d290a2963eef59b776ed2420965d3e726aff4f730755661da1c03098acd9765bdc1908a32a5b840967af2d6c1d240ddd943b202a4b09b5fa2c2986527fbeb86b3f66b28c80a3d6f512eafcb9c5e9a14620b3c6bec57be90d9de8736627424c700aacf8749e35941a486efc39040b2f3e8febf5d42d90f2e4fca766c44c4087b66e7e45445496dca106afc85cb32e03312cbe4ed0a463d32c579b5ead08aac784034727c24673e14d38d03bccbf3658dfe014dfedcb8e17823de2b76baecc01941df67496e66de5a0aa5553cdf3c36b4c0519c7d7a1bb17eff45d35ac03be5b15eb0c528fbe26ac5eb3921e6e98666bc6e1fdb03366bbd03966475bb74a9c3319a9d4f680b269cf5d9b3c5d43188c8629b0320a55ae84218b8868897d402b50adf7eaa6153404151b03d5b5d7bcd33afd1a3513b3633a3a8b343c0fc7756c0ab44baad90aa31c535741ef5d6aac86810399a96ff9096e2b668de034bddbda45961a6d969f58570b27784c02eba2e1708cb9160bcccc8d18c98caea9adaee07d6543c5fc6824617eb328afb79eb7184e84bd1a5955a4238bbfd7e7da39ea37d76598aab8e5dbe6cf7d682d405edb88b9ecd378f95e3d3d6590aaff5cc189217d376531a67b5d184df79a52bbbf6cee6649c150f472a97f58c400ca489dc96cb59c7df54ab84b89b1a86f5746b8be55e27067a1c9a8c5088ced7b24f1941be35d334c9d96d819e610eeb5fe204742c56c213491a3fbb6a4ccdf9e7721e67091da89a58488b82b48c6f0ad0100407055d202488d75eaa3cfedbd70c55b796ba0afb3d97bd9ed50235d3eda1afc524e64886f0fa4609f15e77235b1ba9deaf0badd9fd35a3581b9023cc0f0ab4e7e041618e95c7cea04771fd0fa5ddf681a7daa01f2c7fbd9bc0a5e636e6b00085e1388ed86ffb6b44a00382995ce60b2a9c868a364412edc813edb18a3036e2fbbd7e67e6def2a653e2d0ff5a9a7f2dafeac6691b510791da2eb032024f9bb4c62d73db3db1608ba9a31cca76fa47f86e404285b3b5567805a0f1184ebdc7ec3766899b92af3a42dd1ad12453b2b2780758aac11e7aa086d44fd22a5fe4eb04b28573f36914f13759b5282dd5092a5aa21a0776deabdeabc0ede0ce5cc98bfa6a230aba592a204b3d45834f3c05e5f4a77abdf66cd3fd5b9785712236512ef9f06ab07bfa6a04f25431d00714d84dfd6309643ddebf5e0525f51d475aa3a5b5121ad888fedda1a7b0563def1657a5bcf55b3182e1705d2a23636f1014d78ec39eacdd7153407175fc9ef64174e1943ff88cb54f1588f58a65e943a1eefd1b7611b76e42eaba8167d676543a8089c32463e2fe1bda7d35c255b1332451724864918b20e70a2f6aef886fa5c3338e18f562f52f7e0b07e0aadca5d2ed64acd89cb61a3555625339488e36b4f532a7d2185273413f24f114bfe86fad08dad85478724d216ccc5878c3c72fc0c8fec142e378449ae39562db0c702704082443997bbab2672552744cb309235b7cfc6ce10958e4f3ac3847fc5abe5ead23ea14a77449edadab1c163386a1510a56a580ec0276a86e9253ce700f84fe17ab8937428d8c6cb210ee87ffe44cedac7180668a84e859ac4a73de139ecb482ac3f31171eb4be7385482a715b9ffdb4b402c7d02f69ea3595e0c1c1aecfaf5a30afe283ab24814dceca194ce353db87018b1e39d168a82fc3f4cd0ac771560b846595b4c25b09be172a65a5ab58a3e129138d931a2b16bcb484a9becb427768845a3546add0015de5bdae1bb24abee409c4265dce1583de736a0af180efe1bb030e104ac6b35e4a87070ae714411ff56269da274d781505acec012facadadc6dbaae5a736f5f583e4c6f17b7aea774935fcf3de83fbc9ebd4e129e7a0b3fbd46f7e624f3d7a6fceacc9b175fa98185bbd9138a73edfba1653354f037a5e9a1e584926244d7d1d89b7dd899114307ba17b5389f581549de56985f64f0c9d67fceaa2288ef8b4af7f8c3aea31dbd51fa9bf32fca8399477865174698aaef7ab9c3dc0c597852c1ce7937caa3592d042c198a8e77ed76e7dd56b9f7cd50dce97986bae2a1e456ec7c3102af3a95f14a9a07ba039f312dbff86fcd9476a595d9dd55bba857d02973ce7959404ce805dc979ec5ed57ac44cef6047915c752caed39509e34fa88a0ded6a92c480d691897b80216382e6764a11375def3ce1cdf227cc185726c3e5eb4844ca8f9e4016545497eb3313cdd666cd03efc546fad5764750452ef8c1ef91e9aa55272d59c50d6bee35d5c9b87ec6e43bb52fc4f9ddd6f0864e460145a9f3599a91b1254a69bf347dcd81449c1a8247c238d8d61e954a7a68ca312b0548d5cd134f9c1a5526ea9fa4e7ebd6fbc950f396098f7a2a5f3131f2d3ae8672f51c13b1b51e3b1bdc7d43921ca4ca0304bc18fcd75713db2ddff55d08fe5c5677b21b9d60579d0d8b9b133b13733de1140d8d7afb910fb6a191f60a37ff86bd2592ac2a5aab3f668ad03ce283c2f1a3e054e759bd75aba402bac5d5f401d3c9eb8156c71e5c05dabe4315eb53501c0858b6cfb6a45ecb72adcae56a6b8ee855adbb927ada3e637f35cedcd8f321cb1bc49fae23a188fc6a4c5bf868e5e48860d5880c49c1a40548fbcf9815ab0261eed9249a045ff7a7802ed8aa6fc9bb59619a63ccfa8ca62cc248105eb54595185f4a180557ab7a8aa0181d388363015e5502bbfb0d6cf5de61cc9596ecec00e87b0e1ad4c5349c938b5ae9aed5f275b78d5731f69996c7fc0a937a9e9ad9a35e4522e5968a0fe983d783a5aa252cacb66e08934778ec1520894ccdfcb8bf76ab757fe6baea627ed4ccbe10b6e87ac3735772b20a15a29673ed464948ccf3af674a8eeeb32a7bed71a27ded117bb65b5a6bac9f81b39d3eea04876e8da887d21046b23e5eaf9bb18a8b53e96b7c9b4c7a5d7dc2478b5e2bcf980b7c4b0547af28d5d925c803fad9537ca34a091487a9db4fc5a134358e56350311de0d1fc2356a6142b442b725e1fa5dbb1da0fa256635bf3684bdaace62d4554a24f6b7a7ac9ba6c62b7e5612122e762b948bc3107051b54c4d645c9eba6c6015b37d5848e38f7deedf9390be59c17741ca6b2d805661a2ea7f324ebf9fcb62cbb4a88e2ce4bc9bd66e58fdf748a5b7cab3e18e31357f83de2da5bc366d9f300ece7a9d3d1b11d9bdbeb6b53c8e8195c068eaf95694647e8cf8b41d4b7945647c9440a812a04fedc11aa5118d38d51fa63508aa4e41ea7a5eaed1d06544d6ed950771fe593e6de3815d16995461866af16a9eb9869cdf1de1849e60c70852bb44c40e4b68ec57b19223e24b97b6c4bee5f403fb02cd541a223c225d18116368534ed3ea61ba22faa454ec51097dea05e4ad23c6eafcc40f33737e34e93db7b49615c2eb4f9f06e461f7466934b65a0f8daaa4d486ca20d2c509eceabd13ee77ed0d47ab2062a50a36bea2a94139ff3807f7b8b91b6e62b23ff965bc1b7b7b95236ffd08dad1ee89f55aaa4892a168f70664e93b32f5cf62d38fcbf33f000000ffff8c9dcd8e753715445f25fae691ec6d7bdbceab2026900881044c182021de1d2ddfd3885be5a67b8414a274f7bde7d8fba76ad537d4a703ddfaaa56484dacd6362bbae174c61aab2818c4bc3caf07bba31ae9df70d29cb71b61abea2b067b7d35b7dc84f2c18a330d4a81cbcb10b1649db3aeb6de6c9b5380936717c563950ee7d1f624258944b07dc28481e79a7a55279c0d34bb56d5d199a3f735129e9dc2607e21fe79bd89984bea774cab8130cca05d24feda276393fde7f6585d0d872dd73243a801079f25201a32c753cb43ffa88ff02355cf0e6525bbbe8489bd7496b9960529df14d2f7c0c8d3666f636d74609baacbdab55d12c8faf1f31861f1e6196c0bdcf132dfe4650756028c68d82ee38adc435b9be873753fcf13a6198ad75e124b560de7eaf4b93de588a06a2299bf31faba7fe88003a68dbb8d0cf45a76b7565501ba22d2a4cc15a14b980bc25e92c79a7630f932ab6e18586defe86c2610ecef41708f938f9590f62bc1e3557c087f3b033fe110056fc452b8913de19fd0cfa8f3a7725faeb112acfbd1239a0a770d5bc1df6bac3667dde6e599656a034478aa6f99410a2b834a11e19ff20a9974d76ee7c65e4d55fe54d84befe02bc5a012a03775c20119c585f0bd8fadf2166c0ae5c2003b3e226bff3665b619c005dffcf3b59c7fdd7fc50dbd1c0b6d9a5683c73294a04a19b1d349568be8edaa138a4064a8f95b3b5b2e0b521e2d5568a502c9e7f1d9a39b96fdda1797c44da0bb0ad09f6b7a4e91fa019ee977ab698131dc273b5c4733f4c1be139dd1ccafd9c276e3a0f6fbfa8e9e88492e1a5ef97ba9fda72544d7117b593256e6da0e3a56c6f0f3224e438514c0888a180bdef765805cfaa7e14ee385b7c682dc364879fd65d927badb1aabb3bbb84910f73c5a7ace9c7358749080cb5f70948912440f6932f5d2646f17f28e79799ea3974bd5b62ecae67ac9062e51646d178f4659d04aa4c274e2f69dd9fdd29c8f50767c256e652807b767e59ed0c36f21063489fedc91e6ef676c5cbb3b816efce44e8ebcfe30645aa53b9cbbb6620b0416c3751ada2510796bb1c25d316d7a6304e64788307ba86bf31ceb2e9a5e232c28a4b073ca712194b5b2757c0f685fc5a33df7b61d5bcdcdf13bbff5b3fc757add2283ef4dfe308b40fc74ae561bbb7d954820fa2e5a912fcc813a934208e9c813236e3f1a918d2bc1134c2e4dc1d5724861c168cb881969a0be4a00b16175ae83871eb52da3735b84c0e9b081a63427e5e504e8a87fd8ea1bafad156dd0ccf485de4002f477208531a23dfff0f7e77ffffdfa77fef5fcc31f7fffc35f7efbe33f7efcf2d38fdffefa87df7efdf5cf7ffbd38f8fffcc8f3fffedd7dffef9e3979ffefb4dfccfbff4cb4fbf9393b20df31a101ed45dbe82a8c5900e7007fa8537c59fd16d2bd0a6432190994e5b866fb9001e594c745f095214f9961ecf7bd5469000791d17c598bd5cf6b5c422154b878666ae489633512e1a0fc53aad5737f2157a0d11bbb6eceb72ebf6d6a21b09bcaf66047a4ed0e669e78ce06d331cad0d0fcf8c656e4e68c8cb32e883eac79afc587e89a0de9fc35c8028d5cd22b9ab4f6acadc0c074d5fd6c207792bf8adb4c822a4d235bc6b9777c1f02bed9d5d9c49a30f073774bcb7872d566a2314aa3a02af5ed04441ed3574ee8970ce9c79d1477376c264f03a3dd4636d2b50a0d1344bab2b8b6000fd687bd9693e573628a603b537e9039b95a10efd564e7f6d3ef098d97d91849d68e8d171ff69f62a7c949a7b2a0911ddb63f344881c22697f8d375854c4c522e1b3c44163b63e62d259cd80bebc42a3cb3a9fdf9c2bb6a33566c70367528398bb7f76dae344e045b4f150144c0d555dfeae5faa26f9f7b6cbd4289e2be18499d937d1c2fc31905974fba729aaba606fd280e3a5d1424522e1b5d33d1f2689efebe2c7fdc8aa3d92b9bd802979ef1091ec062032edf351edfa54ba1ebf74f811b4ddb0cceb1a275586d3061f5b520af52c3e1ea6cb35737bb33ca0983e795ac6e6eea7b5beb70494a5b03f942b7968ec19bc709f6939a698740cfd80a6f8a9164fedad2941e34cdf7cb31a687f928d3ae6eea73efce9122f64b961ea13c26f70a5a9a7099fab443a4ecdce3922983306ddb61dc939e409fadbe712f9b4d19bc4c6ba13c9f72b240f4d30940228672197d47ef2a76acb3ea7ab047cbd5d5ddd8b26f73f77718e436a588d1b29849f6c8439ce58f7ad1b0f12820bd01a1b65156ab3f0a4fbf15392dee79365218f5c1cb5efbf4205ec69626554255e486303fa89e4b89e357fe297ebb346956d2222b23a0a124b5fba7d683b0d66c450aafd96d259b556bc18a41deb73b0cb3a79daa7bf66102d963b7793f17da44b5aac7e786499dc6f038a1ef36fa1f67f5e7d8005eff6e3697da304c9b3b7bb530e8553f8c003bf0a3eeb2ad7b5f6354d554a3ce32410872816aeeecc23acd474bad17ad4ee83ec652c901fdb17e0d31f6dae104ecb99a42e1eaa6f0d33f0afde752c401bf922d60ca1952e8e5b44188d813b3610d4d8fca5e1366b97e827b8737de833b523333d6f00d0e3a1be0a8fa751309654dc1385b49d79f33f21f2ed08d0c8b426aad0cf75655c02ba943a03ad8982863783083b6c4f398cd424617e6c46de940d3887d28eb871ad419fe16cba01f3172da5e17967eb7266c8ebdd3cd4e70b5cb055601544d3f312ee9aa4f7d26d2671b8a1099a9ebb1562699cc361dab8c24344858fb8ad3c2105b97171bb4423989eec8f035fce5978ad6a35d98e99b18dda56efce8bbab2c14e38c4bbbae5d373693dd3d0a7946b30099751c88f6e64e4ce706cf5ca90164c1046a5aeee9e253484dbe23ceceb1f350b9971d67380ad577c2814298b072da46d785c7daacaf0dfbd5f61ca6a125d3407b35c6e77deb151a07cca4593d0d426e5a36c7c8a65a2b40155271600ab0557f7b051a989eb3a33636d028b5e770cc2731bb4be9dcdd652be4ad3b479e5c1368bc6ae2d3e2f3351e987d6fa3601d3e8bb61631aaab29fb26d9c9aee545eab3e223566fd5210dd023f43b8c7af2c0acea2af0b11ccab9636aea7cab07a8e08b8d88ed0ee10a41432fc6c95edc56f5bcf826bb065cec1eba2234b3d73864181bb0f6b6b6be32d1671fdd1605e3682f7ddd3c8b20a05e2baf311d413ab9c31529b4b9588d61da3a712ee3e2feb6f39c3dfe2866654eae035b0bac32a26c5393976e0e8413dc24bd678c13e8a3c69b336ed4dfaaf335144b20eecb01bf73c462676e448841e28695a92c924ca6783c58f6d330ecaba7755d521d1af3527d8e10a86338b1c7bead48bd7f40242c17b37462d5341900b7bf728d5012b4657bb74ec0aa0dc913fbec52f2ccade7f48fe0435fb6d24ec57e60ada6e2c256e0f47d36bdd6429ca874256ee398ce8b26b1eda1eb21222931559a1ea1ce1c2ed8ad1ea9587b0d0bb5ad500486958d84b52d7b9bd835d8a07ee7b4432d62adb4016b9d1863ad38607f3abbcdc4f7263a4207139cf7da349e040323af0f24ed5a5d8cfa9eeef76050e6ce7049064aa9eaa6acb00b76f48188cc68cb6cdeaad18091e1a8007304d315a356dd8b345b3abd02cc5b99a697228003db9a450167eb3a7b5cd0ca8a0af77420f8fa22518febfc3d5bf54c8ebdc6da96c146369125894e54bfeac225b7d5d863bdd374bae2adb72c16ab8bc3a6d96fc050764fd38e03c97176fc6282ebe8dff56e627da226476a80578112b61cae0af34855d2ba6bf87cce587a41221517cc64354bfcab04b53954f2194c47a5ad0bc764b5f0402abc8066fe3e15894710d6b9dad0091723c27750ef6bf28797cfb86444edaac951cbaf47e3bcdce39807adaf3dc81133e9686857e209ccc53081049ae616edb59b8f70e299fa71f1ea9a841d3fa209fe29e4b7510006c59abaadb80196d508192498e84fc3fbb9bb3db6447d54c38734369bcd75dd7b5575d607b158668726b326227402c03ea4ea8380c53a1c58749939113c313542b7b64440a24906272e77689131de73365edfe389ea569215347213335931f0f3754df681b21aa1a56df4c167a8e2c6d825ad3fc93e1499937d226d692a98ac55b3d5583c851eb4474f677631a4b11755cb1a23864e022b126fe320b0430642e346f9665bb94f765afc3055b0a0c3c4fa6805d55c4db932a80e869dd5418b67317f638f923a5a47823f4cd0d1365ee86a42a6ae1a7ec6eab018b65d371548b8c27bd7decdf0ebdb57a0855c97a6364db89c1752fdee285dac03bfd6cb9757fc99b0911f5454189fd9cbb60891eb6919183274fed90209bcba3a19680ed36a1c46f6d2bb3fa9b8a3a95a058abfc12917d01a254b8170f4f3baefb9c2b08cf8f555944b9443dbb6e10417a0935a1028329e0153d2e28bb6ede515184b1f97e640e3e8317b35792d8b144425db2e8a1e06c01a1b22893542e09efb9a9778e34b026f1c549ba5ccad1aef3af427e8cd8ec968c71a6cc65c0afb3472c61a34d6ba0f5a3dd4fa08077c840e41a063cb1d9ac73ba3cbf8b20115ebd9378ec750db7f9a18db8dce49cd60675f634439f521e2ec34aa1c0983ed327b5d872233dc3ddf87afba41648cadb6e5752c314624aa730d4523203d56b13576c062948ee8bb59d448e63bafefb50ddadc0bbae63e915ddb75b30ba38ef9ff7b5a74ddeebda8d6e144bc0d9b90010d8f62b18e50599c6877c2552c23949363b998f5ac63cc3d716207be58943d63949166c262ea94d3a6183807a6ce4600f059d8fa75174d024beab0751e2092b5ff73946e22868d0e69fb79304a1d463c5b655a35d92a90731b43637db7c8183eace2c0314e89eef9ad00ba8cd7d0258fe241bda723345703e6210f78230b2dcd520e7c25c244ef7dba6884a5c5de6e1e8f698046386af67771fe31cd1a613542ef9a277a3ab4ad65f962776295ea0e0c5ef69127b238fb6c9cae88240c51f3d6597ad4a2062772922c7eae4d9296941a7bd3efc53cbe713be772907ae001dec73ce18351d2ad2c3d08ce9bcd40db39429db4b756da6690214899e6ca46dc6d8ade182d6c773f46d53c33944aa9741c9076c32e9707d9a084b4451c8e6982a2807177c8051bacf48f97a75f87c6270f41a7369bf0b0f6c5c6f359b30f3baf4ba7325e3ecdd75febd562b68989cdd44e40f49c26c669ad29917bee1d2645bb29f918566c7ff2fbb1808754146cbc8c523be33daae251bdcd6a6a870909df969bd1ed76642d36de613ccfd4885f55670594bad5601293b2564795f3ac2a5c7a59f2386c0ca252b35858106bc66582208ac2f751dd6350dcef99a31fb6b2ee8ab1eb60f1f6e0d1d3ede2a9a78d601b110ab5593cada20d3e34859c4ddaf5e1c1c88dedad6349c973ff5ecd7bf64db69d22793d9b4f06692cb7a77e14cf37726def032269c865acf23e916d3a9387d0ba8c79c1e537a6779c09dada00660130f8f221ef115bc52e202a56aaa5b08f1366f6f5d6986f98dd933ed7b6547b2d3c93c58bee4bd7254c8e0e629be97cae3dfd89a499b7b095fb048ba54ff3c5d1240a585ba0480873c3806f533f18062de4b11972480cfdcf9862f477b1f5cb4595dda1f449daa2d9e927db3ad982d61e466e81a1e65536a71e166bedb9936c19bd94992614d3e5d39c9a3893d19e7f09e3a8d06dafb81922696d52db00e2ff9dff0291673b0c3f7094c5d33a936e3d8129487efe4cd808a2a4a61d6d3835d376957b846785d827fbba9329bd75684a84607ce7148ddc6c9c5cd7bc137d8a7e35b1ba4d120f87229705ff24084abb3e591faadcf2443ba67ba8b8ebf53c1933bac1816ae20ab7eb6ccd191ad70a1ef874c8f6174f46cdc3ae935e6b5a801f74649b60210e311adec8614bc16054d6fb176fe3e3e01cd3760807044020a7c23c561ab0f7447b378b6366faa05f8ef7e30f131c2397f666c1a9a06ac302f7a778d250eff025d2d705559135274e0675863dfc703eb7650d213954b9034a257b1ab1168cacdbcae7c942c6a730b1a60d6146c784ee4ad74237a6ab80512dc2b4f445756411d473bfcf0a3e319cdc4f90e03d51a2c749adcaa26205be46334537204126e32bb923ab51f57d90fe8c565a9a8f3d067848a3554427134257ea59ca251e6597ad5024feddbdccf644476f5d50a39a2cd377933216fef9ea9ffb3f7ea4bdd311d2da92bffa6c32d54cd17392c6f4d12709b67597a88fe20c55a0c8e6e03b4aa53dccc9e9feaba7475c4ce5ece755bcb38a792f1ba3adea1fd95358ad0cce434103badafa9015b12e32581e398b5eaddfdc9cb5aee2b9cc47be9ecbeba05d5b1874bac3f3b205b849341e8644b1cccf5cb3cda636b4ecb5daf2e0768353c3c0e718d617ec664ac34a21e73bfc41868d116aad3979cd00d9d2ba6f326769269b006467d1a9e4b15475d8c1130f95b9d0ad0f63ccba31f963229555d140652e9041368920aeb7e9a2b652d1bb4896718cd132e1ad37bb40239a667757868d863bbb880acf3e741adf9ad48008f383625df567fca32fd7fe01288b86c222fba86ed98ee2b10df031966d66405522ab539653cdf76090d767585cd9587b25fbcda42e94d476e2c59ab92c039de8b765fb53925e3deb02ff5cdbdf1902c02a5ecd866d00f9b64aea62c17fb24baa73af3a56a0537fea2bc94d678bf4929c00fd3b46fd6b63428e0b306ad32b963e8d0d1394736a571a87e1eecc9c5974cb57f8b467ebee69a95bf94db7731168ddf434e79b3e8b2048e0ddaac7c572a683ef8541c16ed9c477d1bf03710898ba63a7910a33f499bbb10ea0a78c302742385cefbe52261bd36180743a0ed502d9691c8cfb52a31c6d55d3e5c1018454d35036fe0f2d0d37d6770d71cac339d4f687d2c1c47bb51e9f8a6a257b2f2643c50b68caa84ffa019ad99ece3763cf58bc9b3dbb2c15c872aa19de330fb8cf46a390bd3c2ae8306ffc8731f4b288cb531f7ea1db7d5803ac148db2dad7d69d28213d53d3e4d887ee690d326b91348e0fce3bbd411a9676bbf40bf141ba79c42762e0c43ec0f7363bd32f6727892569943cbc011a4753476bd548c5049ae6765f55bd04742179683a80aae81c4d0c03ae59b90607891bda248dd5b2aa556a076b3c1bfea8abe95545b45cc3023110125c4ccb648c1add14b7bca999cbc41be4cbc89da17436c8c6598d68a57ea3bb9ae6436308ee573dadf2143d2b304a73e3dfccee8dc1dc6143a50fd382d5fbc8349a368a88d386ad4fb068cfed78e6f3deae6fe9b4af8ac6ab51bcb2c92bf6d897c1becb4425d7660628ad498b986da12a99df1a602f8c5bba5f23a4c6bb968bef8aad76ed76b324c94a166e82e08951adcdf7fa6ec392c99342cd42df157ff1ecd74a537cc3218aaff995b5f439bf96fdb2a6a97e0d53b2f92ac43aa117cea9bec7163e93c49e450727a31e51b70a3649db30fcfa6d129960ccc28616731ea6edd724846bd947bad528d6d45f5b6d1073d1b49fddf0cb8d087e91bb92d51e697216d01526b4a4c9b5ea9f919c71de5bdbefd8a8471630ba17480d8a82caf1983f8e559725d2318cd55f8c426a9a7f718e93126163cc033c534bfbcc986ea9f10814f0a269bb4d705a33fda55fddfd02afa011f3eff40a60da3e1bf8428e36e9b5a42d4cd63a7804db1ab17e3733754fbc32f6d41e0fa535bf35779b3a70b96dd9ca9a7be95d4edaf72acb144098888c5542fc99195cc968b445d0c4306a6835509a5a3740269e98478ccb8510d31e10b2d63c5d8fc1807d5eb1f75ea659886027f8fa2bfe030000ffff8c9dcd8e64bb71845f45b87b0164669299a95731bc912518326079e38501c3ef6e04cf990b55045bddab011a83e99aaa5364fe447cf10f5fd3466acdb7ddf7731be30897c490ccbd99596635cfdd42ad1c38e15391ef6bfb05c7d922accf853aab7eb02cc5fc6348cb71d777c19790a5398b676bd3df1013de5116d002fce43786849f8d1be4fe429572dfd344c374ed65b7f56728e80b1e2dab90f91824b7cad1c4d5c463300cfe8d8f1eb22fbd5504b6fe4c950a47adcedceda16bbb09facbe6fe18a049854d0eaf9e15cadc390d9e285cbca608c7dbfc9384fcc7ab27e8510346edc52e67c467b670f8912428087cf88b67eb9630f80e477064aaa64af6a7effb05c9eb778aa6238cc563f0a36dd5316c083de54ae6b9cbf3ec54d576c151637dea3ff03e62ceec5d17bfac390b6cee266983fc93a11b8884e2b507c6b653194d9e971430d4911c4d3247aea573dbdb33341a265c7d05ab910dc69b53f4f21c5d044acb05758f523043f4cdb925fed4f1cb046f810d2b5ba1efead3c3ef1798c91eca98c562f013567cc57bfc7217ce0b481aaf8abb7650b0e57721d72b37458d6c7cb621c8353fde755ead42662434b8e9ce3996deab854578655f1ef26f658a770d7b6ef18da671329c01e9a351b33b4d9225c033583a40156edf7340efb134f308f1ecf4fe41701632ce47b69db54820be7019a0452aa52b9d3ced9a7c14dc8ddc00130d6941756afbcba0bd3d5a28df3e9935084889ad9619b720105ff3531c8cb09a59dcc2bf7b709eef0379fd1fd104ee469e82098be27946218ee6b0e9ec29c546c0f824628e13163db8ed77c0a46673c4dadaac6bd22ffe2b5cf1a3af6425193608bc4a826e045c639e0b21623e345201350beb333192110f035e6f6fc69dddcd841e065e82c8574b8c4a383f87c48c3a3c738a76c153eb43fb9206cc9e89692a0d7efb79130239d47fa3041dca40d8abf3e6bd1a72a6cb0c0959e643a6d74b33004fc8fb9640335cc3ca264e64f9cad67b9d30701eeaa0481618450c188305b515817d2943c860296a263924824dc5371e1e2aa9bdf8c6114e5d1cec745f34ceea0aee7f80256e5e291a56cbc1cc4b78fe3c227fb40947d242b54032c472fcaa400be2663a52d02e4813b70c01149a7182305ffbb6f879dec6c61694bfd3d6397669d84ca4c8259467f18469013fa8a12c3ba6da33e03a2e4115619623052476c9cca3385294a550bd448bace0b70bfb22f2b086ec3b15d4979a4d480f06a9f726c6967c32030bce2ec55988545f2127e892b822742626dfbb09921b37e89e98a2eb10dd7a09b5c2bb5dccef13ad15a7961ba66395ca850af4075bd795182027b7d820178be073e32d942dd349e69156a497cfcba5659cb603a489b303f48a193e5d9f26e1f6dee58aa7845a5ca62f3bc3d4a01b4765206cabebc6d400509a29d539812b5e5dc6c918e13ed3cccd25f756bf624f070f3253e887e6de32825eb6961ed716dc394170bfd892881217d72eaf3d2c2be2076080135365973827aedfbef82ee2be816e4ee380e99979a73d6b57a67fbb0db73ea921928d4d10ecaba5f23967ab6d723b87ebee723b5fd96f138134027639da560fea48969d91b908486ebad4af3ec64253c3ec4f3c3112ea76c1189eed682d46c2412c7f0980bb527f51f0768448206c624428a4b5ccc323e46e132f8e9d92986c83af2b7e408c6a59c4d6ab2a44f78fae28f88b6aa01894e8a4400e1626bd40679f1ea39b11d268b510fc212af2b5b644b12504423a900afc136246539ecdcb6c2d78989225c5801fb24670c102258b9d1b221c6f78383f3b67f3e0eacbb6ce64c71784a5e0686a7c0961859f01566d41b100d11dda6664860475235c79ef50ba5cccc52bafdb76ed8b41f044529d98efa625b8ece2004435af9262d61e7e0d48bdd6e8404b486cf17d8d8f56bea42c41c642da3f17197e791fa354db1229559943f394907e95ea05b025f9b9e24d7914b0f0c61bbb426d086ace8e60624a3c4014e41cd2e2540ec50e5eb8eb908df468fa3eafd16a7c80b1059e3f99cbdd90a5a36b4a4ac9053ff1f60dd8a7d355929857ca40fffe369c4391455cbe12c73e3bdbbd584577571c06a00bc55380c6be4d0d78617b696c2bfcfe124183adfcd6943cf3a5842f31ecbc88f1dc2c498a9d903dca8c88844a5f873418daeaa58b8e5566acfcc46c62cb787809a81f04ee56ea62ed1e43665fd2563f55b895691c2c9e17d151fbde8e22e1f3b5163e4891be2ffc58f6dc7934defc1e627bcd63ae1c022019198ede898f6ef028183695a568c43bef00b7f2a758e3f714662af861248b2d86f63aa5172f8f56c3a843b87047f0a8284401e30d1e246176678c803e34b9a16f2b81599ef66ac17b40bfec4a3137d080969a7991c875c92956a5030ebe7049cb9c80280c8d89cd5ec253ba09d0e61314fc1d19e1e9b9606f15e52930cb959af59b9132edd581f8f326d874679bcf35160d5391a591e6012d0c6fe897a556e098f44b283aee4a9f929b64433eafbdbdf4800291548b67643796543b09d911ff2a6f4fb5bbdcc6e0a7da0f459d5e74667fbcb2119e72dfb03312fba083e8b1644d7ede1f3e25a0121df9a37118eac6c111ee5e81e1848cce3b104f23465b3f395862948d35241e81d5dcafcb6eba284970878d29779b6149f97931c4c91d162ea808bcefb2c3a7fd2d84876e4692d5a708eb6d956b3b334c5e04bc14f089d4260dc6457a0f3302e2d825e887787619938e79718a396d8f856240068278adf239223197fbf57b3c1bf2481116287e3ca482f067834d45b3b75aa4a64f27667b72fdeb866992c83c1b89a06c4a0ef01074428e3e55aef261d6d378e8826eb2c4fc6476e234b986de0772c385c31109ca3b030dab8caeb28ed9886b8f55a574fc0dc4a1f31da378fb77400dea602961d5195ce31315a46e2549287967b17cbd5e5fb54bf2b6c1b0dbe42bb01c09d6d94f2af36b66d605ccfe559d00a1a9a59291d1b435fbd3cf18a485a6a52e9d3783152600f5705eb7fc92f8f12835629ba6481c945449b550b86c1547b5525f1b162925e869ccc94bd4f13040962c82a5eefe356a02c751451c376e84230ca4f227e2108c1d870bdee80b5db721fe7c926002c65e46499e40f1b97ec0928463cb75ee521b5356365f14fa073d71c03ce71df7c6c6858744981d996c0cee0ed5d927e45b304410906d7545602526cc83c0e885b19f732d80d464df4821686f1315a32f716117ecccc43873b1d9f00a8340888f84a54375229147d7bccf5b44acea2dae55c17bae20749a9d4930272933ce77c88015176da5903ed62ae19c8e3c291ff2817741f24e327ae6b5bd6db86ff94761f21fca6642961e6779e0c4e49c80595819f3e60b31d4e6f903edd584fc618b0af34ea28780632828acd3011593d64e7ad3bb30c5c241ce5725e60564ece843599e7f8b64b1c8c5320b246e8da94445325abe106473c55a22da4f86232cbc78ea2c704be207bb4b83f64958240b896c7c7b40b094c184d86bbb8f6472bef1d510fa5a4a8d093cbe325cb536103c20dc887bd5092784f38a72bb7842bf70f5022cdd9714920b34dbc05c3041d0236e5434310ed83d0f3d46e3cc7515461ed0b98cb8e6106410f23b96228bb0766831ea9376e5518861a52a61d9caa47b8e4278fff842bae40840e8bfd68f08fa6097b9495c1327063ccaa6dec1224e2067a324755e1c267fbcb29cee40f5af6b4f31babe535ddb1cbe03b983a52035a1ed2ccee4b19d19151c96745b22149c0253c9a6f83aa4e6ecd6e6abf77ce919763a613a6195cc570ae54056325f72010c059f7057b330869ceea2c7836ca3394b06e97378ee7f608fbe447fbe341c841ef24dcdb176af25d338df166c0c5df28eea8e546e64cf2d1c884084924673a3a85187e2c468a577fd645a79bc37a2fb409883afdeef4ffff5fcf97fcf5ffadff787bffdd79fffe3affff6dfbffde90fbffdf53ffffcd7bffce56f7ffff7df7efd3bbffdedef7ff9ebfffcf6a73ffcfe8affe12ffde90fff42e76a2683de47630220e04a3c4c5562a5c6169ffb0443969412d7dad46f858497cd89f688a7352dfd179a36a9981662a093f56129356fc243a005e305316e673e2ed39ac319d187b683478547831fa2b92d1821f88522ecae4c18ae07c1bfc4793aa72b2edac44c84a8b995cdb0d7b0d0fcb970087179f98fb459cebe98502b706c328c0d9c61e3355c316d98810f1717470bbc067b9825e332e4136f0948863078cbdb077c840e286fefd4712098eacfc352fc450b0bd44bf452b840c036627853d86f018baeb85b10522db542552eb9a7707b4dbdebf3ece16548322881e0e9bfa1761f1768ca120c090a5ed2fa228f3a8c1ff78995281fa6b173b7dc53ebd0096512e23d4a4699b5e6bc4452c160cf93eeb29e1c0e09b7e3d67dd6d9549678a47a2fb15f63a6860d79aa42285a45ad0e4138bbc2c0b5e084e439a1cfd6502bbc313c87f4f6994a564550eb12ec8b9722d3274c230c6b801bc905c909548706c022308d258b05d9a794560b5e458991c4906b692216027b98929f404f8ae83c2a90c2cbf41fc7a4c19444bb961c3dc05ba5eba62c46ab700a444d39e46b8db04be003c7f838a6d96b2ad4333b04a919a331df94cd223c04a652a60ca13ba12f94821eed36540662e3584ba119e76fa30716d92264f929c4251353c0ec93f0c0a3c258ad210627e643a71387ecc73f45cc9394ff15e88eb964ea6dbd86546830beb04a6022155c3f9f9a56bc86bc3d3528421a2a20f14b5726b7bdb34aa4e427cf68f33b73e2198d17f27e3c274bb403344b7e37bcbb42c68711c8aa965bc46188e4850550634215a81abe43ac338d202ede872d25a31f8b0e1d7e85406dfe4f35ba508d09ece42b106165aae940ea468686ff814ac4a1e48844616a28223f59a4e103ed3e5b9c4f00a4c42cac8d843e891d016046803e964bd845a04cc84d77b20ba68a6967084bd9e7e785f2686fa239ff420bc3f7d0c32c56cec2e36916eea9a1b258ac66404a76b484f598cfcdff85b90bbe1631d1f95ed97242f9d14fb280641ca5314fa4ecd8e8e548c78e23a4f2ab558b01eb10814e5f6212040abd7952e58d9e8ea7060b92753e75cec680b42630699806b3614dca6f1894a63944be01b10f7bd222d7e4e026e40af510eb2a12d886480f4d3008f082d4946af6ad212ef44c449ab1307c8e16697e652fd6c741eb3d7581dd5d6021f300d3d7e2593310041a3d838cae0bc11435fd902aa8635e72573c99ed026d5ab05013b9a29b9fcc938aee531680b068303acee7701e7fa24a90601338ae585761a080b1fc0789c897b867075a52649ed3a7f1ee1e4a5f2baebad739e13edfa85345b31873da6a1f939f2a94dca238ecb4c9c34404f606abb200b6187c3c4716a4e45b6559ad11e90d5805db5e6a43932090c0d9f31326fc4ba72b74a6b9d011cab10f9f550849047c081963191492cc639db69646d561483b966e024f74c2e431ebda121d874949f000081612c51df8de25843ed45e7d2150a3c719ec1b04e5856bfe4656cbce9f94f1f30830f8d9b8bd56681b3129663dd469e24578da58cfb127b5a39d9f83b530aa6781234a92d48d1f62194d8836bb5dc84098c00d69b417900ba2a5f2038be44b038a603af2cf152d4144ab20e4132f149d19bf8e77c476f22672c37eb194031198a448dbb46b4bc4f006a93ef87b9790af4a9bb890b1cee3064ca4f988b285d073e97e77f9ec664ba91faf18e301606b157b0dc6252c4fca353b79ba06f56a8f54deffe1af85b8769006afd12027374910de73f5d2d0dd3c8a697a77cf8c4d47ebd75e2837041ad28e6d98e56514026db2640c8f82fc5f4d01c88f37459ec34e24ad35dcb6bdb98bdeba3380c69d0a1bc77ba8fa24cc7e970432cf33530d21c600573e59cc8ecc45515e8d435e62d1b7b70b2c1c5740f050b521ce9b7a0d5f3b37489605497fadee1c1f228bb9c1e78c4d27e0b13153350e75666b922eb81caaf439e02afe5ccfee8b2386bfa819fb0c06a4cdc57264c9023153e288f1627b458b54c813725936c04253261f633ba282842000a686e8e9639b92e000ea68d642404cce8ac79543208185618bcb759127604ec43f18bec9f66d796e019620f0714cd1c8940fc5121c7732172871ac6b5ba4ef5bb0264804850b8fe7690da9af2adfa0335026eb1e2d2b82c3c230910543fb9abb2e2c966655ee17a35924ae46952ceb6045aeadb8412c8e05dbb930e7e2cecc113a2bef0f468342888786b858191ce0625f16fd27a0954501f01c4eb1adb8798869028047396a0aa102211e3cf49ca2fb34a8ae82973d356a8b3824bdc41dfc446769bccbb9a897ca3cd7451f898767665fcc37d62af0c17c36532ea842d61c0f66e62cd39a73c196234f5923b95bb633630d3e08e744f8859ab030486d5537c04bd0c2adda569adc94fe1954f3eab45c0a9b2f0620889f74c992c3dbc008cf6975e0d4a27bde7011e53f9f74bccf582f71db6054ffd953bf06875295ce01b0f11d0b8cb6ec037d8e2560d52a4941c43611124fd926832dce4d351e024ecdc636362f76e12949b4c7ecd46a21c3c8586c8b20d448bc0638cdf24643dcb2156a0a0902973339fa73b6f68c9a74b87c2db80fc23545895b98e40ecdb78413a474c65f73ea0006cb1a17bc668ab30b301f460ccdc381140159f50a570b06ec7d12f3d97b09d0046ef66c5613b96fd0e919f85085539d2aba536370767a8dcf6cad3ffeb2552bc300927b39a6e12c31195621164303194741aa96bafb45a41ac76881d83897e49479fa92831a05f416290c84b05a6fdf26cda3766c36a281576e7372e385d247904cdd36350542baa977fe5e6090284f6899202a46ee582148803552ea83068657961fa0caeafe06d334010405a676756152afb5d84b87199986584d07cb5080967de8ba022aa915629fc20e853b11d9e9be1bb7b4cda3bfcc096119af7068a7fb4c82d2c4c5068e703382d71d8e54f6d76155bed7569ed23a7dc3f7435668ddda53b4056050c8ffe0323b1fabe0ce63c3c04d0c7224075bd466c76acb72188f3552a684d5c54732ca92948511e4acfbe27b843b82f179076b2b66174ccf4d268770d0498d8a903a1f340bb3cc6ede149c1063e91706d01e3c7e869bac046256d8cec9b464af6dca1945fad810bcf34c0ffebffac4da9a3f2b4f45a3cf7dd8cc9ae86363f1bf7086791c7a758eb260d7d684c657481bd73dfd51b3b120ecba96f1896c9162fa2b37826fbe1d7016c2d8deab81aa8a9fcc29073653ec98382c6b819d8368deecc3c4a4c816cb946041d8f27a1bd468f1f81c00a9c470c063265aed8104f05d79d9086b6f87ef1818147c6537e6f017a38fae021c232f96c207b071292c244cc645730f863a1f7cdb976c0110c25853e403b05b419f2875f761b9b49c7db5d8738939785b70c3e6133675767e44cd5d215e0a847ec8161913c908063d81465c0a0ceb5c2680cb8510359909b46994ec04fab3252a78efc224870b3a3bee113e2a96970df5ae667310486340c99d02a2d993ff665a0eb9ef2dd79c328642e72f3c3f407fb788c0b0787179682d4f26a1944250ce709dba7789fd037a894ec557c3dbc9376316a800cca9c2064f8ac18e152222db1dee9ab42835e22b24eff539a07a9115433eda5808c276958c7fa64e7dd987039fc8f8c1e39b1f7beb8c023116ac11d2fc65bc2f28c4f83b8365a15cd831b185a41e0e2815c1a1a26051a402ee1f45a0913ce74b85d1fb3fe50d3a04bc32d26629cfcb5583a374498811b46eeb9b36e3b92c6709c41d073757c2012e1ee3d7268a15ae434f348e065fda257df7b15dfae77fe0174fc74b99fbad93cca7a769d760de4b9b00f3f89c9ce031fb0801b857f39c7949e39aac9840fcd19ebc2ebe7d5c3331a696fceb3a983421e941b090aa142a88a7f637b7c433468d5c6c3369cc56b9161c010dbfcc886be59040fb2f46da8516d4843ecbefcceb509b72538ae6ff2121344aa190a93ac6ed626f987ebc9faa5cf14f9aff9bebb164b23fe1819705b9e1a67105ebc23b189ae48a14a825f7dfa7e4ecf7dbbac4d338702005139af16f964a52776ec443892103b66f6eb81c17f365730cb4a5a4cf146024426a054146a6b632affadd01ffd9ddbc4a30bd1890750f8ca348ac3b2e4bf1eb441a36e6ad37bc36efef2c1541da0209840d500a0255ab3f6b628441b43e685b9115cbc205a58b2f76ab9bd4a475fb2525e6effb4d567a9dac00cee643ba9100d35ed929b39acff87b93e420ec180f054416ff26ba2f7dfccd8113142c17be80623503fb596eeedb24eb144fc6950b426db669e58109977c885839ce107a34d4f6f2761f0697f0abab6ce9fe1ff04159b080d6135b4020058cd7fec9c708eab96ba602e25b5d521d067600ba5547689042bf6794c452c431cc9b4862aae4830475dc434350869a060fdb6b2bf808ec25aeaee14d9641e7b1a4b234ce417360e691af5a6ec2cd33e1b65fa55270698566a9b230f29791314dce3471ca3dbb199f2d3c19331271be4c8f95265ecc9d8ab0940fe09944d56c3668a287f9fc26e1572d87ccbe05928fcf85758487ea29d263805c14006915ed0a96ac39040114366af1930508d1182622926d2cb64250c06efeb84581f51e1b6582327e50025e12feca2ff68d66cba5199856ad912010c280bc2ac2dd4cc96f7d251fc2f328e7ac4278eb84e48e10f9a5aaf0ab930e0e84d620d0067a8bf1819813c4bce40ab762327635fab1efeef76700bb1098291b5c26dc61e56dc61ff8ec8dd33b7f30ebc040b03103e75fa5e271b407c51336abb145588f25e7b86c72f69ca110cc9d7b885217aab4bdb964d95d265961c3704f2c118ac16dbd1488007e88f8a2403bfc0cf27d9a4a8492c866198ad2581c051c880472f57f6ef992821fd1727e4ea08d85d67dfdbba0042d51447249f91e336553854e38ff7cf04fa34a16c1f6cc14b929dcbe4292d5214bdb9305ac805e26b75fdb720af974a0479205019693b154d4d9057bb746227a29c9a560d75605153220d92b8553c1b507868ff83b9be1832c664b94adda23c597760c5c534d0b95ec68021603fa1cd91b546da6bcc6ae4856314ed04439a61bcbed142720b636483fa4a7906b90a77b6d58b905cfb90160e54b61c39bdef2bbb284ac613bb6cbe139b04a1fa1b2f38b870b95af0656988164a21232041fc9a0145b0a9948dadcfd899b7bbc93605888c4143b40b1595cab29e952efafe04ba74c25a8cd5a752ce7afe2412565a7ba12ba7ca9f97df650dd1408b030f093da77a57162e60845991d87230c8afcdb40d267e724cce463709b9c53d9c227df7a085f7fac902f1ee489cd36e4776f2f765dac1b7985060003184ebaa5c1c09bf5d508412f3e6957980b7dc601dad1094235f257843600e9b9028702051c8bcc1a282f66fd64f0a06e3712cdeb5b01c71d21f1a5cb6e80bcad647c046c6c8158e0c2b612fe1d125cb4b21e8def8ea28f01d26733d342cc1397bb27da6bf0283ae6791f69c7d150348942288239bc670ac4e6948974ca92ec9793142cee9acbbcc8e7b6e0f5d91cb06bc8de654392b8f8399455c0dd2dfa7e45e38802c58882569f374a0de190cc0f57f9d444d69cb315bd06705633a6ab27fb6b0632d45af458380f258c33d671d388206c2cdf22d8f65d520a81db2c117770c19a2f094e487c12fcd126f07712df7af3d3432ab134f8717b950e92ef37792373fec6098bc1be5bc4b81bd7ca07bfa778d6eb7078acf428adc6201f764961b40e5588770bad4d681a2ff419a344993ea8e0042c10c967118ac4336aaadd29f5ff4dd87960c5a9671fae20fb4cf07c92f76cf5107565ee903eff30542f4c313825642ee576d4b83acecf3d95eb7bc4cef1ad6b1146875664a28f927cfbc24481eb80b0f999b3f3f54bea69bb2f695837ad1d84dd8c279c5d7b6c2e0d60961111225a8a4f0fcf0b255f3138858d990857afda7b6ec15722df4f1458b27270dc80548738787f4ab61dde25290fb2c878530a5b3660f7211a98e86b44f02815c3262ebf6ff6790345afa58488b1a32423688d9da5929da35fe30becccebe4190eb750a5de4ed382567c88af0ba700e994b123646182320a607c97141d00f6e804629887a75a43c069d455dca5477b57879e9f6903ff0f0000ffff8c9ddb8a6dc975447f45f47b43de66664efd8af18b2c6164b0fce20783f1bf9bc8b58e71c5c8eada205ad01c4e57edbd56e6bc448c7843237bf7232c940de6cf6e1fda09b1dccdd5f9d78a77ba09e7d4a90214fdf5260a7d12b8f53429ec3f3d922f47f4008c5d1a51f9a65f17c8259bd05810992a8b0473233d94a43dcad9869c97aa98fb8634f975b0d798b76b784895a386fb70224be43f5814ed8c063607dd71ef08549b68ac4fe7dc019cf65cadcceec995ab92f357e710ebdfe91ca3101c57c52926f8ed8a14285d4299c4f0ace66216b5884263066396ea42225539995a98a8d965f0bd755933d00a59bf966b52d99909410913ae61da121f365f8e673a9f52d0fd850415659a510f28dd78a43fa128c01e01883683cb5bdd713a07a8dc85c249b87047fb1a08fefc066223541f2a8e5dd0e8b52107adcb82624d5c31a463bde6c9bc10e0fb6a824ea2ab14ac0fbe7a7d85c86bb9da7565b795700d97f252a2807fb79702e6caf439fab035067e8d901cd9734d25f15d75b54ff49e55744286466876b51dcc3ee4a473d9425172301cf35380c32069bdc76cfef60307f19481abd34fa32b2b3af5df991e2d26fe7b01b81284c38784d9828cec5d954fe11b9cd157e5fe5c4a13629e75d2798fd0f583852bd7946b8f518c48ed9599cce2c743f2839be85b8b4b3b4a4b2cfbd78eafe0885fdbb1123b19418ff7b92982d577385cb73ccde69e4089f5aa9284b7c5142519d3f8ec4e3c8827dddb6f1029509107aaa915c5a6473f6f8d935c5215231fe937bddb97f20d9617904b1fb1c45ce8d5f7ae50292a1f3e9b934375f02e826361927d52a27675d052c8ee89524cbb704c6cd8e5be17704ad4e084cb911b306de99ac1c612690929b1395bdf88993a41e3233e9ac561a8f04ef283f5d50d1b7621b2bcaf400a4c8fab46b55132d33b0bd1d95deb90c265b2c6b88d9bdf9af0d9875aed44425c0cf85b864a477c8cb3edbd7d06d2fa28a84cee569a6b07407adb9b7950872fe405e486d0514291ca5252ad3ab685cac1d89bdfcd94379b2cca93b5fbc15b7fd29cb1bbbfc275ab8ea88649d05d29a638ea64e4f0e194e5d7dee00f9e73a1151793c467ed00a034bd6a78ab877824d8e46133ff3e2352615d6af071048fd88746517e2be015747bf611fd96117375a65ee96eca0b5ca8d7fb4be644fb76b348cc95d906f8a69915220f4d8d99c6a8b28e57fc384960506fc0877a454afefe5ded73d4831b4982d77d8b9c00f3d2cb886158a01f2c53c61cb0dedb5097d2783eac8e48f31d95a3873821217ea0d6b534f0bf38d8a4066fa056168ce85a8d9d30f2342dc7917e7c1dd19d88d8e17ca5bbf7b79de7d467ad6329b4cf134be722aa6ee9435c589034c52262e3504f064cf8e4cf08687799fb33e6ec93bcb6153b3d19ef84afd5802f7b4737dc516fa7e6f4b35ba357cf36122113b85f4db7d401fbbad51d47bfdcd3adf6821497d12bd6d0f2675eb2dea3837d2d99f12803a1eeed3035d1076bd88589e01a736df88e521e5dbc7d105c3eaab494b6c57b7665b7c20973a167bdca18742eecf9750266562b239e2f2d134e63854c4612b127812960a3439a97425f5c24040c55e00a448e5459240bc686d24e0da4dd0de5b4a26cd13a052e027d1399c8b5bca03aca4959879ba3b7680dc255a90389e73d87cddccb3de35de2495a489582e958adb14aac60866c570e3deaf8a66e9cd7ad7ee4f46b11909647dd2ca110c9c591c8791b4bae357878fa9e984209225a8122b90a44b4c80a3aa6840f7092a6dc560ddf7aedd293a31394f8bd38e76e6ab01b1fc185da09d1818c58a9de5ef5e80718ce1829bb8de2dd8cd886818461c5e2ad89fbdf8614aff4518a7eec755af0101340c2ddb2557f30d0a229ad6714d7c36be6e87efc26973ac5477be8c9da78711602656560da742fccd5fd19d0fd0a94bb4686891a4cefed400cc719cf7ae8d84d08a377855c6799d931fdc280e15957289d044be72cd3f9265225afc16da1209003b2b6d9f784f7d7e00fef0a416220e655845cd0c93da6e69bdcef5601c7dca5a4ade72dd9b875c7242bb90ccb24899dc1dc1c0a82c2e27d8943c21679c3592615e7ae54570a48bbf1356a90ea7470a8addfcbb9aee5f672c9460570b45353832a307df240ac00a4d117860a78add51331d0423a1bf44e9e27a4c9a81576c524691fcf34bc4bde3e3ee075aa7c4e4a0aa4ae51d9b1bca66d98eaf5b136451955e15a0b4f515722f0f029454b817d9c257828e6f668687c449b287787dff361a0f979dec59de964e421555da21e14261e18e51b454ac4bdde2ada7025086123d8e2986bfb8fecd7dfaf24f2775db1a5207056c24db8246ff06420aa3cbf3efe98d9e6a591aa40bc407cfce274847cdee3c722e61910eaf6f2f608a2b457583d87af5b5a55ba155184a2f8b9a82c05f6f4770cdac6d7519ad95d257b97accb1be594390d631bfb82935c8ad18d36ff056f13ccec4f3b1c878ce42d759bda79bbd22bca845b844482779218c366c22795277d673eb5f2468870aecae0490b487b0d9f91009cd4918a74773a6b26290d5d9afd8e9c5b95bcae6db98e0e7457b781c9cae33404646cb5405850cafbbf7f92963c211a25136b96e84cc4bee9ca7fa19afc138c941b9d98884ccc9259f13e7fb1dcc081dc49afd86ebadbe720d88a3c47489cd3eb9e8758fb7f4ec9a37b54ae6e95b6e7f674f32a22279cf76b0b97e1ad6528ccc603a295751bfed5748d1ff7270def79b5c84deb9985cccbb9b3242ac47df89fbe411f927a17cc4aefeae30b24fb39bdd7aa09e6604c6f0aa5a3e8039b408d14fcc25f85e035a8efde65b0845bfec45cc039173cf73b7e55d8fa671df792c9adc395b347a5e4bf1cca9ad5725964bbda9fd89524bd268f749e87ce3f19ddf8cb57c74b1e33dcc004a1bc24a9c84bd191bb3a4f4c92ee5392fadfa0cb0e9f6e1b5bec9084f94ce550ff817ff68750b150a185eee4ee6fea53eec8fcc47b5c25d2f74e4a74bcc5e716bcbeaae129439515d4b13af09543ffe006537b0684eea8bff736ea1ea2366a57c23cf1822be698f40e94012289c72ffcfefdf52697583a0aaacb14812aaf4d7def301c9e80584fc116d70c4bae383e18008fb697f06577456578c4c0d456cfb72c913bf223f5b1c0b2d8a2df1a807b39fb0895e1e9d622a4b0c45ce32b40fa0d7fdc1a785fbc4192c28f1f463a0f6e6394bd7e3c175f5fbcea311773449d8daadaab9c04c2fffbb1f63c71592b6afd6b3025832d5fdd9ce4b62e5a73e1dd639d3da9298e361d23364e137a595fc3b7ba31a0fbf6da89f9b32aba06c7b9943efba3cc10252f35d07b25fc8f4de65de8b4eddce0667a3ee7018b780ef6107ddda9af90dffc117eacac4209f1920ccb35d358437f9b16b68f08797cb0e16f65974bb85e4fa71e8c7d2231bca253847600f67c67cc943c4c08ec31a63c289ea6aa500ba68b280349a4c40fb07f48cafd5e7a7cedd9249f563bea5e93a6deddf76f5be3e8fc0073a5377f4c9a86345c2ad50be61b584c46f6bd07dc2227b90082863b5bb9b75e6040e86569c5d23e53e9951092c99da3e0015ed3459e0243c9b8de1197fe2ca5f70ff4d8b7b8ce9ab07c6874a5f90a30123d2a9cf3d7fcb7bb6e5ea73e7af50b7bed1b25c3d02bedfdbb788c615631e192b2b5dbeaaaad0dc40bd57b84dcbd6d92ac759f98820f58620c8866ae68cb3a15a9e3bb631523d3e7b2b51735757ebd9455a491f575d2156b77498eba6f12ba30c6b0cbc56ac26bfcf1d8edfca69a5860139ce5ec3730db10647ce00eb0ebe6a9e28f0c958aae119091f6a66d060c83e6877ad19a8d328ebae7dce3c204baed0cead80557fcc9e6dbe11e55d1581a1be02d6c89f7065788a262d576dad1212fe7087085eaaeb43f5d8445bf5f8d65df25baf69daacb209015190940adb295d2e05559eab9f73111bcffcfb7b3c46d44ae6b6ec6444b5490f62c931efebca41a856bfe07ba61bf30463527838821247742fd55c48774cb0c70bb4f4933178222ba8665dbc70371a6f4a0d9295214990eb75d559548a0e31b976a9313a1a92ca916efbffce7f3fffff3fc99ff7effe56ffff1977ffbdbbffce76f7ffed36f7ffbf7bffcedaf7ffdfb3ffef5b75f7fcd6f7fffc75ffff65fbffdf94ffff743fcbf3ff4e73ffd93336c7250d53ca2eba584bd4c7c236cf786c89e48844e4d3227d2a754dc61183d44dde17faec7945e014bf931168cd387b3ecf19ce2d2423f27b2996823782d7575e278aa539a41ecca5504e52627be0bf3c86942c7a95963c818f1f58f463dcb6ad825031a9333f674e49a062ae991f67d4ae356f99f17f91745f656e8b7838a42a7a6bb794298775f184950ea292d6a4d7785af4c049a0ef6be3669308568a60de569df895eb1af5ee11cd04e0015606f8259d68bcf3e483489ba3da445725fad2afcf419f32b2af191f38fc21c75650a22bae7e845e17b1aaa61498d9b4abae9d0e1f44aa789d68e7017ee311aa2e0ab167ea0572b82a2235055fd365f2381fbfcfc3cac808aea3ed668857bfd1a4e4dd28535380bd1a951f1c91689bd9ccca0f8a25531fbd12de6d7f69453c3b39eb5870c72789ab68e404876669d951d6dad8a7b507bc4c924f6a13ed1ed1631d510c1d2967dd2a8263550716344591a213aa1a9c4da1d7aae19c3b1a739d48eb940450e312cda4b6c647b48c7a7876b5c3a21df2e56e58e2600086599e6ef51417460e034189e93cbdc3e233d22bdb6355b0530ad0b84e14685b2b3f88a56cac2ed617347be5b80fc3dc33e6628893cdba0f119c1b9bb7c6b4aca6106af2227fc1753478c64cf59566ccc00329cd626968b66085f7f2f853a149a127bc3606328eb97740ebd471ee02bcd8c1e2e689794570aec9e0698f0441c7ae2c2da702c87c74897813736fa7232926efd89642821253722cf622b19bafb2a7b778784edb5e1b2548ccfc4a0fc30a448308f5ac764bcd871597b81d90eee9578d9b18abf034579e959b7ff0ad25f80fd166b7b64c001850fff58a5b2e8901265907d5086628e0a3007aabee011d03122d424cc5892b7e23e13a5c61e7785c96dafd2e6d77c86a7231a5ecd495a3429c814c020fd823c96b741566dceeac90421b330fdb059be3ebfbf429a0682218738e91d0ea820cd5c0a698c31a267e39b56b5e0075a6cb5afb8e0e79d9ccd3fbedace95c13cd3222a8297a9daea421fa665abb84ee0e7a909f07c0185fb224e51899bcd9b5a198cb2478782b72cb851353a1b2e7d504c657a9ea1a6261770dc187b76930e4ae7db5647d8d998b8712496ce46b5547755af948775fa88bf2bd613d9f2526ef8e04eda25a70bb4bac87910a7a472152b3ff6443c4496cdf573cfd341d9c86c68020c28a5363d1e8639fa26c539ab381148939ada1043c3161aacb8f8bf291be2369fbf805315f1b1bbf59b929dc0f33fa5774f42197b96e0fabc8998e3a82e3d438cc91d0a1addf3936e254518c071a989e4c22ab74523db786492732805d26e56d3ce08adb010f024ee338ea7bab57c76b7479b0d63f81051c2cfe73e0201b7b569cc8a79ecad8b973a101e1f8d5435fef0e1fe6a55bf996f6984b5b4da590e92c63403455e5fe40e52a675f6ac0283c407afd209ae020c4979e6ddcff8159241539b27e482e76a76c127e071d5a28929a4321ea54fd7c681ef4c6a984e2ab13f7565cdc6f99c90b8183128e5da0f4e853503412cbff586cf435abae400aa1deab487462903d496860286ee7471f21e0a22dd94fdf5e9974fd5120fa1517dc8cf6457ad88c0382304349f740448b2ecb98b0ad229174bc7ae714bbf54941e324f0fa1c58118f2d0d1a23f765d95e8ee3d3a0ca8c743b4baab62650df229bcf6267bd33157eb9085246ce0279920688fe2fb0f30d756f63610097911f66a3bb9c1949501617580b2b610a57ea688c8ed597a23f24015fcb689d5b14eeac7db032d77457e71d3b090309a3c5e39d8dbe342219e6b8be8e73d97f2d72a481bbdd718a8ce421a2e1a3b42867c68d7d7b9085da633772098d9b2001e2a86662deb93916d8d39574e4440cfa4752ea26f6cca72cc8ea9718f26310b643ecd8f08a95af39637a4412cec0b2a5aa10c563a4cadbeaf15b60e91314bb68ee573dc9dc5532d315c7e4b8b61a6a1d7baaa7aa3fb548a3f9534c801ff73dfc24420565c76f8cb6a66b888505fabc80bfe004d35bf2e01de7dd1acad6e82a44aa52b12e0d95e8b9a1fa8f354e45490d164af1e8d734c0509f8324d0dd944ebbbe463f587001df9534ecfc248902e238e7fdbb169d5ee91337ddb1d82fd45a36c5477a57b378fb0d20bef3a56778eb7022ab2a32a50184636a4746ea6c2d4a6aca97039c692860ffaf81101945cdb2740d43fd5549443f7a9f5d4dc79ffb0f878f1a37de1311e4298a4d73a5a4576d49c8a6872d8b41c0e816fab148396bfcfb642f7fcde5965cafff1c7538d374e5a823af2f876db0cfe3d5f01b14547c7842d9ea801aefdd5c5877da8d036656296bca409817942ddbec7096b040693423daa0b8cd194cc809c8d2a4ee60685545ef55dddf2ec37edb3d210face67d9b28e630ed4f4d6b54b4853aff45c0997ba93a627d132c03b1bb52b86ccdf7cb96031e0d531bbc9b6564005c85e721d4fc646686188b029e54f395ebc4cd955205fab972099baa2833a29d6965305b9087ccacba198632f24e5716813fe3b8d23b6cf12a443f05b495a2150cbf752b2aa971591bdd2b1ba4388761721aa07f4bcd77a88598b2175c70e8eda5d71703e389a52d42e0c0222ab4399b5b675b0e4587a62bc58922304c58eee1f063a67df60471dcbd6c6993ef4d6408559cb5893c095633a05d0774685ca45b616b31f3e61f42d980fbc4a26426833c3ad2ad7a65069d9d95ded8006e335a31d1aa98f8fabb428fe11c48e3a883ab87de0ca900de4beebe0c8556bffb90a39bedf810c54f1d18a070c4b8d481c54158565d23625e55841cabc6227b08dd5c5104c69aeb533804a23e04a05f7ede0184bc3840ec08b162c5818c8b6449715a7d62f9ca0cf62ce76ade0630105b6cf63e233db2a5c233ae929180b273dea9f98896c47cd334916e3c5a310a484c7dca088e8e3aaf9e3322ec8e993320a2b6c2d19e475f0cbbc9a37fddb41cd09515917d6aa3c6c9d5fcf1e819cb7b9b9ecdd9a4f7a40839e6827d51511bd9afb5385705ad3a711ca425b4809d59ecd4125adeede1115753d7e84f68d01a1e0acb936442a020657b7c09ce9eaa644c4442aaf18a4617fb7624c20702589accdcfbf8cedaa2e5d34c8bb3e8c216238bd5d7c85378245ed4fde4f553d3de1dd10f0b7607d7002cee2ab6ae2e9cd346f449195e7e7203e76151251a595820b7297af07eb53aa4636cfdf5354ac67791ef3ae8fbf7a5d6dfb1d264fa1bb0a359e40fea146c6e820be19244b52065dab968acd0f648d7746d2d85580e368a9361a930c09236afcf408fe426cefe104f3a16d2bc6135aa96083f5144c5e878890563f12675099f0aaae4bba5ea0f61ef0c6951db5e0a2cbde5b6204ab860022d39682aaac9fb6daefec4ebf5a23dee91658296ca81b1bba3e82c46adc0580cf572bf78f0f3dd070fedab6758a16946cb94857ca0d7bae087594eb71e9fcc6b4544a8835711eb3d2adbedbb1807388bb3c31adacdd7b826fd4e7aa50f77133f652dd4f3c38fa660575780b022de2d3b6aebc84f28a4dbf40d553d7bc3ea8e02562de58b4688fd86760dec9bd50957ec5870cbe77febe555471b716f89051049b7775f596b90c238698077280ba51b5faf8e9aafe6508aabdf0079669d89d6c7a4937b536ca320a62fd649b732bc63c032f1f8d55f3bb5ef59ccfb4499473f7bd29e2203c6da609254db2aeb23cfcd792898be257486acf04498cbd74b662e44261260bb20f7f744e69d3e4e4f13646f1d9a29e56f86814573ce1c0b8ac62cf17e8a552159d3bbc845359d661aad586d9bf3d315a6e290ab3b586f365cf9aa882af3590d86b8b3a467d7d1dc692256c7affe40b10638ac04b65bf37f010af92c56b17ac28418588385627baeba5b8e3ffe5042a98a24a761b156dcfd19212073f3b12e8742fafa0847fcd05289916a34a17f20a4ed957e0c10a470abca766c30ec78004ff25728d96bc4ef43faca994120f05868ab036296efcfa1dbca692ee091555083d5fde357d50286cb4726fe0aea21bfcfdbbd24a4ccd815a41476b815b4023c2c2b017fdb5d567b05729e191a0a7e7afa8811761c3f40c39baabb0aa1abf44be856403191f2844155d527620ee5a0a417b32b5b529083ed3ee2a30dbc6f6ebdd91a4064f90db8f5074875bb94c24f1cef263380e5daec280b45fa6c686b09aa690af403f28bab3172f55b7c65c80784ca99471964839e0d45841a7b13550e816d692b210c071206badfc358e4859974b5af692da60c0dec9b89e36b50143ce93bc2cf072cc5482b46baab389f2e585e1b1fce3ad11b63608b8bef823caca2a2424a0a8f2a3783c85ef1d1edbeeacded0e8425e3820fbee90f01f684187934dc3474ec159725fff8647eb2e12926778d7ad863aa1d26b93f2aaaadda0ff604d2c96cd6cda2182b1eb17c53d00c9fb3aeec5caf4258f77215091677159033685288c0146f05ca3237d0537f0ebe99178000be6ba36f14e7bb45e30f39eaaa683654cf34741a35ab523d4cad4af8ffd1b232e216982a8d8d75a8d54f51c7dc38a9a7370772bcc77eb8348ab4a328512f366f3f3769f48defe73875fc7d02be1b2e1e38bb101855041a3b79fda89b7e1dd5ff3b75ea8f8e8a8644e33813b60340d2a8137cdc3b276bedd0e37f87da3c1c042f81157f6af38dca73c18ad5f7065d2816016a0db593200cfcad4bff7fa7b0ad18aa1bbb8abb0097eb3a93e180d5f3e54eda66605394f059d7313c66afb92ef1dda5e70092f818d57198ab61fd8a5c963b73d58b2aeda24cfc321567694707280325af167951dd43d50a60a1e0b01f02995039786883b04696a490783505bfd80aabc069e6d028281d9d4fdc97df0401aadba7053b5471d3fcc436e15f02f00ef5e05b848fdc720431813be728d475b3014be4b89ee4d88d05dd8059aa0f78dd90d98584f2db22f18e706f8a05ceddd2f4d45ec623fb157ceb8ac52458763004c9d51013795ee6535968495d18e3dfa98ae8ad636746112a021e280674056b442d49a4f47946d3ee9f71dd9945fec432eef8edf0cd41e93dedc9b0334677c4d5d78ee2429b2263d7a119bc4d135c7c23ed93df54fe535d7c4962404465e6439488e3bb10f8a8181e919fa526bbeb3839cf3a4c1008ce9b6d0e7d5de32b7ba47436930f9d1c4f63a2b54815639a8931986035b3a37aeb2bcdf7f017db6cb286b9c5bc57ba31cc9bd620ce5ee414d1b2244c40fb6a85fb665dd4a17350f92b104ad990b8993b2ca412d70d3e129cfaffac2ae0d61cac01dd71fc4bb9cd95aa3d8606a810457cdb39c5ba0ed8b0b82b9b7f8f1d265bb88eb0c42316cd915d9a7b75147eb72692c64bfb54af3c7e80b107eed4a4ae30c6cecb16014995a2fc32aaf9ea7c07a710070e303d36b89d57a472896d03be9e59864ae657ae5a56283989e5615663631485424a9df16d9d6d8784babbeaf058b5f4b663bf567b806c351fd9aabf8286fb4fba89f5827dac3e80e1f318f125809c87b5c91117ef8545e6a8f6cc76a6d9bb0cc98784725b3eaab0299ef56ed67ba143982da0e89207cf35b52b19928a15713f9194fee190274d086fa0af7bb94b19ab2e16d7dac419267794f39bbf18c2a6e7a15bbb74319036d93439fcc4915cb6c4e8e675aa38b5cd2547683773a4c6badb64928505bdd9c44d2a2352a2db5735b2b18751792f9039cafa4014c25bb4ca3492474d93529cbb443f7916e2b3eb832b364cc4566cc9a3170185769402b41ffed4870709009fb02e1d6d4341c4e2311004b45d4a3dc752ee7ba6c20b58f6f0b6a215df76ebb39b0c20a65ff1e6e84b94f3204d116b81c6bcd357cbe51540917172fb45c6286b49f8c886fb7bd4b23c455610dd5b10a4b49495e49b626bb1c991f335690c873b9bfb54152f80afae2967de1b4d0cb83f0e1ae07818b0a8d6ec63074499f5d8c48573a8bc2587d1e7f06ea3673d0b6cffd8542a2f63d284a88acbbedff050000ffff8c9ddb6e5dc71144dff51504df19ccada77bf42f46a0408411c4b28c98090204fef7a0e66c0651af39e1793240c81279b8f75caaab567d90f97bf96fcd7a0e99ecf8ec4240e31405e060e95a404a0014badcaa79fb68427e3be4d736b0f56dba5b26d5aba2c3e680bcb978b4aa11e2eafb43d404a9fc28abbf3375cc84804b7bea05a54f3bfa50571622db9cad3bb9a8a1bae56cc699e2b7604988a1bcac3f10e756c0bd914e19f62397f0769a76b5e866f95d510fb043437c25acaba1515e5e9518d4bcdca8aa82fbf11f3325271bc25d6b2a289129a3dd56666ca90fcb17de72d0626eeedfd50819934d18d30a65f77b0733dd76f352364a9d52ee326c54ec6fea2c5e3e99b9d2798936129d4b2669ad53ff1a8479e527591823f03b0409d913e130392aacaa9a67d393c217a3e29aaf3e8802b4b4f5cd20c431770c27e276d7c01bd21aae51554e4fa9fa672d0203c9b238cea9541930c94711d0b266d8bd5e6b7907c9fa9bcba0ec8cd1b130c8b4583d6b53b68b67b3b2b7bd7ff3831b40f953b334587d77f9c7f07c6e1d1e253778149b05e909b92ba5d6e7397826d1bd97b159b05a4b8c8f009fb2b73090598f8ba8fa97264dc943d6cdc1094f1bf8d516af3da71764f25c9cad845b653e393bd6df01cc5617723822768182af8dc46c263155059b68aa5047d10c3ff024a213eaae51be41e333c9977894ad8b718b1bb904c1588fc03e8638112cf33a860d8886b9bdd1cab8c6ca87a0cdbac87413fdd519d55c75c72c9315070a33e6d7bc9a7ba6a4b9e47bb45b61ca7db578143300a093a6701dfb7dcd1118c897c9fbf0f67528299bf3eaaa1880ee255e3dcba1d4e97dca644a1bcfeca2b6f628311da3ba201ad9b4d37bcb3fb0366f2f23fb7625d365f9f2fc135caa644e8b2d4956295435f6d398bd633e2c17ee1da37935dc0bac5021587de6313513102b1e9a4c985e1c4640d68c5573d18dba76c2dae1d87be2af29ad6b19cd57c31058514fb137f2ea5b539b773e69341d4f735b48414f7119b33aa4f1b385b54c13696842c98ac80837415a574e0caa11c923a7eb198eb9b8d2361a33a9650d43a3e99045090537d9aa79214d67839327e60ecde4fb6e2ccba9b0227cbd760d487c0709b874c51a563e3628d9ecb8e81c49439a5faa793bdb58f1f79ea19eb7da2797811c4b958ec339e0226ffd6414e4843baaae83128a823c7a81615e3906f16f3e18c15d57a55d2885eccfe4f1a3eacf39513b2afecd9435b9a74727cb570b25c6ffb58bf90a67ba78580b132b012003e15c26906e5b9920e803e745f9a719c1dcb677e0b7f63837bf58b4b55ee1a0ee1387050112d664886777b1c3cc5efb6eb14d0f8aaaa047341cc61a3a328ec6af6ae6bb4020bf19daffe9056fb3971c00bc77f6eb626a5bf8474380eb38b529aed94c3405cda29b57ef52c3d211ad7045b2d530873d83faa49aca9084eb5fef8b1f8512ac60ea2d1d72b2fdea046d11c0bf35d6579f8466c559a4f8e75f919ef792e51891dfe1315da61d169ab40edd9d44a16188a98cb9d804a5a45139b49fe97766f88bf5c2945884c1ce168d8027d5220e58b0aa1ed75508ffa031b6ebae8b8c33003e571ed3a22fb23766e4954e07bd8cbddc75c9ac7caa1d2f7657934296baaa54f2dc0ad475ce0319fb4861dfbea59c733dc6f8ce2cdd36d5566d6c921d0be0fa3bcae03e6b13955cc3f8edc2fab93125d2e43aa4c11945e18b3c30ac21985f96f0bcb193475d232d4742b30ffd262136a562d3a53e7450cc64bce503a81dde536f4ffcd875b8f90357291acc29c7a046552925420e8c335c888f3ad9738659eeed3daa52d4b3e62adece4150778849552f39fd8a6a3dcff3caeb520ea625a9e9ca09a9803e3bec45f5cdc3c6ae4a0f9475ae0896b9ca7463231f8b6f1eb387b05f77a89e6876d86f4d6d15bee0a6f08853b54e92d5cdc76dd12a84cd125e1c41118b4962a04ca3c683d4d0a03d2ba326b36e3a1a7517f207a392a8ea17cd61175d0cf2d2238675e7b4d49502c656b1b3cd60f6ca6b1cf9031f26cf082c7562714c64c348ea8f9907ff1a2e3ab6553973400d18deccf250578a5906491d20d297df668e03b62b1de7afe346f55a99a1551fa8e37159e35085ae6f57753e10f887e73d8188aebb34835ac53dcfe3417e0bc770f0d5cdda7f34a2bf1f2a755da91f915a4e59eef7cbdd68f92e1c368bc33db6c2a6a1ff589b1242eb5ded9b902f5c897ebae29a1c7f64fd846240f600ed145bfb3567562929936ffa18b19e54a1e3f18c0e117bb2c160f66887969863f2da74e92045c9562e2dbc43036ecb8c4747952c955ceda73dd0729f52170784d2be0c28f8e26a51669b079df5c711c7ed2ca48e5f20e0851c6c0f242839b9bd781d8d5dc7fbc23a2bf4fde39aa0ad79e5deed6b108861795fd4f7c71aacf19af21867b907de88f75b90f484f465b106c260fe6dc53a064dd3a6f585fed0d979353a78d2c8bcbd9e4e41f7226de2a3590b56d5b73cefdb95d97ee862b30e74242a7c2e6dafae8acbac523496cd02270041091dc7ad3f2670e89e843c5871b144f245b2f621d833ae1f7d05d28ef2f440809f5a51780f5c438f01f176ca5b661a9580ddb072deb989e619c6e168713d864210b15b72d5a10518d91c8d3df259dd96a6fdeb233aed35c1573d5b63358d86e587d6da56abf3d22a0921a7c2347620ce290cd2fa3d535cb428a802122f28df3a456e9fd0724cf82c76d82b461380e40a3abbd25e2a2d6a12467bea4b39f395f43016a4a2ab5e12906bcf3b6cf11105f5eb7d78870e584b44cf13065d717597ca9e473db7f92d91606e08278e12869c83049bca662eb946ac93b455f5eb69c85b8f395b062e4e6fd89ddc55478b12fb4d24cd16e431a47a664ee0a1e7a88eae431c22dcbd7564fb7cd6b0311f194deabb6ff0ce8b818d49828eab504cabb8539947ab34671d99475b2ce049ac455db36b7da4b55fafedd2edc41e30f51e71fb75e68d4d148a2049487bd8aa18c12ab56ae8761c455167dc867595e4a44c202756411c086aaae7343484d06573dd99341147be6bad6c746cbb5b8cf54f6a99c9b449e5bbd61a2847e873d22d126b35a47e342bede00b98de67d4474db32884b4ab998c05bfe6244e7b6d154ab1e20c416e3aa91e9768268d30cfda0e69008572e5cec8af8280e670146954819265cdcada82e054d6588e669b8393e484e5a29bef7c697ab9df29a8a23ff85394336c878febac6e35f52b9c7c55b31f2aca44c96624774bd680ff31097dd902cc86396cb643c87a7c77a156acfc19896ade1b73d3183fdc8b328f5dc0045c6b4c396df32b9ce92f2fc734e611d67d8bcf0f58908e8b4593510f80913695ae38081485bf78db58efcc645b6dd357205a28df41fa5a6f6005dceb7834b508e6d5356c8d0c3a3bb106f4ec76383bcef17be244ae1b994bd09a79bdd28933af005a9806867ce79649c51d5a406090f262b99d4b311df7ecd16ba1594f96cff40af6467dd6eb016ea7a85227e150ced73a3262489bb767dfc3eed708f8e9cdf7ce9eaf301a41c0267663f2e68ff2d48bd0e6665e4383d2fcc29140848073176b7ca731c2e4fd3a20ba3551cbbe609dc79940170aa6e247eb1c269bd8282b53395d08fbdca745ea77559389b344a1cb5e8ab2bfa258116042b24b3b2e667557da65995a91e98ab0e24e30022e70a8cabb6584c7caa11ef918aa55ae0bdb5c4837450c3ed0ba0d07b44baf31315d8eb6933d79bd506c6b7086ab1a3cfc68b25e70e4d2745f0b2a59f26f64b3bdd08c0ac6e1a81d28922b42444fc40d646201755fc7679c60ab6066a07b14d730031eab6cffbac9763a6913071b31d9b735e4c8857cbaf3c7cef623efac8568e2054f38e83aed4cbb7c339bda4645e58d3e699f104445f95d0bf139a0176e275dd5f360613b341a089b52717a55c0b3d7c3b5b7469e669ca7f9e78ee83e6eb253de69b7268a8bc1f2c84bc811815e15e5cf031a4efa8ec4e89b1657f0435513e93cf7210a278a33c57e5c3de7bfba1499fc68562d3268da522f4976ccac3a279bd7fbac9d73566ddb2841736dcf98530ab84db24a265edf9ed6d9276299adeda500b547dee87fd6e93fdc322fcad7aa68ce93f2db88cc77d5be65aceef0511087ce068fffd36f14520341158c11e8965183889b211aa7e450ae85d4598204e10c1bbe4c6bcd7de52bab6a9360471e0205428233d90f5115af6fca73ec4193d60ac06aeb5600949d433b39c304433c0534a6f9725c9440d7ba172adf87f63941433f37a6284a91f5c2325c67a4fc6fd569874878852272a7b1b30d8d87aeaffdb4fffbc7a7a7a79ff4c79ebf7dfffafacbf3e7a7e7b7d77fbdbdbc7efbcbebd7af7ffdf5e7972f5fbfbc94d25efed99ef79ffbc7ef5f7e7e7dfefcf4effdff3ffff6f7efdf7e7bfbf3dbf7bfbdfefafbf3e7a7f787e4f9edfbdb975ffef7eb9ff4affdf1e93f000000ffff0300a520f7b8f78b0200" + ], + "rawHeaders": { + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-Request-ID", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "cf-ray": "913c0019e9f57c6b-LAX", + "connection": "close", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Tue, 18 Feb 2025 06:36:01 GMT", + "openai-model": "text-embedding-ada-002-v2", + "openai-organization": "anabasis-llc", + "openai-processing-ms": "142", + "openai-version": "2020-10-01", + "server": "cloudflare", + "set-cookie": "_cfuvid=11CygvB1hzKml9umEwdopp3rN2l3.23iE9gLzZisM1Q-1739860561412-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "transfer-encoding": "chunked", + "via": "envoy-router-749cdcf4bd-nkbwf", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "64", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "5000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "4999948", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "0s", + "x-request-id": "req_8dc47a23f0725c02e021ae8de07924a1" + }, + "responseIsBinary": false + }, + { + "scope": "https://api.openai.com:443", + "method": "POST", + "path": "/v1/embeddings", + "body": { + "model": "text-embedding-ada-002", + "input": "testFunction" + }, + "status": 200, + "response": [ + "1f8b08000000000000038c5ccbce63e771dcfb29065a5b41df2f7e95acec48081c24ce225a04f0cb074d520e58c5f13f5e78f18b439ef35dbaababaafbef7ff8f6eda7fffecb7ffcfa6fbffdf4a76f3ffde75fffe7b79ffe787ffbe5cfbffdf9a73f7dfbd73f7cfbf6eddbdf1ffffff6c95fffeb2fbffef2cb5ffff6ef8f8f3ffee35ffff6cbaffffbd39fbec93ffef2ff1ffafd9bee7f3fcbbf886846b8abfdf11f7fbebfda766f57fdf1fdc33e9231f9fed971f5f67effa8a99967fbdb47d554b4d2df3faabb11e9f05b6a1bb11defbf151d5ebd019fcd4d1b1dfc6ca9c504be998e85be3f98a854662bbcae9975b7c1f34ac48886c21b4ba6569bbf7fb3674facc29345ae243c9946c4cce29297665968e2a3754b95bc6f9b4aaeb4e0f3a66485be3f836a875b18ec5ab5ae297d41b8f9d233546e462b6c46e498046cbc78db04bdc4baa46fbfaf9898ced2164f6c0d1d924eb52d780b0d09b5553c50d3510bbba6ea598dcb606aaef8be56e35ad9f0663d1289bfd51e610b075276da67f09455b8b8d1d98b6ecbc0c7359fed695cc92d93c1a32ea9695a56ef7ff689b81b8bb730465a16fe2a95be09c76c77aae1ecc9aeace8e2eaf8d8fcd85e5ac58e1abed98897c055b94bd9b4c17a1773f02c6ccd06fcfb4c71a1b51d9ff0753c0ba52909f1c27d7b06435ee5da2c460bad0eb87ca5a631467125f2be1ac26b4bdbc0a96b95f4a415d47581d0a621650e7154d55bba137730c7303286de1bbc3fbf455ae5fbe9b699d0c49828de35398b4be5b9b386b14ea6d61cd73a7ad673e10d267d05e35f8ba958e2c91697753c183e95b9efe7d52363f0b045de01c26dcdba7b0b074b72443d20faf9aa8be02db80d9c12c1a72d735f83ad890cf7155c30ed5257294c66de519806d4376b1377a23bd2129fcddb547123ba7332e1807878aa156efcfae8063e427947f4500886c3f8fc86c8b5187cb047c4c66f903409a3d0ae3e5310a6ca2ab5851084a6560505e1aa56bc916ded85a9f336c3c68b825d474beffb16598b0dad4e5a85e21e73ac786205931e0605953e943a35dd82036ba90f5e581311695c5f89c95233b8f09a360901bf3cca0b32fab806e52c3f60024b6bd9ab89d146caddf002de99eb35ccdc327df00123b3642ce63691dbdc01f861ddb92e10dcb6b7dd0380ca81e4c1ccd055e346e162dbd310ae3d02e4d28d1497195857f14640e236cebf249b7dd721215e46486960ccbe57c093e1565b1445f34e1c1e395b4d697cd8deb2c6addd3b070401634bd321bb85892d5e67b1301577cccfa1ee029b50723903915a6da9527a8e2a99a297edd1c205d7f116f7e10c2f3e86516243e91d4a35a429dcc6e57e436819d5de78f355a213f39e5bb452f49a51439866961198f92d726b12728e1e1e483a1d7601b80d1741ee050cd7c624576530068fd83b887d1cf1abc010295ce4702c030fc9bbe2cdeb8b1481d5a5dc010d8738f59d183eb6561974f4bd2b03225d4f0a5e3eedb4168560ff2989b8694ee11b8ccde0ca5a4dbc95a68f4f7a5e44c2c4afbbdb49a5c4de31488c2893c6183c53c360b5bd7d038beb2ba7f02bef640981946c1fd9f735adbaa88e597c631542947acadb82be305299c0dbdb7d32dfff755c86c140d4aad6f8e3b2ee8629cac6ccd5e19c6af5eed2313391497ca6eceea4943ee341d7d5eb0a7a2598ea16517826c63db3e14ccfaa0ae53e69c58d124f93a9a008bd918545ab983f6a7a7c3329292a611e94c92eb249395b4b08efe29003da96dd5e03b8a41297d68a21a2d2965fc9a9184aa53b2208fc5ee210c15be857648b60e8d68ac34c451f6ed778ff6b5aaa74d3e2d45629d6ff16e61fd8a4a95e6daaa7f200033cb15ddde7fb43a82f33c6a301a01d10482288641412abb6e52eed835c3d9d51b86bad077ff1c5742e8750996f5150e51e6819c372e16eea36ffd56a53e01d2caf72c4e23b5bb9e289305f22925a73a3bf4eec6aad2e853cdf914ef04ce25a771010a176766141aea1e1ba544549aa4922b9745fd298fe6e05ec8dca7a909292819849b3350b30ae5a7936110de211ed5443c966504e4d711d0d4a1f69817b503646e7451f0813dfc07defd0c131b65d1da4132f81604cac52cc7d62ed2b9ec9f861f50d8d3ef6206e6921ccc5581a7e81c7d86a50385197847b68263e4d41f5b6a5b28986d6d8096239732a31a4ed7a232f946ee2f05abe73143b540e7a74a611f97bf43e46c3dca844ac30161e840a52b61617cbc2359bbea0cb134b32b5f5f95015dab4a14411ddda84005da30b1fb5957500ad6a57c4c7aeb6d2884d24e64a4d20862cecb20d04c89c135fa0dadd39889ec4480bd33fbba93a4c771d7059a2bb0e211111fb21bed2c23c4e716f77429e3bc663a4696beb141dbc31696b86694ef724163c9a1675b43896a51a552170653247e86a5476afd03dd2711ba4ec2ec4ce306d5396212401ec94419e7b7cf19a02c9fb88073e81a569959953e43b2ec090791ccb9ee567704181c57c52890da180fa58c6d243e444d47a5561aeb34ab320685119ae18117cb37748dcf3ae36941727d41439ce57155ac40e4a276a181a1947b7517d2e547fd8c9028108f8719a171671bcbb8308066f5d2ae4edc827bc24a7d92077ab79f88cb25a9f5c884a9b4f8ca70f16e23347a1e17ba54e3b463adf753a5f9feb10b1cbe2d3b039a9baa4fc4a1d71fb03649fa69a271d8363c063b136299d4461524253101f6acc2568f8f7e126a5c4089df29ca4d3dde15822cba6bd0cb380544566389d245f33a495aa32938270665fe586f26c0ced6ef61d3b5201a03a7f9e83a8fb35240dc26630b44bceb0f6a71e9582446e56a5204f7eaac050bcbe5aae6c051281d4c987eb0c728e965944239253cd98ac9375ee8314d282cf71482f924045ed2897e6aec7765341b7a7dd16e469735d38e69f83f34980a548fab99cec8bfbae5982e4ef81704d47b0a75a1183d509bfeeb30ee875e246e6fd88fc2e35a54cff00d9a39a515154e2a9668f3019783c1e1a24c2cf4d81b5f6b1361f6ae20b423a6100efa7dd07e17d14691e7a7e07e58370da39fcfb5bd9a05a46aabc0b2eb5d49cfb8542aed583a0a06ba9be7823324a12210823becfce84a73830d1181c0fc02890817ad24413c9740100cfd1a7b072e045c63ed0a61773e91cc8962b962d2956b2a0da68a8c3f34b7a2d21073dc439c0e3d861894c74ef5c39d790726ebb57624822de996ee44a50ce7f625ed54c342f9c90534b1cabbb911626171591a4cd556fe434425cde77eb59a4da1891359e47950f52af7e7aa27f50f9361833bbe5807fc37a4f6121dc1f134117b4d7dab8c809eb00aec0eafc1ffefe5b998f9a0caaf7e3ab3a50eed86da122ab2e7091c3e718242341afb47d885a3a417105c3778deca0c4ad92e3d5183f551f2600b29b9c470deee2d9bd94c9a50f260aed8d2912c3574f7cc29a507b06bc0ae2971416e3377deb4711e519bc6702952f3947558e7d2981fcfc3d65a07210584b78850ee3fd7717c99392ad07098255441c5d8021ee24cd362c906436ca0c41b4d6dd9ba5aff864ba93aedd22d02e55579d139208d5316486e7914bfb8be2fe01facb02419296cfa4a3bd24c769cb58387b5d9c3ec995d4e1312552565d26d3086455b641b0bf105ce3884d6724ab91b6f0c38a8b4e1413df0b623f50c11e578ac59fe68e10c8eb7c847b3ca0176c8949c899252158c367e992caf40ca99a779f17c5fcb12da27d8ea20349c5acad63c90e71f629a24774924d8027b2210a69371bf24ed9a974824a2bf10a4f5abd63e1109fb8118a5985dd274f5d181dbf4fdec8ee15b092ca3370218c88cba31c90a66531b5bb7a34792633f76a08c8ade9e5c83594c6f95cf1cec8fa3af1e21a57e6a2d1ab228999d74c8f45452b4e4a41b7a454168add9a678c5bdcad2bfbf0b64c9644a13a330d1e50cbf449ba009b32c4d49bf6f12ab85227459101f3b8a2c28268af76c225f9948f54ac23c865a453925db47c16440710ea7f6cb4f5e0ada4a8ff44bcd6d95f31b4af83ea96c890b8d4c3ed4d4a8770b83cfb22bb7b27f5441cfaeb08922ce76b635aed0e90da2e5affd6b60b8b86ce4c453a36c2630255a473433b1299796664ba977bb604ca84c7672029a5bb5a0151dccbfb8301e1c9eba191f9427e2f4511bf8682a022ed1e975d143d4bf8252bf58361e1a3dd5de7da0c5816f63ac444a2cff92d831a1dc49023d1eab3c0931de1827952c51ec78ce30169cd2c1242fa0c09cc4b4d5c4684287fa40e10407ef12da92cf6082073cfc732415ec4e99d22d52b363a06ee881f9fbce827b7936c1281a8e5d94e48a8ed3b78e89db0ccaa22db41f787f2497c727491676e3f004084b02dba84e5cc5ac145558d948b12077f8e422895aee02fdffc8a677ade133773c07c9f6ded1ed9e46493e9ac180814b711e7d7a6561e50da9e09b093ad31aab7ba08f72e2d924378f6a12c12415115c469b9e716c6bac9bd8a35e928dc69c4b2ec3c34466ea7714ba77e8ced09500b7d3d834480930bbc518a393641888fe5baea7194d68ffd42e7c55af017e8da2079e32e5346b7fc33277d9467a398737f3ba734fa3af7241284e8bb160826b33483ba1e2e95a6e19d9635294be5ae968ca2c74d29474e256c7d85562ceeee057dab24e199aeab3e8c4abbee73f37378dfba4e1c0c01a7b22f01a84325498f415cc5f3f4cfdca182053e760a917db86a74b3ca618a46d053f483fabfe2445aa5dafdc1a4a1dbaba2838c19aeb96496d4eaf3712e45d72b5dc999ee19d68036fc215e102b91713c2b4163996bd900a6f984db58c651e7bac8af8cf48f6fb82a97eac38b79c484d5a9d5e8bcdda0f2941aa91ef7c98f7aa69d91433568b999f3b6d01266cc14c238c99a5951bc9352edae58a15d730c9d8eeb1b2b19c225edc9f5e4d9bdc91326e58a2d8ee71233f2cbc70e138c54b8becc815e8525a284cff4901ab4076ab0f43879316c49efefcd6cf94a707b1d841348a8efb17b74a9f8f450712519e0a44faa8a88b27fdae8bcdad1876d67de9921b636ad0a0bd8138aaca908f4f19e42577264397b248e03208920ac4a9b5c603546eec9efb8b0f3dc32540655c507ada9b7ae7d0811cf65765cdeaabe0641fa3117c02bdf29844f7dbd7382fe13716acfb946e7f5c29c78598ad45bfa82efc96dcc0cbfba582e15cd574d9e2fd2db147d9a76a7912a36dbbe180c6c549fef915a6e2cbdd9cbe173462aba0e17432abe72347ebf61575c4fa7206492b669c896f65cd1869e057b14daf6cf7db117efe3baeeb0f67f900c482f9f8d989a8634fa3c2654ae9d8443f0f218457ca6ae5901e47f5dea1f6afc6bb37563436789a145ff000605cb2b269451eff946de7a475f5d1d3341a2d2f52d3521e4be02883c8693c76eb347db472b30a675a822ffe115e28e765b3d632eeb935311446fdb7a6721bbed6661ec5a9e6b1342ffe479a64fa8c6959c51aaf1a56abae0cd8ef75f34b4b9edf968f12899c52d3104d0cf020cf3353fbf48372e4cf49de17ffa9dd42c3021472b5962a26532d87fa3e19eff9c597d1122da454cfc9170cd48ed6425f698ec650bb2fc3e9a0b08c65ec74293fe7f09a00b0beca39ca9bc4e3d2308f29b57c7d22defb31151ebe87526b0a6bdd78720f123204eed0cc2e85d978ea4b91c9a73d016b72cb3833d10e78d0280afea67262378ae55467954374f3f2063c179fa647e8475934a1d2dd295382e7f36b8769ea30e731337b498cce378e0ef8c9d0b02535b9d9305bff343e576830fbc88e3e85d64de2f4c1e40c0311f2092bf7a97a251acbb7e22a7be2d3f2e941a826e9c41a26ffb63ef50a82ca162adbc6880546aec4af0fa5f578490ed48960eb65df35f112f779d3bd1aca37654163b71e6466c90e3e4dac6b96c880b3514f95ce2246480af9fcc83767245803542fad691d49e3e43b77393680a46efbcc92e4aab73eda14366989a73700ec2c4870b8dda20af31b9beb2adbcbc5a47b3905d61338496f1c098a2e422e575efdb5f552d2f7ae1315a80fa413b2df09b73ab6211199347f8d9073d0780f40bcbe8abc5f0b42b4a2ee8ac7c5a4f669702d235b4125efe9c09ef341cbd86e807fa975e887d82fca9a771592d61551839f31d76e163378666b536a964e4617f52a16725a1e1369b6d1134a7c35da9735f33240aba5fecc87374043d591fa2dab3457810852d59f6fc180bf2d59f9c5ae2485e7fb28848f6515a54edcfc9aa0805a86be0e5833bef3592087a5d0b84d84fe51ae92f7a379e207cae8feb075a8a2d669414fc0f3ec01b3e12931faac65eba5cf715c1b4e6295f2880cba8a993d956b7752ba9743de62cb9d5331e3e15ba4bb1893149cf81f5e6597b61945c4b14f225ae93369d3dbf75b10605fe986c2e88e214daf98a53fa271ab7bcb7273ddf4dad0605523b4f23719e7e023fce553bbaa229a25c3f628853653e2e51741ecedf8ca383ce8b859ca3f4f993c98f200f4360fd887d3b6e159447bb7cf0c87d472afbdc5baa377a2485db4537961ac84347697175649612eab94dae3183b6c7dee5ebd7af7d9adb75661169f499dd117107306f371bcac8eb9d7e7d244c867cea2bd31b99847e3259de9ecf0287ae6f79e37db034c15689ab9ca2cbf802ae4ca3ed68d6846c00756d98b411560f8b096ebb9e811ad6ab46bb68d723ed70320272e633ecc6e024b6757c4409ec3a7a566fc33b702dc638eae47a1b89923bbf038f17bb150c6cb3f8e811be1150e4f6df8b284ac4ec653d2c6963231505ea3e7f0b2bf21ff999139c4a3f6422553c811728374843b1bdb485a5bd6bd6a0f38f0601fd3ede47d0d17d04b92925e3d41ab48fc7d839548893dc1d96edae411a6d37297e13cdd0b4625234d5f2005d1174fae4d9fde8b4b03811198bdcb32338271a986ff68c38fab842f0a8f700854d278f922ec8b55ceb551f0626823cfe1a2ab38d2127e77d12d4ef4d278a6b75d1b888f87b44cd68bcb03abec393d774f21e2269a49c0d678fbc76b6fe81a9477e7266b3f1f8c2d01069bf79e3900080e2a48ee7d95077746e235bfc9cfaa4ada4399c11e9ddaaf67cad7b54ea59f9d4fc645e6a4842eb592c8a9c13a4f27c973bd58b458ec22559965fc3386b0351f535c6deee40d4b7da08a2416c7369c6d4c7a97c64a27d9a6d2e440f4e1b6a5586ea248a7f77aacf271ec762839abf2e37199250b93a4237e6146e6aadd3db6ec3690d1eaa47fd9235e931418da068344d9c089f12c2c2123784607f6c006cd4b92697fce193cbed489f06ec695e0b0329f55da33c80ec687127cfd4c5e4f2591cbbab172871ec277a089ea0f1faf3a84b67efee52efcfd164d8edf6f027a2d69e67d95da2ebcf276fdc09f26144e02525e123e2a147b3d1e8d3296be5c11179fdaad88c61470db3a34c256ed62b1aa5cf534d7d649f8b6dd6ec5f6ae6753890c9a9c9572fb7104174d48dc14dea7fe661c72f5ab0956447b30e9adf70425c3969fe710df64a435b326fbe191e9d4be714b3c3d50ae7a89ad636598668f2cef3bae916f51270d3d4cf1f678bbe74f583c5940c21643e47e96ebc91859fbdfcaf911d563c8aea7845b5afdafe9f2f769ea5229c71e3cc68c0485ce718aabf9676832428325cdb2ec6c2993ba6c852dd2c1aa230cbf3fa53495c3b8f2552c45cacfffc6affb0a2afb09bcc978141eb1e579df48acfaaa86df0f097bc91563ce9f3526de034c66049f4cc312e1c79cd0e1fe3f589ce13a8b093d2caf9388857d1b8841bddd84eb27fec0decb1fe012d46aee987a7c55cf5c96ec2d8449fd3b1c64b0df937402c703edc8d34a0d9825af36e14fbee6488f35d91fd84bb9f5f03830e6ddc69fc3f000000ffff8c9ddd6a5c471084eff51462ef05d3dd333ddd7a171314b49810cb32f1260482df3dd439476075cd7a756530fe937c764e4f75d5574558c0d35bf3458bc803e3378ff3039f53d29e30075558304e2ae831b786b6c32d030b9d50fe19eb0dce4caa0ff21161d95a8e1543c4bf3283088f78f8fa26f6c5ac97145edb1237b3cf264057918375c5add24072a4334b7183e4d5c10031a76174dc6ddc47fa3c63b54c76e86ea6c31bd34fe6648393265857f55f613874d329f2e70386a8c181614489ab028686879acc45d0a24af320b70623f928d8b23f78d870125c71e2e1a599252ce18afe081b722682d71559039754dd9aa0cca2ca2cf078e6cc0f9dd8693992c2a3b0b0f7ca2a94edd9a5e7066a6ef5a4056628632e45b7d6e871dc0e26b9418058463c0eba59ce468937ce071e97c6304a5d7a8c498fad25444c72e60398c53cdc5002c123e8421f32b8d4ad931e6109a06095b51c5b6e9a652506252c5d6654016e53899cd6ad8820d70d9788da24bb0bd615b8e4539009625b8d9713bcf7988a125a0905ac245349c7c5324a28e288abd564986b4be5949dc530fadce31204c5a876bbd405c075b8cd0c73065b011ed09d2cce829c5a35e15554f0e17b72cdba0c1258df835d3f019c59d255b94b54d332d1ffdf88f1d88b515c186c05fa63d76482e50e6fb96e1424d2949317480c540c2327730eab58d62301a28052d90b821035605e7d20bbfb8d39011891bcd178bd32be2e93f0ecaedc29bc51d9afb81bb4ba800590af67ddb2ccd890aee40317559f0b72eb14293ac5923cd77161107a8f5b409b1406338ff71d49bbc95d856714d1d9bdd7b70ac029efb9fadbb48d10487d8118c6723aea5750f7d17140d4c034126b52dfcba13625094faaf4ac4402505e65841164868639c9997d3f3672152942600ad6f62054b8740a856c31fc24c973386400da36b3ba7800d31095f890774410a18299b4a4ad1206795a3fd4dbfa758bbfcdae1c7a2d368fa32ac3b4daffd6e8daa565557d78a7d836c45c65696e7649da41ed4323391c429b9585e1505723460cac37ccf7b8c28c9489d72df57a20cc1ce48023faecf5d49d1a0c38512f782111a4bf9b901956745833b20005f80355afa3a5ddb1dd0c1410d5975ae298aa6c90e9c0cbd5288249124f06087217aab40122bbd543c63446af393ab1b9bd94285c2be9dce113092f05ed830106eeb5d30259152d2a225785ace9ea8795694ca7a8b7c08e9164fed061c9fb57382f08b0d1000288490b6c37adf54e1048077f7bbd073b1c975bdd841b83557442f21de23a32608d323b0d9b1ffaf871001b4a0ca212a4aeb434974a9368bec939d57c05c1c4b93b6b4164bae24f57a473c84cbeac01c227702c98872b5404b23cbdc29b0c7b50e6240360a284724bfc230815a5a9202d93f41473d18953cdc587ca0b7ebdfe5a11da5f1a314279b1684ae05ab5219d2e2e50ec81b3a321da7b9d96b0c90f329aca9634ac1bb4f4145e2085235f5b3fa93856ea31387a8b4ee57d33445b5d8226e4a48a2d18f8ec563b04f094c465a57a92c3b900ef02b530f60649bbde12052d609599eb9e4a767ea2041ecb18980e693206c2829c0fcaa91d4960ef69df412bdbeb4e7a8cbc6d567242c7b331aaa297c9e0bed161faac34e29ce94c218fc575670b9504d5e321b7d5852b8488837908629a526f02882eb5b6a80940328d5e0e256cbee4e15f979cc9af7315c92c98b6a53e5e4b61a0252270e5e0629ed576160ca8058c26db864d92e8015aa697b4092ca6a3068c4229cc89d2ac913491280eca4177e4813f98eea2abce269f507d82dc55d569fb8bbe4a34d1a5121876a0558424a2b620257948a3950febcb0f7b4c09c76ad57de083a4b50a7c2ccee50e750adcb761da0806bc424e4a84b67afdb436b5d3d00d350b50762ea7e8d289d835d3ba7622a4c0bb359c7803095da0f242fa6001427a36d77e23b373240dbc47cd1831fa74ff12b2bf1f2ef7f2408527ac3ab965500d1254be46943b181e1a3bf73709372b750a5f18c549adc322d36ff0160f3421b94814bb0faaf75d150f772c6f832c953a9dbe5210d37241ef98d3ab083f0257ba3ab040e56ce554079ba551379404b0c25e97a42b921b5a1aad56cf08ca640751e3864d73524f5b8ad59333dc83a66fb4133596d5a33266d120218cec1bd66b61223602e8d0ac26a045ab9e38fca08cfec5f05edf526b3e7e8b309bf57ce405cf7e3f444e8650135d605123f538dd699e37dc6ab8b4b5bd3fdd96dbce63f1846c3cfdb78e181c16a27de5d52e2a83a38f04cba58117041c65e28fcc5e4d912bf012ddcaf65b334e6cce6b9506c3fdde02930cfdf5f5ebbf1a7c44c0ad25019a14b77652a0ac8fa0e665f644eeb7eb86c8eeb801157d43a6c07fcf1d0530ef54ad26bd8deaaac0e12037c97d6fe19d884e7d0cb38fcec108f875492f9b035d135476387ba7501063ae769902a270cd58af908468e2025a9a0442cde4f2324ff424dc5cbcbdc5db641a075d96f9c1258b7b8b2b4c8a7c815c4ea5b51c763c1a7255f5367c66dd0803e6b777d2ba6b0fdeeee53609aeb0c8698d477f4974b25096d6710faf59c79143dfe97b57178da8ec4ddeb25111f875d5507a474f305d5f1683f351b851237ee4947feb6046e3ac5462806f0160b276a0f0940e61e0ee9d424cc8ff20f5c1d328bd5db7d76b633fe816b6e4bb24519e7e52c28e9ffbb4fdf8e3eefefe137ed9e9e5f5f9fce5f4787fba9cffbd3c9c5f7e3f3f3ffff1f5f3c3d3f3d3436bfaf08f9eb65ff7f7f7a7cfe7d3e3fd7fdbef3f7dfbebf5e5dbe5b7cbeb9fe7afdf4f8ff7c737e47479bd3c7df9e9a7eff077fdb8fb1f0000ffff0300b0c002c507830000" + ], + "rawHeaders": { + "access-control-allow-origin": "*", + "access-control-expose-headers": "X-Request-ID", + "alt-svc": "h3=\":443\"; ma=86400", + "cf-cache-status": "DYNAMIC", + "cf-ray": "913c001de84f2efd-LAX", + "connection": "close", + "content-encoding": "gzip", + "content-type": "application/json", + "date": "Tue, 18 Feb 2025 06:36:01 GMT", + "openai-model": "text-embedding-ada-002-v2", + "openai-organization": "anabasis-llc", + "openai-processing-ms": "83", + "openai-version": "2020-10-01", + "server": "cloudflare", + "set-cookie": "_cfuvid=PPJ9vzd6aXWEGC4Afhh_TGrb4jclW4phRCk3f86d4MA-1739860561802-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "transfer-encoding": "chunked", + "via": "envoy-router-dd569d47c-cfkjg", + "x-content-type-options": "nosniff", + "x-envoy-upstream-service-time": "48", + "x-ratelimit-limit-requests": "10000", + "x-ratelimit-limit-tokens": "5000000", + "x-ratelimit-remaining-requests": "9999", + "x-ratelimit-remaining-tokens": "4999996", + "x-ratelimit-reset-requests": "6ms", + "x-ratelimit-reset-tokens": "0s", + "x-request-id": "req_b197b006111b33df62907d2c3e08ff89" + }, + "responseIsBinary": false + } +] diff --git a/src/services/code-indexer/__fixtures__/test.py b/src/services/code-indexer/__fixtures__/test.py new file mode 100644 index 00000000000..fc2953f272d --- /dev/null +++ b/src/services/code-indexer/__fixtures__/test.py @@ -0,0 +1,9 @@ +class TestClass: + def __init__(self): + pass + + def test_method(self): + return True + +def test_function(): + return 'test' diff --git a/src/services/code-indexer/__fixtures__/test.ts b/src/services/code-indexer/__fixtures__/test.ts new file mode 100644 index 00000000000..89f1ae5a831 --- /dev/null +++ b/src/services/code-indexer/__fixtures__/test.ts @@ -0,0 +1,15 @@ +class TestClass { + constructor() {} + + testMethod() { + return true + } +} + +function testFunction() { + return "test" +} + +const arrowFunc = () => { + console.log("arrow") +} diff --git a/src/services/code-indexer/__tests__/chunker.test.ts b/src/services/code-indexer/__tests__/chunker.test.ts new file mode 100644 index 00000000000..f3a7951fe35 --- /dev/null +++ b/src/services/code-indexer/__tests__/chunker.test.ts @@ -0,0 +1,43 @@ +// npx jest src/services/code-indexer/__tests__/chunker.test.ts + +import path from "path" + +import { getChunks } from "../chunker" + +describe("chunker", () => { + describe("getChunks", () => { + it("should chunk TypeScript code correctly", async () => { + const filepath = path.join(__dirname, "..", "__fixtures__", "test.ts") + const chunks = await getChunks(filepath) + + expect(chunks.length).toBeGreaterThan(0) + expect(chunks.some(({ type }) => type === "class_declaration")).toBe(true) + expect(chunks.some(({ type }) => type === "method_definition")).toBe(true) + expect(chunks.some(({ type }) => type === "function_declaration")).toBe(true) + expect(chunks.some(({ type }) => type === "arrow_function")).toBe(true) + + chunks.forEach((chunk) => { + expect(chunk.chunk).toBeTruthy() + expect(chunk.start).toBeDefined() + expect(chunk.end).toBeDefined() + expect(chunk.filepath).toBe(filepath) + }) + }) + + it("should chunk Python code correctly", async () => { + const filepath = path.join(__dirname, "..", "__fixtures__", "test.py") + const chunks = await getChunks(filepath) + + expect(chunks.length).toBeGreaterThan(0) + expect(chunks.some(({ type }) => type === "class_definition")).toBe(true) + expect(chunks.some(({ type }) => type === "function_definition")).toBe(true) + + chunks.forEach((chunk) => { + expect(chunk.chunk).toBeTruthy() + expect(chunk.start).toBeDefined() + expect(chunk.end).toBeDefined() + expect(chunk.filepath).toBe(filepath) + }) + }) + }) +}) diff --git a/src/services/code-indexer/__tests__/code-search.test.ts b/src/services/code-indexer/__tests__/code-search.test.ts new file mode 100644 index 00000000000..eb27335dfa3 --- /dev/null +++ b/src/services/code-indexer/__tests__/code-search.test.ts @@ -0,0 +1,72 @@ +// npx jest src/services/code-indexer/__tests__/code-search.test.ts + +import path from "path" + +import nock from "nock" + +import { CodeSearch } from "../code-search" + +describe("CodeSearch", () => { + let savedKey: string | undefined + + beforeAll(() => { + savedKey = process.env.OPENAI_API_KEY + process.env.OPENAI_API_KEY = "fake" + + nock.back.fixtures = path.join(__dirname, "..", "__fixtures__") + nock.back.setMode("lockdown") + + // You can re-record the fixtures by setting the mode to "record" + // and running the tests with a real `OPENAI_API_KEY` in the environment. + // if (nock.back.currentMode === "record") { + // nock.enableNetConnect("api.openai.com") + // } + }) + + afterAll(() => { + process.env.OPENAI_API_KEY = savedKey + nock.back.setMode("wild") + }) + + describe("indexFile", () => { + it("should index a file", async () => { + const { nockDone } = await nock.back("indexFile.json") + + const filepath = path.join(__dirname, "..", "__fixtures__", "test.py") + const codeSearch = await CodeSearch.getInstance() + const chunks = await codeSearch.indexFile(filepath) + + expect(chunks.length).toBeGreaterThan(0) + const persistedChunk = await codeSearch.find(chunks[0].uuid) + expect(persistedChunk).toBeDefined() + expect(persistedChunk!.uuid).toBe(chunks[0].uuid) + + nockDone() + }) + }) + + describe("search", () => { + it("should find matches in indexed files", async () => { + const { nockDone } = await nock.back("search.json") + + const filepath = path.join(__dirname, "..", "__fixtures__", "test.ts") + const codeSearch = await CodeSearch.getInstance() + await codeSearch.indexFile(filepath) + + const results = await codeSearch.search({ + query: "testFunction", + distanceThreshold: 0.3, + }) + + expect(results[0]).toMatchObject({ + chunk: expect.stringContaining("testFunction()"), + start: 79, + end: 123, + type: "function_declaration", + filepath: expect.stringContaining("__fixtures__/test.ts"), + }) + + nockDone() + }) + }) +}) diff --git a/src/services/code-indexer/__tests__/uri.test.ts b/src/services/code-indexer/__tests__/uri.test.ts new file mode 100644 index 00000000000..be272d8d9fc --- /dev/null +++ b/src/services/code-indexer/__tests__/uri.test.ts @@ -0,0 +1,79 @@ +import { getCleanUriPath, getUriPathBasename, getFileExtensionFromBasename, getUriFileExtension } from "../uri" + +describe("getCleanUriPath", () => { + it("removes leading and trailing slashes", () => { + expect(getCleanUriPath("/path/to/file/")).toBe("path/to/file") + expect(getCleanUriPath("path/to/file/")).toBe("path/to/file") + expect(getCleanUriPath("/path/to/file")).toBe("path/to/file") + expect(getCleanUriPath("path/to/file")).toBe("path/to/file") + }) + + it("handles empty paths", () => { + expect(getCleanUriPath("")).toBe("") + expect(getCleanUriPath("/")).toBe("") + }) + + it("works with full URLs", () => { + expect(getCleanUriPath("https://example.com/path/to/file/")).toBe("path/to/file") + expect(getCleanUriPath("file:///path/to/file")).toBe("path/to/file") + }) +}) + +describe("getUriPathBasename", () => { + it("extracts the last path component", () => { + expect(getUriPathBasename("/path/to/file.txt")).toBe("file.txt") + expect(getUriPathBasename("path/to/file.txt")).toBe("file.txt") + expect(getUriPathBasename("file.txt")).toBe("file.txt") + }) + + it("handles encoded characters", () => { + expect(getUriPathBasename("/path/to/file%20with%20spaces.txt")).toBe("file with spaces.txt") + expect(getUriPathBasename("/path/to/file%2B%2B.cpp")).toBe("file++.cpp") + }) + + it("returns empty string for empty or root paths", () => { + expect(getUriPathBasename("")).toBe("") + expect(getUriPathBasename("/")).toBe("") + }) + + it("works with full URLs", () => { + expect(getUriPathBasename("https://example.com/path/file.txt")).toBe("file.txt") + expect(getUriPathBasename("file:///path/to/file.txt")).toBe("file.txt") + }) +}) + +describe("getFileExtensionFromBasename", () => { + it("extracts file extensions", () => { + expect(getFileExtensionFromBasename("file.txt")).toBe("txt") + expect(getFileExtensionFromBasename("file.TXT")).toBe("txt") + expect(getFileExtensionFromBasename("script.test.ts")).toBe("ts") + }) + + it("returns empty string for no extension", () => { + expect(getFileExtensionFromBasename("file")).toBe("") + expect(getFileExtensionFromBasename(".hidden")).toBe("hidden") + }) + + it("handles empty input", () => { + expect(getFileExtensionFromBasename("")).toBe("") + expect(getFileExtensionFromBasename(".")).toBe("") + }) +}) + +describe("getUriFileExtension", () => { + it("extracts extensions from URIs", () => { + expect(getUriFileExtension("https://example.com/path/file.txt")).toBe("txt") + expect(getUriFileExtension("file:///path/to/script.test.ts")).toBe("ts") + expect(getUriFileExtension("/path/to/file.TXT")).toBe("txt") + }) + + it("handles paths without extensions", () => { + expect(getUriFileExtension("https://example.com/path/file")).toBe("") + expect(getUriFileExtension("/path/to/file")).toBe("") + }) + + it("handles encoded characters", () => { + expect(getUriFileExtension("/path/to/file%2B%2B.cpp")).toBe("cpp") + expect(getUriFileExtension("/path/to/file%20with%20spaces.txt")).toBe("txt") + }) +}) diff --git a/src/services/code-indexer/chunker.ts b/src/services/code-indexer/chunker.ts new file mode 100644 index 00000000000..72b9e3e57ba --- /dev/null +++ b/src/services/code-indexer/chunker.ts @@ -0,0 +1,201 @@ +import { readFileSync } from "node:fs" +import path from "path" + +import { Parser, Language, Node } from "web-tree-sitter" + +import { getUriFileExtension } from "./uri" + +export type CodeChunk = { + chunk: string + start: number + end: number + type: string + filepath: string +} + +const supportedTypes = [ + "function_definition", + "class_definition", + "method_definition", + "function_declaration", + "class_declaration", + "method_declaration", + "arrow_function", + "export_statement", +] + +export async function getChunks(filepath: string): Promise { + const parser = await getParserForFile(filepath) + const sourceCode = readFileSync(filepath, "utf-8") + const tree = parser.parse(sourceCode) + const chunks: CodeChunk[] = [] + + if (!tree) { + throw new Error(`Failed to parse file: ${filepath}`) + } + + const traverseNode = (node: Node) => { + const { type, startIndex, endIndex } = node + + if (supportedTypes.includes(node.type)) { + chunks.push({ + chunk: sourceCode.slice(startIndex, endIndex), + start: startIndex, + end: endIndex, + type, + filepath, + }) + } + + for (let child of node.children) { + if (child) { + traverseNode(child) + } + } + } + + traverseNode(tree.rootNode) + + return chunks +} + +export enum LanguageName { + CPP = "cpp", + C_SHARP = "c_sharp", + C = "c", + CSS = "css", + PHP = "php", + BASH = "bash", + JSON = "json", + TYPESCRIPT = "typescript", + TSX = "tsx", + ELM = "elm", + JAVASCRIPT = "javascript", + PYTHON = "python", + ELISP = "elisp", + ELIXIR = "elixir", + GO = "go", + EMBEDDED_TEMPLATE = "embedded_template", + HTML = "html", + JAVA = "java", + LUA = "lua", + OCAML = "ocaml", + QL = "ql", + RESCRIPT = "rescript", + RUBY = "ruby", + RUST = "rust", + SYSTEMRDL = "systemrdl", + TOML = "toml", + SOLIDITY = "solidity", +} + +export const supportedLanguages: { [key: string]: LanguageName } = { + cpp: LanguageName.CPP, + hpp: LanguageName.CPP, + cc: LanguageName.CPP, + cxx: LanguageName.CPP, + hxx: LanguageName.CPP, + cp: LanguageName.CPP, + hh: LanguageName.CPP, + inc: LanguageName.CPP, + cs: LanguageName.C_SHARP, + c: LanguageName.C, + h: LanguageName.C, + css: LanguageName.CSS, + php: LanguageName.PHP, + phtml: LanguageName.PHP, + php3: LanguageName.PHP, + php4: LanguageName.PHP, + php5: LanguageName.PHP, + php7: LanguageName.PHP, + phps: LanguageName.PHP, + "php-s": LanguageName.PHP, + bash: LanguageName.BASH, + sh: LanguageName.BASH, + json: LanguageName.JSON, + ts: LanguageName.TYPESCRIPT, + mts: LanguageName.TYPESCRIPT, + cts: LanguageName.TYPESCRIPT, + tsx: LanguageName.TSX, + elm: LanguageName.ELM, + js: LanguageName.JAVASCRIPT, + jsx: LanguageName.JAVASCRIPT, + mjs: LanguageName.JAVASCRIPT, + cjs: LanguageName.JAVASCRIPT, + py: LanguageName.PYTHON, + pyw: LanguageName.PYTHON, + pyi: LanguageName.PYTHON, + el: LanguageName.ELISP, + emacs: LanguageName.ELISP, + ex: LanguageName.ELIXIR, + exs: LanguageName.ELIXIR, + go: LanguageName.GO, + eex: LanguageName.EMBEDDED_TEMPLATE, + heex: LanguageName.EMBEDDED_TEMPLATE, + leex: LanguageName.EMBEDDED_TEMPLATE, + html: LanguageName.HTML, + htm: LanguageName.HTML, + java: LanguageName.JAVA, + lua: LanguageName.LUA, + ocaml: LanguageName.OCAML, + ml: LanguageName.OCAML, + mli: LanguageName.OCAML, + ql: LanguageName.QL, + res: LanguageName.RESCRIPT, + resi: LanguageName.RESCRIPT, + rb: LanguageName.RUBY, + erb: LanguageName.RUBY, + rs: LanguageName.RUST, + rdl: LanguageName.SYSTEMRDL, + toml: LanguageName.TOML, + sol: LanguageName.SOLIDITY, +} + +async function getParserForFile(filepath: string) { + await Parser.init() + const parser = new Parser() + const language = await getLanguageForFile(filepath) + + if (!language) { + throw new Error(`Unsupported language: ${filepath}`) + } + + parser.setLanguage(language) + return parser +} + +// Loading the wasm files to create a Language object is an expensive operation +// and with sufficient number of files can result in errors, instead keep a map +// of language name to Language object. +const languageMap = new Map() + +export async function getLanguageForFile(filepath: string) { + try { + await Parser.init() + const extension = getUriFileExtension(filepath) + const languageName = supportedLanguages[extension] + + if (!languageName) { + return undefined + } + + let language = languageMap.get(languageName) + + if (!language) { + const wasmPath = path.join( + process.env.NODE_ENV === "test" + ? path.join(process.cwd(), "node_modules", "tree-sitter-wasms", "out") + : path.join(__dirname, "tree-sitter-wasms"), + `tree-sitter-${supportedLanguages[extension]}.wasm`, + ) + + language = await Language.load(wasmPath) + languageMap.set(languageName, language) + } + + return language + } catch (e) { + console.debug("Unable to load language for file", filepath, e) + return undefined + } +} diff --git a/src/services/code-indexer/code-search.ts b/src/services/code-indexer/code-search.ts new file mode 100644 index 00000000000..cc1159073e1 --- /dev/null +++ b/src/services/code-indexer/code-search.ts @@ -0,0 +1,115 @@ +import { connect, Connection, Table } from "@lancedb/lancedb" +import "@lancedb/lancedb/embedding/openai" +import { LanceSchema, getRegistry } from "@lancedb/lancedb/embedding" +import { Utf8, Int32 } from "apache-arrow" +import { v4 as uuid } from "uuid" + +import { CodeChunk, getChunks } from "./chunker" + +export type IndexedCodeChunk = CodeChunk & { + uuid: string +} + +export type CodeSearchResult = IndexedCodeChunk & { + vector: Float32Array + _distance: number +} + +export class CodeSearch { + public readonly dbPath: string = "./lancedb" + public readonly tableName: string = "code_chunks" + + private connection?: Connection + + private _table?: Table + + public get table() { + if (!this._table) { + throw new Error("Table not initialized.") + } + + return this._table + } + + public async initialize() { + this.connection = await connect(this.dbPath) + + const fnCreator = getRegistry().get("openai") + + if (!fnCreator) { + throw new Error("OpenAI embedding function not found.") + } + + const embeddingFn = fnCreator.create({ + model: "text-embedding-ada-002", + }) + + try { + this._table = await this.connection.openTable(this.tableName) + } catch { + const schema = LanceSchema({ + uuid: new Utf8(), + chunk: embeddingFn.sourceField(new Utf8()), + start: new Int32(), + end: new Int32(), + type: new Utf8(), + filepath: new Utf8(), + vector: embeddingFn.vectorField(), + }) + + this._table = await this.connection.createEmptyTable(this.tableName, schema, { mode: "overwrite" }) + + this.table.createIndex("uuid") + } + } + + public async indexFile(filepath: string) { + const chunks = await getChunks(filepath) + + const records = chunks.map((chunk) => ({ + uuid: uuid(), + ...chunk, + })) + + await this.table.add(records) + return records + } + + public async find(uuid: string): Promise { + const result = await this.table.query().where(`uuid == '${uuid}'`).limit(1).toArray() + + return result[0] + } + + public async search({ + query, + limit = 5, + distanceThreshold, + }: { + query: string + limit?: number + distanceThreshold?: number + }): Promise { + const results = await this.table.search(query).limit(limit).toArray() + + return distanceThreshold ? results.filter(({ _distance }) => _distance <= distanceThreshold) : results + } + + public async clear() { + if (this.connection) { + await this.connection.dropTable(this.tableName) + await this.initialize() + } + } + + private static instance: CodeSearch + + public static async getInstance() { + if (!this.instance) { + this.instance = new CodeSearch() + await this.instance.initialize() + } + + return this.instance + } +} diff --git a/src/services/code-indexer/uri.ts b/src/services/code-indexer/uri.ts new file mode 100644 index 00000000000..351ce42a75e --- /dev/null +++ b/src/services/code-indexer/uri.ts @@ -0,0 +1,22 @@ +import * as URI from "uri-js" + +export function getCleanUriPath(uri: string) { + const path = URI.parse(uri).path ?? "" + const clean = path.replace(/^\//, "") // Remove start slash. + return clean.replace(/\/$/, "") // Remove end slash. +} + +export function getUriPathBasename(uri: string): string { + const path = getCleanUriPath(uri) + const basename = path.split("/").pop() || "" + return decodeURIComponent(basename) +} + +export function getFileExtensionFromBasename(basename: string) { + const parts = basename.split(".") + return parts.length < 2 ? "" : (parts.slice(-1)[0] ?? "").toLowerCase() +} + +export function getUriFileExtension(uri: string) { + return getFileExtensionFromBasename(getUriPathBasename(uri)) +} diff --git a/src/services/tree-sitter/__tests__/index.test.ts b/src/services/tree-sitter/__tests__/index.test.ts index 4a5782dcb1e..36c7c174736 100644 --- a/src/services/tree-sitter/__tests__/index.test.ts +++ b/src/services/tree-sitter/__tests__/index.test.ts @@ -1,15 +1,11 @@ +// npx jest src/services/tree-sitter/__tests__/index.test.ts + import { parseSourceCodeForDefinitionsTopLevel } from "../index" import { listFiles } from "../../glob/list-files" -import { loadRequiredLanguageParsers } from "../languageParser" -import { fileExistsAtPath } from "../../../utils/fs" -import * as fs from "fs/promises" -import * as path from "path" +import { fileExistsAtPath, readFile } from "../../../utils/fs" -// Mock dependencies jest.mock("../../glob/list-files") -jest.mock("../languageParser") jest.mock("../../../utils/fs") -jest.mock("fs/promises") describe("Tree-sitter Service", () => { beforeEach(() => { @@ -34,32 +30,8 @@ describe("Tree-sitter Service", () => { it("should parse TypeScript files correctly", async () => { const mockFiles = ["/test/path/file1.ts", "/test/path/file2.tsx", "/test/path/readme.md"] - ;(listFiles as jest.Mock).mockResolvedValue([mockFiles, new Set()]) - - const mockParser = { - parse: jest.fn().mockReturnValue({ - rootNode: "mockNode", - }), - } - - const mockQuery = { - captures: jest.fn().mockReturnValue([ - { - node: { - startPosition: { row: 0 }, - endPosition: { row: 0 }, - }, - name: "name.definition", - }, - ]), - } - - ;(loadRequiredLanguageParsers as jest.Mock).mockResolvedValue({ - ts: { parser: mockParser, query: mockQuery }, - tsx: { parser: mockParser, query: mockQuery }, - }) - ;(fs.readFile as jest.Mock).mockResolvedValue("export class TestClass {\n constructor() {}\n}") + ;(readFile as jest.Mock).mockResolvedValue("export class TestClass {\n constructor() {}\n}") const result = await parseSourceCodeForDefinitionsTopLevel("/test/path") @@ -72,39 +44,8 @@ describe("Tree-sitter Service", () => { it("should handle multiple definition types", async () => { const mockFiles = ["/test/path/file.ts"] ;(listFiles as jest.Mock).mockResolvedValue([mockFiles, new Set()]) - - const mockParser = { - parse: jest.fn().mockReturnValue({ - rootNode: "mockNode", - }), - } - - const mockQuery = { - captures: jest.fn().mockReturnValue([ - { - node: { - startPosition: { row: 0 }, - endPosition: { row: 0 }, - }, - name: "name.definition.class", - }, - { - node: { - startPosition: { row: 2 }, - endPosition: { row: 2 }, - }, - name: "name.definition.function", - }, - ]), - } - - ;(loadRequiredLanguageParsers as jest.Mock).mockResolvedValue({ - ts: { parser: mockParser, query: mockQuery }, - }) - const fileContent = "class TestClass {\n" + " constructor() {}\n" + " testMethod() {}\n" + "}" - - ;(fs.readFile as jest.Mock).mockResolvedValue(fileContent) + ;(readFile as jest.Mock).mockResolvedValue(fileContent) const result = await parseSourceCodeForDefinitionsTopLevel("/test/path") @@ -116,21 +57,7 @@ describe("Tree-sitter Service", () => { it("should handle parsing errors gracefully", async () => { const mockFiles = ["/test/path/file.ts"] ;(listFiles as jest.Mock).mockResolvedValue([mockFiles, new Set()]) - - const mockParser = { - parse: jest.fn().mockImplementation(() => { - throw new Error("Parsing error") - }), - } - - const mockQuery = { - captures: jest.fn(), - } - - ;(loadRequiredLanguageParsers as jest.Mock).mockResolvedValue({ - ts: { parser: mockParser, query: mockQuery }, - }) - ;(fs.readFile as jest.Mock).mockResolvedValue("invalid code") + ;(readFile as jest.Mock).mockResolvedValue("invalid code") const result = await parseSourceCodeForDefinitionsTopLevel("/test/path") expect(result).toBe("No source code definitions found.") @@ -141,25 +68,12 @@ describe("Tree-sitter Service", () => { .fill(0) .map((_, i) => `/test/path/file${i}.ts`) ;(listFiles as jest.Mock).mockResolvedValue([mockFiles, new Set()]) - - const mockParser = { - parse: jest.fn().mockReturnValue({ - rootNode: "mockNode", - }), - } - - const mockQuery = { - captures: jest.fn().mockReturnValue([]), - } - - ;(loadRequiredLanguageParsers as jest.Mock).mockResolvedValue({ - ts: { parser: mockParser, query: mockQuery }, - }) + ;(readFile as jest.Mock).mockResolvedValue("") await parseSourceCodeForDefinitionsTopLevel("/test/path") - // Should only process first 50 files - expect(mockParser.parse).toHaveBeenCalledTimes(50) + // Should only process first 50 files. + expect(readFile).toHaveBeenCalledTimes(50) }) it("should handle various supported file extensions", async () => { @@ -172,73 +86,42 @@ describe("Tree-sitter Service", () => { ] ;(listFiles as jest.Mock).mockResolvedValue([mockFiles, new Set()]) - - const mockParser = { - parse: jest.fn().mockReturnValue({ - rootNode: "mockNode", - }), - } - - const mockQuery = { - captures: jest.fn().mockReturnValue([ - { - node: { - startPosition: { row: 0 }, - endPosition: { row: 0 }, - }, - name: "name", - }, - ]), - } - - ;(loadRequiredLanguageParsers as jest.Mock).mockResolvedValue({ - js: { parser: mockParser, query: mockQuery }, - py: { parser: mockParser, query: mockQuery }, - rs: { parser: mockParser, query: mockQuery }, - cpp: { parser: mockParser, query: mockQuery }, - go: { parser: mockParser, query: mockQuery }, + ;(readFile as jest.Mock).mockImplementation((path: string) => { + if (path.endsWith(".js")) return Promise.resolve("function jsTest() { return true; }") + if (path.endsWith(".py")) return Promise.resolve("def py_test():\n return True") + if (path.endsWith(".rs")) return Promise.resolve("fn rust_test() -> bool {\n true\n}") + if (path.endsWith(".cpp")) return Promise.resolve("bool cppTest() {\n return true;\n}") + if (path.endsWith(".go")) return Promise.resolve("func goTest() bool {\n return true\n}") + return Promise.resolve("") }) - ;(fs.readFile as jest.Mock).mockResolvedValue("function test() {}") const result = await parseSourceCodeForDefinitionsTopLevel("/test/path") + console.log("result", result) expect(result).toContain("script.js") + expect(result).toContain("jsTest()") + expect(result).toContain("app.py") + expect(result).toContain("py_test()") + expect(result).toContain("main.rs") + expect(result).toContain("rust_test()") + expect(result).toContain("program.cpp") + expect(result).toContain("cppTest()") + expect(result).toContain("code.go") + expect(result).toContain("goTest()") }) it("should normalize paths in output", async () => { const mockFiles = ["/test/path/dir\\file.ts"] ;(listFiles as jest.Mock).mockResolvedValue([mockFiles, new Set()]) - - const mockParser = { - parse: jest.fn().mockReturnValue({ - rootNode: "mockNode", - }), - } - - const mockQuery = { - captures: jest.fn().mockReturnValue([ - { - node: { - startPosition: { row: 0 }, - endPosition: { row: 0 }, - }, - name: "name", - }, - ]), - } - - ;(loadRequiredLanguageParsers as jest.Mock).mockResolvedValue({ - ts: { parser: mockParser, query: mockQuery }, - }) - ;(fs.readFile as jest.Mock).mockResolvedValue("class Test {}") + ;(readFile as jest.Mock).mockResolvedValue("class Test {}") const result = await parseSourceCodeForDefinitionsTopLevel("/test/path") - // Should use forward slashes regardless of platform + // Should use forward slashes regardless of platform. expect(result).toContain("dir/file.ts") expect(result).not.toContain("dir\\file.ts") }) diff --git a/src/services/tree-sitter/__tests__/languageParser.test.ts b/src/services/tree-sitter/__tests__/languageParser.test.ts index 1b92d81b6be..858c9d7f5a1 100644 --- a/src/services/tree-sitter/__tests__/languageParser.test.ts +++ b/src/services/tree-sitter/__tests__/languageParser.test.ts @@ -1,118 +1,106 @@ +// npx jest src/services/tree-sitter/__tests__/languageParser.test.ts + +import { Parser, Language } from "web-tree-sitter" + import { loadRequiredLanguageParsers } from "../languageParser" -import Parser from "web-tree-sitter" - -// Mock web-tree-sitter -const mockSetLanguage = jest.fn() -jest.mock("web-tree-sitter", () => { - return { - __esModule: true, - default: jest.fn().mockImplementation(() => ({ - setLanguage: mockSetLanguage, - })), - } -}) -// Add static methods to Parser mock -const ParserMock = Parser as jest.MockedClass -ParserMock.init = jest.fn().mockResolvedValue(undefined) -ParserMock.Language = { - load: jest.fn().mockResolvedValue({ - query: jest.fn().mockReturnValue("mockQuery"), - }), - prototype: {}, // Add required prototype property -} as unknown as typeof Parser.Language - -describe("Language Parser", () => { +describe("loadRequiredLanguageParsers", () => { beforeEach(() => { jest.clearAllMocks() }) - describe("loadRequiredLanguageParsers", () => { - it("should initialize parser only once", async () => { - const files = ["test.js", "test2.js"] - await loadRequiredLanguageParsers(files) - await loadRequiredLanguageParsers(files) - - expect(ParserMock.init).toHaveBeenCalledTimes(1) - }) - - it("should load JavaScript parser for .js and .jsx files", async () => { - const files = ["test.js", "test.jsx"] - const parsers = await loadRequiredLanguageParsers(files) - - expect(ParserMock.Language.load).toHaveBeenCalledWith( - expect.stringContaining("tree-sitter-javascript.wasm"), - ) - expect(parsers.js).toBeDefined() - expect(parsers.jsx).toBeDefined() - expect(parsers.js.query).toBeDefined() - expect(parsers.jsx.query).toBeDefined() - }) - - it("should load TypeScript parser for .ts and .tsx files", async () => { - const files = ["test.ts", "test.tsx"] - const parsers = await loadRequiredLanguageParsers(files) - - expect(ParserMock.Language.load).toHaveBeenCalledWith( - expect.stringContaining("tree-sitter-typescript.wasm"), - ) - expect(ParserMock.Language.load).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-tsx.wasm")) - expect(parsers.ts).toBeDefined() - expect(parsers.tsx).toBeDefined() - }) - - it("should load Python parser for .py files", async () => { - const files = ["test.py"] - const parsers = await loadRequiredLanguageParsers(files) - - expect(ParserMock.Language.load).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-python.wasm")) - expect(parsers.py).toBeDefined() - }) - - it("should load multiple language parsers as needed", async () => { - const files = ["test.js", "test.py", "test.rs", "test.go"] - const parsers = await loadRequiredLanguageParsers(files) - - expect(ParserMock.Language.load).toHaveBeenCalledTimes(4) - expect(parsers.js).toBeDefined() - expect(parsers.py).toBeDefined() - expect(parsers.rs).toBeDefined() - expect(parsers.go).toBeDefined() - }) - - it("should handle C/C++ files correctly", async () => { - const files = ["test.c", "test.h", "test.cpp", "test.hpp"] - const parsers = await loadRequiredLanguageParsers(files) - - expect(ParserMock.Language.load).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-c.wasm")) - expect(ParserMock.Language.load).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-cpp.wasm")) - expect(parsers.c).toBeDefined() - expect(parsers.h).toBeDefined() - expect(parsers.cpp).toBeDefined() - expect(parsers.hpp).toBeDefined() - }) - - it("should throw error for unsupported file extensions", async () => { - const files = ["test.unsupported"] - - await expect(loadRequiredLanguageParsers(files)).rejects.toThrow("Unsupported language: unsupported") - }) - - it("should load each language only once for multiple files", async () => { - const files = ["test1.js", "test2.js", "test3.js"] - await loadRequiredLanguageParsers(files) - - expect(ParserMock.Language.load).toHaveBeenCalledTimes(1) - expect(ParserMock.Language.load).toHaveBeenCalledWith( - expect.stringContaining("tree-sitter-javascript.wasm"), - ) - }) - - it("should set language for each parser instance", async () => { - const files = ["test.js", "test.py"] - await loadRequiredLanguageParsers(files) - - expect(mockSetLanguage).toHaveBeenCalledTimes(2) - }) + it("should initialize parser only once", async () => { + const parserSpy = jest.spyOn(Parser, "init") + + const files = ["test.js", "test2.js"] + await loadRequiredLanguageParsers(files) + await loadRequiredLanguageParsers(files) + + expect(parserSpy).toHaveBeenCalledTimes(1) + }) + + it("should load JavaScript parser for .js and .jsx files", async () => { + const languageSpy = jest.spyOn(Language, "load") + + const files = ["test.js", "test.jsx"] + const parsers = await loadRequiredLanguageParsers(files) + + expect(languageSpy).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-javascript.wasm")) + expect(parsers.js).toBeDefined() + expect(parsers.jsx).toBeDefined() + expect(parsers.js.query).toBeDefined() + expect(parsers.jsx.query).toBeDefined() + }) + + it("should load TypeScript parser for .ts and .tsx files", async () => { + const languageSpy = jest.spyOn(Language, "load") + + const files = ["test.ts", "test.tsx"] + const parsers = await loadRequiredLanguageParsers(files) + + expect(languageSpy).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-typescript.wasm")) + expect(languageSpy).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-tsx.wasm")) + expect(parsers.ts).toBeDefined() + expect(parsers.tsx).toBeDefined() + }) + + it("should load Python parser for .py files", async () => { + const languageSpy = jest.spyOn(Language, "load") + + const files = ["test.py"] + const parsers = await loadRequiredLanguageParsers(files) + + expect(languageSpy).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-python.wasm")) + expect(parsers.py).toBeDefined() + }) + + it("should load multiple language parsers as needed", async () => { + const languageSpy = jest.spyOn(Language, "load") + + const files = ["test.js", "test.py", "test.rs", "test.go"] + const parsers = await loadRequiredLanguageParsers(files) + + expect(languageSpy).toHaveBeenCalledTimes(4) + expect(parsers.js).toBeDefined() + expect(parsers.py).toBeDefined() + expect(parsers.rs).toBeDefined() + expect(parsers.go).toBeDefined() + }) + + it("should handle C/C++ files correctly", async () => { + const languageSpy = jest.spyOn(Language, "load") + + const files = ["test.c", "test.h", "test.cpp", "test.hpp"] + const parsers = await loadRequiredLanguageParsers(files) + + expect(languageSpy).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-c.wasm")) + expect(languageSpy).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-cpp.wasm")) + expect(parsers.c).toBeDefined() + expect(parsers.h).toBeDefined() + expect(parsers.cpp).toBeDefined() + expect(parsers.hpp).toBeDefined() + }) + + it("should throw error for unsupported file extensions", async () => { + const files = ["test.unsupported"] + + await expect(loadRequiredLanguageParsers(files)).rejects.toThrow("Unsupported language: unsupported") + }) + + it("should load each language only once for multiple files", async () => { + const languageSpy = jest.spyOn(Language, "load") + + const files = ["test1.js", "test2.js", "test3.js"] + await loadRequiredLanguageParsers(files) + + expect(languageSpy).toHaveBeenCalledTimes(1) + expect(languageSpy).toHaveBeenCalledWith(expect.stringContaining("tree-sitter-javascript.wasm")) + }) + + it("should set language for each parser instance", async () => { + const files = ["test.js", "test.py"] + const parsers = await loadRequiredLanguageParsers(files) + + expect(Object.keys(parsers)).toEqual(["js", "py"]) }) }) diff --git a/src/services/tree-sitter/index.ts b/src/services/tree-sitter/index.ts index 83e02ac6158..d49b1995cf8 100644 --- a/src/services/tree-sitter/index.ts +++ b/src/services/tree-sitter/index.ts @@ -1,8 +1,8 @@ -import * as fs from "fs/promises" import * as path from "path" + import { listFiles } from "../glob/list-files" import { LanguageParser, loadRequiredLanguageParsers } from "./languageParser" -import { fileExistsAtPath } from "../../utils/fs" +import { fileExistsAtPath, readFile } from "../../utils/fs" // TODO: implement caching behavior to avoid having to keep analyzing project for new tasks. export async function parseSourceCodeForDefinitionsTopLevel(dirPath: string): Promise { @@ -21,11 +21,13 @@ export async function parseSourceCodeForDefinitionsTopLevel(dirPath: string): Pr const { filesToParse, remainingFiles } = separateFiles(allFiles) const languageParsers = await loadRequiredLanguageParsers(filesToParse) + console.log("languageParsers", Object.keys(languageParsers)) // Parse specific files we have language parsers for // const filesWithoutDefinitions: string[] = [] for (const file of filesToParse) { const definitions = await parseFile(file, languageParsers) + console.log(`file: ${file}, definitions =`, definitions) if (definitions) { result += `${path.relative(dirPath, file).toPosix()}\n${definitions}\n` } @@ -96,10 +98,11 @@ This approach allows us to focus on the most relevant parts of the code (defined - https://tree-sitter.github.io/tree-sitter/code-navigation-systems */ async function parseFile(filePath: string, languageParsers: LanguageParser): Promise { - const fileContent = await fs.readFile(filePath, "utf8") + const fileContent = await readFile(filePath) const ext = path.extname(filePath).toLowerCase().slice(1) const { parser, query } = languageParsers[ext] || {} + if (!parser || !query) { return `Unsupported file type: ${filePath}` } @@ -110,6 +113,10 @@ async function parseFile(filePath: string, languageParsers: LanguageParser): Pro // Parse the file content into an Abstract Syntax Tree (AST), a tree-like representation of the code const tree = parser.parse(fileContent) + if (!tree) { + throw new Error(`Failed to parse file: ${filePath}`) + } + // Apply the query to the AST and get the captures // Captures are specific parts of the AST that match our query patterns, each capture represents a node in the AST that we're interested in. const captures = query.captures(tree.rootNode) @@ -156,5 +163,6 @@ async function parseFile(filePath: string, languageParsers: LanguageParser): Pro if (formattedOutput.length > 0) { return `|----\n${formattedOutput}|----\n` } + return undefined } diff --git a/src/services/tree-sitter/languageParser.ts b/src/services/tree-sitter/languageParser.ts index 2d791b39a8d..0fbbc41997f 100644 --- a/src/services/tree-sitter/languageParser.ts +++ b/src/services/tree-sitter/languageParser.ts @@ -1,5 +1,7 @@ import * as path from "path" -import Parser from "web-tree-sitter" + +import { Parser, Language, Query } from "web-tree-sitter" + import { javascriptQuery, typescriptQuery, @@ -18,12 +20,17 @@ import { export interface LanguageParser { [key: string]: { parser: Parser - query: Parser.Query + query: Query } } async function loadLanguage(langName: string) { - return await Parser.Language.load(path.join(__dirname, `tree-sitter-${langName}.wasm`)) + if (process.env.NODE_ENV === "test") { + const wasmPath = path.join(process.cwd(), "node_modules", "tree-sitter-wasms", "out") + return await Language.load(path.join(wasmPath, `tree-sitter-${langName}.wasm`)) + } + + return await Language.load(path.join(__dirname, `tree-sitter-${langName}.wasm`)) } let isParserInitialized = false @@ -61,71 +68,75 @@ export async function loadRequiredLanguageParsers(filesToParse: string[]): Promi await initializeParser() const extensionsToLoad = new Set(filesToParse.map((file) => path.extname(file).toLowerCase().slice(1))) const parsers: LanguageParser = {} + for (const ext of extensionsToLoad) { - let language: Parser.Language - let query: Parser.Query + let language: Language + let query: Query + switch (ext) { case "js": case "jsx": language = await loadLanguage("javascript") - query = language.query(javascriptQuery) + query = new Query(language, javascriptQuery) break case "ts": language = await loadLanguage("typescript") - query = language.query(typescriptQuery) + query = new Query(language, typescriptQuery) break case "tsx": language = await loadLanguage("tsx") - query = language.query(typescriptQuery) + query = new Query(language, typescriptQuery) break case "py": language = await loadLanguage("python") - query = language.query(pythonQuery) + query = new Query(language, pythonQuery) break case "rs": language = await loadLanguage("rust") - query = language.query(rustQuery) + query = new Query(language, rustQuery) break case "go": language = await loadLanguage("go") - query = language.query(goQuery) + query = new Query(language, goQuery) break case "cpp": case "hpp": language = await loadLanguage("cpp") - query = language.query(cppQuery) + query = new Query(language, cppQuery) break case "c": case "h": language = await loadLanguage("c") - query = language.query(cQuery) + query = new Query(language, cQuery) break case "cs": language = await loadLanguage("c_sharp") - query = language.query(csharpQuery) + query = new Query(language, csharpQuery) break case "rb": language = await loadLanguage("ruby") - query = language.query(rubyQuery) + query = new Query(language, rubyQuery) break case "java": language = await loadLanguage("java") - query = language.query(javaQuery) + query = new Query(language, javaQuery) break case "php": language = await loadLanguage("php") - query = language.query(phpQuery) + query = new Query(language, phpQuery) break case "swift": language = await loadLanguage("swift") - query = language.query(swiftQuery) + query = new Query(language, swiftQuery) break default: throw new Error(`Unsupported language: ${ext}`) } + const parser = new Parser() parser.setLanguage(language) parsers[ext] = { parser, query } } + return parsers } diff --git a/src/utils/fs.ts b/src/utils/fs.ts index 9f7af84e4af..334ef02bb8e 100644 --- a/src/utils/fs.ts +++ b/src/utils/fs.ts @@ -45,3 +45,15 @@ export async function fileExistsAtPath(filePath: string): Promise { return false } } + +/** + * Reads the contents of a file. Carved out specifically for testing purposes; + * we can easily mock fs.readFile without mocking everything in the fs module. + * + * @param filePath - The path to the file to read. + * @returns A promise that resolves to the file's contents. + */ +export async function readFile(filePath: string): Promise { + const content = await fs.readFile(filePath, "utf-8") + return content +} diff --git a/tsconfig.json b/tsconfig.json index 1d70336fc17..492adb3440e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,10 @@ "strict": true, "target": "es2022", "useDefineForClassFields": true, - "useUnknownInCatchVariables": false + "useUnknownInCatchVariables": false, + "paths": { + "web-tree-sitter": ["./node_modules/web-tree-sitter/web-tree-sitter.d.ts"] + } }, "include": ["src/**/*", "scripts/**/*", ".changeset/**/*"], "exclude": ["node_modules", ".vscode-test", "webview-ui"] From 5e51fbbfa421e300b27f8faee0b21f811961f796 Mon Sep 17 00:00:00 2001 From: cte Date: Tue, 18 Feb 2025 01:38:31 -0800 Subject: [PATCH 2/5] Remove debugging --- src/services/tree-sitter/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/services/tree-sitter/index.ts b/src/services/tree-sitter/index.ts index d49b1995cf8..8583dd3eb72 100644 --- a/src/services/tree-sitter/index.ts +++ b/src/services/tree-sitter/index.ts @@ -21,7 +21,6 @@ export async function parseSourceCodeForDefinitionsTopLevel(dirPath: string): Pr const { filesToParse, remainingFiles } = separateFiles(allFiles) const languageParsers = await loadRequiredLanguageParsers(filesToParse) - console.log("languageParsers", Object.keys(languageParsers)) // Parse specific files we have language parsers for // const filesWithoutDefinitions: string[] = [] From df31b8c9d912f41e39d32b56d656a1b755231aac Mon Sep 17 00:00:00 2001 From: cte Date: Tue, 18 Feb 2025 01:45:15 -0800 Subject: [PATCH 3/5] Update fixtures --- .../code-indexer/__fixtures__/indexFile.json | 16 +++---- .../code-indexer/__fixtures__/search.json | 44 +++++++++---------- .../__tests__/code-search.test.ts | 10 ++--- 3 files changed, 33 insertions(+), 37 deletions(-) diff --git a/src/services/code-indexer/__fixtures__/indexFile.json b/src/services/code-indexer/__fixtures__/indexFile.json index 14c28fcd70f..fcc2ca60be8 100644 --- a/src/services/code-indexer/__fixtures__/indexFile.json +++ b/src/services/code-indexer/__fixtures__/indexFile.json @@ -14,36 +14,36 @@ }, "status": 200, "response": [ - "1f8b08000000000000038c5acbae2d570d9cf31547770ca8fcb6f32b8c088950108f011920e5e791f7be8174f9a0700777d0a777f75acb76b9aadc3ffde6e3e3cb3fbefdcbf77ffaf1cb371f5ffefac33f7ffcf2dbbdf6dd1f7ffce3976f3efef09b8f8f8f8f9f5eff3feefcfe6fdf7effdd773ffcfdcfafdb5f7ffce1efdf7dffaf2fdf7ce03f57fe7bd3cf4fda7ff83d0421d199bffde545159894e97f2ffe6e6fcd36643d2f62221a95746b8f893e9e298941c73c2e22f65acef3d75ae5daf4489d9c463d1f8ab6ee113b0b8dc2c8f3fd31a6a6cff7abb98fa9d39e441d3395f400534f6dbab72544a49e8ffd6c039848cf7e6e405d7ce27909d9adfe5ca8b858a437dd3ab08ab3a4aaf0a23395285439ef341adab426b801e2c6eb97aa50e1b749f664a93d975b6919e6cfe74a78fa8cd3ce3a559dd24ab3acdb9cd3aa33c4696156c8298f1344a9aea6cb62a3ae1594465913c1f9eed699f1bcd5d0e64aa905356913aa218d3479e6104a6d22838b48ac22fa9c78a6b517f8726b64e3242d32ab286d52750b870f57857fee5bda9c741b3013ca399f2d2f5e934a667418ef403b5043d9213992c6911147259ea76812e5e0a29774fb651ebe8295812e460243f4a4309474649e031c410f1fb698460923842d6e4c1ad54d239c02dede3554e1187360f84d8af0a19ad1341d1d42a2927289e7db4d2b758680080817a59f03403a685108f771424df8a85b3ccfda4c3aca8b16e5d656071da72c4ea4a7229381a4466c52f9098cf0af0788418a6f0d8d1aa314302924ffbe54734e00a40de617313ecb00844ad353334d037c04be4034dc370d1a3a9cae40193db445164a0e6e678f2541a939063e67fd05336e328d12a71448d51e5a80a6aa2565c5a88a0cc3ca844db89eb6117057ea05b3ed70e2a0c8d424f77373b1e4b3d24e170563b6aa6652e7de8e2831cde0e493db6b99a654250121aa1d796184f7fb5a80c5c69b6320ed9ec18dcb3a9b7a499648159d777a642bb8d19b9ad4613f5189e83e2d66c3cb195393d938ddb053a8e675b6e208ddd4c454f39c2b7cc41889b6453a23796a16e8b03caafbd4b1aa9a8d9e782f2f8370e7964dd1e70adcb24228b05e11c31713a80c7071598fde3a12cf4394dafdb47885bb351de0ee282298d0f8e03087406b371140d8f464179d75bab710cf52d7a5bb1cab41ea038a5f61a90eb5f915747ba113a647b88c3b124c9cd05d22c2192c5da20cfa3216365c84988aadb7936e9e32c500bb0423507c151596c935f7995e9028ad4b8273ab23a88a2091440a17ccd50e4f4a5371102152774d2649abcab49ca99b148a334eb20b46d44967fb2428e134f7bc8a12deaa22825b1c2a5d922497c858c2383b75491d3373043c238e9473a91826d1856ccfb30615db747e6e2dca1bd207772c46cf89bbc370b2c351c3698719f1e85f53b8afd576575085b5052249e0a9a24ef79eae6675342b2318c91021dd7ed328a6dba8ee45cd239803efe64d9a1ab062552a23ffd227466e930d2e2926496bf1791e55dab22da6753a1b416134d065b18cdb296e45c06b8b9aa4db4d204308798ae86b27483dc1f7b44a0e14666b83bb0e3ce041b79658481e189a00ad1dea706b6ed1088f31e64f16915684b056930deee68739bcf9c8a42a3397c47881958aa43ffc9d77334734e38dafa6e46a1fb7b9810e9712ca28998e18a68ff0c84d6b42bcad80618a30e5935c2b193ade1c575d19ad9c69eba6f4053149a5beafb10609255f96e6ed4f15854f2c1659adc04bf5c2b39b7fcd4b55b7e697d5c891fbe5559664316164bc0e2eb8854e1783f3eeeb74b22d2c65c320140f0479777e24887998b8c4a1c95ea8387c50a6a48ec5034cbb5e46b05da7832f6b444d1491f565dbec294a4a1bf3b47547da8df12e4c8b2d4189194e6db44d70bd207d7932a706223809443b5c867e9fa8d6e1430134a7867bc6d5156f77615b29eb0a095f240ece6ef3e6e4d2ec7e5a09ef4d743d1d96f755f3e8614f6e85f03863d1763de30269d7912646e2884a32a097618cb299711ce0f7fb67da9a0e1c235dd3b7923ec94fe929344517d6ed6b8a9cca6f633f0d62a956a437e4a5bc59f249a72769abc508b645e12e7a3dd8cfdc1083990a794c163110964099fd58e6d794eb35fce34476bc1341bbf2d5215c47b662bcfda49118f7ce2574b27ad68f696d3e75ae625cfdc8f909b123fd3bba4ae868cbdabb5961ad05567a20710c38145443363a4c40a42aa9a26d4d95224301be7ae12a9c52bb7669f9ba604c616d7d0ae55c708f1d15508d88c7832dbf8b713b1ba7b2abaa0ca90e98871835419996645f4a6b151d475c251cdcec346295a7feaaddf669b379c3bfa23ae79870d6e6cc4eac03537694935ab60adb70c81a568930afaa63d3af973d9843e6668449335e0c798a45f0c4c8d61a1fc5cac2be6e9c6e7f3a7ee2e56e58e6c8ee8c444a286b7b8d95d1cc53a7538691416a3da3e34320872f76a71fc3641bcb7c32198c4a3d26e12ab263738acfce7c4e914485b3a90cd39e906bbf8e61d2ec57b6f6ae934165e5ff9338d801df9c1ea99b4fc6a56abacaec685bebb139dcfe131358b3d769397cd3acda98be94740e05dd4c35ec10f62db6612f2056463189568dc18383fe4c4aba5833984870e7096db7e019dda7926dc395765e05b30a39e6bcb67890100c4b1f1e1ae966823138ef78c28a9ddd578ec905801d672deefb31750ac7cb2ef4ad7494c6581f2814373bfe342aade292801acd3870aaa53b14204da7b58c85dde82ef13393ab76bd1420e64cea90e2c3a6a1d854895cf3c4bd99a0c24b720d7c7e5b887a7107ffb4278a254a890961525d8c4788969a34ea58f5953cec92b28e50b6151085633a9e8a7abd7e5c98e66f0e94f111ae979dce74fe53aa7087d35fc553749e65d54e2085e4f296637af2bccf162f9dbfa80884495e1ea6727dbcf4f23cd27647f7c20ee7e7b3215be7f68aa05ef6cd13a31de3b16497c595e1f1a8183a88086eb4aa8acdb99dc45e99a033902bc07a0917a365479ebe897c4dac58e7c05b9f0b700d1bdca9f9a7e31eb3a73bf4ee2c510d1ec5eacafdf0a3d8b3b90fbe06ccca44d61d53c3d9dd0928f14d53450bd7b1c5a21685aac2d07e86ced6157994834680a745626a6568fed22475980ce83afad7e0e28f7dfe97c2b883d4b76b05af3ed9d2b66e10ab6dd59929fe74c2bcf2d8231a08913399592bb78e704973e9fb1196b4044f054e1f7e139412f6ff453312d70741197dd7a3ba68c6868b6312ecc6360ee8dd71df5ba1ad694eeddac7d1253c67d98fc84ef3ed9cccc3fbf64c83def5b9412e33deceec48676ca7ec4c5f53ebec6b7100654740fb64f1171d819dc673e380a55215bb2cb7620b64fb346bb6b1ccc764f3eba44b1c0cadb65f25cd9937b205f3ded59a40133ce5c85cd57842ab4f47fd7d841538d3c19da3ee48e0c02b628e484556da14a9ab9783204c113f697e5f6725157598233a767a7ce77bbe3361b6f1bb320bdc6732768c423d5c074aeea3f8badd3c6ec2462d1fe8f916cb954a939dd7505f950db54befdea6209a5d4d91757268fa0fcb4cf01c6e83767c2b4897eb3081dfafdef6034216ae1577b61332caf3779b1a393d1d093fbe7042eb0c2edd978631e1e229defb8399d64376643981f3c716213b0b655f62bfe9fca542fe37000000ffff8c9d5b9223c98e435774c79c2f27b9ff8d8d41a1fe4820ca32fbbb4b150af983040e58ffe1a7aedea29f0461c487c1cc08f4f42e7b29acf92abf7e1eb6a193ca6e7a7bd9a720abf2ae81e718c115ba9fda6ad61ebc660ee364f8cf2aca0564f5f533625d45e17210a7b8005bca25786e439b1c5eb8edd322b8d6dd2cd6a9de501075b59e2e0c36490b64538be5137c6bd5a476463555ed2ce4f4874be26b7fd35b38dfc69fa7658e1a6beee1b59b753bfec6cd564f8bb59c3b6ddab71ef09d1ef27ff765e1f9bfc622b9a65d1b41163d8f9eb690fbc05c168394032ef9e75131d6021878ecb2829115166c18b655bce166905092a1ea3286d7e102a3f6601f74ba2cd45d3600e4d2f9d70580ce37cb264e3616d92c675f8a62a853ec6c0980fe452cef9e2b85c2617f1992edc9e4132806fd79c8878e0b927280a69fc3b56ef94094e476058b8e2bad9cb87959c575f0ee7c913a1a1e9665d250d5695ec066f8db9e328f102bb2d2f7ca811be061053285bb57bc11ce5cb049f4974d1c77bb422e5ac09e6292ea5c3684fd9af5ba300dd733c5219d9dc823122ac4446ebbde651dc3ad7d594d7f27b8fdde152476f1d29331785b7c0fa18a5b78cadc01f927f86da559cd5ff6824d48e9657707d03d1fb3fa556d03253fed7c68a4992cc8ce1e263f4f3ac82cd91e5678012c8ee38ffb7099956563d473bdd7cb10299052492168e2e8a2dd0293987f28de5efd3d6b73e31bc1af65067fa8fbc2a79193a3ee6561eeccc6294e04f9e7ba663fd950573347ef9696237110c0f972a23aeaea62f562726fb93a45b35724b0c26fdb477abc4601c5cbf3ad250e144962440c50b0624a2f2c465af72a6c91107bf2de16abdde15699ac83e85094ddf2dc2de645eff14abd70412d30de8063ca59d4865ee261ce7a6e554d8a832c48dcd7df8b3601b7c16287360806804ba434eb0dde0faa9a7d7bfb7b5f28714f0262ceddf4602dd07cee69725e3e85c0713e53c6b34b6ab78f8dc695875b15e00dd6e2f2968ba80cf7971f36a63b56d0f30180cf9bcc406bb1350898993d1ec8e2ce7fd39b40e8199deae7d6865d690df686df17ab5ed32ade1f1298d3556557f26542773ce724968bd6bed08c9a411df1f41e7908403337489133cb7e14e382cfcf7adc580eb638b1262ed9696f7e57eaf33dcdcaf64d859ed3718b88139b99c259419357f287b23d8f4e702309e679ff4ca0a237a5570aec38b9020dd5ca61e16e76db4be0c406fdc4dba8dd7001685e2725d389579339ccb84ca607ede457f9dc7b72c4897ecd7c556e35cb71b64084e4a07f5d4553339cc4faf0b673354ad633c6c5a4a16516afe2cd04b60b6a3af4152eb74086f465e5fd03516555eecd96db149283522e7857f2364c204dac9c367c12eee0a07d8694dd1ef712081b76fdf21ac60dc56833acea8ae0a2dbe213c191e30d62dd1dfb0d9d783667cd942bc8b9eb12fb4a473262f878cab3ecc1a02dec96d6c1fb4ef07594dbed5cad98f94c6b3f2189d2e757400896541a75d73eea00fa3231e7052f78472c3e5d02ae3ee366f1eecfaaf3a9bcd198310c6bc8244a6d9719522e7deba2f803f93af9127ed84a6e400d1a9ae0a16f9933e0b92e717387c77fd8450b7870f1ab2df03ce81d638cd66b2f7758300583fd877307f7964bc412dcf3683b182fa893f595ea7e7cfbb4f2a664c73f1feb1b3f98df6f6d1c3fe5c37f8e0c80cb5e1d978970709ddcc10fc2affb6bc0ee9ba4bfb83824ea028158109fc606952326ee91fbf053c21a23f4ef04fa296b3f6ac370a9f2d98783d723d2f9ada3ac02b82809cb20b6e523799503e68b6a30649805323e710b4a19bf9bbd99125ff4719b642b8a21e3078ee90d7989e809cf119ea77aaf37cb8f1e15366ca0a07362e3348e02ffbef7cc308135c87f720986762a8ecaff83a68765f66cf39df8154bf8ba9fd913faf751d5fe6cb34e55a70b1c8db8aae980ebc5c7ca1bc98f6b7b27f9633dcb36a587767479cbac64f7a6a6fdfca477484c3eddc4ae0834c6acd294a118e63897884c0f8602db5038ab055d20efcb005cb0e01a5e63ea95febc2c9e63dd473c2fd4b1e66219dd88d6da20060dbff4b435eb77b977615ff611dd61874a567f3e3b924bc9ddcb3e10eaeb344eda4b78fe31448042988a4494b87c601eb7564e7a8ffa2c07a312ecf0e099d78830ea8092bd008f111fc1d4435f8f928b689030e5d2f342be62d5e46d16c8fb4416f868f7664af41548b273b6ebce9a42d1f049a3547a47e8ac6540464f0bfffc5aa922bce0a63565a1436d0dac30c2f3f4b25e2ebc5765d71a37c3d31152ef072e2ea98b07d0a8068c1c1d5f4a0623b72e27f5dee3e511b1dae4a78ff17dfc862ec2de4333c8467232ab81b37d4b1a749952f1ed9afb84e409c291c993f46cdc4e97dff733ab659d5ba90af8bebc57633a959ffee8ea72904b3bfbc453a64ec83c0287fc2c1b10a7e8f292f6cf261edeed376a39517fd22d4599ba6e9e9c883f519f8344e9d85312dc76e4af46b22c9f59512eae0d7e501e99010e95e70e796687715571172b9411a119c830526bec4f9ceb7b32f98ce0e28e6655160e86f61c06432a32e6a8b35920b00480439293f9f8d7095086d6837e470373cf015b8328c04aecbf00ffc2b809dea3b7409a49620f2e99ff695e065caf31c97f3d78104b0b1894a4824d77041f13ebda69bfce240884ce576c90c2ac2cbecb3ada6e730386a3dd827dd581e6c1fe6501900e9e67b33dbb47ac8dbedbf20875f7c809e6a019f83bc43debc6a7cc7685749030805da1f4776502e32d565badc48389197f30f1a12e8f2d3b1b7eceaa26eaa3770e0b2c1f05bb90de94b13e8dab80d662633f1173097b9c0f71c7c0b0bda2caa36967c1641647357f29d856bc38e17d05eb209edd47eb32cc6a32c1b95ed43c152e9fe328771492eeada89f2aa9fe845fab7466c516b976c378961ca607ada03a3b875fe02b08f9d1998f4cffc95c8cf8084e21a23695194c17c492f8f85d7e6442ddde6a75b62fd246c3b24da3af56beb49297e0017d93fda270f515cbc9f6ed983f857922924cae899f29bee740036461429982e0131c221b2867fee6233f5074371a53d949f7f81bfe3c26b4f05b68bb301082e1caea8a604d0a415be7798b3223e2c93c229e697cb36fbd4831305b737525c51c520adf78ab0f935bbb254f307df22fa3b00cf363749c980742c90ac4bd668220a31f099d9f4a748fa51dd5198c471489438b7b8f38c985b9356e77dee807b398b8b00778b63a9930b0c02ecf0f6997611d8697789802322c5a89ff4d25e84f4aad07a871c96cbfeddd7fcdb0bbb9613244ceddc68ecc6ad829f984b7d128312811e411167331347c02c84ae657e5b59168d422d2c7471514c42359a1f301ac567513e157bfd7330c52b6cd63f6ba0cfbeadd105f0b49db6e319e715e778a273059a32ac36d8c7e919967b06b6464ea7b9067cb519d7208d8ac94cdc8b3152d561a505505afbdf733ca546621d8f230dad701ad98665751526b0841f0bf7fb703b07d6e5e9998e9f723814adadb43083b3f9ba5d3a816c60bb1337b5abc0c073240bfceb9d70f8b06488eaee4057210a5d1e1a0c0f6585aeaca8f47c5c471dafd53e412e3f37838cefbece4800b902b096b54b1923e7b4b366872e569b3e0aa4b4824edb01d84ed8785ef9a73a9b6e8970690b4eda737ee9e9461bd0ebff3c50b0800fe1cf8daf12dadfe4deee0d7918598e69a5c8a7d86afde96e11196792e63e29f07601717ef26c5c8c74a5c490bbdaeefde5d93ad3be6a09d788517de02ffbe8c0cff579f9d910c8e5a42cfa53c38f3e496b9e70d3b43fb20fd31b46da840022062bc80043a175d8818f2174c1d83da0e1138c50adc911450b51f591f18897195227a4b54c0e431ed1885fef8f63bd7798a291a80d16cef4529244036eed52b7341f7a2e3e10eb936ad984ead9e121d4ea0b3ef540b8ce81ac6e67cb97c7f4d8aea35f2deb07de12458ac9c614a60f8d2ef60a64fcaa326f236bfa952ff3bff6717b3f058d38117c22ebbc3d4d3c93373110d60b615a08c122c70c93944e4a8e8a55bfaa096211a314fc9fed7b34272f59ff3f11e1f603153430a8a9d337c391986bb846e2fce6abe8f4bfa76929bea70c0515a4eb819da0a8ee19e4dcc85a47938f7e322ca40664c5ce15fe175209b4cd87ace5f148dc22564683cee13d794398b7bfb8a52feeea5bc27dcb5c57e686a007172b10dce5ae1a1e3c2c7643d1a151d1f7290546496d7ad0f7925fc28cd74feaa5725f73ecec2c17790e595cdeff6638c5c06f284c77e7ae6be47548ab5c568c0df69b6d8b84250200cff1158e9a1406a0ab9fd3a81f3140084fb5b88e221802b443af171a0385490be556960325bc033f4cacd4f651f22938bb42c24008ae97b88e6cc0cbdc634dfc17140e66b2515e1db857230938f8d92572fdfc04ef2d0d91383d8b9242217f34a59a7ba9632d7e3754cf0ab5f0599caed28cd60d5badeada3c89271fccb133332e305552e099b81d3bc4efc62507eafc9c1912c23f9306f237f891f3c2751bae08798aa31f770dbe9016c80530d8178b490c19da591aeef78f7a331f73cc5a99db1686e81721d538e9dd50200988257c7de5b57123e67eeff030000ffff8c9dc16aa43710845fc5ccdd2075b7a4965f25ec6563133690cd258740c8bb8792fe0d992a4d3ca70563bc9edffaa55677d5576a9ec2ff242dbd938fd1401b11ee6949d4a687830e4fb23de3e158bd2067708c0ae8f648d94228a1c7c31aa4b060c2a6417ea28b165d05b3468eaaa3a3b53ad441b4bc4fd23355f0ed99746d32bd06493443eaf31845dc9d150544b2601a9022f9636b90cdeb718fbb362eafde389302dd56b4a8a8d8a8001ee8dbdc5d4eb4e3a40817adde521be7ebe6cf43f8d95d387780c654a1d927420de4625771f890240f1d36d1ab9ec64c07bdea1e7480c3c86b0b289a83eebcebe801f100ceed2e0a28ba36a3c5b613cc1f7af37a1709871a5d1856108da9ca0fcb58aa92186682aaf6de0adfa71c770c599d36a1a756a7439b167a2303379daf0eb0a0a38bfbd92e792db909562b77ba30cbe41bd99afba61c2ba84d98aec541363b55620c91c2a24f36353e01123dc1f77bad3565c60db2a424503888c554999ce77d1ee874c948e840e1c22438c51beab83b091bfad03f8be9ad09dad9a3a79c9f107d5757b9ec81ca371a4c60d2be44155d244807b614e77293c8097bc01e318c05ee6856b62165fc5ca9104c2001f15bd2798010e49f0af8d5bda8f5f551196f2da6820156a64397563dc09c2137a493ea0f247ee3e1fa415b770def3ad3e5358a698f612347e79307cf5516bb94fc7bc78866ac4eb2ee506ac4133ef5d2d2747f431338c7819d79d0bf407e83982ea16ae0e0522575850e597ab057cd273a071420126673a445812d3c7c2a4037adf1a162f8cf843377b6a27a99d5ef5002fb5b31c9a197f438b3a9a838d85669cb95c850f8840b4564c438d6229f622b76741bdaf8649e75fdd987a2774a8e915d0daba77196798cc674561884c3a50f0118e598aa1e6fd5a60af379d881af82a8e6934d0b91b1c6e1fcf6e4bd397fbf91a35bcac4e9a4f93dde62955eb19f579d8aef04f9f62e486a23d4517648c550fa481e11c03461401ef3763bc33a1f21cd53b0a0cb49d1bb4e510fb973350c2a4f5edfd97c28279c3fc3f6f9d83d827dab3c7be75f156e96c2efe75a9c45767bfcbde641b709eca63410e5fef3b043d4ad571eae8dbeb46a52cab5d9a4369ac035896dd8b185ab8ee5a8d1eab00032dc65622222294858de32508598a04aaa23d40fe942674476099b744fc9239035f719f9dc94f624dd52e3ec65b2f131b59d037a717c0239bd0658a888158a3cc75011087a6f124aa2c2d77dea6278aa3cb00e0287b4cd5b8e29a660a4c5c94ac0d605d0b7785fb81d7f297531659c726f0f77b99e9c71e9868a861d6240c7e47d90dfc51cc1e3a4b64a4416a69ba0c5ae8cebd3b049c9ea57e31d94c22a4f175334314139602a4d37c61121b7a65ae17493eb4d5df8716e30a647976bd740222737531d7b2b5fb0020b5229c1270cdc0f099402c06112a3bb40030ec068fd3710ae8a2495d69953831dd08d1339676f4384030de45d4e0d594b467c7a757a0d29cc547bf83f4bb4faf4a14d90d991be2496fad38738138b44a0bddf60ccad24b362c0ef90f90c9646d39ab650a82c74280bf74093124edec19f61100d7bfb4cc27aadfc9912a2a334ccd7c799d0a7cca743c7642b3006888dfeb902e3e80fa9d96049af6a7818a6067e0b4c07449ae5982a4a5581d455cd94c38088bb77e26cbf16d87d1ffff1141d3dc275675623659138a92ccd8a4b83c64d4489a5379f9e62b91f4023b29393c9bcfb1a3bbc49258c036aaa13c44668a8720494acf268abc3d6dd45c09ee15e3f6b693dd4852c0d6a3b50d13906e2229d57a549b6068305cbb7ad4b2f062335591ad8d882930947a25c11a44b83c6900ebd89d4cef914d2a5aee04cee174383d74c1565beda6f6ccd86395ee3b680f46398f276f257f1cf89e9e16a2fe3e389ba063324190c024f5445cd044a8284bee9beb40b8526e16e0b473cab44158c5e8dfd4327ca26369ad488a0792fd7bf783f5114ce26c49d13d1e3fa4d67860c4e12d33ab6f31cd8550a9b7f3da8991fdb9c13603a9e68c1083b25137700f5a54c47eb9395aa78f653fadd57c49360a03c26a7532ec8870b4cf9b0c7b635cb52a13de7fd6cf1ce08b19bd8926171f5885e9069cb06aad39e7e7df1cbfaf7effd3d7f5d5fbcfdfef5d78f9fffb8bdbddc3e7efbfaf1fefeedfb2fb71f3fe6f6edfbfbc79fb7b7977f3fee7fbee9ede5279652e3f226327114bb5576dfb01cced333c38a4d5e5ce8ef1b3f1d40be60d666318235e9894d70805912027f6e111a3446fcf7e6d82d5a4b7db600cc767612a26312f26e776b29e928d0976517804ac566c602539c5420e7f1506fa5afb31a60564192003f2e4345e41db39519baf79862345fc87b653e07427ff504c604b0f2695f4b658b66cd8641132f7034beb80428de673944092c0924b332d18d5789dffe6d656d80ca2800382488857627e07a766ea8419028ce6018a1bba822d123438a254f0490a22bc57ec05fc78242440970c481258c9332d91c3e44a76c1da326be106338ca2a01287c474803135adee19a578af06ae902f782029ebd4e01351b2def2c71d8ab6b73b32562f9070000ffff8c9dcb8a654976447fa5c87980fbf6c776af5f113d6955d1b440ad890602a17f17cbef09d161e65711a38220c9acb8f71c7fd8365b26bfd9243ea343db9ecb28f74c158856a98098abbaecbd1317aad5cb9636ec5eb0a9faf2e0cb2ea627e1142cfeed7207524d6ce09cb309f55a8711aa53df187a032194b1ed1274fe028259c3904848bbb7f4a76ce36dac6a6de123cfbd53b6f61859ccef3f07a506768c2a19530f0c35f6f4f92ecff1aa5654c619d7343d2c66d5268e4c32b7bd0aab6da5b8efddcad29d025f3f232bc70f354d2b43c7196ebdee7b2c53cc7936a9d8336a769f78d0953a0d9dcd70093b4c67a8786bbb85e13bd43273480f8e323a3b996de8bf4e33a482bc2b8527e238a2caaf1a759ce3e6582ae3df765a8e0570d8a6adc7ac5ca6beacaa599d9a70a195b3121d7692dd05e0929aa323ce24c5d6fe5dc363e4d46f53c3a9022c16af61d4b89c665ea4baf856a4eaeb5065ef301c085a13de39553807040a250cf20ed920b2ccbd57559b1e47b90b2709d67335c18b920288e0b6f085ba452adaa0b62cc4deec6006866960434cb05e6df3d6e893d89b05be918fb69e9e219985e310736f0bfac498599d2f343b335379edb16454b7c391e3d220fbf4bee83349e81e828c2cdb3a250abbd4b6f5bce4d814f82af868f7e560663e440fdee0ee494b2b17a568777694691748de85bded5edbe66a699df1e5346b6a5c89039a027207d6083b51d397b2acad8fa5dfc747876b4f83ae9363f926cdddc016d24c2228edd03cad746ba3eab886c430b399501bc5db639b43b24b8b43885681b12dc53554a8d5cd5a8cc87dea865dd958b41f1b6cc8b6f3f7debb58de19f16a696201c5d0d001497ba04a800db382f938fa98c532270d8d4005165a4da74d77490ad4ea48785e0663f023eb9bc91886a1c50a5a75a73ee3bb32cbc5eb1ff6546023d9e9fd8530c49a51c85a707bb79d81a671ad044fb61675e0ed659ed9c8c352338cc732e023feaee8763e6528a80569f5e41d7c2c18589254fa995509628d36a4292bc19b03c3690934b3e4040fe3af31a982d81e513271b855c40573e8a04c9a21a1ed3ddbd4e863ad98a7fd12d900059a4f2b47f5a81b9e30e742aff23553fd4230c2a7d3690de99ae1ee6dc8dc0a0ac24d65052e8d90d6b6b94ef13e36d49c6a4a385b28232b157257ba2bef26919c549fd9e241cbcda53916ced336e664085dab0d864ff2674e1bfd33ac55e4098ba64f3ffad85d618f75710ab221c1a026b95ae6a5ef6678f189cca3caf28e5acda05cce4fcd3d418d818358ca9ca9f0a0d313278b436f6606efeb525e0dbbad4e3bda914c69be75c6c25563c1c6398d037a4cda41a79d2ed20cc72c51363a916be5eb551e5935cb64864f4e50b7b377472ae670f3779dbc63d308908b7e60f562ce59bb013e37cd8a96ba6e7bc674de1dbe5135d8ea4ef57924afdaf17c30ccebebaff68a988fba4a734e6b4d839192dc31505b6f20dcf47b00e99a7a652ed4c24cd77916c9fd69553c7deee91162c194bdce169c0de6772bc2c7f590f8596ed3edffeb9cbf7545202ed096a204638651f919cda9c281abdf04c043222d062947d55b3acfa5089129b68e6a263e11f36e4d16e676a9160f6d00e4854ccb45dd2ec3b5e6f228fd8261641e91b520f0eaf96c4751ef2d77f1d4605a3b516fa3fd5f855c3fb03cc710561f95773721d36d0fe1bef44ef6799c44fa7ec49ec3c0a9781bca1e8e66c8e203f84ef9a60e4e5109bca40ee1a6d875808638bb1fd79666adef9043c21c9fd499e89460556b0066559f4ef7409131317d7602b9a6319120937b07fe94549b5d85abef94a05326e5ea323650eb086750b4edea509aa3aced8af4a0a9be4ec81f3d8d2a0d2d266666a85334fa0f9a05bd80c29462d6e911aed9575acdf4716ddb24137ecdea04553cc7a128b79213d9c5b660aca24aa19eb596486fbc182d2d2a470b9f454b0a63264d77ee6e4733a07163a6d51e625db40eb988e3f2b6e3429e01d805af695e22687c1ab787fcbb3dd6ce28d71dffbbceae8b564b1c09df4f433e1d37d1aa51bc32c21de11d384175e2edec33dceb85bfb81b40ea0c54969dd2308a5f8c8e0c841572b0607818968f0bf3722b1fdd2356ae098abf5835cd6ed37ec800ab9af08d963e4beae28b16ea503924f2b21dbb12e67e3a1d07868f43fe9a06908a58ad5b074cc71a6fba076ba5f61462bac192a84b128baf996906292a8faf5228e8d8fe0d6049d78adeebb4cc19ed1ddd168018782d6d7ecd51598f2d6486d3414c3629787b1623e1915360a52ddbae97807694544ff375445a193515af5d1ecb6791a08c520d001d91ba5c7ca5e04e756b26c9d47458c0646778bc61956b65cbb284771eafaa09a125b59d94d41abe8ffefd010980511bca43987cacaacedefe794a4d46d13ec2eb88fa766c3fd3683fb471f5a8c3b2ca31aa654f2bbbf5a8de269bada663d874daf4f1197134c37fddab4ead8b6b6df3742ef3fe8cddddb1bc46a65a625b64b37a03501f7b38332efd79893697f79f4d887896caa538d623f654a1a8619986c2a6164290375dcdd9a7eb78180d7a14dd9b37017b9b7d10bbf4922d98fedbb4ce4d40653b0fc1951b365c662a2ab79e2886da1fea2caad0349e2dbbf88c7e8645f2124c1a2e74d6854c67b3746c2cb5189a26096099883dbc3eedb48a864df6b2ced53c589eb9e7b2dda49f09964e8a6653f358c730aa2e334ce14b77f9925d1973b7337f3df9ceee27e68bf2179d7bb30d8e3a96361305063dbed61d0fbdab15d3eeae6a31fa90493623909ef4d654d6c5ead78366447d2f363048210ec55a61b2c668d19aa541e9e80aa7cd2c1a5d8af7c7e42a66a4ed60df9427eeb3af57d47bceed55208d134537f01211ecaeb19d580c0015348b47dadc1b3b4088e967b3cb52bb7e2354561cfc1a63592ae57e85e75faa43c92a5f4f5f2fd649b12e83d27189370bdfd9b1f27c8298dcad2befbc5943cf8aad0112502a19141727b320e2380595477378a666afaf37c5c7eb53b6254c617a7829c629dc1d8aa1839361aa423ff31c731bc9b5f46e12010458ca8fb4b933b32f1aada7d5a0299e17d65cd1f9ceec4059ed42d856f469137790e3eefe9986c907d43f96cd22570d2d72a626c04b4de6b8581320eedae65c283f52877b0dfc8c4adb04dddfc33888956057aa2325033f8d2365ebcc6a27fdfb6a8c8e693d677d8e617cf90e0327bf7bdacfa693a3293a86ffa56dee6a206dd517a671eae70c8ed87153b8056c1904f0242ab423f634ac9a948c37dc169b8da5484e083358c2f469615d5560f175d0902d4ad50f4fe7750fda89e4bcba8c70e6173b753221f6aae64c4d5c6d5a39bc15faf013449323e667a68a8dc549c3bf76e4794693d93d407d701b267907ef8a3ed4b44138456311ccf64cefe5992c08657ac0c3a6dc3592580e716d99847bbde8b2b984c139d6e04e253e9e8630dabc26a725c7673d37001893131ecc5308c136b25c258b413bf039873a9db9d058ddc7cd6c5868bd1dc3fa83d6d7d3e4eb8409025ffb46c94a4f9bbb408ad0725512b6a3fbb4ad33de94577830d15a3e0e69d896f207427ccd3934df728ef45fafd52f1d150b8b1a13411f85ddde40812c43894623c06592fdd887486e11aee5d526d88e9b968df966f86ccf4774d1a0245444fd6e07644dd3d2a1acaa144d1ab84f8545e5ce916e89bb5f41f33ccb9721471dba74d12f300d7885dfdde64765cd5db78b7a30002d408430390d2ed5dad0be8fd5267673a55a54b0dc2afa50b568d26a047538f6d0c41e398cc60699cf084e3c053abf47e1f09c249b7f6cabc2d394cb8bb5d3b989d8d8b9d31765bea7d16f35b5116659d9a37cb52d3df9e21886c73ce800732db1fab6123fcbb4707c19c3639d885776860d2ae1fdb0800bdc74dc0dd5cdb7acd391a287be3aa84bec1e9a2777a748cd59ec143eb9418ba38859f26a55ef4c95d7b1ff681439eaab48c900497df6b27f221fdc4edd2822bbea59387735ca7674d00bf6b1acec3baacfbcc6a6e7413f43fc02766cbd7bce99c39462bf6ec35e38bf9780189223050f0fe58517f390bcb0c95d25d8ee96cbb6c001e83987bddcc13a747616a33f512b678cc74b4c0298fdee2ac475d8d397abc67ddc42efd6b2eebfbeab2306a2b51e62da3b28413b6370f85c910690e85426d8290586972e36ad31a8b0e15d2b3e9d6a6b556f3ca0e7d0dc5620a2dcf0457aa5a921861a92da6d027cd051ddfa420a45bae61a61dc1afe5357e32a18f68b0e03b0bc2a32acf7da72987f88c999b69776e0666a40a26aa0771944b5ce1c5d353d1c82a14408334d3cbc30a0f1d64b00646f5af121a28d9914b10d0cdff444d67ffd948ea765cf41338dac0eb0297a4e82f954cd0fcfa64350ae5a68a7b807dbedfbd739d62792379abdce953cb7a392677c0dec5fafed2fb57a19e88f5b57cef6ad6fe0b305bc573f7c149003d33cfd80092d65061ed6fc0cac94e3bba1eceb0bebedc2bb1e90be4c975d617d71384a78cf55fbc04f60d1480a3f87d75300a9b24cdb21df356dc7bb5c9f4b7f41532c573d9442c4993fc6f21d0f77b42df64729d51a51108ab92c8c0a58d2289218ffbacdadd896966157af62835f465edb3629f2b437f796ea05f8b9943919c14cb6fd24ebc6419e2b865ee96069fab43bf65c9707c43293f729c96389482ea632299a13479db52575b0822a3b532f2eabede8ad3437b5b3d8a55557ed17cecd46d6345c0c73cd4c2f2ac19fb474276b0400b6d53291b99bdb7c7659158a53c7e98bb2dfe13478693b439b086fe679d95c5eccbec1ed4b4d8915fff9540ce44d4dac3b7731e988f4d2b68b034192b5dd5025feda470eed86800fea6d7af13ec035d7b2c1f77d5042338cbd7b3892ad73fce2a044cc29fa7df518533f14ec3b9713b40efd3fedd0a32f736394bd4c687e1394ea78f0ab9dc2453b7d779e2b873a607dcb382a974dd2296d4f659590049a2af371a56c9706c9bd27c701d53acf97ab67ac3c6814793f5b0f6f5707391a669f83709796a41f8012f434c491c38cf55f4dd7cf5f99e939fcb69180edbad1b238a9c9e2481fcf017c677807cec5c1474ceb108cbe73af7c5cd7c307e459735a909e116b1dc62fd31be9a39e6190f236b6b47db09f42dbb092fbd31ca72b6a9c6a7693df823bbc07988245add950778d1d3ee4c10ea630ded156752819ed9ad34ec1d4b8a7232b26ce70b542d54cbdc493bce8535de9f7343c18fa342f5500a7d3e07ee779b0028ebe23eda66c47a227ee1ba9df63a5dd3935675ae1d037fb006276eb62e3779a3ae31c7b172565afda87c28f2a8aaf4d3d6dd67f6755bcb43b48b176159c31b62d3da5e759823daecb57ab40d5b55a5f967e69359140ed2a93713a30540eefc35ae6b8a83b3f7ace3d6d2acb0a58865d89c554fe19735db820db773be6eb8b1cc3f0f6f7759534f96a175aecadd6efc9c41a8a1cd85a7c6fd5ab938c9d6ec489789536f26eaff6221568b0d5e951e07532b6ab08eef60b0878357bf37bc28b5dce1e9b97bf60cdb6a7996a0e1d57678117f5fffe306e5aadd3ec6303d945a7585759b2755e34bbb9719fb3e59e8d41f380f7710f1e0d9ddb1b27e071714f9cece225a02f5165c66ca34f6d61bc07abf8faaa7a23df3018e04dcc74b9635c2a713bd088e2fda1a013edebda31a6b9ded9a02505fcceb53e263f531758ddd39a46b92b59ffef9bb59258b146a02e91e7d7edacf9a341607a2cd9eb3aa60a75ad46cd5dec79c3c44550c33d87f4408575770369362a36594d3b534dc66b96702340da358cecc9a29778b8670ce3d8dd55b63e08fd9a327bec5646d6c4a76c679f55294c54b3c248335a33352886ca44daae33bfa7f51c26ced799f443e0cc5c46f50279114b37e351e6d86e62aac33a76f150cc3462f1a0a05e1fb07b587324c521e197c1ea1d1da793d470d981fe596c93bf3b3571105f7a1fa98136f6bc79b95e893a2bc33ac06eef34e522d0771179a511578f4b92b5564d54048948b5d502ec09bf6693d2d5c9a305715e62d628532bb65d807d06c5f61cd31611bbfec809e4c49c47caefab171f47f28585656e5bc8ce420504e30c59bd3873343b69b7a5fd545448f56576c64a76bbfba19c9e031b7bc2dc819569a4b03c56545b24e01bc89b3ff1621b462e9a19665dd5787a7dda5cb6dcd7993d8bfd1abe565e7d419f9d7b698547bd0eef543b255d45bb89d2ed02b36d3118bf8e83b45e56338ae1e0b4a78ea53a2c27411747bde00b61b65bd77bfd2a4dbcd6cfb07abfbbdd6a72f4b267b6f02a6aff1a7990f446b343c5328258a3aedea00b2561f174a3f6f0633d16cf55f72a0a5860fe6e32f6c8bd7c8296b5189dfa18d24d62e42318cd1201ec0a0eb29e73e9da7b73e40398a2425577907eda577435583d6c3d41a41c4020fdb3e5f6ea49aabedbb4f9e2843fab7e50a0b4e6a72da02f4a9af9946048fd8159bd4ed2c496660518e3fde296dcfc7fd883376e5ae75866e5c5574befe94b53fce261a40ea769936cb4a14aa300cdd5af9a6b378b6ed632a998b3329f0968488f6aa79e76b8ba41746498037baf62a1b268735c4e5a91517c4859fb2e8a5ae5221036835fa1b966aa12aa1de47b1467686d7c638ee6281ddb953db62bba69e6f77ce61bd4132199ae9ddd6d03ecdde6d70c2b7f020737d3129e716a4534d2449ce612bfa2376d5d0c7c5c2a5509e6f5531324abb0b9436b742273b64997bd21bf2c1db8c7b2427610ff9153ed368d7a15a30d112354e20781863164b0d462b796cd1c80474cd1876e5ac2bccc01e7409112ab66b5c93eae5973da98cef70813d56c5fb42fa6579c2b43e43a117e3a4376f1bb98baec1e3e675936fd8e012240c5748afe8a36f6d4decac5a2cd52a9b1ffbec29351b9620fef3ce7fc3d6df51b332fadbc34f5d9665e493e0cc7256e5870b6708c2cb29af4de788aed3ca6d1ffabd8fcd2b00fea5df3d33418effd5d5efc8198349d9fd51ef00a3dd0b01dac7f3d832b11f7b5f08de2dd6c6d83bd748f3595739adfa69993d213795f89c72950d634b3c7f4b2876eccabadbdcd2d3b06138e6e4a456d3648ee1cdf4d728343a34007cc2d4d4b1370d00e6f2cd724ebebbe0a98dfd03a44eed677d9898f77e6e256e92eee362b4c7f3128bb0b1fd642c2b327d850461feffe2d54c834edf9eabb3c456dfbbbb3e83526f26c9109f9d5c47e75007fbc1b81d61da7745cbfd760eeaf87599484e908ae4d25997c05d9a606a820a2ac62a061422de9538c202ee534f3db249f0900ad19fb072f47d41c7aeb3ee0a9a2cff61e7ba752aaae40db20d5664fac0b0467753c9315dd0cb373e8d47bc65afb6bdbd593a01fee7c0df2fb61a6de9db34e9bfa2477b50b18816fe207d36de771bc63e756b235f327ac4dea6be0f689c03c23b48594931a13101d78d314b3ed020891a46af441901baff03ec5c9daae188b9c7e37952ac6d08a8da0af705abb62fbda7afb88b0dd1c6e37122e588d66f37e0a57aad141aeee4592cc5f6b4f3eaef8b5e7f83a56a88830fa2a1acca9c091dc21f326743896f592814e6ecbf8f43c2c4e6757a2d953da9b6a3242d16b55e7d6c42b347c5f931646cfc9ec39344788e1381d583407ad775a13281caed7e8295678096e07cca3590e92b9bb4da74ae4defab1364eca75b6ef917097d293972b0d19cabc5773143bd1e327f514568ed3bfa6fbaef04baf59c0cfd6cde69e91c001ab01a4d6b34e759a610632e30fd565845444a8de19ddbbc446e029fade64d4595adde5b5f6e949b78c32037233f05e68b52cf8debd768ab29be1e098ca99e3852168decef42b0d3578dbe40d0bfbb27fb569f60b3731bedf9e4eb022fd2ebf79660d5fb45b1b45dbc1b8057bcad848bc0fc5d14772589b15dd7623f51d6c4d53130ed3fd5489f554e5ad61a18a9ad5484f8d9a89b431f08ee5c00e745359739dabfb718d959d736669d6514448633b9c06c5c45189185ce55939bf919ef2d66998302cc657cac22d8dfc3409517ae167965ca003d5cba1fcc597ac78882d16d09a754d3b225ea8dff72c451d2ccedec6a7d1dbcf06c650cf02d202d315b55a12bf512989c4a6090ed63cf1f14ecbba468701d7f566939ac6bc27edd487d3d1fc1520bb8785addddcf449fb4d634ff5ec5f21e74f89b60f7a21974f7364df46c2841baab32e8ac9e3b51dc8fcfc11579383d752e110437ab330498c58bb1a258baeb0a524eec81bdb7a743565ba29eaa941e738a9d355fa0e96e715d2a678cf0dd2228dbb75732eea54ec5509b3aaa6b25a838e64c35d74e6619dbcd14bb733122bc6b68c4dab9be1c7b7faf7ab30092fb2da91a2ccd481d020ea6fd1d61e28d0164c9b7d188494b3eb1efa60f0c5966d80dc5196e1943cabf0ec443d54484207badcdf2c1bfb3c8530afed4ec55f6a978a7974332509eeda5a9d2e5131e1f0e0cdeec5b84c7be0ba9bdfe4569ee17f6f4375ab49822bbd89956867f3aade35aad5bdf4d9a3d8598bde0eeb36b5ece375bef13cb71c29ac9ae0e655e22d99ab8b4e732f5183723e34beedf55fefe75fb1c73292b77582bdf305c4699e350d3b030150356c8e9523adefdca7f79f20b6fe831364e9146ce8f8ae349b8693ea5896b46f09caa26b7ebeb74c03fcc1e4b1933d4911270496595d1e29afa4bdc218d798756912d0c68aef0b8e9849f66aafd2bda80b26496e7d346ec5299d4e351d0802f64a573bafa3af982c34eac4b95d1b838b67f3b01969b76ead68cb2be8a8db73b114e89a75c8c68ebe7552da0e3dd4bfb033cb5eaee3df9c21d48ba68aabb1e00d9b83180a55b10402630763f7adddbc7fd9385e4fb91d781a85e2330a2f163b5c6d1673a0dd2785cceeaa25b19362e394334bd060b9c26b667b902a3031fb52407274256bf6b180ca7ba246e746b9edcf92ae4883fddebb1baea541080bc6e43d49c2184acfe069b65fe1d69d016d25874d2b0b97f56a6e35307ca6cfae558be588e57d7e80e6b9a7879f9288763a24488211ef53969d1399462072d372ebf51714855811c28d3b0154affa5ca9cd2897c1c4a46ad680f9d7503cab38ae13eb5c1933cd8d784d9ff3200ca38d5d79615e9f74e7983cf1f36c8a02447aa2e9e7bb6fed88fd33f4bad011845dd4e5b86c488c363396d98fdae688f0f53b9f904dbafead93ea720b5019abf7e3be8fbc9cbd6536b33fccea70f9d8b3afa20fdd2d23f3c6b1ec29e0f3c38672a30de5ad596dc4061faa57eeb1760ed3cf695c75f22795bc435b5bd74477d0a77842415497eb35241f1bf7807a63e0526d2f87d9ab777b43eff01296fa69e4a24d90463dfa88497a7cf759f0830aaed5dbe238628d656ef65b83558742bf4dec7d0346c0c0ba94bd794d93d3af3d35aa46107c8dee647aa8d1f2c874bcbe611e90b266774077d2b193dfdda79f40fc8e983f700550ca3eadcbf3f67457dc0f6e37e9400ddcada78d141fd751d45b9298ef960f137eafaeca1c9a6c9ae47dce38753a567e8da2f037c626755b141d328e3160eb62c332550393a96d990517f2d752d4f391b30769c65e9ba91e6d398d4c158c237678951920574536a0f8b9effe1ae44616e151480b48b7b4db6845cad606d7e818d3c29e304ea67a36efd92d155b121244318eeb25e97535dbe28dd6180a24b4dd9bf6628cb22c98e73bc56711345fae59b238eb5a612ec49c3efa4f626d9120b0d41acc165ab48ba592d6da66e690f3c6333e729fd642c4522fca534b65e76f58e5c669a138d5eb366ba38dcc181fb1770d2ff2a231b3291d6c478ca24f0c6d0ed3fc5fe080c7050ed6b216e79b7547aedf4d3d18807a0b5fae739d06b9e7a77f39fffd9fd71ffaefe787bffee3affff6e7bffee7afdf7ffbf5e7bffff5cf3ffef8fb3ffef6ebf3eff9f5f77ffcf1e77ffdfafdb7fffbe0ffe90ffdfedbbf68646cf24beb65754c8b33b2c76657f5ae0f767e73a49e7e43452ab18cdac208d04cd1ceaf0b5d19de8548f8d1d154a70dcf56724e956ae2878e3dcc1e46d7b61d3e8206b9e6222a9648db22599894ea06926d199eab1b8ca7d7b4ece48b5daf934f24d1a6bdda8db46e749716b652490b9977dbb3d10a88f3a84fb78e52d4be015fdc6835597ad95fb325ff0b0000ffff8c9d518e233912434f3480a40849a1fb5f6cf164371645aad1f53ba8e972d9ce4c45907cbca15c423e9e8c20043cf521106b3f6805c125a264834141bda1bd82d5b8293c6cfec28de020b09a3b45d15e4d126c35ecc04e6fd7f674f4ea34f8a88b61f1e0d61e12d43f67c7b765d53984911c77531c1c4c37a183622882705f81669a4e98cd0c7d735ecaaf092fb9540ae094d7ecdc12e7cc69751b0567cfa8006d450cbb153051930dd3234a1a8081f46d95fd478ce1c6d22878e80e79ef67dbaab4e0061b67933371b399e57242b4972f69b83a1623ac611f0c1a9139c3d9e66dd537d6bcca8db28d564d1d70e3c2abbaaa41db7f51204b3b6f3638bc3a0e14a8ce6c92a249fa70ac08f9367a1bf82ef812d9fee4f0b8b4a36bbc1c23d81c8f7d09664c4375af0073ea97bc9a73c83a0f335d5d06c638560f92679c6df7729c34de32742e8246cd2158cb2d6a17772360bba6fdf35cf08977f6630bb35b6ba899b611e42eecae89dcae23455b3f45cdafc72ebb4e0913b48af59ed23eb01f00f171b299da0fcd309c8c14ee673c9fd8bfae7efae32c8b04b0b70570f2ac9fb4a1cfbc07dbce9647c9f9c3d4dacbe1dd3fbf5d5f2b34f284f733eca145dfa8b8f41ed828b9db9e462f04536384e2be6b35ad25ba4a61b746666e5c6bd898cd55d6ba477509d6b9a655d81f9463b9ca8eeb3ee57330f2431829051cb79aa46ca91db897e0d066f3b67588eb06951d44b0cd3f13f806fc300b0147ec91934e3c63cd10acde7a3c24fa6696fecbaa1edae70809cf617a77aeb20ccf45f8742f8c8f610c23b07db5dc9f1c6c1e75143da794508a7d7e968ee8736eabe06d2ce2341a3f3a6f9f1abfd99fcfa3026e3e16667d27d2b62972130dda6e1e8428cdd432d64e5bc9f70bbfd5db7f8f580e40dba7bac3af5703a3a45bb403b358efa91c2cec8c8b43778639f3820f511f00d90732883777815a94c7f82d80532804f9c3ed79dcf26a1d20a2e6d8fbe4f9741eaa2b4a28a0b5508c4d87a21254a91a03dc72b98c1c3c9aed214e639199980abdd42ac483e0987a0e76b79bc9752f2fe35fc4baddb246b3de7cefec99bfaf6463a7d19de49edc6296cbb8440b3ba5bee3f897ad7a798e4fe9a3dc4f90aefa99d3206aac80ac590dc37818b6a973fe2cfd34a94e32e81285be6819d2b24b784501301cd54dbb1fe84043c3ce849abba45c56aff2c23ad0725d1704d7fe917d3e82b321420422b965d683a1420b8d66ed33e703137bca70d86c2dc3b474dc178401bc9608778ec6186b0d0f0b22449bb1e5e3d6edc6afd9634335b40937d630e07952eba3bf2ea9833fdbc18ccb38ea9db22a7554f1ff86060a82f2dd630f3702a65bdd39d7476b9d133d3191a8d1802d47b71e075a988c0fd7983af50259fb348787ad71d2f29dacda291f54fa025b5e9d394f8cad8d6b73dddf277feace31f5b55e176e0b77c3fbfa0673ea18cb559b354b440f0848c7080538dd62f9ed6b0e46544d864d92af8ab1bbc4f8f8cdc84310ee2837aa1541441b83d8a72c4d441008d66776aeb9fc340a29e28459137b2de7290eb63486d3aa183a32d25463bd38bdb73954406d73e5b1581670690ff2250e7b2578f43397c9ca9de9d463c331e6d26f1b60038d02348eb2d6d5ba2091297c6e933a354022d84be711af03fec8261dd61e164aea0783987bf49aaf4571cfa47123c6e51bea46a9e51cda4a9a54892dfd8ffc7e594544e01936d6c8997d86437a6381f37143cd2ee3528fb1da29734adef2080390e4022c6f035f4c1c4b7ac4da6d999b8be2e9a31a0cace97db6d9c99240ed3601384b7fb4d65aead4bc6cc5d26138680af718167956db40be36c9dc9cba852b0fbd118fcad25a6a95f455dd877abbcb57bbc47afc8cba41ffe8187dbb11967a072f29d4e6da4cc2ea7ad5c083db16b51e57f9d4902c73bf0a61cf69f3f9bb48f4342fe3eaf892cc4b81a2ec4595401bbb023600c818fd6e8c5b68ed7529db9c33a4b34637292fe70cd7bf27bc588f96f49f4ca5cf2b88fd3879272c1d4d7d517e6d781d72152d9bd5f6ce9c362b61487c04c699210d1c82d57e692bf8f5c69ef688dcffe4fe7e4cac9c64ed80f9bc98628e72be400772a108a77123ccc682784e469009739943997a2bf545ed24546aa53385cbdc42b871bafa82a8811fe5d5131cd83c833ad300bb6f55a79ff913c3f87d5ff6a907e9644dc34ab719d7efa917d9ce6321eece96c6bc9af4b676bb20519f877d9961b48d6661c75a314cacd9fd52c22dc38837d5cde6c4cdca48b014bd6edbff40b7569f34a73e4d6a3d1fe4841d57f859704e583c8f5ee3e6706ce0a826b8c4a04741c967c0657c36acaad48b244e8ff47c2ba29357643d8ea377d55d3e089e437184d1aa020b8e1e9d931dad9643cdecce8008b6f0262e8c62b0b360d05947fd9bed66aa9bb57467469a65e0caeaadf9017a91549679384ba2787f88597cc6f2e9d435e93edc1732b07c7eb69f654cca05e4bcdb6a860a72fdd02715bbe6f6a6af525184e4366de6c5c1bdba8d8739ee915776177b477f6ca76845576f2b68be2e534c0e9036db952b48da1a3fd9949a79208222bc3cb6b67a3f524fab68c723797412ab9e71615e6664dc043e4d8b2f140e77404facd58ed958b89cecb481c57db825e074f308717f679faf4c439e5236a950d5d73ddbd736ad783ac0f4c1da5f956f169e9ae5792dc33ac0cd6d49ec3c3f3d464fd1f6bb20d237f2a5b87d7718d3c0c234920e6d071e0456b5471bb7b81f4f99d38de404eaee7473b560d6d08a000030c778626d05152f320ef049f5a152429c9ffc94fb8464db5c1ee727a2a5b308c1275bf9c79ab15da1c6ca79545d24a4b5acd7ecedd3e8674f764e4207edd0912d8d8c895075139a9435e28c9bf5671feaf7baa32f57e3fc63fc8c5e7db4f0e53e115d837d1738f913e7fdc7aedeb706a4c620b7a4c794800d638e36e8bf43d9a2980a116ae63fc45cbe193339fe88cd8e6e127b02ed9956838c40a4055dfeb8bb5fac69dae1b9c63bbd29ac571dc7a608e7c1c29aaddca3bce6c5a4db5a81d20633335ca6a74e99c7de9376abeea6ca33510415d3025bdbdcae3c4f46d34f1a36b95e57092f33dd0eee5d3ef342461d318101f698bda04c77c47a790c724a71959d81d0a8a7edbcf9e16ccb7cee51f3a74dfc6b0887a8a721b278f072900ece342321d0e10acb7c54d0536ef435423776ba5a4580b234a43d7eb6cdfc790da8ba6964494ce9ba43a975ccbd81d6402fa8234575eefb43d66365a28f2e122d7adb99336a1b12acedd986cf26871e31ab8ee41a3762ecbe844ebbfd031d9c6e001d114df1a5eb387cb853796c482fce20c7cf1a18289759f60f15c0faa1751ca0d39ce233f486447d7958d93a4dc32d6de923e3d9b7f79173aed9ce0e03781803ad59c06154356b5240469ada0cc82e2f8d100cfd8758a52e4c662cebd91c9d43902f3fa92f19d680b2e90650851ce3db5ed398288f1d576cdc641670b8e90f91926e4e655bf00e79cc037d04debc123c66cda1aa0f45b0165ac0400ee2db8c0abdf7169ace7ab6c0f3b4b72cecfb2aeb54e76ab941b237d2b08ef901bef5e563f7eef9865cc31f050bbaaa63b7c77c7eeab52c3a779bbff472e23c1ddb36f48fd5f6e5c8aae1141a1fde712b89d81b6b9f7df5abd2babb9fef224e09332f73a3d9dd4ad41f878ccebcd5ccfc6cf2f2e736b1cdc5d350486c8fef83f797628956a83ef5b6777997030edfe18501b1d29acedb66391de1b88fd8ddba08834e1d6bb242e0a755d35216b9cb1e5b3bb8f634d571a8c4307dfb5476ff17b0dd34c3fc5c78ba529d51ecb62343eeb1d6bee4abadf2ba8b5c48c4ba18843133cc959bdb63d980e8f6cf76a3af16bb72989990c0776f1e573b1716a31aab1aa33ee66c28be46969dc18ec27629e00c0d21d4af0d54eeafea51fc9ca7714079556c52fe32f58b3deb8cf05a1a1a01f544ffdefdfce5a695d82a9d734d50a099888ed13e144c4865b96e4347d299715c2a2410a96f04872b0befef38bcef61da5b33452c38ffdaed85608ab9e17851e155d9cbfb40df219856d725ae1bb8e0816f76de6ba7b6fed781275489973d610274e768fe64f77e4f2c95bd7959f663498ca367567bc80033d57430c69db9ac0d939a3bddfa9853e71bdb8e52431b051b31c4429f2b01db993fa2aed5ef5f8ed7aff18cfe3eaba12475accb18646b13ade940d41b530c282e16c41b75b619ad3b3e451b8e084d6eaf1c1b5933ccdb5560e3cd411ebd2c3d8a33d3d8363b775819284c30c75d8f8e4a6584cc9639ca30e2ef012f72525029d748f5c7eebb2f4a9ef44e0e6c2b9a176b7742b87a4f6ab935e9b9264cd769d31d193a559e0e505bed2889d3bd98918ea3ecc322ed98e1ecc30dc68dca7ff9673eb69cd2e77c449f1e9bb9ea94fc55f4d286852959b34e3f81f44973a73e7050a16b3caad1a66d5f28c13c5dbb8cd788488ddfa5a73edea2080579d39a752f746f39036354eda6fb8f5c59566f1cd7c1af5f2cded9fc85539490ce5c1a70094e0db3794941182fb901c3fa31d07c53b9db70c97888467789216945575d39ce3418ca5f3411083ea835fa122ad2643b2ab63434da217f752baecacb6f5597fb8d059b8eef36d933098a9966b701e75baaf80628b2ca5f6ddfda8d09766f1b5fa4b1c1322b80ed663f5ea10a3bc59c3a7eebbc59faa53b4f9262cdaabb48064ee37b0c54d634f894ecc5bee691ae1d2aef4b86fa8461c5f49c16cadb3d4f6ec3925d17b562d5c66d87ca5fc479de2af3ba814bf53541e5ed76d8e1c9a5d06f2271564dd2ee1a257cbff9daf0306ce05a3083dca10fd16b8c57ed727816e6a8d94c90bd26dce5d9196c0b6115909a66f93e03592a3b046c0f133f997c7278e1183f9c46c17907b4faa97edc07c321a1ad0a5d1d6c82b13a0cbf4c209750d17c13a6d1b18f1df900c8377fe6ed4350ebb24dc25f71faa4119de62041a85a24867d5f9961593130e22b9a4b46dbe42948bd3f1dd91f2105a2923db79775b9b709cac2922e7020b6da4ec7ea982935ed4311b01e6660090d6bd4ea00d66afb6afd0c0db8d18a3dcb8afaa2380f2ccbaed35e61f559d8168ed5b01c326a66b38ab38612f973d2ef733c01b34a3f84602d6d923037a715becd78588271b8ee346c3755ecc7f9367430f8e5f4fcc3dc16f281c064d3b5768c73e5621b90e051873ee22490f7dd802f372872aaf45168404db4fb04994f65ade42edef3dfd883a86229dfdd42b1b012915d695f9858678fe18d8079fd63fa67bd92c394464ee7ebf693230d014b1f5069331a4ec451f10f71fcafcb368819960a05321fba2bb82ac038dac3c8cd338f1d3478fa4e1d6fea965ba88a37f3746b9b65d97f6c4e4f2cff9af05ab5a3d6c85f1c583bc49ba14a4c6276ee8ff2682030ba75ca79dccef278593826c3320f031f945e49bdcd3db6f22d2148d0baa0dfae73651fbd923a5aeaa361a49bff2fd61c46cea3b1a1aaac77b9e63a7ae6b50dc2f3b8f9ff760725ebb74b5174b91309c0af2552067a374992a5bad3671cf4f13f572b0f567106b50079f4b58c2299505d95eec1d34e712c280dde57b00ae38bfeabe3b2a3958ef170adb2d2a57e55de41164876868080be5465ecd089cafabf6f5fc4c38e0b0b442fcf8e4dc898546776af6419978e51bfdbc100fd4d47ee4e0c39fa7a67bc76bd0792705fbff8d33a839339882415f3b9ba1e3749e4dfd03b41835a3dbaddb7283959f91b9c4a30cec6efecc0b7435dcd2aa0b7b3755b5b9247ecff70f8fef737fb25dd29d9c7f23684977d62b000b6ed6d273b71744c3dd9c2c1cb7ba201eb771964a40d1c31f63184fa5e0f2a0ec1aa9f0cb28f8f1e51d6db6ff7b45696676a90e2bda644586ebeb32dfd76009c5f657c4cd88195d3b9c7c7519a64b92acd2a422375b7032d787ab156352a15ac347afeac58fb1c0c489ae8f00104d9d683fdae0fecfd46ea32bae622656108830ddcdeba7be73ea32cba6d9fe2b7d22ee6d61d862dc03f8fc51c5e058b976819c460dc161e49cae2b9d256874f57c6b046615608c602cd8be2f49681b334537b8f46bb5930e721a43014f6a9df823b7be8dd8096b75d26da20dc2ecf0b291ae14b615fd39b3d3033ba5b689f63a6e5a41650dbcf20220ef331b8a7e68faeed47ff4d8ee921e444ea71e10690b745fa607144ea13db0f689f7fb7eee6493f1bc4555bf180093cd6ec461c7c3a1004efc50a973de422f92c2fd26cbc54e37525410c40405df7511d329df1860dc3f6771996a31b0d2165fc59925f66fc5613e2f72800ff42efa0858f35e2176be477ea9486bab9a6d7387790013fee14a37ffaaae4daeb40f5f50f63b2688aaf9272e9efdb55d02d55b5a97e426f1e1cd467337ad27cd46dbc12986cc00c0e7d2b41cddf46a4d13b42d7997afb7f5e499d20985b126e776937004ef5b21538f588b6c27f44961bfcbb0c238bce4bf754bd80bb862df0f25c53c43f97aa7fbace8c9eb048757a4f02c51e6543ec42cb137732a705cb91751cfefb71c975c55ebf037ad426366fb79e7056eca3c58b6b4d459c2c5024f31f11ccbfa9499c1596a1cb9912cc379cd5d6324bd3da0e941f135699491b6d9db1b4d8f9f9ac6543747cf8b033e3df185b241781b7e8ba126ca307ad328ea10f6e8b9c0a8fda92fadf33e2f871bfb48c65ce1e1c1e5b320270638615a6509eb4b43b9519673dbc907c6397792c79655d9b62e7ee334da7ee6622a0c22b7444c8318f510cf7dedc61f42fcd7372183c947cbb327da04bfa5cfce995d29c2a8167c4875f0cf1f48255e975cc0a365698c043359b95157cd7613a115df9565ddb2cb88e5e85e4f9dd308d737c0e7bb5c4901d55ba82963f937076e5b6707234da460dea197ba65bcf884d9ef8c5aad1e83d1fbd7eadb3e7a3b1b59aed5dd8420f2fbe2002b27c1fd46b55390575cfb3bd98b04e94ee595eb0cd3e7691f0f91f000000ffff8c9d5b6e042110034f14699ae6d1dcff6251b151a4d8acb2bff95929330ce0b6cb726202a561b13a0029eb3183e33e1ab7c9d6180ee5437bb60f5d27d1e71ad36e0acfa6f9b6544f880a2bfbd97d61f3d077747996273865fb247d8306b0a139bdec0a8b4ce84c9a78e883bba1be1da3b3fce62717696069b4837e36acb9e25f7cc77d09c475400066155c0c36cdcad5e75e9ac76c50ffcdf5b5e8bad08e543a9bbaa56ad69ee986f4b6b7697394fb8d7296e82d0619a758da8f7919194dcb24fb38ea9a3968b39459f4867e0b2242c3c531c80c9a25ef8ae9e3a292a6869edaf66173fe56782ec356c9e61fac5f2b3a062d84cbbea1b7592661f0eb2cc2435d92170eb3739a29af3da5412698b6a9ea5c031c34bc20bc9e5059e754c0992397209a3b2b274fbcbbfbae47987b1780bcc29ca2f2198f25f881afba9e4b34d99a6f5659895f6f19d34b0fd923bb0f085992f608e639bfc9e65f6d8551ef22164c2bafbc3b403e9d0331861087119566912a95036f6fba6adeeca57a177fff1e9b8be5e56e4d5a62cc014945cdfe4478bdc741291a0af35891651f5e6d970ced755a402cc1b8fc38b49ef6bf20fc75c5b4fef46e35185aba8fdd208ca79ad384de607d9533399408f8233955a8f409c5aa2fcd661deea7a93a970bf55578a5693dd33ef574b3fa579dde6b6b9235e2db0b37465f92390e28a434bc5dc71cdaf564b9a16ceb9e4db58b9a9cb2cd320b6116f275f94f81b15946b77942ff76bbb5b54e1e525767e380dfed51ddd974c46de7f604e7e145fcfdb10964550ba57795b6dea288b5b9637c10d081b49ff17ffcf3a5d334af83e32af5b76cf57cb530a43b2465ac6c066f21ac42e7a01a31c67ad2ba4e31bf5b1a237fe174df000000ffff8c9dcb8a654976447fa5a979803ff6f647fd8ad0a4558568815a130d0442ff2ecccf49d1d7968732470d497564e4bde7b8ef87d9b27fa8260d79f05c085b701f2b5df3a83071a529a21726827a02ca5003e48c0654cc754c21aacdc05e4442b2ede024121ade38e03a710ee81328ce532c3384d8830b417d81ef35249b492759dfe7ffba6402216b759e5b9c0fc71c5884f5e89288a038d24ef66712dfa705eaf26fb9995c0398700f9d64c36b4ef70b64dd2ed7ca2d3173a0ec4cb23e958d9b0de97f42aeda0baa50988215beb2df2a1f98ab3c55b626a9e67c3e29782098dbad97eae3aa5c3d31c8dd7b5e7418b240830b867eefade344455cbe910d192920b45730374acea1b43dd716ecdc9cc58a583de64ff594efe73219f12b115b7360ecde27db11f2d4f321e293d9ab2f901a9cb9f42c9c4699783b4e6eb3a93925dc415c98ba01901e35b75711032f4b2afbd3e59c638a04fbf91334dcfc3c64bfbe13eb5f41da2563e6ecbfda9489c8ecf5d255ea9ea31e2b851b7ad71eced81392df39c7d78c862a19c7744996f236b703483c04e9ebb61f7d47a64d89583eca1df929067a0b20796e3c52ab2bd10f71077d277356246b28f0fd5685a03189748b89e422d32d547430ae770e878977d1dee0657ca14cfe755f40f902327046a2ef545214ec00f7c237d386844e7e596b97fbc9af7fe6e1da8b81c4ba12fcb7bb917faab266a2860302de68f91c9b8002099550aeb15cba8518d55d156547d2e5ea613b9d7cd65d56977aa2cb730868a1e251d62b17b64432f432dd1572ae1ff2f105afa2bc7fb4c6c81ce4d929aecb7c2c72f99994fc2c286e70a8dc2924a7573940d93f1281c2a1aafa2d5da7bf70eb9162f3c41cd4859873e6373c33c6b23b00fb50423d2fd02eb0c265df179d7b935908910cb2437883abbe72795ad7ee73556088f1a74f13993bfccb72e8d6d73523e1e5cd494ee7557dc4aab930849fbb26b3d034ce68016d54975ad38799b2eca6e3009bbc6c88bd159716a64c3922730d46f7468b02eb7f93217a5b9d12b307fca65d649a86b72376c2d92a3a07e9655a7fc17c785701a9e749d851fa21c8b98eeac7cc3ffebf21c123776dd319a577c9f2ed63bd72ab6f62f69aeaf9e1c5bbb01f6fe589149a01ebaa889c34b4de73b9345ae8fd27aecb1fb2e45a5d45c7e9ffeb5f920d0dfde2b15e0247db9afe61be3e9c222920f1f74298bc25f195a13abf0c64ad088e3c5891b78280bab2d79066cdebec132aebb7eb5cbbe2cbd68187375e999f73ba848b7746cb5cbb7a957ec7e90e39e3bc9e2f53a20dbfaf5536928eadd00e58b86f8679809a0e3f25e4b97298c13560aa49c44e8c9532623fed755fdfd2048abc494ef42344e59dc80193d76257d431dfd80baf4e425d45649f5c66b517d7c2d78ff8e070a372dfaa662b86fb66507c51bccb852427be180ec0a318ad40559a1de559e644070ca56903ef917da269948148f6fa647c03d3b67b7a34ec7704c7bb9e4911291d1539f7be5f7793c4f31f570d18004fae2d775da0034a8ee0f6dbd547b10fe22255ae1173038c53624782d6d875664cb25483bfa83e43883eaaf0440148932ce4cae584eeb38e847e4bc342d745cbcef8498a7ade394559f8d97f032fddd086b51c7f3d292a77c2fa85b523bfbda797f515276ee817d0969ab0f942aecedcabd8011b4a76f22cab4c256e70709834022a1274413d3e05adc73f33f55bcd5fa9932397e034fe033ca9f4611db5e1d38eeb89790f6c51e0493ab1ae6962845b7bec855088abfaafeea619295ee04c5748bc154a42843371b4f7ad53c18d110a54a83f0d6f7aab43210ea1a558732106c7cd99cf0247f38b8bd7b97cc60b3d3d65aa72f79aa1ee9c73215da56b3506f7993cb2902c4de5c63bfdcd33e6beae5aecc72ca184354cd41580450be2a27a164499e77ad952633813cb06facfdf74541fae47ec270b07d64a87707f1345f41a8c6af369302aeae725d64384b144f90cfdf97eb9773699fbf08dbc2038bb481f255ece71d2e3dfe550681dea394f6ac40b84a58552c9eb4b5314834c89595b19ee6d944c71fabae69b267cce994e587605ecfbbd847cafe1226ca50b4fb038ead8d30d597d5db8f175f7cf43fb8d861463a5fecac3b5a439197e91a4cccf08b96873fa8879ee28206e081c4e28a1c820db87536e31f89e2d9b5bf63fc86afb99b88128242e1366e4357b24b796f2a6f26959ab5ce8589fa2efd7f494b11cf2a23e7d75d4daca585f5e0097a57d899fbc3af5fca3516b9b60e369d130cb8438395ba5e7f516b750a31fd19b5fa76757ff33d8d1933dbb9319474bbc5bf75baadba10571c9bae68eec6bd3dde7ee39e2fdb37f3efffb3fcf7ff2dfef1ffef61f7ffdb73fffe53f7ffbfd2fbffdf9ef7ffdf38f3ffef6f77ffdedc74ff9ed6f7fffe3cffffaedf7bffcdf5ff60fffd1ef7ff927eb99b34d6f8dead249e419474fce927d82823dd37dbe6394cda94199089b09b96efdea5176f9a09a4b81397ea169f95d7d1eaed6b28100afdf36196aaf20c042ab8cb6ef7330db6648918eb9c19e630fbf56d50722bb55578d0bbfdb594315546b4d1f23b128cb77d7c7253e37aa8d180bb983fbc02ce0a15469e2e2985059ba28c62cc7a88cf1e5587e270a804bea7a39e5e57444435fa9585dfc627ba28eee11d273c2ab27ef98338e75fc37884f35ee074e522f8202dab00dcbcf07e4f1551c181546ce81e9b0b811421624c42ca10e1e95d06e0d2a841915df99e26457c79328e526c08d1aec006cd2f783e7f5da46f448d7feb439c3730aca21d297097e9bfc1a984e4a95e58aa6d69be680909e1fbab73db6f2fa2583dfe6f012b34419823ffb91d2c0ee17bb0cdf40d35e7f302c789d4286aacb9d08563c77abf75e63a84dafa8e7237a82f8ab445edfde4a32de39732ddb839c55462a52dcf1a793eba43c9e42b05d77af0b84a129c484cd219574311774e08abaa476b8f7e0c0742a1ab517a8f9e535bf9cbd53c66ed8225b835e71f64997a1a21abaf749753568d6db898040cda9a900b47ec28955f02d149501afa8d242269cb8439b5e5c563ba28f19ec31e8d5180aee06b33eb7765dbe0fd05b0801997edde6334709d3a70dde4fa201a84bb37dfea66f705789e165a08c08311918aa41ec85b49ad9c0446d2d536a56207f4aacca33f2c069f0a7538aa84b7cb91c14f05f6bbc887252c10af88728d21dbad59edaa2d02da7f012c8b8b54b5e9bc9eac2b82edf81c5c95b76b1d44355c6085b3b3ce4b7f671c8b7feb789f8cc40f09d747c64976efff34fe3b046f998a8bf75ec98422f5c917ab6432b48db5813c62e0d43999021c861cfe4d7a32acdd6613df360a01d97a515a77f8fda83389349aa1ef456354e32ae67ef8dedb60135fc2e0c3b452a489bb5a6c8eed490756251d788dedd3420518e437f74a93554a88ac05e4c5a3b9848ab0b525caee9f3ccbe2f808c4ca44a6b87da9834a7bccf8d1746414983f8ab63a770e56c1b1d8dc28a911d49333a7736fae8a69d957fd6e550930178387ec301e06c3d5e56a0fb944d0d33183b186d833d174953b21d904c2ad81b9028c1b3908226ac789a2049fbc6e68bc83ac76c897198c2467a2ef0a8d410218f6ec774efbcb6686d9018dcb0a66835750680d0919f33f537127917c65948c75a3a0ed2a97ab54100bd457a85d3bf64055f593cc2d57d3fb9e448b4374ec65fa05ecb3c295ec0f0b61db89645ffce8a87a04b5b087b864078bbbaff51da0b284167f4816896e2c04f2d50d453daf7522be29f8fd4ceae9621294901f6646a01e745a818fad8ea359d6caeaa52f0c11c484451ea10d0333a5a3b21656b246219b5f4dd9b29161263c3022b5f2d63fb96403538b16216b4bfecaf5e5d910e4876d5534e2dcc9da6ccb970e577f9bcfded3a487228d6b2ed060badba579f1784ced7205e59e859672c4ef9b788703b43e9e591393bd70ea44a2dbac2d4f5c4063b6c48c51205d17f657219b59527efd5b88a247fbe8b3c9a155120c229da2bafe0b5b21c0124fece681761d605f4a9e52617036d34fc564dad1751d42d946b8d9217bdd3734ace1a7ef4ab239c7407ea9e0509a3e929707f60893d8fcad3eb97da6159101ba12f0e05630c00e76a3bd03bea25c4144104631dcb29fa43f5c6ba08130639972218379ab9e3737dfa233eaa4fe4c4a8b442a3a50d83dcbe8e14c668f471baee310219078210ed4ed8d78c1cf5b2677209c3c8f82c57deb3a3779786ebcdcb0d19b874c51bfc62b93c07cc4aaa4d30455d4201227bfd5a1b696c5e9dd1a7f77eb94a4f4dd670b481f83dbd41822dba821b370e58ad38ebb8eef3f6236c3b7ac18a624b4b8f85bd505f411aaf34033efb5ba167168a73addc69d3dca590c61d32063bc17245775c5bd755e8b98d717a1e93c6c75ecc07b8f7e0e739ae4ed094f5a8f919511f0634798c7b39c34732d1441eae1ccc40922dd14a6158eb127e2636c37255f9b3a63b25211e1d0713e9f28ab60b98b96ce5941d3e0380e436c3e30204162c0c6b2ec220d23dd6d4b2dae64d1111185cbeff7a3c54aaae171c0bb289a195988258f93246e108034ceda99708a9b115611aea59b251a8582b742ca2df8c707d8dd42d2487f6563e83e91f99dec8c56f75d59cb5fa3cb4ceb327acf423c327d54fc001e47b72210e0c7f9bb06740111f16e36436a7ba240e91eaa81e3f5ca61016fe6c2ff5a30e2d98fadbfc365a59b5167359624b38345a1d2cb7942e5e071097ba5299c878589098d0f5f37331ceaba527f5e9edf08cfd278c9da3315ef4c0235c36ace68d33be5afb5ab038d6b5e4a1c01e56501a1c3d359b47f1489814a4da953d2469f05aaaab8ff67254ffe2ce624c6fba235705c58801ed6db48b0361e94e2928993488c53ba9182f86b78bbce2af4e55a62c766a55c365ffda5301db7efceaf9a0644e2cc5e62e1c416982f263fd554e894c25e82d0e4d6282c920ad4a5fe880747bee869e732ed25cc4da64737e3b3daa729a20ca5eca5e2e44ccaf014971592aa8214a567cfdb64b5c909985fc298d376bd036a7801b6c3b475b89b85f71503ec9a0af9da9ab48c41cfdc49278a19d7a10919b528e1209120e4dc1b1026c0a64f116648a2031988528c613f445b939d8e462eb850bb52cae1fbe376d425ac93b63048325ab158c232dd335b1cadf6b15c2e24c8b14f9f62611422c27f4aaa8275fbcd99e30a1d5aa928a5b95b50682dae4fde13255180f8850a716763e161b1dd03519e3e843ed298f3804651d063c85f240571d55e9cc2e3811d4a8f976f8bb159cd6a81bc8939a4e2aba143ead4b0d063af98cdd5d6c2b6c5e3450a814cd01e1a1f86b008d6a5c5a3770885d0f4a7329c0ca028d6055f3d94c8ee7bbbea7ee8f38cb1d1780dafffd47b846e600367827956fda49ce3238ae9b7ad6717d28e2dbd44972c2afd291ba2631c076b5eb5cddefb454ab0aa98baad7ea3b1b6de23337e99763b9cbe68c3609a0db0700e72afa3e6fa18c8773498486fcb6beb48e03106552b08ea70dce411532d5bfb25c259c1fa11d9f8bf3a542afbe33d3fad385277ea73fbb487d81ee2e57ec0b0c494344693068bbbbb1ee8f553b4560e3d253983d60fff3c225d3308f70fcb3f387b5045a8ae7b80f0c5aa3ea1ef4fffbd410c90e6bb9d1ba0bb0fa6240a49c0dad00840475c9ab554b50234ec87075febc94a790f7e8a4de30f9091c8ed4caaea0125fee6a57bf63d004bd8b5b50eac92a85582dca49ee85524ce32a9898d58e39f74fecd4bd02c5760b92e5c6acda24d82be1b3ccef0a3259f2967b68046abbc4a029966c363a4dcbc600c5f7302fd0449f978b36e70080edbe8c5d55bc22f65c511be3c7a7869bbedf2e11938a86db04ac4f2275df592106cf7b94cb2390c95b5c96af8a618b6ea18e972d175ab03d7b0557d48bf767a15157d97071acdc8cac147fa8c1d93014d8001b791f27dbd8b72a636b1f9b3f9dca888cde1c84a07aa9106e505263b9e4086dcc933084a527e33405d59bc8195484387457a38cda10fa9c8a2007004f3185ae33947c3d9864a991abfbbadb8a4efaae643589ef464b0d18d424236dbe50e821e0a90f874569ab8d510382154d9412f54c7bec35c8bab65b839fd4bb06b4930c1b383466b640e5afdc43a74b5db5b802da6864850f46b938f816a537453e9f18cec80398b2f3f893b80f78d7d57743317c08031170d97f2a85c78f2c48a5f6760dea1864a96b5724ca18c24fca2c1b3294b36d5a15f80ad90830203c2b701853759fb8c94548189f72ab534186c39a237d18f1d0efcbcc5f18085509081a1eef9c6b0fc6aa6ec94bb1c1be9c7e5d82b8023650153f0682cd7df6f8beecca7569b6668f71c996bf8e48f597656d68e4b7786f08f85527063595c07448a0d4381358b7aee36363ae2e084799282144e96a109d6cd90930e39cb5388242dccbdab02f99878086d17e5f3de927d6090a2ad8216b6076fa9d1e267a4e14386217b604b8a465cb64aeb2684fc7c36a1744e818f3e9f224f5606a4e8b2f7335c90531673d99a49725d5d008c0e9dd32fab1faca481ea427e3bd717a782a6364c05e777d5386115c5ebafae608ccc8c6b118fb5c53ac887539fa4348354e72748b8e5f11bec8609a651547aace0b475c1c98b91afbd33abb8f39ee5584be8ad895434f753eae0bd54884239d90da10bbb8252f24c0ebd226e6801d32b30aa7e0abf22dca62c064b7ad1068a13128df4f97303deed37ae144d73ea6df094779038fa6a6be30c5caea2fa60b2aac5870cd29b98948685522c3db0478ab1e37e1ce0464a455097c91f6a20f86f9c57b35e88b9bf499ed127cbbd39dc99caabc53300170364eef827fed0122777707dc053552c67f8a9a9eda37ab27399583b4a9d8aac6b13e0e477609fb0064eb1ad08c9ced3db22225662df037c8483e0299ebfdc8b580ff9815001cb1d54bf4f5333deca37b1932013b866a6e55c08470971140d4ba98f0dda5b581c23ee741a8b8a0a703735c8f5f1993ecf34f403527e97942b7297503563b53f772c065b226729786f66b58312a3d2c3c05462934388b0e96c67b15094cd31fa2ba440ef12fabe7eecdeda3a1480484808aa13a0ab23663e6f03a48696d851e346d2db931eb0a30f126505212ac48a77a53340ad2ed14601e2593f2f966ddfa1d1aba92becaa677a40afec24ce3f8cc3c7db48cad70eeb154097aab711363a892e4064b66caf80c50789eb74e1bb172865b624c272cb66f4e9ba619e14938d132cb2d5365a909ea5882b5b56151cc18a8e9b5294802244e9a206a1f5512b8acaeb508b72dd7bdd6bdf03d9e0f55289505a3e2297c5be306c1d748a6498dbbc1e10e799e1911ee9dee212a594dff688552ef8b899b434efb4a8ac542ba85de9db50be4dd2dfa1ce0c9dec7f5d20123e4439214fafa43f9e9053c99321bc3fc8631767e64b804f2ee9bf6831323c3a5dd69f159b6c8ca0bb8b5ea8d77d595ef690759146fedab80d94726361ba1c323b96f2f276d18569712648464ddd51fc55d93e2869ae92aa488e8b3309d5be9165e8a49f5611bfcaec3ec72a7d5addd31c6199152aa62f37ce96e6b93d505ccf15cabe25ea4c8e5199aafda0899157e1f02114d3d3147941223e1f0be4aaef220bf0764871791a9aee06a5236050762e4a95e7003dfa389ebdaf015dd6c31f58823f0690d0505434fd94617191638175184c0aca85aff607ba93da74d7e4354dd35f07a0f919d6afeecc67c3cc3beffad0ae206278721d4c795ca55b55262dcd9dc8bf8b5010dc8d2b80e50db5ef7801a16f8826754b7c1c354d1aa03f216ee4a38856cb9a795fd1559444d79998bfb6555e15dd2873d6d54a8dd01f4e3f9b087ebd039357ece7d8db4fcc7b6d90bb61245ffdd247b51751f2b67670fbc2bf896c8ff8ba363f76868a5a096e26b69a92cb72b4869a3796fc55e0bb3912e434fc50480477231a63c8d55c854e1a277f965a81cd222d30fc49b904589801d357955cb3d3ca9fed5c679499ccbf339608bb99b2fbeae8ece7b4df0faa007c014a1c1cb9c0d68a2596185bb211904e7f2054e390424cf18949e95e03dc5bb422516bb512023133749e212b1c35fd725d6eb606caf32f4d6a34496c5019a43757fe16bf77a86fc9ee12057ff50bbd8b196e8a382e9a62acc15c32726ec22fdd6ee1d72598927f625b37228adb86322725e12ffb9974eb49e49ff05b8b9d29f5a7e975f3fe20ffb6af83a05c1033bba35f8dfb63e1aec49a7865dae36d2cd3ee242eecd60e2d099b2ba2aa815fd737d6e61dc94af6fc129f59c27bec39952383a4454eb4c7781b79197702889b913633d250bb9c35ffecd527929dc7e4253d78d525047fa76cbfb65725475c661c179ce321823e538cfb110aa335bf36144534a2cdad59d07c40faec3059b528f661393a7ebae485918e26ee08d913c0f767c4d391043a46e151e7f65ba745c14d771230745cf5bb0b7ef26ae82251a639e1faa64a00214aa685a1898f631f6f65aaaa97da273ba0b011c44f4ab90f070e3729cf68b25a6d4bbd8419cf58dc81bbe578aa6d81e00f17331424c0381f0f6a848d449bfba74627beff113bbf0d71544f1962329fd1aba740d1b38c70139e851208afff1b34fede911892994f888de66b55c3ea4ad479051f1195eaa4ad5aa0b319e5778097741df7f61e2abe910bc8cd226763962e154e232157932705e651b2b021d9e705fe0f485e4eec8dc7c2ec3fc99ccfceb5b7cc651cde10daa72fdbb0646ac40f85c35535e4c433ee34fdbfb1cd85759bf302bd07ad27c585f57a7eb1b5fb4d31175290507563c6a9499a62a2926fa8b21d5ee2f09f5f30c147d9122d1eac77fd9ca52cfe5d2285969fc89d73b183e47d48c036cd65008e8729ecb596ae08bd2deb9fe14a6f4327e7738775abfbc6b5b9bfc2ede17d5ec226ac0b2aa32c245e73ab31253f2fbaae59cea836aa9ad52d7bb4ec9581774b37257223061a80bf1eeae4af5d6709a8e1e9f3a9b171f2278156770bb17677d6c2d751be5b81ae652bf33cfc7e6aab17af42b9fa771d44a36688f3641806c193db0c56037fcac6cc4d2b3396488e032389558637ba84e8628e43ed49174341c23177bc42ad68a75e9d111c22554cb70347d931728d1b55e3d30d7694f3d0c2f977443fcf8e8ada6e09a542848ad5d21ab56901bbc66714cec8815d686cf6bc5265df520811992ad571554ebc2dba77934bcedf7374a8769051672cf0d62755b2a0c1a4d17399d197ae77fdd402ef2af4e6aa0962c9d361a12abb2877f0da1359f57d67238698d8d1555eda57923a2460c26dc0b11aac8548cb9900c431d9112faba2b9c0dba8d1a79d7d102a287a6212d6b85cbef7fddb00964ba5601243ee6a714e2018295ee061f39f830439bfaa4d8885f1bfcad5add1be136faeed4d76dc177ab47dce9e470a09362e3169af6941b2d3a95f4918b99ccd7d642258492329c3f754547b0737d9e8e3280dd2b7918206efc89986523bfe0e08b1cdca0511eb5b9370c5ed321037736f04fdfe9641ef0209399a5e4e3a0253437f395ff58549ade8bfc365b874bb7c9cde0aa0ff5a163fe921b48245922afaf24d89398593b527b34d6f7b7566f7dbfeca10cf678a7a5bc9b8181d19a3cf7e5426c3ee6dd5d219895ee242ecb898d214c992a875da3ad2b1f7e1bbdbb497a8f9e1a60ff549e8c4173a149017ea87aceb80268a7de1ca6260fd1407d71c37b91f7f16ef2f5d0c42f586fcb12390f0a855ebbec51e02d68038ab1823f215fdf79a6d452302f588baf028e733bfa800a8ba7ce5677a7d5b1d0b2cb9cd703483bcd7586cf5895c2000953e803c72cab2d2970bc5dd0eb5451c55f177ae5e816a0dd5ee214707236576fd1415c8eb2b6b566723996853578170d1b655adfb56d0e7aab84e9762a745538a82a75dcaab8772480de13c6828b41e453c5aad909bc9a6568cde3a20ca15e7b5410b9f2e82869ec6bb31017347210f1a9e1d9f899eae7f9c5baf2a39dc7acd70f7288aa521a4b1d3afe5e5b4e4e44d4671f6a9e021b147313bf0bbf02038c36e46574aaa9c5b860a32e2aa83fd28a3ef278c36b05a6a17b99de37c87276886b5658edc214bca958692e76d4bb2144ada98ecf802aac8d1a3079468a3fe9d7dcee0947e395f123b58bd4793eec14baeb53c7f246e4e9c9f1557bddc3d9ae9c7a1945f77f010000ffff8c9ddd6a5c471084eff51462ef17667a7edbef62828216136259265e8740f0bb879a33016f55af25df18848456e7eccee99faaaf7eaefa6b5674c67a98f02f8a58a5581208faaaa125d44860c15defa18968f86c61a1b314d756592f083b672bfcc8599c680dc9e4a084bdd2ea7064928ad167d6b4b6a5af7259ef8ec1b15600a30ac25b4c2a77bc9831e008f2e62a56279c39263c83a4f2998ac227d95b70c103c9dd4d1880adf9182e9fc01e35c77c9b767670714d97e9add620bf1b520f2e89c5cc7e1c37d5d54e4fe2939008baaf4acd027dc27b4fe7850d3030095a6358f0ddda2a2375a2f637113d3bea7c7ae3a606bb7d0e7acea301d4e0bfbe2b5b8cd26a9603c16b4e2c898292e336ade0f08ca29155ebc094f62becc9eaa4466f3fc720f715699b2c13f6a40df18bec1d800e928f0af381fc43a12ce0919399d0436ec7734879d89a09af8a418ff6a1207cd62909f471271e5e44c4bc0f0e048ec78266b308b908273afb250daa7d8e928dc03ab92f931dbfad0296a06e4cee096f43dab8da54f61e67c2b9cc2fca3cd7c6a86cf8e3aa9cc938053bc74d185248d40d88b80bb1328f043386d4211d4358a564cc6591e35d02307bf4ada32ff613a7618dc9948070e35216a491ffd8c5c4613d32bce3ec3cc9b0171affa2be6651a2de00fe87efcb4acef1f7b06670a62719d7e3dd8fb982aee987ecd821354c019144489f31e772cfcbe13e0f84c770c0f75fa379cef7a14f50ec249e53c2d0622267ce7322c9497069c1f2c9b09169427cc6cc86dd5d988d0b6e096213377551411ea9eb56a4e4767db9bd7aa77aa0403061323582a765aaa5bc0e4c378604aeb7717bc58e752b06ff0af51bbdb6cec774c4a784181686d77779bde37ca6d2aae521f8a135ca97120c020d75a461d896353770cc5c59251345168d6c9e255537341e0b4de77c8feea80fcb7308445df777781269b7c3e83a79531420e1071c7d01fad5e15494e77dc3843aa9e1a674199b2f02a24a85d4afbe0d11184d4a21822c57165e8ee96250e0c484988b7338dfacca815060ff90e2167594517f9b1715483c1a3a9cdea874c8b0f5e1d4fcd69c7a776d6a754e49c8963b7e7c108ae9843e2f0bb26898f11c72690fc19696f0c5506914c14733c44393519c9862f37c0b27ea280cfac01696972cc22fdea11763c8fb02c4bd2c0f61b462a4b38a59e48a0a3e4e3864473254d6c7a81c8f9ce18663641a122f78355cd6dc8594ab1909005517163c2e383ca9131e6036f3d1d8e48082226c5b0164b56954409aad4ac9989c983adb7beec582003ee02264d48e7fdc8b4259855139bdff87783c65db1c0be0f7d184e9a682b95b2eae8b10e0ba8537c60ee00377989a8b321f231f9679374c626502899949620958eab39422c933b18b6d49117429cc8bbee3a9854827b9e148282f0144b948a04a9c5a091626bc2b5c0ce2706543a5e12815967c48a85c6e449dd114c4258adca5e1e6c8ce4678bce7bbd06e11671ee3d23abb8b942fbc08a1e20c8ed25939556eba84cf00f987718798789b40af5724d0e42b50d1d6278956c2983f31bb303e2171c3d9c386dea7a426471c96592d4b90d8dab2f1decaa060619d625ec7acacbd5139f34b68786e084c65398e8b58903085291c27824592e0add9c01aa6d51d17b6771ebf66c4ecb08aada08ed61d38dc5b220e449f2599e2b1380e762276622cd3462ed27884e019f81833f79a3c963d1c58bd0e9e00ac755561f460bb9d55ed9eb2f7521407377a809f701c055c8082f3c7350eae6a16d54488fd42508f0b57b5a589768ea11e15c0108e66ec3325e5b347e10d71d693748ee7d075bf99164150fc0a569463602d6818a08b7da1c4ae02bb2093e9f08f0d81d62867bc48a58cde576cc361685cf8a7a6d9cc7486d0567ebba628df013046ed731c97907ab5e953d36f6a6b594ae08c9e98f6f2422cde7d0c78388adb7067a05a20633b2495e0ff0b71c45b1737655afa3a79b1d190543fb7db7a0a91871cc691527fe609a9302f397a2ddc1e01a3a59f7038448d9571602c4ba623f6568537852b7099ab9d0a398aec8852ab5d4975b61e69423e367c965898b62a85d1a53ece9e055485216b91bb88ea388bb31a1410f4487cf8342439bfc71c87915aa123d900b4ae4538590629f11b16f48d01f3cea9b6a9c1d8dde4c200d4da792f207e9e18d674afae5aeabadb4ff3dd754daab0d1f1071f43a78c72e17da18fa1f5130544298a6339a2006d4a8eb9835dc09d9521659ac1c6a0853675720706a23bf664b6821f9bef3a34d8a619d42bbcf55c2e0eee95102e673aecbc857b6c174bf71a84a847a3bba53542dda7e035e72f16bcf334b90f9218a9cf6691f7d2221ebb2cce3bf46d42918d08e5092f55b1180bd966225133b0e3ba98814a11fd7b590248d6c3408852929c294196c7807f42f8c440665b20c26a80b48be50b48b096f7173faeff7f3c3c3e7ec4f79d5e5e9f2f9f4f1f1e4fd7cb3fd7f3e5e5f7cbf3f31f5f3e9d9f9e9fce29d9f96f3badeffbfeede9d3e5f4e1f1dff5f3a7af7fbdbe7cbdfe767dfdf3f2e5dbe9c3e3ffb5d5e9fa7a7dfafcf3d71ff0db7e3cfc070000ffff0300443c0a67ce080200" + "1f8b08000000000000038c5bcbae24c771ddeb2b2e662d1927de11fc15af24913068d8f2c25c18d0cf1bd13db45427da2067318b9aeaaaaccc789c47ccdffff0f5f5edbffef2ef3ffdf5976f3f7c7dfb8f9ffffb976f7fdc6b3ffef9973f7ffbe1eb5ffff0f5f5f5f5f7d7df8f3b7ffacfbffcf4e38f3fffeddf5eb7bffef1e7bffdf8d3ff7cfbe10bff77e51f37fdfaa4fd837f8120243af38fff7c51052665fa8f8b7fda5bb30d59cf8b98884625ddda63a28f674a62d0318f8b88bd96f3fcb556b9363d5227a751cf87a2ad7bc4ce42a330f27c7f8ca9e9f3fd6aee63eaf44da28e994a7a80a9a736dddb122252cfc77efa004ca4673f3f405d7ce27909d9adfe5ca8b858a437dd3ab08ab3a4aaf0a23d952854397f6934b4694d7003c48dd72f55a1c26f93ecc9527b2eb7d232cc9fcf95f0f419a72feb54750a2bcdb26e730eabce10a7855921a73cce214a75355d161b75ada030ca9a088e77b7ce8ce7ad8636570a2da8499b500e69a4c93386506a13199c446215d167c733adbdc0975b231b27689159456193aa9b38bcb92afc73dfd4e6a0db0333a198f3d9f4e235a9644687f11768076a283a2447d2f864c45189e72e9a443938e925ddfe390e5f8795812eae0486e849e152d291793670043dbcd9621a255c216cebc6a451de34c2e9c0dbbb86321c630e0cbf49113e94339aa6a34395a8a45ce2f976d34a9da14204848bd2cf01201db42884fb38554df8a85b3cf7da4c3aca8b16e5d656a73a4e599c939e8a4c2e24356293ca4fe00aff7a8018a4f8d6d0a8310a019342f2ef4b35e71c80b4c1fc568c4f118050697a6aa66980b7c0b7100df74d83860e872b50460f6d912d25a76e678f259552730c7ccefa0b66dc641a254e2190aa3db4004d554b8a8a5115192e2b1336e17ada46c05da917ccb6c3895345a626b99f9b8b25ef9576ba28b866ab6a2675eeed8812d35c9c7c727b2dc394aaa442886a47de32c2dffb5a80c59e379f81b47b06372eeb6cea25592255b4dfe991ade0466f6a5207fd4425a2fbb4983d5e8e989accc6e9869d4239afb31947d54d4d4c35cfbec2478c2bd1b648e74a9e9a05da2c8fea3e79acaa66a3e7bc179741b873cb86e873056e592174b05e11c31713a80c7072598fde3c12cf0394dafdb47885bb356de07e514430a0f1c1410e81d66e0280b0e9c92edaeb746f219ca5ae0b77f9ac06a98f52fc3a96ea509bdfa86eafea84e9114ee38e04032774978870044b9728177d190b1b4e424cc5e6db09374f99e202bb0023507c151596c939f7892f4894d605c1b9d9119445904802855bccd50e4e4a5371102052774d0649cbcab49ca19b148a234eb20b46d04967fb2428e03477bf8a02deaa22825b1c2a5d922897c858c2383a75411d2373043c230e9573a91806d1856ccfb30615db707e7e5a9437a44fddb1183d3bee0ec3890e470d871d66c4a37f8be1be56db5d4119d616882482a78a3add7bba9ad9d12c8de04a8608e9f61b4631dd46792f6a1ec118783fdea4a9012b96a572e55ff8c495db640f971893a4b5f83cb72a6dd116c33a9d3d41e16aa08b62b96ea7b815155edbaa49bcdd043254214f127def04a9e7f03dad920f0ab3b9c15d071ef0a05b4b2c244f199a00ad1dea706b6ed1088f31c64f1691565461ad261bdccd0f7278e3914955462e89f1023315497fe83bef668e68ae37be9c92b37ddce61e74b8945044c974c4307c84476e5853c5db0c188608533ec9b992a1e3cde7aa4ba395236dd594be454c52a9ef6bac4042c197a579fb5345e183c422cb1578a95e7876f3ef71a9ead6fcb21a3974bfbcca9224268c8cd7a90b6ea1d3c5c579bfeb74b24d2c65c120148f0af2eefc4810f23071890393bd5071f0a04c491d89079876bd8860bb4e075fd6889a2802eb8bb65953949436c669ab8eb41bd7bb302d9604256638b4d136c1f982f4c5c91c1a88e02010ed7019fa7da25a873705d09c1aee199757bcd5856da5cc2b247c2b7170749b37079766f7534a787f44d75361795f358f1ed6e496088f732ddaae679c20ed3ad284481c514902f4228c5116338e02fc7eff4c5bd38663a46bfa66d287f8949e42d3e9c2ba7d459193f96daca7412cd58af886bc9837533ee9f4246eb535826551b88b5e0df6931a623053218dc92206c21428b31fcbfc1e72bd827f9c931def44d057f9f210ce235b32de7ec2488c7be7023a593eeb47b4369f3a5731ae7ee8fc84d8a1fe1d5d25b4b565edddccb056022b3d25710c38105443f674188048555246db8a2a4582027cf9c26538a576e5d2f255c118c2daea14cab1e01e6b15508e88c7032dbf93713b1b87b2abaa0cb10e98871835419996645d4a6b191d9fb84a38b8d969c4324ffd4db9ed63b379977f4575ce11e1accd199d5807a6ec3027b56c1596e19035cc12615e5547a65f2d7b3007cccd088366bc10f21493e08991cd35de8aa5857dd538ddfe74f4c48bddb0c891d519899450e6f61a4ba319a74ea70c5706a9d58c8e0e811cbed89d7e04936d2cf3c1198c4a3d22e132b223738acf7a3e2749a2c2595486694fc8955fc73069f61b9ff6ce934165e5ef091cacc137a747eac69371aa9a2e333bdcd67a6c0eb6ff20026bf62a2d076f9a551bc39792cea14337530d3b807d936d580b88a5510ca25563f0c0a0bf82922ee60c2612dc7942db2dd8a3fb48d9f6b8d2ceab605621479cd7160f228261e9c3a6916e241817e7b527ac58d97dc598dc02b076d6d67d3fa24ee168d985be998ed218eb530ac5cd8e3e8d4aabb820a046334e39d5d2350588d3692d626135ba4bfc7872d5ae1702c41ca70e293e2c1a8a4d95c8154fdc9b012abc2457c0e7b785a81777f08f3d512c514a480893ea626c215a6a92d5b1ec2bd9ec92b28e5096151085233a9e8c7abd7e5c18e66f0c94f116ae969dce70fe2354b8e6f477f2149d6759b50ea4105dde744c4ff6fb6ceba5f34445204cf2e23095abe3a597e7a1b66bdd0b2b9c9fbd215be5f692a05ef4cd8ed1da784cd965ebcab03d2a860e02827b5a55c5e2dc3ab19726e80ce412b05ec0c5d5b2234fdf44be1c2be639f0d6e7025cc306d735ff68f7983dd5a17767896ab015ab4bf7c30f63cfe63ef832989581ac3ba686a3bb1350c29ba68a16ce638bad5a74541586f6633a5b57e4610e1a01768bc4d4cad03c69923a0c067415fd2b70f1b0cfffc730ae91fa56ade0d5275ada560d62b6ad3a33c5a313e695471ed140881c6766a5dc3ac425cda5ef1096b404bb02a70fbf014a09ebffa21989ab83a08ce67a54b79ab1e0e29804abb18d53f4aeddf766682b9a53bbf6717409fb2c3b44769a6fe7641edcb77b1af4aecf02b9cc783ba3239db175d919bea6d6f9aead03283b04da278b273a02ebc673e380a55216bb2cb6620964fb3473b6b1cc87b3f9dde912079756dba9a4397e234b30efaf5a1168825d8ecc658de768f5a9a8bfb7b002c71d5c1f752d81535e1173482ab2d2a6885dbd14046188f8a1f97df74a2aea204774ac7b7cfd3d5f4f9865fcaecc02f7998cb551a887eb40497d145fb59bed26eca9e5a37abec972a592b3f332f5555950bbf0ee2d0aa259d514592587dc7f5866827db83db4a35b41ba5c8701fc4ebded002113d78aebed848cb2ff6e5323a7a723e147174e681de3d27d6118032e76f1de0333ad07ecc86202e7618b90f5425997d899ce2156b3729c5e6f51e13b61c4c5a0bbcfd0d367d9eb0e6b7e945f5f8badd5494f367dda6cc4caaa9c35eb399a314257c444b1f6a0d10d1e27db3f12167a065975147dac2b8b6d0ec7298e1db63c4d1059ab4d36076e69d7115c23c78375aa4fa320d7d57ab3b0b549ea0cd9c46cf81877ad68bfcc283aa294859c7acd2571db1fd73a73beb5bfa7305f8cd5098e5d8f2cfb7d73b3515dc75af6e992cb5bb1f39d6ae7ee4a169e7f2516ce9876a4cfc8a23a6eb55db96f672e8307297be7929fa5a2a5ce8081da0c2b181e26c6866149d8a771b395509c87aa4378787d5de0c51eec837685d875976507c80ff38fdc0174ee2ce35bd9586413eff9008a579d6267eb0ca07f1fb1cc411ea000f69757b2853b5720ebe5e7761eda7a4652b0a3e90063ddd05e5192e9ca061d232d6f4b4f567175e7ddb991ea121e96655c16d5ddff2f20ddfcb50851b3634586ebe429b8b6f3b067c874ddbde04440e7ce26d1cbdaa02a792617c5d69ee2492a241bc29a22357a661a52dd8f43dad3e63812ea8a894cbb3ecb3ab25d3b594dff3cc1ad997346626737dd790c5e66bfe34c15d799a7f4e99dfc3be3b7e122d1bf2717a4ed402fc969b5ff050000ffff8c9d5b7224b90e4357d437243e4472ff1bbb81cc9a8f02e4b07f277aec72961e2471801cee242e7fea1e47c94f3b1f33d2081ec8f62c263f5718c82cd91e3bf10078388effdd9acbacc8dd9b7aae7bbd8c21055c2a21048d2f5db4936012e30fc5db55dfdbb56df38d60674738ff50b3814e2327479ec383b9d5e32bd91164cf75cd7af2465dcd1cbdedd8d16207019c2f27aaa1ae4e9e5e74cc4953a5a8e7c8082cf1ddd6921eaf5040f1f2bcb5c48e22498488060a964ce9f9f696d63d135bc4459e3ca7446a37a8555bd681972bcabe639d49e645cfb20cbd70412d30de8063ca78a88d7989f9369ee766668728c882c47df43daf2de036586cd7066103e09251daae71de0f3a35fbf4f6e75c28710b0262d69930e759e0b63eab4879790a81657ca6b445a5d46e8f8cc69587ed4cc01b3c8b8b93264365a8bffc61bdab7c043d6f00f8bcc936682d96060133b3c683b1b8f16fba0d082dbc42f5dc1cdf475a83396ee722d5ab5bc5ea2181d95d95fb88bf4ce88ef79cc472d1da1733a362504734bd773c04a0991b248fee613d8a71c1f76b5db6791cbc7df96c51c95659f1b3529def6d56a64e28f41c865b4494d88810ce0a3379257fc8dbf3ce098e07c13cf79f0954f484f44a8e1d2757e046b5b27870d73365297062817ee26d54b67101a85f27c4d3894713d1ccb8748439ede4ebf8dcaaa34589be7abe32268bc7717b8008c9417f5d459dddecc47a78db3e6a25abeecdc5e446cb2c5ac54d04de07d4b4eb231c6e8136dc9719e70f44d5ce342b96dc3ae11c9472c12a83b7610069e2c9694127e10e0eb34f97b2dbfc1c02617d1f3bbc86714331da0ca93addb9e8defe5870e478c3b0eef4fe0d9d78376776a729c8396362fb0a8333a2f9788a35acc1a02dac92d6c1eab4f3751453655cadec6ddda5fd84384adf6f0126589ad2a8baf64c07d09789382f78c11db178ba045c7d9b9bc533df55e75b79a331631876c39328b55d844bb9f4a98bfc0fe46bc7c5fc3019dc806eccd0040fbd79ce80e79ad8cd0d1aff6215cda1c1f9afb2c0fb414f6fc6682de770870551d0597f58a7716f99582cc13db7b6837e419d761da9eedba656296f4a72fcfb636dfc8bf9fdd4c6fe3d3efc3132002a7b961f26c2c1757207df30bfceaf06bb8f93fee0e210ab0b06c482f81436a81c317e96dc874f09bb19a1bf13e82b77d95219864b95671f361e8f8cce4f2e6515c045895906b62d6bf1ab2c305f5483c1c32c90f1f2939894f1b3991321f6456bdb1d2c453164fcc231352e0f113de15ac2f364cdb1e2f1a379fa6e1650d039b170ea4b817f9bb3ba99c06af83fb904433be54bc7ff8da687c7ec51dba6fd572ce1a37e46b5ebefa3aafddd66153a9d4e7034a2aa8601ae171d2b8e077fdc3da7837fac45ee09e9a10d5dde302b5935a16e3f5b61e562930fdb2257381a639ed2e44631cc762e1932bd180a6443e1ac0674813caf0de08207ae6ed95bb5d2efcbe23dd6ad45f3421dbb4d24a3e35e5a1b78a3e1979e367bec0cf72eaccbbe4377c8a1e2d5ef6747722939735807427d1d9b9df6629e7f0511a0105b8744e4b87c611edba59cf42cd55916a212f6e2e099ab45187540ca5e80c6881fc1d4431df3948ba8e130e5d2f3607cc553935b16c83d91053ada3911627d05926ceced3a3d5ba168e8a49e3a7a87e9ac2420a3ba847fbe56aa302fd8d69a32d1a1961a5618e1797b594b13de2ba3723637c35dee52ef3b2e2ea98b1bd0a81a8c0c1d5f880723260f3bf5eef672771f6df2c37af37d7c431721efa11964213998d5c0d93e290dbaa4547cbae65a2e7e023778f2c43deba7c2e4fb7db25ac6b8954a87eecb7bd5bb42f9e967ae2e07b9b4b3af3da573b9e41118c6cfb201718a0e2f697b3671f36e3f9ec38efa15b6432653c7b6053be297e77390281dbb528cdb06ff558b97e5c98a32516df0857264063854ce1db288f2cd55c519ac504684ba3186915a63be71aecfc964dd828b1b9a55593808ed590c86a487f752653341600900072727f3f1d704a88dd683bec70de69e0db61b43019ec4fe04f827e226788f9e0469268e3da864f6a7bc0ca85ebdc5fff5e2413c5a4050920e6caadcf99818d34efb9a49e0309d8fc82089ac2cbecbca6b9fe2060c47fb76d6551b330fd62f1380b4739ecd54cf2c9136ea4cc947c8334b4e3003cdc07f839f35b6f994994a970e1202b029947e9f4c20de62b4d50a7c3011e317121ff2706cd91ab7b54667a2d67ae7f080e5996027dc9b12eb53b80a682d16f613319790c7f910370486cd91a93c9a761e98f4e0a8e63f0ab2152f4e685fce73108baaa57519b29ab6e05c97699e0e2edfe328a61592ae49cfef29a97e851fa9b47b441639fbf8e62c39a4078da03ad38b1fe015847ce6cc4bd27f2206111fce2e44d4a692c174402c898e5f694b12eae664a9b27de0366a1edb14fa6ae54b3378092ed037519709571d919cf6dc8ef995c813116772b67fbbf8de030d90c516ca14049fe010514039e3371df985a2abd098ca4e3acb6ef8736fa1856fa6ed442004c39559e9ce3329186d8df3162523e2f53cc29eb9f9669fbc8c6220b6c6e84af25e3429bcf1560f939b33299fa06bc55fa2b036f263344ecc1ca66405e2ae9e208cd19798ce5706bac7d48e6a35e21165c4a1c5bdb9afe0c27c176e77dee80b594c5cd8033c1b4d26742cb0c3f9216512d6b1f1101753401b8b56ec7f9d01fa935ceb0e6a5c3cdbb7bdfb5386dd89f12d217266bbf792ac86e9949f708b46f14689201f61908ba1e6134056925f1567b758a306963e3eaa30415ce2155a0f60353a37117ef5733d432065d9dc7b8e49d857cdb8e85a70da5689f08cf3ba4234818e6c9d329c42f48b649e41ae91c8d4bb9167d2509db20978ef543623d6a4974869405515bcb69a27ca54b210f67018ed35a0156976e929b5861004ff7e6e0720fb9c38929869e719818adbdb5c083b5b13a9695403e185d89959255a860119a06f679d638b8706708e8ef805a261a5d17050607b3c5aaa8c47a362e238f6f993e512f1791c8e73cf4e76a80031e2b046152beeb39bb3419d2b6f9b05555d4c22b117cb41d87e58f8a63e97aced75690069b6fdf6c6551d12d66bd03b2f5a8003f067c3d7b44d6af5bfe50ebe461622cd35b8147bc2574f4978c48e588731f1e703b08a8b671322e463258eb885aeebbb6666cbd6ed6da09d7885279e027fbf8c0cff579fad160f8e4a42efa5dc38f3e49639eb869da17d90fe18b36d4c81044044bc80183a075d8808f2074c1d83da8621708814382d2ea02c5bb23e1089719422ba392a20f26ced1885fef8f43bc738c5140d40abb7f7a01412201bf7ea915cd039e878b843ce899d4ca76675ca1c4ea0b34faa0522ba9ab1391b2edfaf4e51bd46ee0ddb074e82c4ca1ea600862ffd0e327d423e6ac06ff3db54eadffadf3ec8c2e3990eb41056d90da29e26cff4813580d95680324ab04025671391a1a2976ee9412d5d66c49c92fdd367c5c8d5bef3f15e1d6090a92105c5f46abe9c36c25d5cb7177b35ef71499f4e7242150e284ac30eb78db6826db86b02b9909487731e1551029991b8c2dfc235904d12b6def31745a37009e16a8f7bec9a92b338a78e4ccaef5acadde1ae2df64b530388938bad71d60a0fed073a26cfa351d1f12187918a64799d7cc82be14729d3f933bd4ab9f7711636fe06595e51fc6c1f61e43090273cf6db33d75932a5983d8806fc9d66f3f1230405ccf0cf80953e14484d21b7af099c2b01209cdf4c142f019c2ea3136b038a4305e9ad4a039359029ea1572efe54fb2132b9488b84032099bec7d09c99a1ab4df30e8e03329f9d5211de2e94854c3e164aae5afe063bc9a1b3cb1bb67371440ef24a794e757648aec73526f8aa57614c657b29cdb0b374bdeff22449c6f0e6896ec97841954b834dc7699ecb7f11283fd764e34896483ee46dc42ff683f7240a13fc10a91a7d16b79de6c006d8d5e0b0470b195c916ae9fac4bb2fb5b9c74a76edf4f6e21628c690726c3c2d00802978b5cf3979c4e173354fe137c948efe66334a48d48eee96ad4a6978b0e4f32ffe2e1786641cec1310ad0bd92b285a4845e2f6b248505276c1af0135db4982a982539aaae8ed6eda0836879dfd03325f85e4d7aa7a8d74812ed90fa3c6a89bb73a3806806a61152245fb6bec8e6dff58cfb1c5cbe3df99d1498b6624445c5c646e081eee6e372a35d9522345a275b07e74fe7cf22fc1c979c3b84c66c49b36fbcd4401abb8dcb87903c4cd88457bdc94c175ef5153a90c3c86b0b513417eefca8f480d703388fbbe805459fc3e8c9b693983fcce6b51709078d2e195680c694f2c33296aa24ca4ca2aafde4e27ecad163c8eab4014fad4e871c0bedc8909bcead032ce898e2fe764a7e96dc20ab95275dd032b9237b74df966b05b509a76bf18b6cdeb74a54090a8b39d9e8eb1380e8497cbfefbd5b346e244bca1b281c89c55499dcf53e0f4cba4412baa47041096ef1863a7a27c986becccf623c53a29d3d4ecbfd09e87bbbe2b29754be4a98c0647c892a7ac98b74604b712e372939e115d823ca1870c7b0324bcaf879de0ac1092448fc96b7f32042907f2ac2afbea1d67f3f95f196311a0cf0bcd3e1c8a81ec19c211dd28dfa4312bfb1b87e61eb3ee2dde174797d15d32bc346d7e19b07cf5516bb94fcef8911694c27d971901af1079ffaca363ddf3004eeba64675ef817e037784d97a46ae0e252927a83439619eca7e613ce010588bccce69a16856ce1f2d100ddb6e44bc5f0cb2467ee6e45f535dbbfa204de7f0a258736e955b3d9a838d856698f2b9143e11b2e14c18871ad45ff295bf160da90f58b9ef5f9da4ba3775657f551c3ea4dce328f4a4e678541385ce61008a3ac517a3cb78d82f92c76e0bf2251cd874d0bd1f1c8e1bc7bfadb9cffeec83ad6a238dd98df6b17abe915eff3daa3f19d48befd7a91d41ba18eb2432a8675aa59228069c21079ccc7edc4d77b89fe0f0000ffff8c9dcb8a654976447fa5a97982bb6f7fedfa15a149ab0ad102b5261a0884fe5d989f134261cba323460541919971ef39feb06db6ecb9efc60616f42429e6e414f5d23b577b93cbd39fef3d629113eebfc393f3699f11ec8fcb734effa72acd52fcfd3c0f67c16aafef2b2fbe4d61372120e2fef3a54234dbac3e5c5bf378d570941b3970364ae19a101b0e2de1f4b15c3d5a53114087bba426226841d2e38d81aacc0415ad8e723fec009d51dd251ed2bd358fc8d63cb3ef9f4d696fd62d0667df904daca49c237a71ff0672fa0eb07422261439d7a20944da1b4a49687c7d765d0d4fc9039b227040361f7b2542c16a8bc393a0a54ba06f645f5c8e7f9dba9a3226eeed3d02d7933b2ebde944e30931a163f6e722bf9739a28fd36495de7771ba89247632ae6fc32692d55fe15d94c28a4f57533484a0423095c18571f58e5b53ad4abae17a530f7edc05c61d7de2dab5d4c8e9626a686df50b56d703494af00d03f7618122005c2131bb0b0ce1009a3dff4384ab82a6d29a3b59ec20350e76ce39168c0343e45d6f0d398f0c727a35a3761ccce83dfc078f688d8c451124a7da9710a9bffd127762110cdacf1bacb9153a2b96f20e7bff044bc3b6a6c728540e3ad48d7ba249819377c967349986637c67617d9ffcdc28d1210df3d7d79dd0b7cea78b62f2383096888df1bd03e39a0fa97b28925e1978588d01fed6351d80352b3455c4a942adabec94d380c8d53b24dbdf07ecb38efff5145d1ae1b9333348595027b5cb682520d0448329b1cc11191b91fb2534a227399dccfb5c63570c9c84b5412593206d75962af72e272b3eda1a8a754f18d8778fa8df495a5ffa428e07755ca8e85e03f192ce2b6992632860e1f6ed36a1c568a48647430b5bf766c2b5755c01d265c863689b5eaab5337f8474a9a738d3f56279f046a3a32c8efce6d16c85e359b725a49fc3949f247f457e0ea187575ed6af07778d6648180c0a4f54e166122501a56f5c979e83c240b9dbc111674555c19ab5797ee846d9d442b35911949fedfa2fefa717c2d940dcb9113dde7f69ee8ec1c9d6b4cee33c17761561f3bf2e6ee6af63ce5b603a9f6829089be8c45d427d91e9d866ba53559f7d42ef7e2b9e80818a9ede4e79201f0198f2658d1d679645a3bdf7fd3ce69dd5113769c786e5a74769418d928d5ca773c7fbc37f3efffd9fe7fff9eff787bffdc75fffedcf7ff9cfdf7effcb6f7ffefb5ffffce38fbffdfd5f7ffbf8637efbdbdffff8f3bf7efbfd2ffff7ebfebfffe9f7bffc935ba97579834d5c87dd8ad5b7b7bdc2a7674d4fecf6874bfa7ef34f47902f85b5dd8cd00634b11407d82d21cae716d0a035e2ff1c8e7d4c6b9b9fad00b3d39384524c3adeedd9c6463b8afc657b02a052b598b9c1543b95c8793ed43bedebee06c80a2489f0e3182aaaefd8a3ccf2bdf744d0fc20efc97cee2afde50eac0960f5ddbe96ea11cdba87064dfe804bf8f223408999e55225702c90ceca941a4f8bdff3afc5b3212a2300706a10eb5427947a0e17d4644844325841e80957a43432b558fa44402dba38ec77e5ebdc50a82a01af38685bc1494c36572cf894dbd4a8c92fc41a8eba4b400edfd52160cacbbb827da52aaf860a3c8b0ef09e75ea72b3d9e3bd4bbfacd575446b648dcf35159ff1a16d5f1b947b4d1514ad720171ed4ad93b975ca8a8972d31702f48557d31f892057a929c8285dfaeee40ae890d39e730a1defb30427deadb86df4014ca485c82ce1fa060d6001249d2ee2dfd69db788c5dd1163ed6b977dad6dec62af0fbcfa152031ca3ca6ad30f0cb5e5e47c57cff1ae282ad319179a9e2c661513474d3213afc28e748a7b6694ed3b857cfd1a59113f149e56161d67d07add736c28e67a3655b1076a769ff2a03b755a7436e012b24167a8f2d67684e1bba86570480f1d657c763263f8dfae6648077957159e98e348557e15d4711d37c77619ffb6d3ea58200edbc47aac950beacbae9ed5a94b5c68e7acb42e7612ee02e292c2d1d1ce24056b7fd6c618b9eab755c3e902ac2c5e03d4b835615e5475f1ad4895eb50d5de011c88b42679e75ce11c2250386150ef1006916566eeea363d1de52e9c24b19e2b042f951488088e85afb95ba44a1bf4968596a91d0c609810360482f58ed45be34f620f04be251fa59f9e45326bc421ae4c047dda98ab922f34bb66a6f6dacb92516987538ecb83ec937dd16792d019826cab243a258a76a9c47a5ed64815f83af828fb2698591f22833772f72ca4958b53b4bb7694890ba4de854cdc6b63ee58e88c2fa759d3e34a3aa0392077c81a8113b5fa5236dafab4f4737c74b8f66ad0253956df24dc0dda420212418943f344e9564ad5a186a4616640a86d85edb1414876897608d12e30c6765c4315b53ad062a4dca76fd8551b8bf7630b1b92387f676641de59e2d5f6c4821443a00396da035d020c9915e0e3e86316644e421a810b2c6a359d98ee2a29502b91f07a19c0e097ac0f93b11886881544a5535fe3bb32cbc5ebdff054c846928bfd856288052864d1747bc7cea0a671af045fda5adc81971b9ed9b60e4b0d188f0de0a3fc5dade37caaa1a017a4d59377e058b0c992e4d2cfac4e100bb5214d5b09be38309c96409825a7f0307c8d952a68c98812c4e1a81217e0d0913209434264ce981e7dac55e6695e2243a040f8b4d6a88cbac913462ef42e9f33d50f82517c3a9fd6285d33e8de1699db41417253a1c02514d24acc750afbd8a4e65428e1da4235b27221772fbaf26e12c949f5c1162fb4dcdc9e63d1791a634e0da16bc560f8247fe6c4e85fc35a479e68d1e4f4a38fec0e7bac5ba7200c09866a922b322f3d0378f12999c795e56cb5c2a05cce4fe19e508d01412c65cee5f0a0d313678b430f98c1fbbe94578bdd56278e764aa604b7ceb6e5aa41b0714e70408f49bba9d3ce17690dc790281b5d916be7eb553db26e9659ab717222757bf54ea4e21a347fd7a9776c8200b9d50fec5ecc396b07e033d5ac88d475e46c93bc3bf946dd60eb3bd5c791bc7ac7f3c130efcfbfda13311f759720a7b52ec04895dc01a8ad87106efe3d08e9bafcca5c540b33a9f36c25f727aa78faccc908b161ca9eb385ce06f3bb15e1d7f590f8516ed3f1ef3ae76f5f11141788ed28c1361ba8fc1acdb9c221573f04c043222d80944bd5db3ecf5511a2a6d83eaa99f289c0bb35b530c7a55abc7903a05ec8855cd4ed325cebda8cd26f318ce011d95b045e3f9f652beebdd55d7c79302d4ed41bb4ffab90cb03cb7b0cd1eae3f26e2a649a7808f3d23bd9e77112f9fbd1720e8053e56d28398866588503f8aef24d1f9c4a2560499d849b82eb801ae2703faeb160adef228734383e5567e253825dd100ac557d92ee21450662faec0ae442635282ccee1df2a72cb7d95571f549093a6552549765034547b8064589ab4309a2ac71457ad1549f27e4af9ea62a0d2f26d6ccd0a768ea3f0804bd04852905d6e9d1a8d957b59af9e31a09c944bf662541559ee3e628b7b2a664176cc1b28a3a857ad65ada62e3c58885a89c5af8102d291a3379ba333b8e6682c68db9507b28eb223ae45a3b2e6f1c17d619805df09af01289c6e7717b917f93b1768d72e9f8cf3abb2f5ab1e448f87e1af2e1b8695141f15aadd111de0527a824dece3e1bbd5ef2177700a4ce4065e39426a3f8c5e8a881b0430eb6181ec0f2e9c2bc69e553f708ca3585e22fa8a6c998f8a1065815c2b7b4f459962fbed242099593445e92d89506f7d3e938003e4ef2d70440aab51d1d1d305dd678e81e5a2bbda750a61b59127d49d2e20b33cd508a8af155150a12db9f022cf95ad17b9dc89ca9bda3630168435e4bccaf7554f6638b32c38b20264c0abe3c8b29e1b1a6c14a6345d64b40bb95e59ee6eb88b46ad45458bb3c36679142192d37007489d4e5e22b15eed4b7662599c287059aec0cc61b76b956b66c24bcd7f1aa42082dcbdb49955a93efa37f7f4012c02886f310a63e5657676f7fbd4a4d46f13ec2eb88fa766c3fd3681eda74f5a80359e5362ab2a755bbf5a86c935d5117316c3e6dfaf5117184e1bfe6aed3ebe222524fe786f76764a763798fb5dc121b6d05ea0d84fac84166dce2f3d2626ef69f4d11f190ca55712c23f6aa4271c3b21a0ac32d8442de7437679faee3011af428be37a702f6987d2876c9922d31fd135a672aa092e42150b9d186ab998acbad278ae1f6873a8b2b34a1670b179fd1cfb0c85e82a9860b9f7549a6c32c5d36965a80a6590a6041c41eac4f3bada20d93bd55e70e06cbd7cab9b19bf433c1f249d10c378f751946dd652653f8f65dbeacee8cb9db99bf9e7c67e789f9a2fcb5ae7b3306475d96368802433dbee88e17bd2b0ab4bbab5a2c7d0892cd68929efcd654f6c5ead79b9a11fdbd48c1208d38d4f66e903546b408a441d5d1d5489bd96a7429ec8f59bbc048db857d739e38675f4fd47bce641548e844d1015e5204bb7b6ca76d0d001d342b8f34dc1bd98410f3cf26cb76bb7e285456087e6d63239572bfc2eb6faac3c92a9f4f5f0feba4a0cba074b9c403e13b1c2bcf2728933bbaf2ce9b35fcac1821908053c94471219945220e29a87a34073335b93fdf145faf4f49244cc5f46029c629dc1d8ea1132703aa423ff31cb88dec5a7a3789080458ca8fb4b933b32f1ead57ab41389e57acb9e2f39dd90565c5853076eb13137721c7e9fe99c0e40bd43f366691bb362f72564d004b4de6b8581344dcc5e65c547ee40ef7dae46774daa6d0fdbd81835815ec5aee48594d7e1a2265eb5c1527fdfb6a2c1d133d677d8e01be7c1703677df7b49f4d678d70748cfe490977b5206d950bd338f573802376b9296801db80009e448577c49e865548c9f28663b149598aec84309b96307f5ab4ae3ab0f83a6858d14af50fcfe7752fda49c9797719c9995f70ead4849855cd6b79e22ad5cac156e8c34f304d4e313f982a5216270fffe2c8f38e26576780fae036207937bd2bfe50ab0d82148dad603633bd9767b24828f3039e6ccadd2389e510d73624dceb45579b4b039c630fdda9ccc7131246833539b1747cf67383006376c213f35484608c2c775905d00ef99c9b3b9d75a141ddc7cd6c58d47a3b06fa83f6e7d3e473c21402dffb4695959e98bb8814e1e5aa4ad88ece695bd778d35ee1a189d6e63824645b5a3f10e2eb9ac3f32de748fff95afde8a8b2b0b83151e8a386db9b50201b28d1160a7041b21f7988e488706d569bc8761c5e36c6cdf0dd9e8fe8e241495111fdbb1d226b424b1765d5a568a581fb7458d4ca35162d71f72be83acff265c851872f5dea1798005ec9ef8ef951d9336b52d4130310012209931370a988e17d1f3ba6ece64eb5a8c272bbe8a3aa4548abada90e070f4dcbb106686c22f381e0a4a7c0e7f752389893d4e6df1255789e7279583b5d37118c9dbbfaa2e07b1afd5653db1a2c2b39ca67dbd29b2f6e0378cc830e806b49ab6f94f6b34c8b8e2f6330d629f10a67d8a64a781e16e402878e9ba2ba71cb3a1d297ee8ab4375899da179e5ee1ca9390b4ee153376873146996bca3fa9da9ea75ec3f1a458efa14290190d4672ff913f9e076ea962292d5cfc22b2b28dbad0bbd808f65af9ead72e635523d0ffe19ca2f8063ebdd73ae394c29f87543f6c2f9bd04a421b9a4e0c1505e63318f921798dc5505db69b98c2d1c809f73b49713aca3cece02fa936ae5c078bcc42404b3cfee425c177bfa72d5b88f5bd4bbb5d1fdd7b31231d0227a33d3de4109e28ca1c3e76e0b0089aeca049c52c4f0f2c52642830a0cefa2703a157b57361ea8e7106e2b21a268f8527a25dc10a31a92da31013ee8a88ebe90a2225db846346e6dfc29d5b82a0cfb458711b0bc3a32acf71a6bc03fa4c999b79776c1cddc80a4aa81de6d10155d7374d7f4e4106c4e848069e2e585091a8f5e0241f6268a0f25dac0a428dbc0e0a667b2fef353753c6d3c07018dac0e6153fc9c24e653851f5e9b8e827215a19d420f36edfbd739d60792b7055ee7aa3c3751c9b37d0eec5fafed8f5abd01fad3ad6bcdf8d637f0d102de2b0f1f45c881094fbfc0844899090f0b3f8356caf1dd50f6f9c27a5c78d743a42fe8b2bba12f4e8e12bde7ae7dc84f8068a40a3f07eb2904a942a6ed90efc2dbf12ed7e7d21f680a72d5c329443af3b7b1b9e3c91d8dc5fe28a55e232a84e2da08a30a2c098aa48c7f1d732b6d4b1bd8d5abd8c0cbc8b36d2b45bef0e6de52bd027e6e674eb6a6996cfc24eba683bcae187ea5134b93d3ee96735f1e106426ef5392d712b17431b549d19c72d4a12da90b2be8b2b3eac56db51d3d4ad0d4aec56ea1ba2a1f9c1b46d66ab81870cd4c1695c89fb47d270b050012b54ccadccd84cf6e5587e2d471faa2f03b9c062f6f678829e10d9e97d4e505f60dddbedc9458e53f9f8e81bca98935571648474a2f252e0e0a92eca4a1cafcb5af1cda81806faab7e9857d807bee8dc1f77d50a26618bc7b7224a373fce2a0949853fcfbea6d4cff5064dfb99ca07de8ff61871e7dc38d51724368fe2228d5e5c1af38859b76fad579ae1cea00fa96e5a8dc98a4abb47d39ab4449a0e9329fae94716990cc9c3a0eb8d679be5c3f63ad8346b1f7337a63bbba90a30df63911ee1692f443a0043f0de9c80163fd67d3f5fb47aec51c7ea424605c376215929a1047faf51ec0733576e05c1c7c8a691d82d177ee955fd7f5f00579d63511a4d788b50ef0cbfc46faaa673248b18d6d611feca7d0b6a1e4fe34c7f98ada4e353be4b7a63b3c034c4d8b5a60a8bb47360e7964077318ef885d092553bbe6c4295835ee8bc88a2967b85ba1ea5a7e8957f2a24f77a5dfd3f0c2d02f78a99ae0741edcef7a1e50c0d1b32ddc9471247ae3be6df9f758d5eebc3c675ac5a10f7c006d7674b1e9779a3ee31c99c549d9bbf6e1f0a32ac517534fccfaefac8a47bb13291657c1d94662e9297d9d2598715d7db50e54dd3bfa46fa25ea92048aabcc6aa703c3e5f03ed032a78b3af9d173e6c454562b6019b8129ba9fc23e6bae5828cef76cce78b1c0378fbfbbaaa34f98e0b2df656ebf766628122176cad7d6fd5ab53193bdf8897c4ab8591773ced452ed0c856e74781e7648cab88dced1710f00ebcf97d8917bbc91e9b973f60cfc80953cda1e3fa2cf0a2fedf1fc654abf5827d6c4876f129d655968cae170d3737dde7b0dc6b63f03ce07ddc238f86cfedc109785ddc534e76f312a82fd165c615a34f6f61bc07abf4f555f7467ec160106f622eca1de35289db058d28ec0f153a115f57b631e17ad7066d29e0af5ceb63ea67ee02ab39d134aabb12fa7fbf582b152bf608d425f2fcdcce828f8602d363db5ed765aa70d76aab2b0b9e3799b814d4a0e7503d500ddddd8234838aadac26ce5453e33524dc1420ed1e4666b2e8110f73b6018edd5d65eb43a15f28b3c76e05b2a67cca38fbecaac244372b8c05a3b5a60605a84c49db75aeef693d8789f37926fd1238d7daa07a0979d1b66fc6a3cc913431d5818e5d7928e602b178a8a0de1fb07b58732c1587345e062b3b3a4e272970d94dfa67c1267f776aca417ce97d540d34d8f3f0723d893a94611d60373b4d7511e8594c5e09c5d5db25c95aab272a9a12916eab15b0a7f19aad94ae4f1e11c479c4ac51a6576c53807d07c5788ed516d1b2fec8094462ce2be5f7dd0bc791fac21a32b7d16c67510584c619b67ae9cc113869c7f67e2a5548f50d3b635576bbf350ae9e038c3dc5dc112b13a4b075aca85824c437b0377fca8b0d8c5c0b1866a96abcbd3e313796fb3a575f05bf06d7caab2fe8a3736fa1f0a8d7c14eb553d255bc9b68d12e3023cd60fc1c07d57a5961149383134f9d96ea869c84ba38ea055f28663bbadeeb6769e2593f1beafdee76aba9a3179ed9a257d1fbd79407596c343b542c10c44275f5802e9425164f07b5473ff663f1dc357771c082e6ef90b1c7cacd09daaa0574ea634887c4a88f60041201da1508b29e73fbda7b73e40b30a50a55df41fa695ff1d560f786f54422e51004929fad6eaf4c52f58c89f9e2147fd6fda082d2c24f5b84be280be6530543ea0fccea752a4d8c34ab8031ec174772f31fb0076fdcb4ae6319ca8baf96ded397e6f8c5c3481da4692bd988a14aa8008dea575d3b03d1cd5aa62ae650e633051af2a3daa9a71d5437141d197060e72e0895b598e372d26aab150e296bcfe2a8555d041a66f0bb79ae5955091507f9de0a195a29df18d11ca5cb7685c776b70ecdfc9ecffc02f5a4904cf7ceee48017b137ecd86f227e1e0e642c2b39d5a118f34294e73895fa9376d5f0c7cba54ba12acd7cf4d905a85e10eadad2b32874dba648afcb27de0de360ad985f86f6bbadd2654af02da9062844efc50a0610c1b2c45cb881570001e31c51fba89847999439c03474aecba2a26fb72cdc269039def15262a6c5f6a5f5cac387786c87522fc768664e15dcc5d762f9fb36c4cbfdb1022c0c57415fd156feca93dcac5a2ada5d263ff7d3726a3d66e39d879aef3f7c4ea37e6bab4f2aaa90f9b7955f26110979862c161e118abd86ad27be829c679cca3ff57b1f9d1b00feaddf3d36a30cefc2e2ffe424cc2e767b537f10a19684882f5af677027e23e0bdf28ec668b14f6921e6b55ce797e5bcd9c2a3db1f755f13807ca42337b4d2f397c63deb133e1961d43138e0ea5a20606c95dc777486ee2d038d041e696f0d2043968071bcb3dc9fadc5705e6075a4791bbfd5d76e2d757e6e2a8ea2eee98152ebe182abb6b1cd68a8487271828a35f5ffd5d522117b4e7abeff214b5e57767d16b4ce4dd2297c8af10fbdd01fcebab1168cd764ac7fd7b6d9afbfb61564ac224822b5549665fc18ae9012a115176016858a196c52946535c8a34f3db245f1300b566e40f5e8e56d7f05bf7014f157fb673642ea7545d81b64da9363cb11408ceea78262bbe19aeae43a7df33f6cecf6d576f827ed0f9da94df6f30f5e69a7562eab37457bb8011f44dfc60ba4d1ec757ecdcaa6ccdfc096b53f535e2f699c03c5bf316529dd43401f181b79a621217401149aa471f0cb9f184f7559ceced8a6d2ba7dfa152b531bc62a3a9af70a25d313eb7debe226c87c3ed46c215562330ef57e14a051de4ea5e5492f973edc9af2b7eed3dbe8edd5c44187d170fe654c191e890f9227438367ac9844e8e0d3ebd1e16d2d99d68f696f62e371949d18bea736bc52b3c7c5f975a189993c9393c4728c3f122b0680eb5de794da071b89ed153db8d25b85d601ecf7228999b3149955899feb1864eca75c6f748b84be9c9e34a930c05efd51c05277af94999c25ae3f4aff9be6bfcd26b16f0a37533e8196972c07a0029faaad39d663203c1f8a3ea3285544ca8ced53abbc44693a7e87b9351d7d24a97d7ced3938e8cb206e430f05e68b55af0d9bd768ab20338384de5e078d11074ddcef47b013578dbe481857dec5f3161bfa089f1ebede9042b16eff2a96716f8a28c18c5dbc1740b66ca1824de97e2c8919caccd8e6ebb91fa0eb626dc84a3e9fe7289f554e5ed8150455d15a4a750cdc4c21838db26b043baa9adb9e4eafebac6cace39b3043a8a14d248c269a49810952883ab3d2be737f253de3e0d13c0627ca62cdcd2c86f93904a2f7866595be840f772387ff191150fb10501ad59f7c411f142fdbe6729ead0e2cc363e8fde7e343036f72c485ad074c5ad968adfb894a4c4260407344ffcfa4acbba468705aeeb81494d68deb370ea93d311fe0a21bb07c2d634377dd07e17d8537df5cf90f3b7449b835e91cb271cd9b791b0c20d95ac8b0279bcc681cccf1f713575f0da2e1cca901e0893b4d1765650b2d415b69dc4ddd68d6d3dba9b32698a7a6bd0759cf4e9aafa0e36f30a0b53bcf706894863468773d1a7624f25ccae9eca8a101d09c35de9cc039dbcad978e3392568c44c6266a6af8f1adfefd1426c98bec76a456e6f281d050d41fd1d6dea440239836fb00845467d71cfe60e88b2d0940ee281b38256615de9da8371792a4035dee6fc8c6be4fa198d7b853e90fc5a5621eddcc49825923eaa444a509078337d90bb84c39e4ba9bdfe456dee17f8fe1bad554826bb18955d1ce6055ef1e15752f7df65670d6526f07ba4d917dbcce37dee756470a5413dcbc4a7a4be6eea6d3dc4bd444391f1edf66fdd7d7f3af96631bc9fb7f010000ffff8c9dcbae64b975447fa551f30248eecd57ff8aa189dc0d43062c4f3c3060f8df8dc59365292378717324a050eaba37f31c723f22565c32c1bed205b4933c6b33ecd91800ea0c9bb2b24fcb3bf7edfd2f105b7e504196246043d777256c1b8eab6399d33e26288b54ff7cc69c06f883c963953d4e11270496517d3c521ea7bdc218571f75a913d0d68a5f071cb193cc6aafd23da80b26c9dcfa68dc8253924c355d0802f69a3eedbcaebedae0a05125cead6d6c349ee16633dc6e69a968cb23e888dbf36129d035cb906dbbe5d64d691c7aa87f616797bd7c8e7f5386102f3a75b8da16bc61531043a12ae64060ed60ecbeb5c3f3978de3f50ab7034fa3507c56e1c56c872b463105da7d53c8eeae9a137b126c3ca566692458aee631b3d97015d830fb124072e64a96ec630695af891a4947b9edefe2ae9806fbbd67375c4383182c1893f738095b577a064fb3fd0ab7ec0c682bb3dbb6b2d0ac5753ab81e1b3f9ec5ab5988f58dee717d07ceee1e6a789457b3a24488c115fbb2c938a4c2d10739372ebf11704855810c28d3b0154affa5e29462b97c5c4206ad680f957533ca738aa13cb5ce9639a1af1ea3ee741e8461bbbf2c23c3ee9ce3179d9cf67280a90d113493fdf7d6b67d83f9ab60bc940d887ba94cb86c48831db32f9516c4a84f7ef7c403649fdaf0ea2cbcd4065acde9ff77be451f69611267f18d5e1f26d8f5c451fba9b47e60bc5b2bb80cf1f06931b4d288fb0d8880d3e545beebef6ec363f2771d5c99f44f2764d6d5d83b9833ec5030aa2aa5caf26f9b6510fa836062ed5f67098bd32ed0dbdc34b38ea87918b36461ad5e8334cd2f2dd77c12f5470ad9e164789d597a9d96f095609857edbb0f70b300202d6a5eccdab9b9c7ceda156358ce0aba793e9a146cb2393687d9b6940ca1ae980ee49c6cefcae9f7e19e2776be3035500a1ecc3b23c6f4f7745fde07293046ae06a3d4da4f8795d457d4912f3dbf2c584df2b7532c74c76dac8fbd4387538567ef5a2f037d626759b151d328e3160ebe2c2b2a9062253bb320b2ae4f750d4f3917307a9c75e93a95eb3e56964aac63a62378f3203e4aac806267eaebbbf1ab9198bf0284c3348c7b46eb432cad604d79608d39a3d6154a65a9be74c73c5960909a218c7f5e2f4ba8a6dd146ab0d0512daced05c8c5e9619f3fca6f81504cd976b922c6a5d0bcc8598933d3fb1b5b509024ba5c15ca145b3582a6ead6d620ea9375eeb23d7692d8658aa4579c55259fd0dabdc382d04a77adc660dd2c88cf1d1f6aecd83bc48cc0ca583edd67ad12786348761fa2f70c0fd02078b598bf3cdd291eb77510f02a08ce6c7f55c2741eef5a77f39fffbbfcf5ffa9fd71ffef8cfbffefb9ffffa5f3f7effedc79ffff1d73ffff8e36f7fffb71fbffe3b3ffef6f73ffefcef1fbffff6ff1ffc3ffda5df7ffb17b58c0d7e696d56fb303b2377ec4c9dde65e7e63745eac93754a412c7a81d8c00cd14edfc3474a57b1622e64747539d343c3bc9a92a55c40f1dbb9b3c8cac6d2b3e1a0972e1435424917645723029d50d24db323c571a8c27eb34efe4c3aed7cd2723d1d05cedc0addbd2470b5ba9a405cfbbddd9cc0ab0f3a84eb7f65254be015fdc6835b364d91ef844d17171466002ee7a09c498175a41f08a28d9a011506f68af60346e1b1e267fe142701058c595a2ec5e6d255856b3829ddcaee9eee85149f05115c3e0e2d61c12b67fce8e2fc3a273302339ee665138d8de840c8aa608c2791634ddf684594cd0d7fba1fcdae22587ae02a8f28ad52db177ef16b7b1e0ec1915a08c886647011d35de302d51d2000cb86fd7b23f44186e2c8d050fdd21ef754f1b952eb8c1c6d9a4262ed6b31c4e88e6f2250957db6c84abd917c38ec894e14cf3a6ee37463f9b1b651b8dd5b5c18d03afaaba0d9afe0f056b69e7cd06c5abe34081eaf4222e9a240fc782904fa2b781ef8287c8e6279bebd24ad7b8294690396e7b087a7443758f0073eaafbc8a73f03a37135d1d0646db160f92bbed6967394a1a4f19da0741a3e210a4e566b58b3311b059d37caf0b1e7b67dd36303bb186ea696b81efc24e4dd6edda5294f1bed47c69ecb26a97d041ab58ee29e903f302106f3b8b6dfba119869391c2f58cfbb1fdebe8a75e6a595600739a0127f778a70d3dfd1e6c3b1b1e25f5876d6b0f8777be3f5d2f2934eb09cf67984d83bed9e2927b60ade42cb31bbd104c8d118aeb5ca3682cd1d914564b64e6e01acdda6cdeb252ddaa8bb1ce775a0bf983722cc7b272ddbb7c0a232fc27029a0b855276549cdc03d0487d28ba7ad435c37a86cc3826dfa994037e0c52c041c91477632f18c3583b17a6a7988f5cd24fd8755dd34cf11129ec3f44e5f651e9e83f0a91e181fcd184660fbd6707d723079d45674efa58452e4f37d698bdefbb408dec2204eadf1adf2f1a9f09bf979dfbac0cdcbc0acce64b56d1bb9ce0eda0e0f4c94266a6963a68de4eb81dfeaf15f238603d0e65ed5e1d7a38051d229da8659ac672a8585d5b828747b98322ff812f502c8da5883787217a845b9c64f009c4221f01f4ef7e32e8fd601226a8abdc7cfa7fdd03a4b0905b42e36c6b687221254a91a0ddcf2f235727035db254e6291899816fb528b100f8c63aa3998d50e93a35e1ec6bf8871b2658d663d79eeecce9f676563d5e84c7c4f2e31cb615ca2819c523f71f4cb16bddcdb13fa28e709ababba7b37881a23204b5643301e866daad49f4bbf4da2930cba44a02fbb0c49d9c5bca200184a75dbdd37f6404dcdce989aabb85c465dcb03eb40cb551d101cf947d67e31ce862c2258929b673d682a34d0a8afb97bbf6062f7321c3653cbb05d3aea0bcc001e4b843a476d8c6b34370bb2883661cba3d6adc6af996d4235b40e374633e07912eba3ff5c1207bfa783198771d42b6155aaa8e2ff1b6a2808c277b75d6e184ca7aa738e8ed632276a222251a101538e6a390ea430191faed075ea0b32e62e0e0f1b6da7f93b19b5133ea8f405a6bcda73ee685313d7fa38ff9efcaa335bd79ff5a8704bb81adec73788535b1bbeb5197dc9d20302d23642014ab7187e7cf5468baaceb08ef355317687181f9fb43c18e1b672a3cac288686d10f394a18e080cc17a67e7e8c3ab5148113b4c9a58d7709e62634a6338ad154d5b46926a2c17a7d6d29b2e504b1fb9cd96055cda8d7c89c25e091e75f7616be54a77eab6e1687de8d306d840ad008552d6b25a07243285cf4d5ca70648047be93ce2b1c11f59a7c3d8c34c49752310738d5ef1b128ea99346e443b7c439d2895ec4d53499328b1a17fc8bf2fa3880834c3c61ad9bdf670486f0c703e2ea899cbb8d4ad8db29729254f78840148720096b7862f3a8a252db16619a6e622787aeb0e06d6f4dcd3e46489a176da023897fed535c650a5e6612b2e6d8683a470b761e167b509e46d92cce154cd5cb9c98db84496aea152491fd53dd4dbb97cb48badc76bd409fa47dbe8938d30543b7848a1d6d7666256d7b7061edc34ab753b9b4f35c9d2f7eb22ecda6d5eff2d1c3dc5c3b82aba24d352b051f6a04aa08d55011b00648c7ed7da09b4f6b89469ca19dc59adda2a2f7b0fdf7f7778b16e2da9ef4ca5e7278879a9bc13968ebabe08bf36bc0ebe8a92c5627b7b76eb9510245e0ce3f490060e416a3f3415fc686377b958eedfb9bf8f88954ad60accebcb14bd2de70b5420178a706ac7c26c2c886b6704993087299489b7525dd44c4ca5163ab350999b093776555d1031f06d79f404059b7b507b1a60f7bed5a9bbbf63185f9fcbdceb423a19ddb0d2a5c7d17bea4b36739b89bb32a531ad26b9add55e48b6cfcd1e66186dad98d9718d68b6ac99f550c2cdc38836d5c5e6d8cd969160097a9d36ff816ead3a69aa3e756a5d2f72cc8e23bc16ec1d16cf25d7b8381c1b38aa2d5ca291a3a0e433e032de1baeb5525f92d835d2fdad2c9d3c22eb528e9e51f7f246706f82238c56154870b4744e66b41a0ed5b33a032298c2db72a12d1a3b3306edb155bf598ea7ba584a7766a44906ce5abd142fa0074e65e987738915ef17318bef58be9d7544ba17f585342ccfdfad7b1893720039af369a21825cbff44ec4aea9bdc9ab541421be4deb7951708f6aed61b653f2caec62cea897e914a9e8aa6d05cd57a58bc906d266fae60a92b6da4f26a1666e8820082fb78dadee57ea2e2bca764b1e99c4bacf38302f13324e0c9fb68b5f6c385c01dd91563b6663a072b26a03897b7349c0aea611e27c679eaf4c436e29eb5488eaabeeed2b93543c6d606a63ecaf9b6f069eeae5b90dc32ac0cd694eecdcef1aa3ebd2f63520d20ff2b6717bcd30ba818549246d9a0edc30ac6a8e366a712f4fe9d38de404ea6e5753b520d6d088000030db78626504112fd20ef04dd5a6ab84d8effc947343326d5e6ee7c7a2a5bd08c6271bf9c7e8317d438d9473eb761193d6b05cb3bb4ea3eed99939091db442473637322242dd9b90a4ac1667d4acef79a8aff78ebc5cb5f3b7f66ebd7a76e1c375223a067b0d70f21de7fd4bae5ea71aa45ac3b7a4654ac08631451bf4dfa66c5144852c6afa37cb5c9e8c9e943f22b3239bc46ea0d9d3629059106940975f77e7c1eab63bdc4778a787c2b8c5714c82702e2cac5e966b94473f98741b2b10da606286c3f4d42e73db67524ed45dd7f54c2c8c8a6986ad696a57ee9356f49b864daeef55c2cb4c97837b964f3f9051474c2080dd262f58b677447ab90d724a7095d540eca8bbcdbcf9cb5986e9dc63f57799f84b100e514f4d6471e1e5b03ad8dd848440875798e7630539e5465fc37463d5d5581828979ab4db7bdaccaf9f81ad6e1a591251bace50d6d8a6de60d7402ea82345b5effb45d66364a257178e163d767a8f350d0956662fcd7b934d8e984547f28e1b31761e42a71dff4007bb0b405b44517ce9d80e1fae441e1bd28b1a647bad81807298647f1301ac5f5a4501da4d29de430f24e2cbc3c2d6491a2e69431f69cf5eb98fd4b9263bdb34e0610cb4620687b656b12405d6485d930199e5a51182a1ff60abd481498f61399bad5204f9f093f892660928936c00dd90237c9ba31b13e532e38a899acc0c0ec7fd21aba4e3539966bc633de6863e0c6f1e091e7df5a65b1f8260cdb480801cc4b709156aad25d49d754d81e7b6372fecfd2dab44e76ab841323752b38ee9015ef1e56dd6eafe861ccdaf82015dd5b1dbad5fbff535cc3a7792bff475a29e8e6913facb68fb706455700a8d0fedb88544cc89b4cf1efdb5d2b2bbaf9f224a09132f73d0cc6a21ea9722a3d26f15133fdb7af93926a6a9780a1b129be37be3fda258b22b549d7a99737996030adfe6810131d292cecb64381de1b88f98d5b208834c1d4bb262c14faaa6b92c722ebbb666f0eea9ab63138961fbedbdb2fa7f01d94d31cccf81a72bd5998ddd7464c8296bed211f652c8fbbc8c18a58078330669aa97273ba2d1b10dd7c4f377aed624736131362f8aec5ed6afbc06274c7aac2a8479c0dc5d7c8b23d9851d82c059ca12184ea9181caf9aa1ac5a79e4601e551b149f84bd707bbafddc263694804d48afe3efbf9e2d04a6495ceb9c628506c898ed03e144c4864b94e435b9299b17d558821523f088a2b33efcfd87cee61bbb7621bb1a0feb5e305638aa9e1f8a1c2a3b287e781de4d30651d95b84ee0820bdfe4bc474e6df9af0d4da8122f6bc204a8ced17c67f7be2a9695b57858f665488ca2a7af725903f454d1416ba7e7b2344c62ee74ea634a9d976d3b960ada08d8882612fa1c09d8cef411eb48fdbe53bcbe8467e4f7590c25ae631dc6b0b6b6a53519887a304583e26246bcb6f634a17545a768cd11a6c9e991632d570fd3762db0f1a6208fbacc3d8a32d3d83633675818284c30c75db7ca96ca089925b32dc388df1bbcc84e40a5bc23ab5e66df7510f2a42739b0ad281eac5d31e1ea995472aad3737498aeddba3b3c74ba79da406d35a32476f56046328eb236b3b42386b32f376837567ea79f7964394beff988dadd3673b653f25b914b1b66a664ccdabd02a99de44ebd70d842af768946eb367d21047357cd321e2d22d57e97eefab82f4508c8eb96ac7ba07bc319186dad5974fe912397c51bc751f0eb83c5279b1f284531e9f4a10697a06ae8c5430ac278c90518d65b43f372e54ec325a3216ad5570c492abaee95637783a17cb11381e0c3b6467f8415696b3b22b6d4345a217f550baecac36f5595fbb105db1edf65b2bb6314b39ddd049c6faee263a0c8b5fca7ad53b331c1ee4de38b1426582605b0d9eca3155a6155cc5edb8fcee3a51f3af3c429562cba0b676037be4763cb9a069f92b9d84b3c523543e5feca109fd02c989e6a6179bae7ce6958b2a3a256ac5a3be950f9819de7be651ec770a9ba26a8bcd58a1d6e2e857e6389b3689272c628e1f3cddb84876603d58209e43679881e633cd65c0ecf421cd58b2d648f0877b87706d9425804a4ba595e772043658780cd66cb4f3a9f6c1e38c65f4ea3e0dc0d5a75afba5d07439150c60a1d1d4c8cb1da0cdf44208750517c12a6d6b1478ebc01e49b3ef3e421a874d93ae1d7727aa7119d7ac341a8bb4804fb3e3243b26260c49b35178fb6ada720f5be2bb29f450a4425bbb78765b9970ecac29c2e7020a6ca4edba88829d5ed4310b01633b0849a256a55006b6bfa687d3735b8918add9705f5c5a21e18e65d27bdc2e2b3902d6c8b61d978d44c66157b3425f26727df67bb03662cfd1282b1b4ad84399c46f834e3220946e13ad3b0dd44b16fe7db90c1e0afd3f5177359c80381c9a263ed68fbac8bad4182471d7ac58921ef35011f2e50a4aaf456a8414db47302cfa7b256722e3ef34fe44144b12c9fdd42b1b01091b9d21e98187bb6e6898079f463fa6bdd9cc3844676e7ebd69d2d0d014b1ed0d2643494886dc537cbf12f876d1033cc150a643e745670b6006d6b0e2387676e2b34b87dbbb637eb845be816afe7ae9636cbb07f5b9f9e48fed5e135d68c355a7e50b05688374d373189d8b95ec2a381c0e8d429fb7639cbe5c7423119e67968e8a0f44daaa5cf36956f094182d4057dbaf659fbe89b54d9a55e1246aae9ff62f466e43c121bd65a96bbbcfad85af3da04e15a6efe23dd41c9fae550147dddc90ac0df255c067a9a24ce529de9d30e7afb9fa32c375651839a813cea1846914ca8ae4af7e0b6531c0b9b06cf2b180be18bfe57db61472b1de3a25a65a44bfcaa7c820c90ac8680803e74cb58a1132dcbff3e791117392e2c107d3d2b32216352ed5e3d92a51d3ac6fa6c0603f4371db9db11e4e8cfdbe336ebdd9084ebf8e057ab344ea6201257ccf3765d0e49d6bfa12741815addaa9d5b849c8cfc04a712b4b3f1991cf864a8ab5805f476966a634bfc88f51b85efcfafe49764a7646dc3d3106ef289c600d8a6b715efc4d636756709072fcfce0e589f659091d670449bdb10ea735ca83818abde19648f8e9ea5aca7dfce6ea92c57d720c17b4589b01cbebd0c7d3a00ce8f657c4cd8812bbb738fb7a334f172ad34a90889d4d50a5af0f422ad2a442a5868747f8f587b0a039c26da7c0041b6f1603de303fbbc5975195d73e0b23084c1046e6fd9bd7deeb6ccba6ddfe22bd22efad419860dc09f6b319b47c1a2251a0631682785479cb268ae34d5e1c9ca689628cc08c158a079509c9e32b0877a6a4f69348b19732e8b149ac2daf52938bd879e06a4bccd654b1b16b7c3fd428a467851d847f7640fc48cae169a7b9b68398905d4f4338888cd740caea9f9b5d7f6d27fe263ba2c7222b55c3806e469963e581c917a637b81f6fc77d7993ce977c372d5463c6002b725bb6107ef0e04417b31c2d71ef2923cc38b34192fd1785549100d1050d57954854c67bc61c3b07dbd86a574232164197f16e79709bf5584f82a05e05fe809bad0b1467c3046bebb4e49a8eba37b8c730519f07652b4fae455c9bb5781eaeb2f466751145f25e1d2af8f6b41b7d4adcdaa3bf4f0a050efc5e849fd12b771736032013338f48904357d1b9646cf081dbbebf17f7d932a463097249cecd26a009c55978dc08947b411fec5b25ce0df651859b41fbaa7ee0b38356c8097fb8822be1daafeca3a337ac2c0d5e93909047b2c6b6207bb3c5127532d988faca2f09f9757ae2af6fa6ed02336b178ba7587b3625f2d5a5c4b2aa2b2602399df5830bfda26512b0c4397d325986e385719c3244d633a50be755865b6da2863b7a1c1ced7bb9609d1f6e6c36ac6af185b381781b7e8b8126ca31bad32b6a10f4e8a9c2e1e3525f5e7d5e2f8a85f4ac630650f0a8f291e01b831cd0253084f1a9a9d4a8f332e5a489ed8611a4b7eb2aa49b17dd69eb6a7ae262220c22bb445c8d6b7510ce79c9c30fa9be6ded90c1e8abf5d993ed025bd2f7e72a5d4a78ae199e5c3074d3cb9606be97bcc083646d8828768360b2b788dc3b4233aeb5b556d33e0dafa16e2e777c134caf1deeca7c586eca8d211a4fcd90a67ae9c664e8e42daa8413d63f674e919b6c91d1f8c1a8ddef3ecebc7d8b35f125b57b1b90b53e8e6c117584086cf83ea1a6b390575f63d3d9870ed583a67b9c1366b9b0b878f544ca034cc56072065161338ee33e3b6b13582433968cff5a1ef49cd31fbb04ea16c926f97ce13eaaa16f6b37322f3d06774ba97a75265fb267d8306b0a539b9ec0a8b0ce84cea78c84e6fa84f474f5ebff149230d2c8d74d0cf963557fc8bdfb8cf80781d10804905278b4d9372e5d853fd980deabfa9be2659179a914a66539aab66ee112e486f7bdb6c8e70bfbe9c257ab341d6132ced655ed4a84dc324b39fe99a29686329b3e80bfa2d88083517d78e67d02479574c1f8d4ad834f4c4b677dbf3b785e6b2da5bb2f980f5b42263d04cb8dc1bdacdb209835f67161ee2923c70989bd34479ad2c3532c1b40d9dce35c041dd03c257a93ad6391170a6c8c588e6cacac1379eaebecb5a4dbd0b405e614e7545e9c51cfcc0577d9e8b35d9926fe6b210bf6c5187871e7247a62f087925ed2b18a77e93cb7fb5598d7a57eb8469e5917707c8a77b20d610a23022d2ac868eca81b7377d6bbeb84bb517fffa393615cba36e0d52624c014944cdfe64f07ab7831234544d638597bd7bb45db0b4d76d01b604e3f2a3d02aedfb81f0cf2ba6f595bbd56068e93d7683309e684e1bf456deafe54c0e2502be464eabeae8138a554ef5661deea74d752e0df575f04ad27a841df564b3faa94eeeb525c91af1edc18d9197648a0302290d6f978843532bcb0d655bef6ca25d54e4146d2c9310c6627cbdfc9f0263338d6e53aafed9ad6b6b891f52dfce46819ff655ddd974d86dc77607e7e145bcff6303c8aa064aefb534f59689581bbbf60f0c3a90f6a37e6fff7ce634cde3e068a5dec356cfa98520dd21297d4633780b661532075588d16709cb3a45fc6e6e8c30389d230f9e0b6103f791d2b51f15a65d6944f49a89a09e8032ab01facc66a898eb9802aacdb0bd0842b2ade0242734bce280ebb473804fa0284fb1cc04b1672e04fa02dd6b209be94ab2becfffb964d242d6ea3cb7b83f1c73d8222c3290885871c44ef63b89efd30205fe2d3593338049f5d0211b5e73aa5fa0d7ad72adbe1133a7959ddd599f64e3f666e97f2057e5052514a6d80a9fecb7ea0fcc559e8aad09d59cce2781071a73bb45a93aaeea2bba0d72f79e171d061668e38259bff7aae3a0222eddc826460a13da13cc6d25e7206d4fb505bb6f9fc542ac1ef35b3de5eb73991ef18b88ad293076ef93ed68f2d4f321da27b3572c23352873e959388d32eded38b9cda2e644b86371617403467a646e4f11635e964ef6a7ca39c78404fbfe5f60b8f97ec8fefc4aac7f0569979eb3cff8b42983c8acf5d255eade473d560a35f4ae3d94b107925f39c7d78c868a8c63aa248bbccdfd3cdbff070000ffff8c9dcbaa65cb75447f45dcb60fe463ce7ce8578c3bf2bd18192c77dc3018ffbb895cab8c768c3caa6a098aab53a7f65e2b733e2246fcddfd6d21485fb7fde83b326d4ac4f251eec84f31d05b00c973e3915a5d897e883be83b99b322594381efb72a048d49a45b4c2417996ea1a28371bd73384cbc8bf6062fe30b65f2affb02ca17908133127da792a26007b817be99362474f2cb5abbdc4f7efd330fd75e0c24d695e0bfdd8dfc53953513351c10f046cbe7d8041448a884728de5d22dc4a8eeaa283b922e570fdbe9e4b3eeb2bad4135d9e43400b158fb25eb9b02592a197e9ae9073fd908f2f7815e5fda33546e620cf4e715de66391cbcfa4e46741718343e54e2139bdca01cafe9108140e55d56fe93afd855b8f149b27e6a02ec49c33bfe1993196dd01d88712ea79817681152efbbee8dc9bcc428864901dc21b5cf595cbd3ba769fab02438c3f7d9ac8dce15f9643b7beae19092f6f4e723aafea2356cd8521fcdc359985a671460b68a3bad49a3ecc9465371d07d8e46543ecadb8b43065ca11996b30ba375a1458ff9b0cd1dbea94983de037ed22d334bc1db113ce56d139482fd3fa0be6c3bb0a483d4fc28ed20f41ce75543f66fef18f86048fdcb54d6794de25cbb78ff5caadbe89d96baae78717efc27ebc9527526806acab2272d2d07acfe5d268a1f79fb82e7fc8926b75151da7ffaf7f493634f48bc77a091c6d6bfa87f9fa708aa480c4df0b61f296c45786eafc3290b52238f26045de0a02eaca5e439a35afb34fa8acdfae73ed8a2f5b071ede78657ecee9122ede192d73edea55fa1da73be48cf37abe4c8936fcbe56d9483ab6423b60e1be19e6016a3afc9490e7ca6106d780a926113b3156ca88fdb4d77d7d4b1328f22639d18f10957722074c5e8b5d51c77c632fbc3a097515917d7299d55e5c0b5f3fe283c38dca7dab9aad18ee9b41f145f12e17929cf86238008f62b402556976946799131d3094a60dbc47f689a6510622d9eb93f10d4cdbeee9d1b0df111cef7a2645a47454e4dcfb7edd4d12cf7f5c3560003cb9b6dc75810e283982db6f571fc53e888b54b946cc0d304e891d095a63d79931c9520dfea2fa0c21faa8c21305204db2902b9713bacf3a12fa2d0d0b5d172d3be32729ea79e71465e167ff0dbc74431bd672fcf5a4a8dc09eb17d68efcf69e5ed6579cb8a15f405b6ac2e60bb93a73af62076c28d9c9b3ac3295b8c1c161d208a848d005f5f814b41effccd46f357fa54e8e5c82d3f80ff0a4d28775d4864f3bae27e63db0458127e9c4baa689116eedb1174221aeeabfba9b66a47881335d21f156280911cec4d1deb74e0537462850a1fe34bce9ad0e8538849662cd85181c37673e0b1ccd2f2e5ee7f2192ff4f494a9cadd6b86ba73ce857495aed518dc67f2c842b234951beff437cf98fbba6ab11fb38412d630515700162d888bea5910659eeb654b8de14c2c1be83f7fd3517db81eb19f2c1c582b1dc2fd4d14d16b30aacda7c1a8a89f97580f11c612e533f4e7fbe5ded964eec337f282e0ec227d947839c7498f7f9743a175a8e73ca9112f1096164a25af2f4d510c3225666d65b8b75132c5e9eb9a6f9af039673a61d915b0eff712f2bd868bb0952e3cc1e2a8634f3764f575e1c6d7dd3f0fed371a528c95fa2b0fd792e664f84592323f23e4a2cde923e6b9a380b8217038a18422836c1f4eb9c5e07bb66c6ed9ff20abed67e206a290b84c9891d7ec91dc5aca9bcaa765ad72a1637d8abe5fd353c672c88bfaf4d5516b2b637d79015c96f6257ef2ead4f38f46ad6d828da745c32c13e2e46c959ed75bdc428d7e446f7e9d9e5dfdcf60474ff6ec4e661c2df16edd6fa96e8716c425eb9a3bb2af4d779fbbe788f7cffee5fcefff3effc9ffbc7ff8db7ffee5dffff8d7fffaedcf7ffaed8ffff8cb1fbffffed7bffddb6f3f7eca6f7ffddbef7ffcf76f7ffed3ffff657ff71ffdf94fff6c3d73b6e9ad515d3a893ce3e8c959b24f50b067bacf778cb239352813613321d7ad5f3dca2e1f54732930c72f342dbfabcfc3d55a3610e0f5db2643ed1504586895d1f67d0e66db0c29d23137d873ece1d7aafa4064b7eaaa71e1773b6ba8826aade963241665f9eefab8c4e746b511632177701f98053c942a4d5c1c132a4b17c598e5189531be1ccbef440170495d2fa7bc9c8e68e82b15ab8b5f6c4fd4d13d427a4e78f5e41d73c6b18eff06f1a9c6fdc049ea4550401bb661f9f9803cbe8a03a3c2c839301d163742c882849825d4c1a312daad418530a3e23b539cecea7812a5dc04b851831d804dfa7ef0bc5edb881ee9da9f3667784e413944fa32c16f935f03d349a9b25cd1d47ad31c10d2f343f7b6c7565ebf64f0db1c5e62962843f0673f521ad8fd6297e11b68daeb0f8605af53c85075b913c18ae76ef5de6b0cb5e915f57c444f107f95c8ebdb5b49c63b67ae657b90b3ca48458a3bfe74729d94c75308b6ebee758130348598b039a4922ee6820e5c5197d40ef71e1c984e45a3f60235bfbce697b377cad80d5b646bd02bce3ee932545443f73ea9ae06cd7a3b1110a839351580d64f38b10abe85a232e015555ac884137768d38bcb6a47f431833d06bd1a43c1dd60d6e7d6aecbf7017a0b2120d3afdb7ce62861fab4c1fb4934007569b6cfdff40dee2a31bc0c9411212603433588bd9056331b98a8ad654acd0ae44f895579461e380dfe744a1175892f978302fe6b8d17514e2a5801ff1045ba43b7da535b14bae5145e0219b776c96b33595d18d7e53bb03879cb2e967aa8ca18616b8787fcd63e0ef9d6ff36119f1908be938e8fecd2ed7ffe691cd6281f13f5b78e1d53e8852b52cf766805691b6bc2d8a5612813320439ec99fc7a54a5d93aac671e0cb4e3b2b4e2f4ef517b10673249d583deaac649c6f5ecbdb1dd36a086df8561a7480569b3d614d99d1ab24e2cea1ad1bb9b0624ca71e88f2eb5860a5511d88b496b07136975418acb357d9ed9f7059091895469ed501b93e694f7b9f1c2282869107f75ec14ae9c6da3a3515831b2236946e7ce461fddb4b3f2cfba1c6a32000fc76f38009cadc7cb0a749fb2a961066307a36db0e722694ab6039249057b031225781652d084154f132469dfd87c1159e7982d310e53d848cf051e951a22e4d1ed98ee9dd716ad0d12831bd614ada6ce00103af273a6fe4622efc2380be9584bc7413a55af3608a0b748af70fa97ace02b8b47b8baef27971c89f6c6c9f80bd46b9927c50b18deb603d7b2e8df59f11074690b61cf10086f57f73f4a7b0125e88c3e10cd521cf8a9058a7a4afb5e6a45fcf391dad9d532242529c09e4c2de0bc0815431f5bbda693cd55550a3e980389284a1d027a46476b27a46c8d442ca396be7b33c542626c5860e5ab656cdf12a8062756cc82f697fdd5ab2bd201c9ae7acaa985b9d3943917aefc2e9fb7bf5d07490ec55ab6dd60a155f7eaf382d0f91ac42b0b3deb8cc529ff16116e6728bd3c3267e7da8154a9455798ba9ed860870da958a220faaf4c2ea3b6f2e4bd1a5791e4cf779147b3220a4438457be515bc56962380c4df19ed22ccba803eb5dce462a08d86dfaaa9f5228aba8572ad51f2a2777a4ec959c38f7e758493ee40ddb32061343d05ee0f2cb1e751797afd523b2c0b6223f4c5a1608c01e05c6d077a47bd8498228860ac6339457fa8de581761c220e75204e34633777cae4f7fc447f5899c18955668b4b46190dbd791c2188d3e4ed73d4620e34010a2dd09fb9a91a35ef64c2e6118199fe5ca7b76f4eed270bd79b9210397ae78835f2c97e7805949b509a6a84b284064af5f6b238dcdab33faf4de2f57e9a9c91a8e3610bfa73748b0455770e3c601ab15671dd77dde7e846d472f58516c69e9b1b017ea2b48e39566c0677f2bf4cc4271ae953b6d9abb14d2b843c6602758aee88e6bebba0a3db7314ecf63d2f8d88bf900f71efc3cc7d5099ab21e353f23eac380268f712f67f848269ac8c395831948b2255a290c6b5dc2cfc46658ae2a7fd674a724c4a3e360225d5ed176013397ad9cb2c3670090dc66785c80c0828561cd451844bac79a5a56dbbc29220283cbf75f8f874ad5f58263413631b41253102b5fc6281c6180a93df5122135b6224c433d4b360a156b858e45f49b11aeaf91ba85e4d0deca6730fd23d31bb9f8adae9ab3569f87d679f684957e64f8a4fa0938807c4f2ec481e16f13f60c28e2c3629ccce65497c421521dd5e387cb14c2c29feda57ed4a105537f9bdf462babd6622e4b6c098746ab83e596d2c5eb00e252572a13190f0b1213ba7e7e2ec679b5f4a43ebd1d9eb1ff84b17334c68b1e7884cb86d5bc71c6576b5f0b16c7ba963c14d8c30a4a83a3a766f3281e09938254bbb287240d5e4b75f5d15e8eea5fdc598ce94d77e4aaa01831a0bd8d7671202cdd2905259306b1782715e3c5f0769157fcd5a9ca94c54ead6ab8ec5f7b2a60db8f5f3d1f94cc89a5d8dc8523284d507eacbfca2991a904bdc5a1494c3019a455e90b1d906ecfddd073ce459a8b589b6cce6fa747554e1344d94bd9cb8588f93520292e4b053544c98aafdf76890b32b3903fa5f1660ddae61470836de7682b11f72b0eca2719f4b53375158998a39f58122fb4530f227253ca512241c2a1293856804d812cde824c112406b310c57882be2837079b5c6cbd70a196c5f5c3f7a64d482b79678c60b064b58271a465ba2656f97bad42589c699122dfde244288e5845e15f5e48b37db1326b45a555271abb2d640509bbc3f5ca60ae30111ead4c2cec762a303ba26631c7da83de51187a0acc380a7501ee8aaa32a9dd90527821a35df0e7fb782d31a75037952d3494597c2a775a9c140279fb1bb8b6d85cd8b060a95a239203c147f0da0518d4beb060eb1eb41692e055859a011ac6a3e9bc9f17cd7f7d4fd1167b9e30250fbbfff08d7c81cc006efa4f24d3bc95906c77553cf3aae0f457c9b3a494ef8553a52d72406d8ae769dabfb9d966a55217551f55a7d67a34d7ce626fd722c77d99cd1260174fb00e05c45dfe72d94f1702e89d090dfd697d67100a24c0ad6f1b4c139a842a6fa5796ab84f323b4e37371be54e8d577665a7fbaf0c4eff46717a92fd0dde58a7d81216988280d066d7737d6fdb16aa7086c5c7a0ab307ec7f5eb8641ae6118e7f76feb096404bf11cf781416b54dd83fe7f9f1a22d9612d375a7701565f0c8894b3a1158090a02e79b56a096ac40919aece9f97f214f21e9dd41b263f81c3915ad91554e2cb5dedea770c9aa077710b4a3d59a510ab4539c9bd508a695c0513b3da31e7fe899dba57a0d86e41b2dc98559b047b257c96f95d41264bde720f8d406d971834c592cd46a769d918a0f81ee6059ae8f372d1e61c00b0dd97b1ab8a57c49e2b6a63fcf8d470d3f7db256252d1709b80f549a4ee3b2bc4e0798f72790432798bcbf255316cd12dd4f1b2e5420bb667afe08a7af1fe2c34ea2a1b2e8e959b9195e20f35381b86021b6023efe3641bfb56656ced63f3a7531991d19b8310542f15c20d4a6a2c971ca18d791286b0f4649ca6a07a1339838a1087ee6a94511b429f5311e400e029a6d0758692af07932c3572755f775bd149df95ac26f1dd68a901839a64a4cd170a3d043cf5e1b0286db5316a40b0a28952a29e698fbd0659d7766bf0937ad7807692610387c6cc16a8fc957be874a9ab1657401b8dacf0c1281707dfa2f4a6c8e713c319790053761e7f12f701efbafa6e28860f6120022efb4fa5f0f89105a9d4deae411d832c75ed8a441943f8499965438672b64dab025f211b01068467050e63aaee1337b90809e3536e752ac8705873a40f231efa7d99f90b03a12a0141c3e39d73edc158d52d792936d897d3af4b1057c006aae2c740b0b9cf1edf975db92ecdd6ec312ed9f2d711a9feb2ac0d8dfc16ef0d01bfeac4a0a612980e09941a6702ebd6757c6cccd505e128132584285d0da2932d3b01669cb3164750887b591bf625f310d030daefab27fdc43a4141053b640dcc4ebfd3c344cf890247ecc2960097b46c99cc5516ede97858ed82081d633e5d9ea41e4ccd69f165ae26b920e6ac2793f4b2a41a1a0138bd5b463f565f19c983f464bc374e0f4f658c0cd8ebae6fca3082cb4b57df1c8119d93816639f6b8a15b12e477f08a9c6498e6ed1f12bc217194cb3ace248d579e1888b033357637f5a67f731c7bd8ad05711bb72e8a9cec775a11a8970a413521b6217b7e48504785ddac41cb0436656e1147c55be45590c98ecb615022d3406e5fbe912a6c77d5a2f9ce8dac7f43be1286fe0d1d4d417a65859fdc5744185150bae3925371109ad4a64789b006fd5e326dc99808cb42a812fd25ef4c130bf78af067d71933eb35d826f77ba33995395770a2600cec6e95df0af3d40e4eeee80bba046caf84f51d353fb66f524a7729036155bd538d6c7e1c82e611f806c5d039a91b3bd4756a4c4ac05fe0619c9472073bd1fb916f01fb3028023b67a89be7ea6877d742f432660c750cdad0a9810ee3202885a1713bebbb43650d8e73c081517f474608eebf12b63927dfe09a8e6243d4fe836a56ec06a67ea5e0eb84cd644eed2d07e0d2b46a58785a7c028850667d1c1d278af228169fa435497c821fe65f5dcbdb97d34148980105031544741d666cc1c5e0729adadd083a6ad2537665d0126de044a4a8215e9546f8a4641ba9d02cca364523edfac5bbf434357d257d9f48e54c15f98691c9f99a78f96b115ce3d962a416f356e620c5592dc60c94c199f010acff3d6692356ce704b8ce984c5f6cd69d334233c09275a66b965aa2c35411d4bb0b6362c8a190335bd36054980c4491344eda34a0297d5b516e1b6e5bad7ba17bec7f3a10aa5b260543c856f6bdc20f81ac934a9713738dc21cf3323c2bdd33d4425abe91fad50ea7d317173c8695f49b15848b7d0bbb37681bcbb459f033cd9fbb85e3a60847c4892425f7f283fbd802753666398df30c6ce8f0c9740de7dd37e706264b8b43b2d3ecb16597901b756bdf1aebaf23ded208be2ad7d1530fbc8c46623747824f7ede5a40dc3ea52828c90acbbfaa3b86b52dc50335d8514117d16a6732bddc24b31a93e6c83df75985deeb4bab53bc63823524a556c9e2fdd6d6db2ba80399e6b55dc8b14b93c43f3551b21b3c2ef4320a2a927e6885262241cde57c9551ee4f780ecf02232d5155c4dcaa6e0408c3cd50b6ee07b34715d1bbea29b2da61e71043eada1a060e829dbe822c302e7228a10981555eb1f6c2fb5e7b4c96f88aabb065eef21b253cd9fdd988f67d8f7bf5541dce0e43084fab852b9aa564a8c3b9b7b11bf36a001591ad7016adbeb1e50c3025ff08cea3678982a5a7540dec25d09a7902df7b4b2bf228ba8292f7371bfac2abc4bfab0a78d0ab53b807e3c1ff6701d3aa7c6cfb9af9196ffd8367bc156a2e8bf9b642faaee63e5ecec817705df12f97f7174ec1e0dad14d4527c2d2d95e57605296d34efadd86b6136d265e8a99800f0482ec694a7b10a992a5cf42ebf0c95435a64fa817813b22811b0a326af6ab98727d5bfda382f8973793e076c3177f3c5d7d5d179af095e1ff4009822347899b3014d342bac70372483e05cbec0298780e41983d2b312bca77857a8c462370a6464e226495c2276f8ebbac47a1d8ced5586de7a94c8b2384073a8ee2f7ced5ecf90df331ce4ea1f6a173bd6127d5430dd5485b962f8c4845da4dfdabd432e2bf1c4be64560ea515774c44ce4be23ff7d289d633e9bf003757fa53cbeff2eb47fc615f0d5fa720786047b706ffdbd647833de9d4b0cbd546bad9475cc8bd194c1c3a53565705b5a27faecf2d8c9bf2f52d38a59ef3c47738530a4787886a9de92ef036f2120e25317762aca7642177f8cbbf592a2f85db4f68eaba510aea48df6e79bf4c8eaace382c38cf590663a41ce739164275666b3e8c684a8945bbbaf380f8c175b86053ead16c62f274dd15290b43dc0dbc3192e7c18eaf29076288d4adc2e3af4c978e8be23a6ee4a0e8790bf6f6ddc455b04463ccf343950c548042154d0b03d33ec6de5e4b35b54f744e77218083887e15121e6e5c8ed37eb1c4947a173b88b3be1179c3f74ad114db03207e2e4688692010de1e15893ae957974e6cef3d7e6217feba8228de7224a55f4397ae6103e73820073d0a44f13f7ef6a93d3d223185121fd1dbac96cb87b4f508322a3ec34b55a95a7521c6f30a2fe12ee8fb2f4c7c351d829751dac42e472c9c4a5ca6224f06ceab6c6345a0c313ee0b9cbe90dc1d999bcf65983f93997f7d8bcf38aa39bc4155ae7fd7c08815089fab66ca8b69c867fc697b9f03fb2aeb1766055a4f9a0febebea747de38b763aa22ea5e0c08a478d32d35425c5447f31a4dafd25a17e9e81a22f52245afdf82f5b59eab95c1a252b8d3ff17a07c3e7889a7180cd1a0a015dce73394b0d7c51da3bd79fc2945ec6ef0ee74eeb97776d6b93dfc5fba29a5d440d58565546b8e85c6756624a7e5fb59c537d502db555ea7ad72919eb826e56ee4a04260c7521dedd55a9de1a4ed3d1e35367f3e24304afe20c6ef7e2ac8fada56ea31c57c35cea77e6f9d85c35568f7ee5f3348e5ac906edd12608902da307b618ec869f958d587a36870c115c06a7126b6c0fd5c91085dc873a928e8663e4628f58c55ab12e3d3a42b8846a198ea66ff20225bad6ab07e63aeda987e1e5926e881f1fbdd5145c930a05a9b52b64d50a7283d72c8e891db1c2daf079add8a4ab1e243043b2f5aa826a5d78fb348f86b7fdfe46e930adc042eeb941ac6e4b8541a3e922a73343effcaf1bc845fed5490dd492a5d346436255f6f0af21b4e6f3ca5a0e27adb1b1a2aabd346f44d488c1847b214215998a31179261a82352425f7785b341b75123ef3a5a40f4d034a465ad70f9fdaf1b36814cd72a80c4c7fc94423c40b0d2dde023071f6668539f141bf16b83bf55ab7b23dc46df9dfaba2df86ef5883b9d1c0e74526cdc42d39e72a345a7923e723193f9da5aa884505286f3a7aee80876aecfd35106b07b250f03c48d3f11b36ce4171c7c91831b34caa336f786c16b3a64e0ce06fee93b9dcc031e6432b3947c1cb484e666bef21f8b4ad37b91df66eb70e936b9195cf5a13e74cc5f720389244be4f595047b12336b476a8fc6fafed6eaadef973d94c11eefb494773330305a93e7be5c88cdc7bcbb2b04b3d29dc46539b131842953e5b06bb475e5c36fa3773749efd15303ec9fca9331682e3429c00f55cf195700edd49bc3d4e4211aa82f6e782ff23ede4dbe1e9af805eb6d5922e741a1d06b973d0abc056d403156f027e4eb3bcf945a0ae6056bf155c0716e471f5061f1d4d9eaeeb43a165a7699f37a0069a7b9cef019ab521820610a7de09865b525058eb70b7a9d2aaaf8eb42af1cdd02b4db4b9c024ecee6ea2d3a88cb51d6b6d64c2ec7b2b006efa261a34cebbbb6cd416f9530dd4e85ae0a0755a58e5b15f78e04d07bc2587031887caa58353b8157b30cad795c9421d46b8f0a22571e1d258d7d6d16e282460e223e353c1b3f53fd3cbf58577eb4f398f5fa410e51554a63a943c7df6bcbc98988faec43cd536083626ee277e1576080d186bc8c4e35b518176cd44505f5475ad1471e6f78adc034742fd3fb0659ce0e71cd0aab5d988237152bcdc58e7a3784a835d5f1195085b5510326cf48f127fd9adb3de168bc327ea476913acf879d42777dea58de883c3d39be6aaf7b38db9553af2b45f7659b56a233ce65e27fd18d55aa2501d057a9969091c0c05dbf431368f8dac1425714d72d5c2f283b6776bf720e279a21991e94f0aeb4861c99a662dcab32adede8ab36d6bb737aac95c0a84078c3a4f28d17f30e3892bc396075d299d3c0332894cf840a9fd27e06177c90dca3810198b9e7dc7803c7ad39f6afe9cd0eee9be93223232ef9dd927a78490c33fb73dcc4a69ddec4275722e8fba94405f449cf1ee78529181882d61c16fc6d6d55953a11e3a7889e37ea7cedf4a646bb7d0f7aae33056ad8fff85b79c528191507c28e5a5c122525c7675ac1e31955234bebc042fb75edc96259a3f7de6392fb42da8665c23b6953fca27b07a483f4a3a2eda9fc43501674e55427f498dbf1eb4a797835133b8841bfed4345f88c8504fa7b277efd1015f33e3d10f83e166c6d75908b74a2bb5fb249b5ef51b237b04e1dc764b7ffe9ff000000ffff8c9ddb6a24471044dff515c3bc375455d655ffb218190d8bf16ab578c7c660f6df4d64b7c113916d4b2f82618466fa529d95197182805fca12d489c999f036a48dab4de598e34c3897f94395956b635436fc7155d664ac829de3260a5248d40d88b80bb1328f043386d4211d4d58a5644cb7c8f12c01983d7aebe8ce7ee234ac319912104e5ccc218dfc659d89c37a6478c7d97992612f2cfc8fbaf7a244bd01fc0f9f174fce591f61cd604d4fd2aec7d58fbe828ee987ccd821354c019144489f31e7f2e897c37d1e088fe180efff8de6d9cea14f50ec24ee53c2d05244ce9ce7449293e0d282e153c144a609f1193d1b7677a1372eb825884d56511715e4913a6e454a6ed78fdbebea540f18041345ba46f0b44cb594d781eec690c0f5361e8fd83e6e45e35fa17ea3d7d679998ef89410c3c2f0fa21af779ccf64ad963c043fe4ad7c29c120d050471a9a6d597303c7cc9555325164d1c8656549d50d8dc742d3d9cee88efab0dc4220aa9fdfb19248bb178cae93274501127ec0d117a05f179c8af2bc6fe8502735dc5897b6b91310552aa47ef5c31081d6a41422c87265e1e5984b0c0a9c9810737176e75ba9b22018ec1f52dca28e2ab4bfcd4e05128f8636a70f543a64d8fa706aebd19c7a3a362d754e49c89633bedf0856b4439fdd822c1a663c87966c0fc19696f0c5506914c14733c44393519ce862737f0b2bea30067d600acb4316e1171fa11763c87501e25e968730b662a4b38a59e48a0ade573864473254768d51391e39c30dc7c834245ef068d8bcef42cad58c0480aa030b6e17ec9ed4090f309bf9a86db2434111b6ad00b2da342a20cd56a5644c8b983a87f77c590902f8808b90563b7e782f0a65155ae574fd0ff178cab43916c01f4b13ba9b0ae66ed9960e4280eb16de183b8077dc616a4b94f968f9b0ccbba1132b1d48f44c124bc0529f6626c933b18bcda5083a14e641dffed442a4939c7024945b005136095489532bc1c28477858b412cae6ca82c584a85251f122add8da83d1a435ca2c85d1a4e8ecc6c84c7bb9d42bb459cb9b74bebec4ba47ce1410815677094cecaa9727349f80c907f68778889b709f4da2381261f818a6d7d926825b4f913b30be31512279c3d6cd8fb586ab2c46198d5b20489f9948de756050a16d629665f6665ec8dca993f42c37343602aee3836b120a10b631c27824192e0add9c01aa6d5ed07b6776ebf66c4ecb08acd5047eb0c1cee2d1107629f2599e2b1380e76227662b869239b6c3c42f00c7c8c99f79adc96dd1d58bd0eee00f8b8ca183dd81e7b55c79eb27733c5c18d1ee0271696022e40c1f9e31a0747358b6a22c47e21a8670957b5a589ed1c433d2a80211ccdd8674aca678fc21be2ac27d9396ea1ebfe605a0441f11eac28cb800f6818a08b79a1c4ae02bb209de9f0cb86406b9433cba452c6de576cc361685cf855d36ca5680fa1797ebba6289f0018a3ed731c97907a2d734d4dbfa9ad65298133f6c434971762f1b18f010f47711b6b31502d90b1ed924af0ff8538b25a173765727d9d7cd8a849aaf7ed613d85c84316e348a93ff3845498871cbd1a6f8f80d1d23b1c0ed1c2ca38309625d311732be349a1072e73b55321479119516ab52ba9aef8234dc8c705f7120bd3bc52185deae3bcb280aad06435398ba88eb338ab4101c11e89179f8624e78f98e3d052335a920b80d6d58493552025fe1f0bfa81015b9d536d5383b1bbc98101a8b5f35c40fc3c31ace9acae7275dde3dd7c3aae4915363abef1d174ca28173e16fa185a3f514098298e658f022c5372cc17d805bcb32a489966b03168a14d9ddc8181e8c49ecc56f07df25d8706dbb402f50a4f3dddc5c17b2584cb156d763ec23d0e174b5f3508518f5a77ae3542dda7e0b5c52f1aae3c4dee832446eab369722d39f178c9e0bc43df2614d988509ef051158be1c8b62212b502765c17339099e8dfcd0590ac878110c592ac294196c7807f42f8c44066974084d5006917cb1790602d1f2f7ef2df3f9e2e974f78dff5edfdf5f6e5fa7cb9de6f7fdeb7dbdbcfb7d7d75fbe7ede5e5e5fb694caf647b9fafb7efffef2f9767dbefce57f7ffdf6dbfbdbb7fb4ff7f75f6f5fbf5f9f2fffd456d7fbfbfde5cbbf5f7fc27ffbf1f437000000ffff0300443c0a67ce080200" ], "rawHeaders": { "access-control-allow-origin": "*", "access-control-expose-headers": "X-Request-ID", "alt-svc": "h3=\":443\"; ma=86400", "cf-cache-status": "DYNAMIC", - "cf-ray": "913c001639657cdd-LAX", + "cf-ray": "913d1245eefa08b0-LAX", "connection": "close", "content-encoding": "gzip", "content-type": "application/json", - "date": "Tue, 18 Feb 2025 06:36:00 GMT", + "date": "Tue, 18 Feb 2025 09:43:11 GMT", "openai-model": "text-embedding-ada-002-v2", "openai-organization": "anabasis-llc", - "openai-processing-ms": "79", + "openai-processing-ms": "176", "openai-version": "2020-10-01", "server": "cloudflare", - "set-cookie": "_cfuvid=DeAAr6qBXehyZ.BOlCIZlX668VaqO0Ry.TMmqKwSrow-1739860560611-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", + "set-cookie": "_cfuvid=fsqvJ8TVn4GZpiKWo76QXVTVtp3LGyRtRbOHMCiqLpU-1739871791937-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", "strict-transport-security": "max-age=31536000; includeSubDomains; preload", "transfer-encoding": "chunked", - "via": "envoy-router-d7b7bbd6d-4j6gm", + "via": "envoy-router-749cdcf4bd-fl8q4", "x-content-type-options": "nosniff", - "x-envoy-upstream-service-time": "34", + "x-envoy-upstream-service-time": "65", "x-ratelimit-limit-requests": "10000", "x-ratelimit-limit-tokens": "5000000", "x-ratelimit-remaining-requests": "9999", "x-ratelimit-remaining-tokens": "4999946", "x-ratelimit-reset-requests": "6ms", "x-ratelimit-reset-tokens": "0s", - "x-request-id": "req_1053baeb1e6d8c33043ba1c5fa2e26b3" + "x-request-id": "req_4eb0a9c14604e1f1a60df674a8a9b902" }, "responseIsBinary": false } diff --git a/src/services/code-indexer/__fixtures__/search.json b/src/services/code-indexer/__fixtures__/search.json index eeedea6e888..0a2fd8aa388 100644 --- a/src/services/code-indexer/__fixtures__/search.json +++ b/src/services/code-indexer/__fixtures__/search.json @@ -6,45 +6,45 @@ "body": { "model": "text-embedding-ada-002", "input": [ - "class TestClass {\n constructor() {}\n\n testMethod() {\n return true;\n }\n}", + "class TestClass {\n\tconstructor() {}\n\n\ttestMethod() {\n\t\treturn true\n\t}\n}", "constructor() {}", - "testMethod() {\n return true;\n }", - "function testFunction() {\n return \"test\";\n}", - "() => {\n console.log(\"arrow\");\n}" + "testMethod() {\n\t\treturn true\n\t}", + "function testFunction() {\n\treturn \"test\"\n}", + "() => {\n\tconsole.log(\"arrow\")\n}" ] }, "status": 200, "response": [ - "1f8b08000000000000038c59cdae66470ddcf31457b34e22bbfc9f57619530231404614116487979e4ef6608a77c11cc62167dcfd7a7db2e97ab7c7efdc3dbdba7bffff8972f7ffae5d3f76f9ffefad33f7ef9f4cdae7dfee1971f3e7dfff6c73fbcbdbdbdfdfafafff1e497bffdf8e5f3e79f7efef3ebf1d71f7ffaf9f3977f7efafe4dfebdf2fb435f77da7ff29d00e3edf6cd63cd75049dbf2f7e2bdf89b4430dfe5c855629a26955043e8f4d3505958dc7a298589b9d575546abe87355c3a74cceb13447ca68550723d546673004f4b1663ed53d6757c4e47f5ef6752c936e9c67a33bba349f418c72a4d0b9d4141641f19e4276075f417a3a329e57282b133ad8c791510c4cfc792c1d6d3f31ac9269e737213286b2a8535d3a946e771f110a80e57481cfe43df9dcd32ab5dacee9dd6a9c565d4b2285426501d572d051116e4278351155af2218867477f0610d1da0646965546a30b86b1c146af70acbe7cf45c2da53f855526e668ce2c809c9e7b632e956e5072e1a181d82aca444646451c6d26b2628382eba582274c206dacf7d37de09a1887b8784149d4c33cbbd95cf0bcf128e39cc331eb079e12b023e1cb3f290a4fb7ab98a155da102551c8228b11a3eac08e212529a4c809e45c14dabcfc5bad42836026d3df9f5859218ed606a0d2a1258f580608b980e0de6d4ccb2102adce989603e533cb9fb1580c929055faa4ddcd5b97273e8f7d2e92f8e631078567035a2342392312066cfc2795f8dded2a5d37621876a2c51a57d4822430f9d8ad5028ea161aed143a534d578f0d47be5877160df3b12e8f7dd1a87106dc4a5868151b361a1c87ed815c590b33cf1844b6f2d1a578c624c95f012b5ed871627365fbc6966aa5de231ed694aadcea4e0740a20d1088a8c3d61f4fe7ba42617adb9b5f1abc46380323e816d672e4acd9ed629046aae9e6a240c227d9c0b617a0b890f9bd6c3787174a32887c08c95d45151d1063a5528a0d43f4c96dd82497e7290a75e30ce146d299ddcd2a2cd92dba78f86761191564aea73d1c5e4f4ceed23e599442ea6e2ea5c58d11854b202189d9c39d7d2dece7c4877503dc59211b6daec79def13149e2526999521271ba75a86e17f159cead36dc265a6835bb3612dc3a4c97a7a9a9e6b47b0c63ab46460ee6bd23825221e18e5627cc7727ab082bf127105ebb62298ee0215eda36cc66b12284d23b01b1497eb28f62158105cab48ec970291c3ba19b312aa5ac658e0e16a88176c6c16e107108a237e6a435324a42587315d48683657b5b6d52467069321e3259a9241a65095a86325898e831d6979597ce252343f4a8798d1215e7d24d5304b5cf44a78b52be55c585ae95159adc7b7af14635f3d50f8165f3a483f0e65dce146999cff8bd78df6a114b92483161c7cb748670df1075d41e8d29c6027c28c95704b8cfed92db307556a480ad1fd28634a8d4ea3f56800a43cd4810c9af2522a9b2a41763dca82bd7ea1a95d7741b2b40c83cb9ecddd29a97308df8589b2afba994e2b42672fbcce356991b029609a599614600acb20003db2597de486c621618c4622338beab7495f9797d8d9fb6eb7262af6b564e23311f80159de70a2fe390d647cc9a861e30b72fdbf4919fa82526ba7eac4a394dbe539fa0fcf6a308bcd8cacb9732583e76cbd367bf7bbe1acea0bae4914edb62d39daf2012ea29a44a650d75710d41b21880db45aa84778dd2621a90f1c4f5b7bd268208a34d6c38892a666043ef5ac132cb2d9e1eff9d02273d0f574cc2bab980916bb78ec977cd7950e36b26143ac37c3b6653355cebdaae72c7472f7b48a2eec52bdcc8ca6aa68ad4fe2a7027518b51096ef02b49cbb34e7fec14671ffbc164d02a64fcfc5a4a8dd4fbf2adab13b5fa9a631cca1facd8e48ab3891a9e9f4d5624b9ebb5554fedf8ee58a326d83fecfcec0cb0b6eb0711b316c43b4ecf37859e0d5c8033eb5a0b8b601add019c1fb834d48d359ae50c7857ac590aeeefda7b55b563da67f7e5f6e863a95cf11eb1139d23e2a57970f0a170c2744349629941e78cd01c3b5be4292c7a329b95e3f8fa9323a9c5f150f5ef5918b4b246b0283c94df3bb66cf514015eb7951e1f3b2ea424807cd6f6c72ef8371a75c5610cd7641af9689464d571c5f42ee71c58c82a5465b78c0a367195d861969f39bcdb0a4f96129bc1d3a2bd3fc0caaed7b639629d406d37e2747da833058338be33d352e3ccfa965fa4998fb46bbb0f3bb6972ca3446c854ae8fff14dc51290878bfa6dd826e338c3b2f678e0fb5d2a15e0dc3d234b5319cad89967b108b2c28a00ca90602458c26ece32784cd15a21c75b55e7b5b29e0d334699745549f2b79a29883053aec1ee33b31db81b77a542bae5f900d158797ab680e13c2cd9b9d3e043754b3fc311739d212da8dde6c5ed6e0c67ee2d3ba7b8e3495b876575f25892ac23a01665a466b1f34da50296ee543da82bc93508fc6947b0c3fe23efd625c75986433d5c791edbb713df09c2d7af5e8d0b1199b5496ccb9135963c001f8ffb6de2c0e9dbffa61dd5dbb6d659a6215bebcc1ebb5b22fee7a0f515cb9519779a541eaf6f554794f50aeb1388765b60332663e2a9eedf754d77e46934917d4ed12b008b64304c950647da127d66f3da30e18e6c664be904c899501eb7a7cd633af21bdd99a1b9c76ad4d3027cb51bb1423259ebe0cef1772428ec38f0d2cb3cfe8b59dee67198cab311bc77182dc3fd288791335addf9a1853e33fe2f000000ffff8c5d596ee5480e3c5101c99dbcffc506f1f4fa438cf4d8fd5968b85c522e8c559fdfb6cc8cc8710118cbfd13643074ee5f221263c07ae4e9fedeeecffbb6aebd34026b8b208eabbf5fee43d405119847bd9331924a9797efff17205949f82f4832b415c289e612339f4d7c48b40352af155f59bdb42b8dd3da9b8d38a991bf109ddfd1da69ae148903396b5b1c32de3ac097d595f7ea7e649fb91cf7127364130ae2c7db8be0a81d48f11bca9d98da4f05624ed08a1d88c52244890d5855e219a0e0d276f6d359b36776c70d63749a995b1d42caae2abeb00426f6b758f8f03a7e926f7929ad5873af991a6f1903722211f74af83a488d28ff830e1df01eec211b6ab1f5c26e0657cdece571da8fed770e4926f74bd07019dda48886429323a1a7d4f7182c93c9343878f4ad75c22bc47c37a41322406c26cbd6cf340ccc4ebb1baa2e69a59007929465627f98d67e6053e76cf149a17dc9d27d44c6d3f688d63db3998b5335cc1e81bdcbb3398ee0777719c5be7f1c462c8328fe052634bb62a9eb4278533cd4631475234ee594e5f87a046a01f0bfaf436debad014010dc1bd0c5c865c414c1f3b7e3d8dc074e7a97cd562bc6b3f7e8a1aeae87b9cee0510b9494d4214d1894ad9510614a34febf1f0d3ced5a355b43c7a0459b98a8969f00dbd5eac5e608bceeaed6539bd683aabd81b354406a5fcfdb738f541690f88818860c62a17b690bee0ca50775a19feee3ae460fbbbd8eb507b0f06fecea23b6871cf2130574f9a21fdc5527084e248c1c74a5ca09ab2dc8dd061d3dd324cd9f3a1543460a01142722d7015a37b8756be9f15fd0cc17f24abd8c745ff064be9fa124f414a101468edbc6b01225ca8a1adc66647e3a5d9d45f4a65b268d2ae91626fbdcc269e2c4f0ab4bed23e6e0ee6552a7db49e81133983e84615a1dd987f71c66e9434220d9af294e60b4daff2f1862b22f3d2ce2ba66d4fcfdc21fa1a70b57d266277b7bf004d44f3a6d1a8c554db34bbac6ec5b3e3e6866af8d063d996c52add0d93ebe2bf76fd11f3e72edd0883e41b4458c9f6605f410c38b5163c0276e0f5bd050013806ea62df35587022db441791aeb4436d74dfcb821fbb99ae4ce3f98bc792efbb19339a364e16d96f80b8301bee37ae7037fc415a5470af2cd6b5480e415f0cc1a49404b455254a6014c2ccde33817fd862060d9eaae9dc93a1676f5b1198dc2e46781fcbe2be2afb82f561208b594485b92788273a0fc748e1fd3c46103fdb62b16c360faa87ea9a6457bb4c1c868b7d36fa23d2f6ca003eef66fab07916547b6f17d974ec1900b34ea5f56f17cdf3c24f9fa48b02c769d1108449b069d13bf0dcde493f505630af8490ee2919c36e21f71ceb4d7383b32152d012464b727863f07472295ac017b2e1df679ab16482f7905b4815d223a9130987f5d9381c8c49123fc3c4ed67f63cf566473fbfee9498b3b7a518b2ab49b66d7aa54330acafeb39c2658f1dc7a7dbf7512310de9a508cb7350b0306afbf2ef2fb7b30afb7a3267e6802ed68a2c352c02a921c17f576ea7fa8c28953bcca3b8e6e1ee263475f82964ac140bab965afb3ddff0a547ec820d73341c00473ea3ea7ee0392d9b81fa119d39835872a8ef5460b63002ed76513904f49c7028faedbf2e5e24e7718b49220161bc68eda53aa3828a6adfe6a406add046a84d83b5cf3ef3b624d920afec06323ef5716dbfcf2749c261b6980e49f6d05e977d2e1ff5866f164389d6370cfd3f81a66b6612be9815f1d7fde3bfc19aac19cd0c9d3c057fb9c4b8bb381859617035900b4d8a39b4c94ee35a751f029ed3b28cc678f32d0488b4ea89bd151643eeeb9758799a73a2b48a0d8729f71e687f1d6fd5e3100cf93243d9abd4dbfff815c116956dd8bfce0676688e838535e9afabbcf0858c775dfcfd2a3db2302e7089cfec4c1b61a31b044237fd1b461d1ecb3d74e32bb6c697e6ca3054ceae485808aad9187162d23414df826b6f2097371fa9f52349187fdc5379fcd47c7afda64e1dd4c602e95bdc00253e99f978893b6b70752947722c8523926fb97ed42ee68fd55d6deeca1932c27ba1966a74bd6c0f2b2ef52c73874e35634049c7ec680edf8f4f764f1dc2afec63b1f1468f9f67a3d36503cec228f7a988ab04671999fc54646080b2b5e84912d457a84635347df07f597884f23fa0494c6b1fdc2463727a3e1f3cac6fcac474177d122ed4a5b8224c4c45d47a19f29988d76f4ad3acc37e7eb89d0056d99a400a00218518a45e17cd7ada6f7c00f3d644f0c08a3e4eb92eaa1fbaf01f0f938429694f21253caded713155364473dae43e7b1c113b03628bc56b45c2235f7ee9cb46ca550221c45bea195557f1c8e742d6afbc6c751d39407bb69e6026b5b1e8ae4354cde6b8c2a90246b1168d851523a2d98cf3908ed58141b4febad427f4e53a445da38f7544d88f1a4f5614244f2c37cd49ed1d59b11ba95bfc3a14f4a2ac3653d0660273d45ab208666009dfa4459f7903bed5b72559f4c77ff2daef823b214fc56be0947c142a65d734b950b346b29a213cc3e615c9aaf94ae70acc47eaf8f2f9e2f8ba14319a43e6dbbefb1be9de8b7308c59e2aaa123e512f7860a137d611ae0cca0fd842c82920dc4907ba54bf06a6456d1dae972dcedb3352b50b4381777966330346c4e6370f4e45fe835c9634aa606a996f730f628df83c837d98bdb5a4937b58afd6730c744b361b7de6afadd13f9642cea94fe21b3af31c53e018354428ee3f4e83df67dc8e8d813c3497b570efcbb6654be0688745dc28a99cca6214563de34f955b0fb1afe06b4cb06806f77d2332eb9e98a48491d50267b8c2b89dc900e6a82cdda4277791ff1411742e101d325f14e6e19bd07f4bbcb02d6463b4a425ce85bf6ff2e561c5be42ecb0cb27fc019789ce671c4bf8d66648318d9345c4c4d6e9e1fff04b1d26dfe77cfb5159f08d761784e89ffe74d0c3bacef793f52869e1b1bb990edb10b10ac441e819076829b550d60b9c5923a340c4a87c28cc50e00be14d069a2aa14c129d56dc3b93fad83c9b748af31ac46660812eff24f3e37d8282636fb2e0aed8f46728fcff8f207c78864088609a29951d04201ff6dcbfdf7b3e60397936d5de09b64defcaeea9c35d18a22eaba63cc8a65a77b9f9d2ee1c691638d438db33c5ab06eebb6e3c0194f4447c5fba13fb4eb27d1f49b49e4d96535a769c618e8a7348e04da642835f08c54fb4f319b5af138d21db6f35f38428a3c492722946449f02d49399feb6b13784aab7808b578c7603fcfac4fb38d2702ccfa0e6fc0efb27e5b98bab276d4be6df074e8327208aefb0c838182a0a3e3ea138abb459c21dc356262749d22b3bcb934387575fbab05b5044d533fccd468ec69b610afdc2ce60c0fae2889f6b794fce53bf0df762afc805535c9828f846306ed750824be256af8ede552ba949e424e0351fcd378d9a4baeeda2147a307cdc1788fae42ca0fa4949dd1fba88841580d3c1d4566d2fb8c2651629f9eaba63f47fd461e1aa6e11117b6f07d6cab5b2a5163a64a3af17ffec54ef343921df058292b278ed99522dbf56e417928d3db3809a5858c18d7fcc79d2611dc8041a9f17bdd8822c6e7bb3c8974b9709de618c1cd3b84646af4af29dc2f9920ef58e397274bbbac8e700d7055b451520df2da7e62f646505f0ecc8180fab7c8e15d737aa24ba782ec989daa643201c6260792c0196f9425388e27b4d55401dd435a22da83e855601a2a5b76a51f8c6f7baf3e3445d710b2b9f6ce38426c877a2d3cdf4547ff6ec56dcf09e4f9f6cb3f8442ecfe0989d037c9feb0b6188de8dab17a074c9f01222b29be7e9190cc66c8b8d3837067b0bc688bc152d8dd6691d39816372588bb292d63c793ab98fe429a07dcec268635dfb545cfb5a01a545014e3e82aa1b1f9c28fc3b984cc486cb80ebcb86df96d6fb2efdbc102116fcbf130c452d289d3955f85c03cc81877f7b8ea717b95bbdc298b6f639a64ed8d2163e3ec0e9ce341ea9e56ce48fd4191d60445dfeceb477c9058070a727e51a423f2f8be9e1b33d8ce34d13e7c02c5706bedeceb2da3733f74c6e1cf23049817671c9223db3d61a9979ea36ea57b324298fd3b8e4ec9edcf245ffc7f09340c28843aba912da0083eee0f420d2858e1309f7ef2fe644adaccfd974eefedccd0087f2b860f4fa8421541985e77ef5100952ea79a86535f1cbc23a0fdb76c3f642638a341656bfe38fe775bcbc61457c3e7370330a7887b55fb30e9db95120b7efc184efeb8a4b781e5c474520fd0c90056d8d4c8c070b9dc73982a3395ba619a47b5074d8f508d0d684ef2b2a2696033b29af6b6153edb5d1c59574aef5f4dc257d55e2bac7cb74c4614c588f1dbbe6d75cfbd0b1f92d29633f8d436d6416f0c5b32d43232d93736788e341de64062a0e88379c9e62bedf3dcf76d979fea39eead432086dedb1d378acf681f1286b2b9d444b172743f76b0a63b3f04d30f4a5977ae3ef3ec2d757bbc8a45be89c242d7d37e3b9800fd6c74094c45913f04276a975d7217dcbd7ee9c7fcd1fdf202b47cd7ec7e5dec88ba07b9efe05e2001ca916edcdafd994b8f69b4bad3eef7ee73e857d04f6e9bf653e231acb14b6b8c4a3c557a2e9e8648cb43a4465ec40488a115c1ca8357ceaf50faeb64b77787cd57ec429d1c99d6c5dfecfb7335a2a376fbdafa712cd3b974a24840d28972b2e1a9a05740e8224ecc11d49d0a1b0551156838d2fddaafc1b98239f9d034a7b675d7bb1d164d8187ba41f8cef97a6170e0ed12449f3a4341fb409489ebeba8fde2d9bda20459554be9c0159b3abd59761363080a137466514b3542439b6313a9a9bca4d46f45ab401cb3771482195af413d00b62fb5c31d45f7186d00f38663aaf21f5ca104de14165593668713bd49aacdc2c0b21b2e92e3268ac7ab62d765f5b8f1ee6355c7d790d80a11ef99c45550868a51dbd6ae46d77b47306d9e98d1a3f69871df6c09419c4c99813a71bd36c7ce775f80d71cace8d4d39d964d17b2354c68d55e145ae1900fe9d43ba37bddb0793d07d8dd0d1b0c9b6860868f4fa0df572490d152ea326f5ed827fae6ba1d4bf85cda589f39661856c1c3b82cab5a3df42a1be6570b4e1d4da1da3d301404f520697946bd7bc7fc25d917dbc4f0d286ce4f86826261b9decec37cc4b07318a7436305539a8e7fb0b59094deb725f372a09e85ebc8a96d70a10ec8e8ea4f0998aa0719e9d8c434d03243e3dfbbd2ba9dc0343e6b60f20d047842d5c3fef3ea5af3882bf7d7357d73a4d3dc99a279cb35db16c117e90110f5e5d301112a9e8a4211e54b3a86e9e9ff1ee49002e0e930578b67dd5ba7ebe3b40b802d59ff4b46f9e7dfe90c0539463c6361e3468397559c7fb9efd9a4de4ad19fd1f37538a5773ad3ee2015408e0526c2a30e95b7b3af9dd9e3ebee02f95e0a6450bd7867d2dc9a9c46eb8db3796d44f8b2a391b5abc7453b3577f0eec1500bf3b680ec296745870c3b9bb1a0d4addfe020954e322dfcc99e97743ca23205a5325dd7df815432bd6f6d7438175b21a1bee7ae295c0ba72d664c030e75f5c46f288d4bf16687d3f23924855efd35ed05493d49911a832a3b7833b6b73df86500ad17b3629e9dbbeda2887dfe28e886da905cbeef3450272431eaaa7c4d98b2f1aac1feadee4bdf9819d290d74b96f9b2622c11bb91ed420eceee846457cffa5e2038622ce11e1a9929be76a7081a568b66b1e48a5cf5cbc903030ec014312bac47a0538d23643fa5128c9f16d001af4bafb1391fdc37c8c0602c49ee8230dc61d40c4a75c9582e706c2d743f6d1a569c5d623d34f9114a9520508b7a7598fcf2627b9262edfc8c9191a5d356157b19d33d4d44aaa133d1927f7f08ee430ca2bb6782a874bb62ca169eff256d04abb5506c77f9bf69f0a1260e0d53757fcf58bb9e7a6e029abf8180f93197c6bb1b789e5871890c0cd641b55381262e4e57b2c8ad417e3584dd9db53851babb99135adb614099f6ba777fe0584287ad1c8ea8bca625d6c4d42c4dfd384e3633264a90a8ff69de16c1cd3b3f70d88cf22ad1e1872a8f813ef80ae2048b4a719b59fc6525ad3844fe044d9f9fc662b1f741414c4d05d813c1ad5d872edf0d54af1ef679e126330757f42c03576f3b9019dc466f39682fcbd8af35615f1e15a28f7834c18d132a62c92215a724b57de3edf86273633bb51204e73f4c9cec8fbe3218fe9bae00fde176c1e54cb0b7f7320dfa993af5323b8612e4ebcab0ebfff8a40fbcbf68a811a22226a4af98b221f7c417ae9fd832099d8d95bb9a64cd1bf1f7374a6863934fe62c2b9d5fe5fcc41cf358f3acd3dfc648411637515b971f5a504f120278b6ccaa3fd6e26fe7735b07ceb83e1d0dd1c3f10d1c6fb5c46f2acb01ee1fe61eb2cf2a587d8cd9e0739bee4f7e22d9941d8963e6036a9b1e9447c3aeb9ccdda39404ee41f2a467ee833a014c6b55be9c70f7d1d74a72ad5f43dcd737bd6517479ee1446c2ad4f879a9bdf3e7375351179db21d2e6aafcdbe7730d3b236f7094e6fed804b9b79f9b041f0ea4e2d0990cdd67daadcb5b1cd06b795aff070000ffff8c9dcb8e25c971447f8598fd10e11eeef1e0af08da5033102840d4460b0182fe9db0c86c49e5276a6e7343a031e8c7adbc91e1e666c734c5fb651dfa8aaf759811e700d871945bbc4d7cdb7a1dd9152ddeb33e3302b0a19741bb0c76b6f0a9bf1a37afb49d5fef98545dfbd3be16043d97f6d56ac24f37456fabdec46fbd4591c139d735a9afd93fab237375063f5de6c97a2d159583f3994c4f97375848ccaaa2c0411647800a7126a472c269b8a8938489928300725f4b9b851a4cf3cda098f473bff0066b62fe95248de6229d058dd59e9c5b9eef4c4eac4c6429c9ee6815800de7f5b379abd7b788ad400b6ca86db7da9be3ae75c360143e44502569419eb84a89ec0a2623ada32dbd61d21370dc80e8f45c017b2ac2e4bf7e0b2dd66be9b239baa56d2f7eb97708576d41dd2c9241f1ac259916daca6d04cb964c927171e908b9b76b2189de02f57575c5eb99e281f58c90e25de3b6776ed5ad7ac56cadaf81bf774def97278ee9a7a1fc32491582b4822e75533a6fee4ff867df4778ce0b26620d864d4e01d96e8c96cd8d6510d1697fb44ed264a3582f2c3a7dfbc0d8c76251aee95eed33da851d193e1c9dc6113967c7572e848c47400ea4b25fef72c1d3b8143aabc0d9f24bf05a2d408cbc48e31b3551183de4788140a3784dbf10146a7d8a9a15075c51076e32ea9d5eb61f4322e93418e357afd3ef3d73a3d7b8aabb3858087d02378f4ecf0483d3659c4140469500109299257862f1a258a211c3be0e16bf7e4bf679a4465834d734c8b522ae019aa1b025035816f23282f996bdafceb5c88d0079411277dbad514fd306e967b8551803cf7f384e9f12be8e4eea6c9bb117fa68d56610e0763dad9dbdee78b71234404eb414cdaf7a53342904eefa2cd07be715015c162e4fb26bf8c76cdb8b45eb123c5125d966bd955d6f4a6298a3e328a64b7dfa6c72bd7708823affc3106518fcb5ff629d48daa541f845ddd41f82f4f26af4944b163842eb3918be49cbce4221c19932abc6704e2e78b207eb6e488979338f4b61a5caed1238a5864ed2e4394a420ebf06149e1b437c6d71be56579d7fab5b4205b7dc62845506d285dee3ca0f26f77f79515ee6d64f30df5ffce7f3fffff3fc37fffdfee22ffff1d77ffbfd5ffef397bffce997dffffdafbffff6dbdffefeafbffcf86d7ef9dbdf7ffbfdbf7ef9cb9ffef783f97fffd15ffef44f25066d1b68c275fa2f16b49f15b05a88ee3140e71723613414e5eac906d552fee3cd1b8a1fdf268a5bb6988b70784a3e31486bab75183b461babddd603ad9669e28f7a6b33b32f32c6e43e98a0ae6b32a9a5457a25c56e757b2f7db24eedbe435209f64c0b3e78c9e21ddb01f739bd3a399b3abb1560fabf5fb53f77fd06b17fff75723dcc8abeb1e5628093a6cb3e574fffae0d1613b6db33708b685b4e4a54d00aca9f20fef4ee8e9f4497851a2c706d887351f0f2015f7157aa3950fba61d43b0dcd70487061ca821603e1499ab16647d86deb1b355bff280d7778b264582f1d64bacbe4557ce98c4bf9c5557bdd08930b24720902b883d00d95b352bb82766f73acdda386627148ff498985b7c8b18c7728e79c22935593ae7c0465e7373631fb0e89aab1eb92242cd51e700f1f13bcc022ab4c1f257d7a9b9027853c58f0756af63458d9fa95bc87bfdf9ba0aa1b955378dd951e3584aa843ec8e6d3b61468c9555baeced00fe2eaa8f676076f36d832666d57597bf559fb2b274f8e12752ef26316c905021231e22b74b82114e71660cb423def8e20ba0d517f66fd95043a954acd1897ee617bafbc6d2d612c3ab45ab854b0793c53957fd88ba2754f1768d0c3ce06bc9805c6fbab9730f74241c569575d4cee758f5c6bf4e8346fdc422b48aa82773285b58ae5f5da74f353708b93ae8b23ce61220966e8fa7c6565aa85b4c6d5ee1295e4b8e4c8491357cd74acdc3aacd592d5fe607530d13b56c1ba897d9e975e9a95b0d905416b1678547097bba0606246ba1a839bcb592b3ea872b8f2241235dbf4303ef413ae744db9f58452b025e8a980880eb601ed5f3a0337506ea49224566283a8a1fde79bd94a4a6d28a9c74adafea13eac7775dbd20720442903c468c648385ece534e9cfe851870909c3754f6e73f7ca93532a7e65bd80752502a069088283c6babd1631b5c7bf8a82e27e222b753ed1d181fd9fe83163d06f7baaafab6d451eb04e77b11e650ec3da686d2c5169cfd38269547b87943fefd1ab58e1c74f03ebfc84895757819e780575c56b30a586c88c155174caaba0baf5318c7efab1ac03deb436ee896a796ec45e2b4057159c1c68c6530c498dd0d833aa0aa7ee5aa32293ba20f5801069a99bc4072b582865aafcb6cae0ef3af1583aad894d2e598bea21d6ffbac38b29ef066d214d01bc7aa3554571955e42b385a173400bd06432b2edeab0978818333e1c9aeffb240244775182836697de13f02dcdfe5e0db9a692ed89abd11049bb8ab95d0d2ab5e15a221a577fd35ba5eb7d3720ab242a6b322a568c0e279342e1d545d9e748af88932e5e46a20359db929aa879caafbefe037401ca66c46b3554d8685bd58cf6bd311bf253f84f8f0942303f3c2b7a3da044c7420d0ee4e6722a940fb5d5edbb29d4593fbead8f255133302401532d1ecec45d0e96426846b27ae3f7298c3ca357f2e770b1e73bf686e938f644319d72170aff53ff04dadcfb94dc59ef59da23993540fce6aec7a0b88d4061aa8b7d56a9d64fc2c26aa8bf2ffa7b64e0e713b076ab08741f92f10320134d673842629571385246223260148474f23e76b67a8dc81909debd4a4cca5f494e78509845bc760472ad4622f44aced96e2006240454b4b954250b1e86af5d3fba53bb0b20bbfef5d5bb77192b1524dc7c55ad1eb6807474553e90d8b72b4aa08fd306cebab209fb90b689a3553091b8329565a894f66453fc50dd196a4a977caccc32ab7fbd1281bb2f187fd53bbaf99a9962e9d6fbc314bba282a8accd852ea5d0f304c2878e5316bead99976e8a982b1c54997ebc1808746f75753a543185831cc7d210d41299a57d28bd35af5fc481e74819c899dbc12854af789f72fed620c250dfb7934fdb3a8bcd4c1e2eb05805fb20cc75ecda0fb2944baad29b16bf01e851c688bd31491ca712073fadcb2a9353d457ab54b4aec54c2d46534a3e6cf347db65ad22374f3fdd7a0d2b93c02b0fad6189f6aa1c2c06b2a1849bd500f06e4c51abd708ba9529003de196d7d3b22ac2444080ac7be310f8167809f52dad2af87605be036c9e2d2b4a79e0e6e904283f8254b51bbea0de84c7bcf43ceab34165a73751d6f1d4eadd5af9cf528264b7ad572cfdc6a87df24d2ddbb6ebb740b3a53281ec5991589086ceb2ec32460176b8cfee8e3177b3e82874724513c1efbd6c0584c371e4b0c68aa008a0301cd6fd43f00cc8e17eea9febf12113296ab8d7d06abbfca222e559eb8dd6c9dc6200e5b0a65d5cb6f5593178ad59830de7fd7041b25e36b441c7e9ab4a0ff8d1d54a066f6ec4f29964b19d2576bd5575624d5cabc7567f5b130226102f1da23de30e5fdfa3af412a770058a645e3663bf850700b2cbf14bfd4197c75cfc4be656c472a46a74da42f18c7c6a573a6eb15db917fee105ecede6de37a7bdca16b393a29b4dc45efcf361054b5088fdaa0f58ddaa81d6e63c7503fb87bea298b250d8741098c93cdb0054f621ffa6ceb94da22fa825836f6844dc4baa2dd78738a238588d76d5fa30ca763dfa321dbb072723f6d85d510ac3512da4f43651bc16edcda886d4d6f4d5cb4f53725ab5d89e486be10cd24f54da6eb9061d37a9a196b19a6a53294d0ee53553248d2ee546d0fa6a2251876d510e5c1a7736ec96687d683aeaf580d16e967bb120ca769387eba2e8001f4b8b084f58525175847e2219520af390a1704dbf0225491e5a813acc9760cd3a72f532cbbf63664fb0a187859d5c3308868679883c4c7d9bce6c0141eda18598cd9fa2dba169676bbd17871c0116c3713bfa58a96e24c3baee06d2ec73241ef851d15fc795f14d363f1161ff47494774fc18ffc068a5fb8496866d71d96bc60d502e2c7102ac4a996eeaec5d0057e24335747886b249dd353b52fd5f6ea2af7022729433fb42af3eee53bb94f9c0bd89ca56108af78a13946d1899f2448cd2476ed5ae09e166faf5ae4d461a15e28c4fb4532005c4bdcea401fdd3c57f44a2892f6d68922c851c337628ed52cde093274acd53bfea9b2d25977a22abc67949343fec2b540d8516558d544acedb90d2b2cedff3b08c6eab430be9bb36b7feb17fa849c9c3571a5a221f800d45bdc2b12949e81e792a4821b006b55a147fba4680a58b22aa3d160f5d3c6a4f287d473e44082bb0ffae77a972f1c7abf9242f507211c04b88d2a9afd7a203c53b5548049bd5d9a0fb044a98d39d22b3a8137f8e1b243e010d6a49a35084b9bd7635774e1c1ea2e6d5a20b7615b33253871fa8a0dd09d96d0207d7ed6f80e9d50c538f53a218dce705261d7fb72987a4dedca0d91509e5a74d33ea33211b4beecf1c940f3a3cba4f7dc802d68e94e98d45214dd41a81db33ed0e6ad3624f7dc63b3fb22353aa1b4418016923d325a4d6a5c17c01a6e2608594fd41b488790e1085472ddb2c88ccf3106b28362215c3075a9742e5efdca90070398abb79f3ac235263ae06b2b3a9a9cee1aac9cd61323cb5d04b773dfad465d59369d12449ccebcfa7df6a338505bb70ba54b6b1d96939f3d163d43299221d0d8fa9281c491120ca08aa572a4355caf22bd4ef0acb00e950a61621327d85bbd0f04587c68c35bffac31bd6fc03ab7aa603a1e90d9d762998c820a65f073257fd9a2a2725664142e5b3b3325cc584febfae221127ed1a2a4002496766aec0eaa23aa91a98fbda814e01da6c25b75915b5796cf69d6225b95ed052110fdbee211ba24c160aba7fbc5fda28d0a2a94642bae21ce2decacc3053a460da7de2e84ba3b6e50995c77ac7af554ea7062e9e0c27d8058d9e69af535a1ef6c6f50bdc4abdc56355c016e70c57239d18019ca9bc470bc0475452ceb22327d226b093b0f59c8a6033b9691a3553f86ea176a0aec742c1104237848df48257e631036157cc1983af39005408615e99f1622454a783b10fe9e18010fddf9ebf3d546572b33daf094e9c08083d5ea5b2c9020a9c81aa1aecbf1338100d752a32aefa1fae3181f15c897bddbfbc4db29d4b482713debac3cbdf701bcedd4e782b6369b6a12af4b53f96376cd972d414099f29bb0bbaba27e51c9ef7a96c095972c5bf33eaaff59ecac587260c2dd6f3300f8bd7ab664338c4b805c2ff23609a1e5a1725f19a675dfe4bf5336ec7354b0a9fa1ac6c605ed10ac372a0b0568dfd50724eec62200fffc720d488b11840b8742046a472a73dcb2dd691a310172a88c8b23c0e877ec406aab8f54a90bf55fd57d82d1a5dc5ed539bb8a6fad166cec6db5b6fd2cd76cc15237a6c3408f4ccacbe0563f61ddf9a9ce04d75411be3cf905510466823938643f42c2419194c4b27ee99e88f874e861ac8fe71c80444a1201f9d77bcb06bd481b969c6dfe4476c4a68bb05e37557565f1fd86556c1cafc29d78205e2f527e92494efb408c961dc3865f0874363722d60767b6d97326b725e0d942db602e71ed57f8c92ae95889a51abbe17719ba8aa10cb6e5e2d2e56e4b536337cc0226057cb3336e498b633fa4b27a60cc0b0ce30d493d5baca3946537390a3295f34ac32a76ae0fb8fe1d5c0fc4da20ff08418d57f0cd49a8fdeee88e7695562828cfc5656423cc307763a9ae2db58a565d45afdb6aba13cf12edc79727d1c3b526ab752d12d66bf355d7f99274c6d4995f4e66a84fc7591b8cd2a807030a4bcb5eb340220d62353d04b1a97fbe4aeb5b25123cae7bcceb6dfa46834d7b4848b3aef7bfc9f7990ab19358184fadadeb154a00583c972b36661251c4179784ba7de37d7d70f5f59e2c4c8bead3f093b88c307a86dbe5f3a943e8db6c9eb34151ea8a9c6ee422c6b6fac0e9b79dc017a80dd5fa875ceadbb7aecb2016c32bd64e0c26b9206ab9a262e342f22d47dfb33a1b7b19c9f5752bf9acb8bc4d96b24cd106903d9a286b3b122413a13995ccaa2acf61fb82d6e271a9641921886b7c76c92a55360d2c4be95c7526ea22d4b37d474b00cc5472cf40c11b879f0a96e76539d5a7db57dfd3afdf0b5db1157f3756522df4e288f6228a105e1dd5eeffbd8e69876f34ea9c5292714fe4a58f80e62b46e142e80f61a4c71116b62b46e89b749fe8ff63541d74c74c03b26829d4d5e15f1be2bd22b6310426abe4786e703503cb9c0e96fa0ed8f27c8ac085364cc12146bdc5ec90df8ebd6e3327a558bdfcac52c44d2ef0ac37c47e4a36e9d8d1998698a7f7d98c12dc3e67305c382aa8a8269c299404b2622630e404d12a6a25afd233d28ecba253c24ef9c7de25a829b96810aa2f2b401593473bee0978acf6c0fb592b41f5d45496b06ccd363fa44cde6b5486d51f7917a670e3921a123dc1b5dcd9eae6302521e2da99d91bf3ec5329f71a889fda1b5611ed3a34db34e17eecd39f759dd5deafed5cf05f2b71c98e3dd5accc0ff3c0b361ec5f7b829e6f8cb00a4eee48b1aa3fdf7ab550007222c80cb9cdb2efeccb72ad9ec9cfd939d290a2963eef59b776ed2420965d3e726aff4f730755661da1c03098acd9765bdc1908a32a5b840967af2d6c1d240ddd943b202a4b09b5fa2c2986527fbeb86b3f66b28c80a3d6f512eafcb9c5e9a14620b3c6bec57be90d9de8736627424c700aacf8749e35941a486efc39040b2f3e8febf5d42d90f2e4fca766c44c4087b66e7e45445496dca106afc85cb32e03312cbe4ed0a463d32c579b5ead08aac784034727c24673e14d38d03bccbf3658dfe014dfedcb8e17823de2b76baecc01941df67496e66de5a0aa5553cdf3c36b4c0519c7d7a1bb17eff45d35ac03be5b15eb0c528fbe26ac5eb3921e6e98666bc6e1fdb03366bbd03966475bb74a9c3319a9d4f680b269cf5d9b3c5d43188c8629b0320a55ae84218b8868897d402b50adf7eaa6153404151b03d5b5d7bcd33afd1a3513b3633a3a8b343c0fc7756c0ab44baad90aa31c535741ef5d6aac86810399a96ff9096e2b668de034bddbda45961a6d969f58570b27784c02eba2e1708cb9160bcccc8d18c98caea9adaee07d6543c5fc6824617eb328afb79eb7184e84bd1a5955a4238bbfd7e7da39ea37d76598aab8e5dbe6cf7d682d405edb88b9ecd378f95e3d3d6590aaff5cc189217d376531a67b5d184df79a52bbbf6cee6649c150f472a97f58c400ca489dc96cb59c7df54ab84b89b1a86f5746b8be55e27067a1c9a8c5088ced7b24f1941be35d334c9d96d819e610eeb5fe204742c56c213491a3fbb6a4ccdf9e7721e67091da89a58488b82b48c6f0ad0100407055d202488d75eaa3cfedbd70c55b796ba0afb3d97bd9ed50235d3eda1afc524e64886f0fa4609f15e77235b1ba9deaf0badd9fd35a3581b9023cc0f0ab4e7e041618e95c7cea04771fd0fa5ddf681a7daa01f2c7fbd9bc0a5e636e6b00085e1388ed86ffb6b44a00382995ce60b2a9c868a364412edc813edb18a3036e2fbbd7e67e6def2a653e2d0ff5a9a7f2dafeac6691b510791da2eb032024f9bb4c62d73db3db1608ba9a31cca76fa47f86e404285b3b5567805a0f1184ebdc7ec3766899b92af3a42dd1ad12453b2b2780758aac11e7aa086d44fd22a5fe4eb04b28573f36914f13759b5282dd5092a5aa21a0776deabdeabc0ede0ce5cc98bfa6a230aba592a204b3d45834f3c05e5f4a77abdf66cd3fd5b9785712236512ef9f06ab07bfa6a04f25431d00714d84dfd6309643ddebf5e0525f51d475aa3a5b5121ad888fedda1a7b0563def1657a5bcf55b3182e1705d2a23636f1014d78ec39eacdd7153407175fc9ef64174e1943ff88cb54f1588f58a65e943a1eefd1b7611b76e42eaba8167d676543a8089c32463e2fe1bda7d35c255b1332451724864918b20e70a2f6aef886fa5c3338e18f562f52f7e0b07e0aadca5d2ed64acd89cb61a3555625339488e36b4f532a7d2185273413f24f114bfe86fad08dad85478724d216ccc5878c3c72fc0c8fec142e378449ae39562db0c702704082443997bbab2672552744cb309235b7cfc6ce10958e4f3ac3847fc5abe5ead23ea14a77449edadab1c163386a1510a56a580ec0276a86e9253ce700f84fe17ab8937428d8c6cb210ee87ffe44cedac7180668a84e859ac4a73de139ecb482ac3f31171eb4be7385482a715b9ffdb4b402c7d02f69ea3595e0c1c1aecfaf5a30afe283ab24814dceca194ce353db87018b1e39d168a82fc3f4cd0ac771560b846595b4c25b09be172a65a5ab58a3e129138d931a2b16bcb484a9becb427768845a3546add0015de5bdae1bb24abee409c4265dce1583de736a0af180efe1bb030e104ac6b35e4a87070ae714411ff56269da274d781505acec012facadadc6dbaae5a736f5f583e4c6f17b7aea774935fcf3de83fbc9ebd4e129e7a0b3fbd46f7e624f3d7a6fceacc9b175fa98185bbd9138a73edfba1653354f037a5e9a1e584926244d7d1d89b7dd899114307ba17b5389f581549de56985f64f0c9d67fceaa2288ef8b4af7f8c3aea31dbd51fa9bf32fca8399477865174698aaef7ab9c3dc0c597852c1ce7937caa3592d042c198a8e77ed76e7dd56b9f7cd50dce97986bae2a1e456ec7c3102af3a95f14a9a07ba039f312dbff86fcd9476a595d9dd55bba857d02973ce7959404ce805dc979ec5ed57ac44cef6047915c752caed39509e34fa88a0ded6a92c480d691897b80216382e6764a11375def3ce1cdf227cc185726c3e5eb4844ca8f9e4016545497eb3313cdd666cd03efc546fad5764750452ef8c1ef91e9aa55272d59c50d6bee35d5c9b87ec6e43bb52fc4f9ddd6f0864e460145a9f3599a91b1254a69bf347dcd81449c1a8247c238d8d61e954a7a68ca312b0548d5cd134f9c1a5526ea9fa4e7ebd6fbc950f396098f7a2a5f3131f2d3ae8672f51c13b1b51e3b1bdc7d43921ca4ca0304bc18fcd75713db2ddff55d08fe5c5677b21b9d60579d0d8b9b133b13733de1140d8d7afb910fb6a191f60a37ff86bd2592ac2a5aab3f668ad03ce283c2f1a3e054e759bd75aba402bac5d5f401d3c9eb8156c71e5c05dabe4315eb53501c0858b6cfb6a45ecb72adcae56a6b8ee855adbb927ada3e637f35cedcd8f321cb1bc49fae23a188fc6a4c5bf868e5e48860d5880c49c1a40548fbcf9815ab0261eed9249a045ff7a7802ed8aa6fc9bb59619a63ccfa8ca62cc248105eb54595185f4a180557ab7a8aa0181d388363015e5502bbfb0d6cf5de61cc9596ecec00e87b0e1ad4c5349c938b5ae9aed5f275b78d5731f69996c7fc0a937a9e9ad9a35e4522e5968a0fe983d783a5aa252cacb66e08934778ec1520894ccdfcb8bf76ab757fe6baea627ed4ccbe10b6e87ac3735772b20a15a29673ed464948ccf3af674a8eeeb32a7bed71a27ded117bb65b5a6bac9f81b39d3eea04876e8da887d21046b23e5eaf9bb18a8b53e96b7c9b4c7a5d7dc2478b5e2bcf980b7c4b0547af28d5d925c803fad9537ca34a091487a9db4fc5a134358e56350311de0d1fc2356a6142b442b725e1fa5dbb1da0fa256635bf3684bdaace62d4554a24f6b7a7ac9ba6c62b7e5612122e762b948bc3107051b54c4d645c9eba6c6015b37d5848e38f7deedf9390be59c17741ca6b2d805661a2ea7f324ebf9fcb62cbb4a88e2ce4bc9bd66e58fdf748a5b7cab3e18e31357f83de2da5bc366d9f300ece7a9d3d1b11d9bdbeb6b53c8e8195c068eaf95694647e8cf8b41d4b7945647c9440a812a04fedc11aa5118d38d51fa63508aa4e41ea7a5eaed1d06544d6ed950771fe593e6de3815d16995461866af16a9eb9869cdf1de1849e60c70852bb44c40e4b68ec57b19223e24b97b6c4bee5f403fb02cd541a223c225d18116368534ed3ea61ba22faa454ec51097dea05e4ad23c6eafcc40f33737e34e93db7b49615c2eb4f9f06e461f7466934b65a0f8daaa4d486ca20d2c509eceabd13ee77ed0d47ab2062a50a36bea2a94139ff3807f7b8b91b6e62b23ff965bc1b7b7b95236ffd08dad1ee89f55aaa4892a168f70664e93b32f5cf62d38fcbf33f000000ffff8c9dcd8e753715445f25fae691ec6d7bdbceab2026900881044c182021de1d2ddfd3885be5a67b8414a274f7bde7d8fba76ad537d4a703ddfaaa56484dacd6362bbae174c61aab2818c4bc3caf07bba31ae9df70d29cb71b61abea2b067b7d35b7dc84f2c18a330d4a81cbcb10b1649db3aeb6de6c9b5380936717c563950ee7d1f624258944b07dc28481e79a7a55279c0d34bb56d5d199a3f735129e9dc2607e21fe79bd89984bea774cab8130cca05d24feda276393fde7f6585d0d872dd73243a801079f25201a32c753cb43ffa88ff02355cf0e6525bbbe8489bd7496b9960529df14d2f7c0c8d3666f636d74609baacbdab55d12c8faf1f31861f1e6196c0bdcf132dfe4650756028c68d82ee38adc435b9be873753fcf13a6198ad75e124b560de7eaf4b93de588a06a2299bf31faba7fe88003a68dbb8d0cf45a76b7565501ba22d2a4cc15a14b980bc25e92c79a7630f932ab6e18586defe86c2610ecef41708f938f9590f62bc1e3557c087f3b033fe110056fc452b8913de19fd0cfa8f3a7725faeb112acfbd1239a0a770d5bc1df6bac3667dde6e599656a034478aa6f99410a2b834a11e19ff20a9974d76ee7c65e4d55fe54d84befe02bc5a012a03775c20119c585f0bd8fadf2166c0ae5c2003b3e226bff3665b619c005dffcf3b59c7fdd7fc50dbd1c0b6d9a5683c73294a04a19b1d349568be8edaa138a4064a8f95b3b5b2e0b521e2d5568a502c9e7f1d9a39b96fdda1797c44da0bb0ad09f6b7a4e91fa019ee977ab698131dc273b5c4733f4c1be139dd1ccafd9c276e3a0f6fbfa8e9e88492e1a5ef97ba9fda72544d7117b593256e6da0e3a56c6f0f3224e438514c0888a180bdef765805cfaa7e14ee385b7c682dc364879fd65d927badb1aabb3bbb84910f73c5a7ace9c7358749080cb5f70948912440f6932f5d2646f17f28e79799ea3974bd5b62ecae67ac9062e51646d178f4659d04aa4c274e2f69dd9fdd29c8f50767c256e652807b767e59ed0c36f21063489fedc91e6ef676c5cbb3b816efce44e8ebcfe30645aa53b9cbbb6620b0416c3751ada2510796bb1c25d316d7a6304e64788307ba86bf31ceb2e9a5e232c28a4b073ca712194b5b2757c0f685fc5a33df7b61d5bcdcdf13bbff5b3fc757add2283ef4dfe308b40fc74ae561bbb7d954820fa2e5a912fcc813a934208e9c813236e3f1a918d2bc1134c2e4dc1d5724861c168cb881969a0be4a00b16175ae83871eb52da3735b84c0e9b081a63427e5e504e8a87fd8ea1bafad156dd0ccf485de4002f477208531a23dfff0f7e77ffffdfa77fef5fcc31f7fffc35f7efbe33f7efcf2d38fdffefa87df7efdf5cf7ffbd38f8fffcc8f3fffedd7dffef9e3979ffefb4dfccfbff4cb4fbf9393b20df31a101ed45dbe82a8c5900e7007fa8537c59fd16d2bd0a6432190994e5b866fb9001e594c745f095214f9961ecf7bd5469000791d17c598bd5cf6b5c422154b878666ae489633512e1a0fc53aad5737f2157a0d11bbb6eceb72ebf6d6a21b09bcaf66047a4ed0e669e78ce06d331cad0d0fcf8c656e4e68c8cb32e883eac79afc587e89a0de9fc35c8028d5cd22b9ab4f6acadc0c074d5fd6c207792bf8adb4c822a4d235bc6b9777c1f02bed9d5d9c49a30f073774bcb7872d566a2314aa3a02af5ed04441ed3574ee8970ce9c79d1477376c264f03a3dd4636d2b50a0d1344bab2b8b6000fd687bd9693e573628a603b537e9039b95a10efd564e7f6d3ef098d97d91849d68e8d171ff69f62a7c949a7b2a0911ddb63f344881c22697f8d375854c4c522e1b3c44163b63e62d259cd80bebc42a3cb3a9fdf9c2bb6a33566c70367528398bb7f76dae344e045b4f150144c0d555dfeae5faa26f9f7b6cbd4289e2be18499d937d1c2fc31905974fba729aaba606fd280e3a5d1424522e1b5d33d1f2689efebe2c7fdc8aa3d92b9bd802979ef1091ec062032edf351edfa54ba1ebf74f811b4ddb0cceb1a275586d3061f5b520af52c3e1ea6cb35737bb33ca0983e795ac6e6eea7b5beb70494a5b03f942b7968ec19bc709f6939a698740cfd80a6f8a9164fedad2941e34cdf7cb31a687f928d3ae6eea73efce9122f64b961ea13c26f70a5a9a7099fab443a4ecdce3922983306ddb61dc939e409fadbe712f9b4d19bc4c6ba13c9f72b240f4d30940228672197d47ef2a76acb3ea7ab047cbd5d5ddd8b26f73f77718e436a588d1b29849f6c8439ce58f7ad1b0f12820bd01a1b65156ab3f0a4fbf15392dee79365218f5c1cb5efbf4205ec69626554255e486303fa89e4b89e357fe297ebb346956d2222b23a0a124b5fba7d683b0d66c450aafd96d259b556bc18a41deb73b0cb3a79daa7bf66102d963b7793f17da44b5aac7e786499dc6f038a1ef36fa1f67f5e7d8005eff6e3697da304c9b3b7bb530e8553f8c003bf0a3eeb2ad7b5f6354d554a3ce32410872816aeeecc23acd474bad17ad4ee83ec652c901fdb17e0d31f6dae104ecb99a42e1eaa6f0d33f0afde752c401bf922d60ca1952e8e5b44188d813b3610d4d8fca5e1366b97e827b8737de833b523333d6f00d0e3a1be0a8fa751309654dc1385b49d79f33f21f2ed08d0c8b426aad0cf75655c02ba943a03ad8982863783083b6c4f398cd424617e6c46de940d3887d28eb871ad419fe16cba01f3172da5e17967eb7266c8ebdd3cd4e70b5cb055601544d3f312ee9aa4f7d26d2671b8a1099a9ebb1562699cc361dab8c24344858fb8ad3c2105b97171bb4423989eec8f035fce5978ad6a35d98e99b18dda56efce8bbab2c14e38c4bbbae5d373693dd3d0a7946b30099751c88f6e64e4ce706cf5ca90164c1046a5aeee9e253484dbe23ceceb1f350b9971d67380ad577c2814298b072da46d785c7daacaf0dfbd5f61ca6a125d3407b35c6e77deb151a07cca4593d0d426e5a36c7c8a65a2b40155271600ab0557f7b051a989eb3a33636d028b5e770cc2731bb4be9dcdd652be4ad3b479e5c1368bc6ae2d3e2f3351e987d6fa3601d3e8bb61631aaab29fb26d9c9aee545eab3e223566fd5210dd023f43b8c7af2c0acea2af0b11ccab9636aea7cab07a8e08b8d88ed0ee10a41432fc6c95edc56f5bcf826bb065cec1eba2234b3d73864181bb0f6b6b6be32d1671fdd1605e3682f7ddd3c8b20a05e2baf311d413ab9c31529b4b9588d61da3a712ee3e2feb6f39c3dfe2866654eae035b0bac32a26c5393976e0e8413dc24bd678c13e8a3c69b336ed4dfaaf335144b20eecb01bf73c462676e448841e28695a92c924ca6783c58f6d330ecaba7755d521d1af3527d8e10a86338b1c7bead48bd7f40242c17b37462d5341900b7bf728d5012b4657bb74ec0aa0dc913fbec52f2ccade7f48fe0435fb6d24ec57e60ada6e2c256e0f47d36bdd6429ca874256ee398ce8b26b1eda1eb21222931559a1ea1ce1c2ed8ad1ea9587b0d0bb5ad500486958d84b52d7b9bd835d8a07ee7b4432d62adb4016b9d1863ad38607f3abbcdc4f7263a4207139cf7da349e040323af0f24ed5a5d8cfa9eeef76050e6ce7049064aa9eaa6acb00b76f48188cc68cb6cdeaad18091e1a8007304d315a356dd8b345b3abd02cc5b99a697228003db9a450167eb3a7b5cd0ca8a0af77420f8fa22518febfc3d5bf54c8ebdc6da96c146369125894e54bfeac225b7d5d863bdd374bae2adb72c16ab8bc3a6d96fc050764fd38e03c97176fc6282ebe8dff56e627da226476a80578112b61cae0af34855d2ba6bf87cce587a41221517cc64354bfcab04b53954f2194c47a5ad0bc764b5f0402abc8066fe3e15894710d6b9dad0091723c27750ef6bf28797cfb86444edaac951cbaf47e3bcdce39807adaf3dc81133e9686857e209ccc53081049ae616edb59b8f70e299fa71f1ea9a841d3fa209fe29e4b7510006c59abaadb80196d508192498e84fc3fbb9bb3db6447d54c38734369bcd75dd7b5575d607b158668726b326227402c03ea4ea8380c53a1c58749939113c313542b7b64440a24906272e77689131de73365edfe389ea569215347213335931f0f3754df681b21aa1a56df4c167a8e2c6d825ad3fc93e1499937d226d692a98ac55b3d5583c851eb4474f677631a4b11755cb1a23864e022b126fe320b0430642e346f9665bb94f765afc3055b0a0c3c4fa6805d55c4db932a80e869dd5418b67317f638f923a5a47823f4cd0d1365ee86a42a6ae1a7ec6eab018b65d371548b8c27bd7decdf0ebdb57a0855c97a6364db89c1752fdee285dac03bfd6cb9757fc99b0911f5454189fd9cbb60891eb6919183274fed90209bcba3a19680ed36a1c46f6d2bb3fa9b8a3a95a058abfc12917d01a254b8170f4f3baefb9c2b08cf8f555944b9443dbb6e10417a0935a1028329e0153d2e28bb6ede515184b1f97e640e3e8317b35792d8b144425db2e8a1e06c01a1b22893542e09efb9a9778e34b026f1c549ba5ccad1aef3af427e8cd8ec968c71a6cc65c0afb3472c61a34d6ba0f5a3dd4fa08077c840e41a063cb1d9ac73ba3cbf8b20115ebd9378ec750db7f9a18db8dce49cd60675f634439f521e2ec34aa1c0983ed327b5d872233dc3ddf87afba41648cadb6e5752c314624aa730d4523203d56b13576c062948ee8bb59d448e63bafefb50ddadc0bbae63e915ddb75b30ba38ef9ff7b5a74ddeebda8d6e144bc0d9b90010d8f62b18e50599c6877c2552c23949363b998f5ac63cc3d716207be58943d63949166c262ea94d3a6183807a6ce4600f059d8fa75174d024beab0751e2092b5ff73946e22868d0e69fb79304a1d463c5b655a35d92a90731b43637db7c8183eace2c0314e89eef9ad00ba8cd7d0258fe241bda723345703e6210f78230b2dcd520e7c25c244ef7dba6884a5c5de6e1e8f698046386af67771fe31cd1a613542ef9a277a3ab4ad65f962776295ea0e0c5ef69127b238fb6c9cae88240c51f3d6597ad4a2062772922c7eae4d9296941a7bd3efc53cbe713be772907ae001dec73ce18351d2ad2c3d08ce9bcd40db39429db4b756da6690214899e6ca46dc6d8ade182d6c773f46d53c33944aa9741c9076c32e9707d9a084b4451c8e6982a2807177c8051bacf48f97a75f87c6270f41a7369bf0b0f6c5c6f359b30f3baf4ba7325e3ecdd75febd562b68989cdd44e40f49c26c669ad29917bee1d2645bb29f918566c7ff2fbb1808754146cbc8c523be33daae251bdcd6a6a870909df969bd1ed76642d36de613ccfd4885f55670594bad5601293b2564795f3ac2a5c7a59f2386c0ca252b35858106bc66582208ac2f751dd6350dcef99a31fb6b2ee8ab1eb60f1f6e0d1d3ede2a9a78d601b110ab5593cada20d3e34859c4ddaf5e1c1c88dedad6349c973ff5ecd7bf64db69d22793d9b4f06692cb7a77e14cf37726def032269c865acf23e916d3a9387d0ba8c79c1e537a6779c09dada00660130f8f221ef115bc52e202a56aaa5b08f1366f6f5d6986f98dd933ed7b6547b2d3c93c58bee4bd7254c8e0e629be97cae3dfd89a499b7b095fb048ba54ff3c5d1240a585ba0480873c3806f533f18062de4b11972480cfdcf9862f477b1f5cb4595dda1f449daa2d9e927db3ad982d61e466e81a1e65536a71e166bedb9936c19bd94992614d3e5d39c9a3893d19e7f09e3a8d06dafb81922696d52db00e2ff9dff0291673b0c3f7094c5d33a936e3d8129487efe4cd808a2a4a61d6d3835d376957b846785d827fbba9329bd75684a84607ce7148ddc6c9c5cd7bc137d8a7e35b1ba4d120f87229705ff24084abb3e591faadcf2443ba67ba8b8ebf53c1933bac1816ae20ab7eb6ccd191ad70a1ef874c8f6174f46cdc3ae935e6b5a801f74649b60210e311adec8614bc16054d6fb176fe3e3e01cd3760807044020a7c23c561ab0f7447b378b6366faa05f8ef7e30f131c2397f666c1a9a06ac302f7a778d250eff025d2d705559135274e0675863dfc703eb7650d213954b9034a257b1ab1168cacdbcae7c942c6a730b1a60d6146c784ee4ad74237a6ab80512dc2b4f445756411d473bfcf0a3e319cdc4f90e03d51a2c749adcaa26205be46334537204126e32bb923ab51f57d90fe8c565a9a8f3d067848a3554427134257ea59ca251e6597ad5024feddbdccf644476f5d50a39a2cd377933216fef9ea9ffb3f7ea4bdd311d2da92bffa6c32d54cd17392c6f4d12709b67597a88fe20c55a0c8e6e03b4aa53dccc9e9feaba7475c4ce5ece755bcb38a792f1ba3adea1fd95358ad0cce434103badafa9015b12e32581e398b5eaddfdc9cb5aee2b9cc47be9ecbeba05d5b1874bac3f3b205b849341e8644b1cccf5cb3cda636b4ecb5daf2e0768353c3c0e718d617ec664ac34a21e73bfc41868d116aad3979cd00d9d2ba6f326769269b006467d1a9e4b15475d8c1130f95b9d0ad0f63ccba31f963229555d140652e9041368920aeb7e9a2b652d1bb4896718cd132e1ad37bb40239a667757868d863bbb880acf3e741adf9ad48008f383625df567fca32fd7fe01288b86c222fba86ed98ee2b10df031966d66405522ab539653cdf76090d767585cd9587b25fbcda42e94d476e2c59ab92c039de8b765fb53925e3deb02ff5cdbdf1902c02a5ecd866d00f9b64aea62c17fb24baa73af3a56a0537fea2bc94d678bf4929c00fd3b46fd6b63428e0b306ad32b963e8d0d1394736a571a87e1eecc9c5974cb57f8b467ebee69a95bf94db7731168ddf434e79b3e8b2048e0ddaac7c572a683ef8541c16ed9c477d1bf03710898ba63a7910a33f499bbb10ea0a78c302742385cefbe52261bd36180743a0ed502d9691c8cfb52a31c6d55d3e5c1018454d35036fe0f2d0d37d6770d71cac339d4f687d2c1c47bb51e9f8a6a257b2f2643c50b68caa84ffa019ad99ece3763cf58bc9b3dbb2c15c872aa19de330fb8cf46a390bd3c2ae8306ffc8731f4b288cb531f7ea1db7d5803ac148db2dad7d69d28213d53d3e4d887ee690d326b91348e0fce3bbd411a9676bbf40bf141ba79c42762e0c43ec0f7363bd32f6727892569943cbc011a4753476bd548c5049ae6765f55bd04742179683a80aae81c4d0c03ae59b90607891bda248dd5b2aa556a076b3c1bfea8abe95545b45cc3023110125c4ccb648c1add14b7bca999cbc41be4cbc89da17436c8c6598d68a57ea3bb9ae6436308ee573dadf2143d2b304a73e3dfccee8dc1dc6143a50fd382d5fbc8349a368a88d386ad4fb068cfed78e6f3deae6fe9b4af8ac6ab51bcb2c92bf6d897c1becb4425d7660628ad498b986da12a99df1a602f8c5bba5f23a4c6bb968bef8aad76ed76b324c94a166e82e08951adcdf7fa6ec392c99342cd42df157ff1ecd74a537cc3218aaff995b5f439bf96fdb2a6a97e0d53b2f92ac43aa117cea9bec7163e93c49e450727a31e51b70a3649db30fcfa6d129960ccc28616731ea6edd724846bd947bad528d6d45f5b6d1073d1b49fddf0cb8d087e91bb92d51e697216d01526b4a4c9b5ea9f919c71de5bdbefd8a8471630ba17480d8a82caf1983f8e559725d2318cd55f8c426a9a7f718e93126163cc033c534bfbcc986ea9f10814f0a269bb4d705a33fda55fddfd02afa011f3eff40a60da3e1bf8428e36e9b5a42d4cd63a7804db1ab17e3733754fbc32f6d41e0fa535bf35779b3a70b96dd9ca9a7be95d4edaf72acb144098888c5542fc99195cc968b445d0c4306a6835509a5a3740269e98478ccb8510d31e10b2d63c5d8fc1807d5eb1f75ea659886027f8fa2bfe030000ffff8c9dcd8e64bb71845f45b87b0164669299a95731bc912518326079e38501c3ef6e04cf990b55045bddab011a83e99aaa5364fe447cf10f5fd3466acdb7ddf7731be30897c490ccbd99596635cfdd42ad1c38e15391ef6bfb05c7d922accf853aab7eb02cc5fc6348cb71d777c19790a5398b676bd3df1013de5116d002fce43786849f8d1be4fe429572dfd344c374ed65b7f56728e80b1e2dab90f91824b7cad1c4d5c463300cfe8d8f1eb22fbd5504b6fe4c950a47adcedceda16bbb09facbe6fe18a049854d0eaf9e15cadc390d9e285cbca608c7dbfc9384fcc7ab27e8510346edc52e67c467b670f8912428087cf88b67eb9630f80e477064aaa64af6a7effb05c9eb778aa6238cc563f0a36dd5316c083de54ae6b9cbf3ec54d576c151637dea3ff03e62ceec5d17bfac390b6cee266983fc93a11b8884e2b507c6b653194d9e971430d4911c4d3247aea573dbdb33341a265c7d05ab910dc69b53f4f21c5d044acb05758f523043f4cdb925fed4f1cb046f810d2b5ba1efead3c3ef1798c91eca98c562f013567cc57bfc7217ce0b481aaf8abb7650b0e57721d72b37458d6c7cb621c8353fde755ead42662434b8e9ce3996deab854578655f1ef26f658a770d7b6ef18da671329c01e9a351b33b4d9225c033583a40156edf7340efb134f308f1ecf4fe41701632ce47b69db54820be7019a0452aa52b9d3ced9a7c14dc8ddc00130d6941756afbcba0bd3d5a28df3e9935084889ad9619b720105ff3531c8cb09a59dcc2bf7b709eef0379fd1fd104ee469e82098be27946218ee6b0e9ec29c546c0f824628e13163db8ed77c0a46673c4dadaac6bd22ffe2b5cf1a3af6425193608bc4a826e045c639e0b21623e345201350beb333192110f035e6f6fc69dddcd841e065e82c8574b8c4a383f87c48c3a3c738a76c153eb43fb9206cc9e89692a0d7efb79130239d47fa3041dca40d8abf3e6bd1a72a6cb0c0959e643a6d74b33004fc8fb9640335cc3ca264e64f9cad67b9d30701eeaa0481618450c188305b515817d2943c860296a263924824dc5371e1e2aa9bdf8c6114e5d1cec745f34ceea0aee7f80256e5e291a56cbc1cc4b78fe3c227fb40947d242b54032c472fcaa400be2663a52d02e4813b70c01149a7182305ffbb6f879dec6c61694bfd3d6397669d84ca4c8259467f18469013fa8a12c3ba6da33e03a2e4115619623052476c9cca3385294a550bd448bace0b70bfb22f2b086ec3b15d4979a4d480f06a9f726c6967c32030bce2ec55988545f2127e892b822742626dfbb09921b37e89e98a2eb10dd7a09b5c2bb5dccef13ad15a7961ba66395ca850af4075bd795182027b7d820178be073e32d942dd349e69156a497cfcba5659cb603a489b303f48a193e5d9f26e1f6dee58aa7845a5ca62f3bc3d4a01b4765206cabebc6d400509a29d539812b5e5dc6c918e13ed3cccd25f756bf624f070f3253e887e6de32825eb6961ed716dc394170bfd892881217d72eaf3d2c2be2076080135365973827aedfbef82ee2be816e4ee380e99979a73d6b57a67fbb0db73ea921928d4d10ecaba5f23967ab6d723b87ebee723b5fd96f138134027639da560fea48969d91b908486ebad4af3ec64253c3ec4f3c3112ea76c1189eed682d46c2412c7f0980bb527f51f0768448206c624428a4b5ccc323e46e132f8e9d92986c83af2b7e408c6a59c4d6ab2a44f78fae28f88b6aa01894e8a4400e1626bd40679f1ea39b11d268b510fc212af2b5b644b12504423a900afc136246539ecdcb6c2d78989225c5801fb24670c102258b9d1b221c6f78383f3b67f3e0eacbb6ce64c71784a5e0686a7c0961859f01566d41b100d11dda6664860475235c79ef50ba5cccc52bafdb76ed8b41f044529d98efa625b8ece2004435af9262d61e7e0d48bdd6e8404b486cf17d8d8f56bea42c41c642da3f17197e791fa354db1229559943f394907e95ea05b025f9b9e24d7914b0f0c61bbb426d086ace8e60624a3c4014e41cd2e2540ec50e5eb8eb908df468fa3eafd16a7c80b1059e3f99cbdd90a5a36b4a4ac9053ff1f60dd8a7d355929857ca40fffe369c4391455cbe12c73e3bdbbd584577571c06a00bc55380c6be4d0d78617b696c2bfcfe124183adfcd6943cf3a5842f31ecbc88f1dc2c498a9d903dca8c88844a5f873418daeaa58b8e5566acfcc46c62cb787809a81f04ee56ea62ed1e43665fd2563f55b895691c2c9e17d151fbde8e22e1f3b5163e4891be2ffc58f6dc7934defc1e627bcd63ae1c022019198ede898f6ef028183695a568c43bef00b7f2a758e3f714662af861248b2d86f63aa5172f8f56c3a843b87047f0a8284401e30d1e246176678c803e34b9a16f2b81599ef66ac17b40bfec4a3137d080969a7991c875c92956a5030ebe7049cb9c80280c8d89cd5ec253ba09d0e61314fc1d19e1e9b9606f15e52930cb959af59b9132edd581f8f326d874679bcf35160d5391a591e6012d0c6fe897a556e098f44b283aee4a9f929b64433eafbdbdf4800291548b67643796543b09d911ff2a6f4fb5bbdcc6e0a7da0f459d5e74667fbcb2119e72dfb03312fba083e8b1644d7ede1f3e25a0121df9a37118eac6c111ee5e81e1848cce3b104f23465b3f395862948d35241e81d5dcafcb6eba284970878d29779b6149f97931c4c91d162ea808bcefb2c3a7fd2d84876e4692d5a708eb6d956b3b334c5e04bc14f089d4260dc6457a0f3302e2d825e887787619938e79718a396d8f856240068278adf239223197fbf57b3c1bf2481116287e3ca482f067834d45b3b75aa4a64f27667b72fdeb866992c83c1b89a06c4a0ef01074428e3e55aef261d6d378e8826eb2c4fc6476e234b986de0772c385c31109ca3b030dab8caeb28ed9886b8f55a574fc0dc4a1f31da378fb77400dea602961d5195ce31315a46e2549287967b17cbd5e5fb54bf2b6c1b0dbe42bb01c09d6d94f2af36b66d605ccfe559d00a1a9a59291d1b435fbd3cf18a485a6a52e9d3783152600f5705eb7fc92f8f12835629ba6481c945449b550b86c1547b5525f1b162925e869ccc94bd4f13040962c82a5eefe356a02c751451c376e84230ca4f227e2108c1d870bdee80b5db721fe7c926002c65e46499e40f1b97ec0928463cb75ee521b5356365f14fa073d71c03ce71df7c6c6858744981d996c0cee0ed5d927e45b304410906d7545602526cc83c0e885b19f732d80d464df4821686f1315a32f716117ecccc43873b1d9f00a8340888f84a54375229147d7bccf5b44acea2dae55c17bae20749a9d4930272933ce77c88015176da5903ed62ae19c8e3c291ff2817741f24e327ae6b5bd6db86ff94761f21fca6642961e6779e0c4e49c80595819f3e60b31d4e6f903edd584fc618b0af34ea28780632828acd3011593d64e7ad3bb30c5c241ce5725e60564ece843599e7f8b64b1c8c5320b246e8da94445325abe106473c55a22da4f86232cbc78ea2c704be207bb4b83f64958240b896c7c7b40b094c184d86bbb8f6472bef1d510fa5a4a8d093cbe325cb536103c20dc887bd5092784f38a72bb7842bf70f5022cdd9714920b34dbc05c3041d0236e5434310ed83d0f3d46e3cc7515461ed0b98cb8e6106410f23b96228bb0766831ea9376e5518861a52a61d9caa47b8e4278fff842bae40840e8bfd68f08fa6097b9495c1327063ccaa6dec1224e2067a324755e1c267fbcb29cee40f5af6b4f31babe535ddb1cbe03b983a52035a1ed2ccee4b19d19151c96745b22149c0253c9a6f83aa4e6ecd6e6abf77ce919763a613a6195cc570ae54056325f72010c059f7057b330869ceea2c7836ca3394b06e97378ee7f608fbe447fbe341c841ef24dcdb176af25d338df166c0c5df28eea8e546e64cf2d1c884084924673a3a85187e2c468a577fd645a79bc37a2fb409883afdeef4ffff5fcf97fcf5ffadff787bffdd79fffe3affff6dfbffde90fbffdf53ffffcd7bffce56f7ffff7df7efd3bbffdedef7ff9ebfffcf6a73ffcfe8affe12ffde90fff42e76a2683de47630220e04a3c4c5562a5c6169ffb0443969412d7dad46f858497cd89f688a7352dfd179a36a9981662a093f56129356fc243a005e305316e673e2ed39ac319d187b683478547831fa2b92d1821f88522ecae4c18ae07c1bfc4793aa72b2edac44c84a8b995cdb0d7b0d0fcb970087179f98fb459cebe98502b706c328c0d9c61e3355c316d98810f1717470bbc067b9825e332e4136f0948863078cbdb077c840e286fefd4712098eacfc352fc450b0bd44bf452b840c036627853d86f018baeb85b10522db542552eb9a7707b4dbdebf3ece16548322881e0e9bfa1761f1768ca120c090a5ed2fa228f3a8c1ff78995281fa6b173b7dc53ebd0096512e23d4a4699b5e6bc4452c160cf93eeb29e1c0e09b7e3d67dd6d9549678a47a2fb15f63a6860d79aa42285a45ad0e4138bbc2c0b5e084e439a1cfd6502bbc313c87f4f6994a564550eb12ec8b9722d3274c230c6b801bc905c909548706c022308d258b05d9a794560b5e458991c4906b692216027b98929f404f8ae83c2a90c2cbf41fc7a4c19444bb961c3dc05ba5eba62c46ab700a444d39e46b8db04be003c7f838a6d96b2ad4333b04a919a331df94cd223c04a652a60ca13ba12f94821eed36540662e3584ba119e76fa30716d92264f929c4251353c0ec93f0c0a3c258ad210627e643a71387ecc73f45cc9394ff15e88eb964ea6dbd86546830beb04a6022155c3f9f9a56bc86bc3d3528421a2a20f14b5726b7bdb34aa4e427cf68f33b73e2198d17f27e3c274bb403344b7e37bcbb42c68711c8aa965bc46188e4850550634215a81abe43ac338d202ede872d25a31f8b0e1d7e85406dfe4f35ba508d09ece42b106165aae940ea468686ff814ac4a1e48844616a28223f59a4e103ed3e5b9c4f00a4c42cac8d843e891d016046803e964bd845a04cc84d77b20ba68a6967084bd9e7e785f2686fa239ff420bc3f7d0c32c56cec2e36916eea9a1b258ac66404a76b484f598cfcdff85b90bbe1631d1f95ed97242f9d14fb280641ca5314fa4ecd8e8e548c78e23a4f2ab558b01eb10814e5f6212040abd7952e58d9e8ea7060b92753e75cec680b42630699806b3614dca6f1894a63944be01b10f7bd222d7e4e026e40af510eb2a12d886480f4d3008f082d4946af6ad212ef44c449ab1307c8e16697e652fd6c741eb3d7581dd5d6021f300d3d7e2593310041a3d838cae0bc11435fd902aa8635e72573c99ed026d5ab05013b9a29b9fcc938aee531680b068303acee7701e7fa24a90601338ae585761a080b1fc0789c897b867075a52649ed3a7f1ee1e4a5f2baebad739e13edfa85345b31873da6a1f939f2a94dca238ecb4c9c34404f606abb200b6187c3c4716a4e45b6559ad11e90d5805db5e6a43932090c0d9f31326fc4ba72b74a6b9d011cab10f9f550849047c081963191492cc639db69646d561483b966e024f74c2e431ebda121d874949f000081612c51df8de25843ed45e7d2150a3c719ec1b04e5856bfe4656cbce9f94f1f30830f8d9b8bd56681b3129663dd469e24578da58cfb127b5a39d9f83b530aa6781234a92d48d1f62194d8836bb5dc84098c00d69b417900ba2a5f2038be44b038a603af2cf152d4144ab20e4132f149d19bf8e77c476f22672c37eb194031198a448dbb46b4bc4f006a93ef87b9790af4a9bb890b1cee3064ca4f988b285d073e97e77f9ec664ba91faf18e301606b157b0dc6252c4fca353b79ba06f56a8f54deffe1af85b8769006afd12027374910de73f5d2d0dd3c8a697a77cf8c4d47ebd75e2837041ad28e6d98e56514026db2640c8f82fc5f4d01c88f37459ec34e24ad35dcb6bdb98bdeba3380c69d0a1bc77ba8fa24cc7e970432cf33530d21c600573e59cc8ecc45515e8d435e62d1b7b70b2c1c5740f050b521ce9b7a0d5f3b37489605497fadee1c1f228bb9c1e78c4d27e0b13153350e75666b922eb81caaf439e02afe5ccfee8b2386bfa819fb0c06a4cdc57264c9023153e288f1627b458b54c813725936c04253261f633ba282842000a686e8e9639b92e000ea68d642404cce8ac79543208185618bcb759127604ec43f18bec9f66d796e019620f0714cd1c8940fc5121c7732172871ac6b5ba4ef5bb0264804850b8fe7690da9af2adfa0335026eb1e2d2b82c3c230910543fb9abb2e2c966655ee17a35924ae46952ceb6045aeadb8412c8e05dbb930e7e2cecc113a2bef0f468342888786b858191ce0625f16fd27a0954501f01c4eb1adb8798869028047396a0aa102211e3cf49ca2fb34a8ae82973d356a8b3824bdc41dfc446769bccbb9a897ca3cd7451f898767665fcc37d62af0c17c36532ea842d61c0f66e62cd39a73c196234f5923b95bb633630d3e08e744f8859ab030486d5537c04bd0c2adda569adc94fe1954f3eab45c0a9b2f0620889f74c992c3dbc008cf6975e0d4a27bde7011e53f9f74bccf582f71db6054ffd953bf06875295ce01b0f11d0b8cb6ec037d8e2560d52a4941c43611124fd926832dce4d351e024ecdc636362f76e12949b4c7ecd46a21c3c8586c8b20d448bc0638cdf24643dcb2156a0a0902973339fa73b6f68c9a74b87c2db80fc23545895b98e40ecdb78413a474c65f73ea0006cb1a17bc668ab30b301f460ccdc381140159f50a570b06ec7d12f3d97b09d0046ef66c5613b96fd0e919f85085539d2aba536370767a8dcf6cad3ffeb2552bc300927b39a6e12c31195621164303194741aa96bafb45a41ac76881d83897e49479fa92831a05f416290c84b05a6fdf26cda3766c36a281576e7372e385d247904cdd36350542baa977fe5e6090284f6899202a46ee582148803552ea83068657961fa0caeafe06d334010405a676756152afb5d84b87199986584d07cb5080967de8ba022aa915629fc20e853b11d9e9be1bb7b4cda3bfcc096119af7068a7fb4c82d2c4c5068e703382d71d8e54f6d76155bed7569ed23a7dc3f7435668ddda53b4056050c8ffe0323b1fabe0ce63c3c04d0c7224075bd466c76acb72188f3552a684d5c54732ca92948511e4acfbe27b843b82f179076b2b66174ccf4d268770d0498d8a903a1f340bb3cc6ede149c1063e91706d01e3c7e869bac046256d8cec9b464af6dca1945fad810bcf34c0ffebffac4da9a3f2b4f45a3cf7dd8cc9ae86363f1bf7086791c7a758eb260d7d684c657481bd73dfd51b3b120ecba96f1896c9162fa2b37826fbe1d7016c2d8deab81aa8a9fcc29073653ec98382c6b819d8368deecc3c4a4c816cb946041d8f27a1bd468f1f81c00a9c470c063265aed8104f05d79d9086b6f87ef1818147c6537e6f017a38fae021c232f96c207b071292c244cc645730f863a1f7cdb976c0110c25853e403b05b419f2875f761b9b49c7db5d8738939785b70c3e6133675767e44cd5d215e0a847ec8161913c908063d81465c0a0ceb5c2680cb8510359909b46994ec04fab3252a78efc224870b3a3bee113e2a96970df5ae667310486340c99d02a2d993ff665a0eb9ef2dd79c328642e72f3c3f407fb788c0b0787179682d4f26a1944250ce709dba7789fd037a894ec557c3dbc9376316a800cca9c2064f8ac18e152222db1dee9ab42835e22b24eff539a07a9115433eda5808c276958c7fa64e7dd987039fc8f8c1e39b1f7beb8c023116ac11d2fc65bc2f28c4f83b8365a15cd831b185a41e0e2815c1a1a26051a402ee1f45a0913ce74b85d1fb3fe50d3a04bc32d26629cfcb5583a374498811b46eeb9b36e3b92c6709c41d073757c2012e1ee3d7268a15ae434f348e065fda257df7b15dfae77fe0174fc74b99fbad93cca7a769d760de4b9b00f3f89c9ce031fb0801b857f39c7949e39aac9840fcd19ebc2ebe7d5c3331a696fceb3a983421e941b090aa142a88a7f637b7c433468d5c6c3369cc56b9161c010dbfcc886be59040fb2f46da8516d4843ecbefcceb509b72538ae6ff2121344aa190a93ac6ed626f987ebc9faa5cf14f9aff9bebb164b23fe1819705b9e1a67105ebc23b189ae48a14a825f7dfa7e4ecf7dbbac4d338702005139af16f964a52776ec443892103b66f6eb81c17f365730cb4a5a4cf146024426a054146a6b632affadd01ffd9ddbc4a30bd1890750f8ca348ac3b2e4bf1eb441a36e6ad37bc36efef2c1541da0209840d500a0255ab3f6b628441b43e685b9115cbc205a58b2f76ab9bd4a475fb2525e6effb4d567a9dac00cee643ba9100d35ed929b39acff87b93e420ec180f054416ff26ba2f7dfccd8113142c17be80623503fb596eeedb24eb144fc6950b426db669e58109977c885839ce107a34d4f6f2761f0697f0abab6ce9fe1ff04159b080d6135b4020058cd7fec9c708eab96ba602e25b5d521d067600ba5547689042bf6794c452c431cc9b4862aae4830475dc434350869a060fdb6b2bf808ec25aeaee14d9641e7b1a4b234ce417360e691af5a6ec2cd33e1b65fa55270698566a9b230f29791314dce3471ca3dbb199f2d3c19331271be4c8f95265ecc9d8ab0940fe09944d56c3668a287f9fc26e1572d87ccbe05928fcf85758487ea29d263805c14006915ed0a96ac39040114366af1930508d1182622926d2cb64250c06efeb84581f51e1b6582327e50025e12feca2ff68d66cba5199856ad912010c280bc2ac2dd4cc96f7d251fc2f328e7ac4278eb84e48e10f9a5aaf0ab930e0e84d620d0067a8bf1819813c4bce40ab762327635fab1efeef76700bb1098291b5c26dc61e56dc61ff8ec8dd33b7f30ebc040b03103e75fa5e271b407c51336abb145588f25e7b86c72f69ca110cc9d7b885217aab4bdb964d95d265961c3704f2c118ac16dbd1488007e88f8a2403bfc0cf27d9a4a8492c866198ad2581c051c880472f57f6ef992821fd1727e4ea08d85d67dfdbba0042d51447249f91e336553854e38ff7cf04fa34a16c1f6cc14b929dcbe4292d5214bdb9305ac805e26b75fdb720af974a0479205019693b154d4d9057bb746227a29c9a560d75605153220d92b8553c1b507868ff83b9be1832c664b94adda23c597760c5c534d0b95ec68021603fa1cd91b546da6bcc6ae4856314ed04439a61bcbed142720b636483fa4a7906b90a77b6d58b905cfb90160e54b61c39bdef2bbb284ac613bb6cbe139b04a1fa1b2f38b870b95af0656988164a21232041fc9a0145b0a9948dadcfd899b7bbc93605888c4143b40b1595cab29e952efafe04ba74c25a8cd5a752ce7afe2412565a7ba12ba7ca9f97df650dd1408b030f093da77a57162e60845991d87230c8afcdb40d267e724cce463709b9c53d9c227df7a085f7fac902f1ee489cd36e4776f2f765dac1b7985060003184ebaa5c1c09bf5d508412f3e6957980b7dc601dad1094235f257843600e9b9028702051c8bcc1a282f66fd64f0a06e3712cdeb5b01c71d21f1a5cb6e80bcad647c046c6c8158e0c2b612fe1d125cb4b21e8def8ea28f01d26733d342cc1397bb27da6bf0283ae6791f69c7d150348942288239bc670ac4e6948974ca92ec9793142cee9acbbcc8e7b6e0f5d91cb06bc8de654392b8f8399455c0dd2dfa7e45e38802c58882569f374a0de190cc0f57f9d444d69cb315bd06705633a6ab27fb6b0632d45af458380f258c33d671d388206c2cdf22d8f65d520a81db2c117770c19a2f094e487c12fcd126f07712df7af3d3432ab134f8717b950e92ef37792373fec6098bc1be5bc4b81bd7ca07bfa778d6eb7078acf428adc6201f764961b40e5588770bad4d681a2ff419a344993ea8e0042c10c967118ac4336aaadd29f5ff4dd87960c5a9671fae20fb4cf07c92f76cf5107565ee903eff30542f4c313825642ee576d4b83acecf3d95eb7bc4cef1ad6b1146875664a28f927cfbc24481eb80b0f999b3f3f54bea69bb2f695837ad1d84dd8c279c5d7b6c2e0d60961111225a8a4f0fcf0b255f3138858d990857afda7b6ec15722df4f1458b27270dc80548738787f4ab61dde25290fb2c878530a5b3660f7211a98e86b44f02815c3262ebf6ff6790345afa58488b1a32423688d9da5929da35fe30becccebe4190eb750a5de4ed382567c88af0ba700e994b123646182320a607c97141d00f6e804629887a75a43c069d455dca5477b57879e9f6903ff0f0000ffff8c9ddb8a6dc975447f45f47b43de66664efd8af18b2c6164b0fce20783f1bf9bc8b58e71c5c8eada205ad01c4e57edbd56e6bc448c7843237bf7232c940de6cf6e1fda09b1dccdd5f9d78a77ba09e7d4a90214fdf5260a7d12b8f53429ec3f3d922f47f4008c5d1a51f9a65f17c8259bd05810992a8b0473233d94a43dcad9869c97aa98fb8634f975b0d798b76b784895a386fb70224be43f5814ed8c063607dd71ef08549b68ac4fe7dc019cf65cadcceec995ab92f357e710ebdfe91ca3101c57c52926f8ed8a14285d4299c4f0ace66216b5884263066396ea42225539995a98a8d965f0bd755933d00a59bf966b52d99909410913ae61da121f365f8e673a9f52d0fd850415659a510f28dd78a43fa128c01e01883683cb5bdd713a07a8dc85c249b87047fb1a08fefc066223541f2a8e5dd0e8b52107adcb82624d5c31a463bde6c9bc10e0fb6a824ea2ab14ac0fbe7a7d85c86bb9da7565b795700d97f252a2807fb79702e6caf439fab035067e8d901cd9734d25f15d75b54ff49e55744286466876b51dcc3ee4a473d9425172301cf35380c32069bdc76cfef60307f19481abd34fa32b2b3af5df991e2d26fe7b01b81284c38784d9828cec5d954fe11b9cd157e5fe5c4a13629e75d2798fd0f583852bd7946b8f518c48ed9599cce2c743f2839be85b8b4b3b4a4b2cfbd78eafe0885fdbb1123b19418ff7b92982d577385cb73ccde69e4089f5aa9284b7c5142519d3f8ec4e3c8827dddb6f1029509107aaa915c5a6473f6f8d935c5215231fe937bddb97f20d9617904b1fb1c45ce8d5f7ae50292a1f3e9b934375f02e826361927d52a27675d052c8ee89524cbb704c6cd8e5be17704ad4e084cb911b306de99ac1c612690929b1395bdf88993a41e3233e9ac561a8f04ef283f5d50d1b7621b2bcaf400a4c8fab46b55132d33b0bd1d95deb90c265b2c6b88d9bdf9af0d9875aed44425c0cf85b864a477c8cb3edbd7d06d2fa28a84cee569a6b07407adb9b7950872fe405e486d0514291ca5252ad3ab685cac1d89bdfcd94379b2cca93b5fbc15b7fd29cb1bbbfc275ab8ea88649d05d29a638ea64e4f0e194e5d7dee00f9e73a1151793c467ed00a034bd6a78ab877824d8e46133ff3e2352615d6af071048fd88746517e2be015747bf611fd96117375a65ee96eca0b5ca8d7fb4be644fb76b348cc95d906f8a69915220f4d8d99c6a8b28e57fc384960506fc0877a454afefe5ded73d4831b4982d77d8b9c00f3d2cb886158a01f2c53c61cb0dedb5097d2783eac8e48f31d95a3873821217ea0d6b534f0bf38d8a4066fa056168ce85a8d9d30f2342dc7917e7c1dd19d88d8e17ca5bbf7b79de7d467ad6329b4cf134be722aa6ee9435c589034c52262e3504f064cf8e4cf08687799fb33e6ec93bcb6153b3d19ef84afd5802f7b4737dc516fa7e6f4b35ba357cf36122113b85f4db7d401fbbad51d47bfdcd3adf6821497d12bd6d0f2675eb2dea3837d2d99f12803a1eeed3035d1076bd88589e01a736df88e521e5dbc7d105c3eaab494b6c57b7665b7c20973a167bdca18742eecf9750266562b239e2f2d134e63854c4612b127812960a3439a97425f5c24040c55e00a448e5459240bc686d24e0da4dd0de5b4a26cd13a052e027d1399c8b5bca03aca4959879ba3b7680dc255a90389e73d87cddccb3de35de2495a489582e958adb14aac60866c570e3deaf8a66e9cd7ad7ee4f46b11909647dd2ca110c9c591c8791b4bae357878fa9e984209225a8122b90a44b4c80a3aa6840f7092a6dc560ddf7aedd293a31394f8bd38e76e6ab01b1fc185da09d1818c58a9de5ef5e80718ce1829bb8de2dd8cd886818461c5e2ad89fbdf8614aff4518a7eec755af0101340c2ddb2557f30d0a229ad6714d7c36be6e87efc26973ac5477be8c9da78711602656560da742fccd5fd19d0fd0a94bb4686891a4cefed400cc719cf7ae8d84d08a377855c6799d931fdc280e15957289d044be72cd3f9265225afc16da1209003b2b6d9f784f7d7e00fef0a416220e655845cd0c93da6e69bdcef5601c7dca5a4ade72dd9b875c7242bb90ccb24899dc1dc1c0a82c2e27d8943c21679c3592615e7ae54570a48bbf1356a90ea7470a8addfcbb9aee5f672c9460570b45353832a307df240ac00a4d117860a78add51331d0423a1bf44e9e27a4c9a81576c524691fcf34bc4bde3e3ee075aa7c4e4a0aa4ae51d9b1bca66d98eaf5b136451955e15a0b4f515722f0f029454b817d9c257828e6f668687c449b287787dff361a0f979dec59de964e421555da21e14261e18e51b454ac4bdde2ada7025086123d8e2986bfb8fecd7dfaf24f2775db1a5207056c24db8246ff06420aa3cbf3efe98d9e6a591aa40bc407cfce274847cdee3c722e61910eaf6f2f608a2b457583d87af5b5a55ba155184a2f8b9a82c05f6f4770cdac6d7519ad95d257b97accb1be594390d631bfb82935c8ad18d36ff056f13ccec4f3b1c878ce42d759bda79bbd22bca845b844482779218c366c22795277d673eb5f2468870aecae0490b487b0d9f91009cd4918a74773a6b26290d5d9afd8e9c5b95bcae6db98e0e7457b781c9cae33404646cb5405850cafbbf7f92963c211a25136b96e84cc4bee9ca7fa19afc138c941b9d98884ccc9259f13e7fb1dcc081dc49afd86ebadbe720d88a3c47489cd3eb9e8758fb7f4ec9a37b54ae6e95b6e7f674f32a22279cf76b0b97e1ad6528ccc603a295751bfed5748d1ff7270def79b5c84deb9985cccbb9b3242ac47df89fbe411f927a17cc4aefeae30b24fb39bdd7aa09e6604c6f0aa5a3e8039b408d14fcc25f85e035a8efde65b0845bfec45cc039173cf73b7e55d8fa671df792c9adc395b347a5e4bf1cca9ad5725964bbda9fd89524bd268f749e87ce3f19ddf8cb57c74b1e33dcc004a1bc24a9c84bd191bb3a4f4c92ee5392fadfa0cb0e9f6e1b5bec9084f94ce550ff817ff68750b150a185eee4ee6fea53eec8fcc47b5c25d2f74e4a74bcc5e716bcbeaae129439515d4b13af09543ffe006537b0684eea8bff736ea1ea2366a57c23cf1822be698f40e94012289c72ffcfefdf52697583a0aaacb14812aaf4d7def301c9e80584fc116d70c4bae383e18008fb697f06577456578c4c0d456cfb72c913bf223f5b1c0b2d8a2df1a807b39fb0895e1e9d622a4b0c45ce32b40fa0d7fdc1a785fbc4192c28f1f463a0f6e6394bd7e3c175f5fbcea311773449d8daadaab9c04c2fffbb1f63c71592b6afd6b3025832d5fdd9ce4b62e5a73e1dd639d3da9298e361d23364e137a595fc3b7ba31a0fbf6da89f9b32aba06c7b9943efba3cc10252f35d07b25fc8f4de65de8b4eddce0667a3ee7018b780ef6107ddda9af90dffc117eacac4209f1920ccb35d358437f9b16b68f08797cb0e16f65974bb85e4fa71e8c7d2231bca253847600f67c67cc943c4c08ec31a63c289ea6aa500ba68b280349a4c40fb07f48cafd5e7a7cedd9249f563bea5e93a6deddf76f5be3e8fc0073a5377f4c9a86345c2ad50be61b584c46f6bd07dc2227b90082863b5bb9b75e6040e86569c5d23e53e9951092c99da3e0015ed3459e0243c9b8de1197fe2ca5f70ff4d8b7b8ce9ab07c6874a5f90a30123d2a9cf3d7fcb7bb6e5ea73e7af50b7bed1b25c3d02bedfdbb788c615631e192b2b5dbeaaaad0dc40bd57b84dcbd6d92ac759f98820f58620c8866ae68cb3a15a9e3bb631523d3e7b2b51735757ebd9455a491f575d2156b77498eba6f12ba30c6b0cbc56ac26bfcf1d8edfca69a5860139ce5ec3730db10647ce00eb0ebe6a9e28f0c958aae119091f6a66d060c83e6877ad19a8d328ebae7dce3c204baed0cead80557fcc9e6dbe11e55d1581a1be02d6c89f7065788a262d576dad1212fe7087085eaaeb43f5d8445bf5f8d65df25baf69daacb209015190940adb295d2e05559eab9f73111bcffcfb7b3c46d44ae6b6ec6444b5490f62c931efebca41a856bfe07ba61bf30463527838821247742fd55c48774cb0c70bb4f4933178222ba8665dbc70371a6f4a0d9295214990eb75d559548a0e31b976a9313a1a92ca916efbffce7f3fffff3fc99ff7effe56ffff1977ffbdbbffce76f7ffed36f7ffbf7bffcedaf7ffdfb3ffef5b75f7fcd6f7fffc75ffff65fbffdf94ffff743fcbf3ff4e73ffd93336c7250d53ca2eba584bd4c7c236cf786c89e48844e4d3227d2a754dc61183d44dde17faec7945e014bf931168cd387b3ecf19ce2d2423f27b2996823782d7575e278aa539a41ecca5504e52627be0bf3c86942c7a95963c818f1f58f463dcb6ad825031a9333f674e49a062ae991f67d4ae356f99f17f91745f656e8b7838a42a7a6bb794298775f184950ea292d6a4d7785af4c049a0ef6be3669308568a60de569df895eb1af5ee11cd04e0015606f8259d68bcf3e483489ba3da445725fad2afcf419f32b2af191f38fc21c75650a22bae7e845e17b1aaa61498d9b4abae9d0e1f44aa789d68e7017ee311aa2e0ab167ea0572b82a2235055fd365f2381fbfcfc3cac808aea3ed668857bfd1a4e4dd28535380bd1a951f1c91689bd9ccca0f8a25531fbd12de6d7f69453c3b39eb5870c72789ab68e404876669d951d6dad8a7b507bc4c924f6a13ed1ed1631d510c1d2967dd2a8263550716344591a213aa1a9c4da1d7aae19c3b1a739d48eb940450e312cda4b6c647b48c7a7876b5c3a21df2e56e58e2600086599e6ef51417460e034189e93cbdc3e233d22bdb6355b0530ad0b84e14685b2b3f88a56cac2ed617347be5b80fc3dc33e6628893cdba0f119c1b9bb7c6b4aca6106af2227fc1753478c64cf59566ccc00329cd626968b66085f7f2f853a149a127bc3606328eb97740ebd471ee02bcd8c1e2e689794570aec9e0698f0441c7ae2c2da702c87c74897813736fa7232926efd89642821253722cf622b19bafb2a7b778784edb5e1b2548ccfc4a0fc30a448308f5ac764bcd871597b81d90eee9578d9b18abf034579e959b7ff0ad25f80fd166b7b64c001850fff58a5b2e8901265907d5086628e0a3007aabee011d03122d424cc5892b7e23e13a5c61e7785c96dafd2e6d77c86a7231a5ecd495a3429c814c020fd823c96b741566dceeac90421b330fdb059be3ebfbf429a0682218738e91d0ea820cd5c0a698c31a267e39b56b5e0075a6cb5afb8e0e79d9ccd3fbedace95c13cd3222a8297a9daea421fa665abb84ee0e7a909f07c0185fb224e51899bcd9b5a198cb2478782b72cb851353a1b2e7d504c657a9ea1a6261770dc187b76930e4ae7db5647d8d998b8712496ce46b5547755af948775fa88bf2bd613d9f2526ef8e04eda25a70bb4bac87910a7a472152b3ff6443c4496cdf573cfd341d9c86c68020c28a5363d1e8639fa26c539ab381148939ada1043c3161aacb8f8bf291be2369fbf805315f1b1bbf59b929dc0f33fa5774f42197b96e0fabc8998e3a82e3d438cc91d0a1addf3936e254518c071a989e4c22ab74523db786492732805d26e56d3ce08adb010f024ee338ea7bab57c76b7479b0d63f81051c2cfe73e0201b7b569cc8a79ecad8b973a101e1f8d5435fef0e1fe6a55bf996f6984b5b4da590e92c63403455e5fe40e52a675f6ac0283c407afd209ae020c4979e6ddcff8159241539b27e482e76a76c127e071d5a28929a4321ea54fd7c681ef4c6a984e2ab13f7565cdc6f99c90b8183128e5da0f4e853503412cbff586cf435abae400aa1deab487462903d496860286ee7471f21e0a22dd94fdf5e9974fd5120fa1517dc8cf6457ad88c0382304349f740448b2ecb98b0ad229174bc7ae714bbf54941e324f0fa1c58118f2d0d1a23f765d95e8ee3d3a0ca8c743b4baab62650df229bcf6267bd33157eb9085246ce0279920688fe2fb0f30d756f63610097911f66a3bb9c1949501617580b2b610a57ea688c8ed597a23f24015fcb689d5b14eeac7db032d77457e71d3b090309a3c5e39d8dbe342219e6b8be8e73d97f2d72a481bbdd718a8ce421a2e1a3b42867c68d7d7b9085da633772098d9b2001e2a86662deb93916d8d39574e4440cfa4752ea26f6cca72cc8ea9718f26310b643ecd8f08a95af39637a4412cec0b2a5aa10c563a4cadbeaf15b60e91314bb68ee573dc9dc5532d315c7e4b8b61a6a1d7baaa7aa3fb548a3f9534c801ff73dfc24420565c76f8cb6a66b888505fabc80bfe004d35bf2e01de7dd1acad6e82a44aa52b12e0d95e8b9a1fa8f354e45490d164af1e8d734c0509f8324d0dd944ebbbe463f587001df9534ecfc248902e238e7fdbb169d5ee91337ddb1d82fd45a36c5477a57b378fb0d20bef3a56778eb7022ab2a32a50184636a4746ea6c2d4a6aca97039c692860ffaf81101945cdb2740d43fd5549443f7a9f5d4dc79ffb0f878f1a37de1311e4298a4d73a5a4576d49c8a6872d8b41c0e816fab148396bfcfb642f7fcde5965cafff1c7538d374e5a823af2f876db0cfe3d5f01b14547c7842d9ea801aefdd5c5877da8d036656296bca409817942ddbec7096b040693423daa0b8cd194cc809c8d2a4ee60685545ef55dddf2ec37edb3d210face67d9b28e630ed4f4d6b54b4853aff45c0997ba93a627d132c03b1bb52b86ccdf7cb96031e0d531bbc9b6564005c85e721d4fc646686188b029e54f395ebc4cd955205fab972099baa2833a29d6965305b9087ccacba198632f24e5716813fe3b8d23b6cf12a443f05b495a2150cbf752b2aa971591bdd2b1ba4388761721aa07f4bcd77a88598b2175c70e8eda5d71703e389a52d42e0c0222ab4399b5b675b0e4587a62bc58922304c58eee1f063a67df60471dcbd6c6993ef4d6408559cb5893c095633a05d0774685ca45b616b31f3e61f42d980fbc4a26426833c3ad2ad7a65069d9d95ded8006e335a31d1aa98f8fabb428fe11c48e3a883ab87de0ca900de4beebe0c8556bffb90a39bedf810c54f1d18a070c4b8d481c54158565d23625e55841cabc6227b08dd5c5104c69aeb533804a23e04a05f7ede0184bc3840ec08b162c5818c8b6449715a7d62f9ca0cf62ce76ade0630105b6cf63e233db2a5c233ae929180b273dea9f98896c47cd334916e3c5a310a484c7dca088e8e3aaf9e3322ec8e993320a2b6c2d19e475f0cbbc9a37fddb41cd09515917d6aa3c6c9d5fcf1e819cb7b9b9ecdd9a4f7a40839e6827d51511bd9afb5385705ad3a711ca425b4809d59ecd4125adeede1115753d7e84f68d01a1e0acb936442a020657b7c09ce9eaa644c4442aaf18a4617fb7624c20702589accdcfbf8cedaa2e5d34c8bb3e8c216238bd5d7c85378245ed4fde4f553d3de1dd10f0b7607d7002cee2ab6ae2e9cd346f449195e7e7203e76151251a595820b7297af07eb53aa4636cfdf5354ac67791ef3ae8fbf7a5d6dfb1d264fa1bb0a359e40fea146c6e820be19244b52065dab968acd0f648d7746d2d85580e368a9361a930c09236afcf408fe426cefe104f3a16d2bc6135aa96083f5144c5e878890563f12675099f0aaae4bba5ea0f61ef0c6951db5e0a2cbde5b6204ab860022d39682aaac9fb6daefec4ebf5a23dee91658296ca81b1bba3e82c46adc0580cf572bf78f0f3dd070fedab6758a16946cb94857ca0d7bae087594eb71e9fcc6b4544a8835711eb3d2adbedbb1807388bb3c31adacdd7b826fd4e7aa50f77133f652dd4f3c38fa660575780b022de2d3b6aebc84f28a4dbf40d553d7bc3ea8e02562de58b4688fd86760dec9bd50957ec5870cbe77febe555471b716f89051049b7775f596b90c238698077280ba51b5faf8e9aafe6508aabdf0079669d89d6c7a4937b536ca320a62fd649b732bc63c032f1f8d55f3bb5ef59ccfb4499473f7bd29e2203c6da609254db2aeb23cfcd792898be257486acf04498cbd74b662e44261260bb20f7f744e69d3e4e4f13646f1d9a29e56f86814573ce1c0b8ac62cf17e8a552159d3bbc845359d661aad586d9bf3d315a6e290ab3b586f365cf9aa882af3590d86b8b3a467d7d1dc692256c7affe40b10638ac04b65bf37f010af92c56b17ac28418588385627baeba5b8e3ffe5042a98a24a761b156dcfd19212073f3b12e8742fafa0847fcd05289916a34a17f20a4ed957e0c10a470abca766c30ec78004ff25728d96bc4ef43faca994120f05868ab036296efcfa1dbca692ee091555083d5fde357d50286cb4726fe0aea21bfcfdbbd24a4ccd815a41476b815b4023c2c2b017fdb5d567b05729e191a0a7e7afa8811761c3f40c39baabb0aa1abf44be856403191f2844155d527620ee5a0a417b32b5b529083ed3ee2a30dbc6f6ebdd91a4064f90db8f5074875bb94c24f1cef263380e5daec280b45fa6c686b09aa690af403f28bab3172f55b7c65c80784ca99471964839e0d45841a7b13550e816d692b210c071206badfc358e4859974b5af692da60c0dec9b89e36b50143ce93bc2cf072cc5482b46baab389f2e585e1b1fce3ad11b63608b8bef823caca2a2424a0a8f2a3783c85ef1d1edbeeacded0e8425e3820fbee90f01f684187934dc3474ec159725fff8647eb2e12926778d7ad863aa1d26b93f2aaaadda0ff604d2c96cd6cda2182b1eb17c53d00c9fb3aeec5caf4258f77215091677159033685288c0146f05ca3237d0537f0ebe99178000be6ba36f14e7bb45e30f39eaaa683654cf34741a35ab523d4cad4af8ffd1b232e216982a8d8d75a8d54f51c7dc38a9a7370772bcc77eb8348ab4a328512f366f3f3769f48defe73875fc7d02be1b2e1e38bb101855041a3b79fda89b7e1dd5ff3b75ea8f8e8a8644e33813b60340d2a8137cdc3b276bedd0e37f87da3c1c042f81157f6af38dca73c18ad5f7065d2816016a0db593200cfcad4bff7fa7b0ad18aa1bbb8abb0097eb3a93e180d5f3e54eda66605394f059d7313c66afb92ef1dda5e70092f818d57198ab61fd8a5c963b73d58b2aeda24cfc321567694707280325af167951dd43d50a60a1e0b01f02995039786883b04696a490783505bfd80aabc069e6d028281d9d4fdc97df0401aadba7053b5471d3fcc436e15f02f00ef5e05b848fdc720431813be728d475b3014be4b89ee4d88d05dd8059aa0f78dd90d98584f2db22f18e706f8a05ceddd2f4d45ec623fb157ceb8ac52458763004c9d51013795ee6535968495d18e3dfa98ae8ad636746112a021e280674056b442d49a4f47946d3ee9f71dd9945fec432eef8edf0cd41e93dedc9b0334677c4d5d78ee2429b2263d7a119bc4d135c7c23ed93df54fe535d7c4962404465e6439488e3bb10f8a8181e919fa526bbeb3839cf3a4c1008ce9b6d0e7d5de32b7ba47436930f9d1c4f63a2b54815639a8931986035b3a37aeb2bcdf7f017db6cb286b9c5bc57ba31cc9bd620ce5ee414d1b2244c40fb6a85fb665dd4a17350f92b104ad990b8993b2ca412d70d3e129cfaffac2ae0d61cac01dd71fc4bb9cd95aa3d8606a810457cdb39c5ba0ed8b0b82b9b7f8f1d265bb88eb0c42316cd915d9a7b75147eb72692c64bfb54af3c7e80b107eed4a4ae30c6cecb16014995a2fc32aaf9ea7c07a710070e303d36b89d57a472896d03be9e59864ae657ae5a56283989e5615663631485424a9df16d9d6d8784babbeaf058b5f4b663bf567b806c351fd9aabf8286fb4fba89f5827dac3e80e1f318f125809c87b5c91117ef8545e6a8f6cc76a6d9bb0cc98784725b3eaab0299ef56ed67ba143982da0e89207cf35b52b19928a15713f9194fee190274d086fa0af7bb94b19ab2e16d7dac419267794f39bbf18c2a6e7a15bbb74319036d93439fcc4915cb6c4e8e675aa38b5cd2547683773a4c6badb64928505bdd9c44d2a2352a2db5735b2b18751792f9039cafa4014c25bb4ca3492474d93529cbb443f7916e2b3eb832b364cc4566cc9a3170185769402b41ffed4870709009fb02e1d6d4341c4e2311004b45d4a3dc752ee7ba6c20b58f6f0b6a215df76ebb39b0c20a65ff1e6e84b94f3204d116b81c6bcd357cbe51540917172fb45c6286b49f8c886fb7bd4b23c455610dd5b10a4b49495e49b626bb1c991f335690c873b9bfb54152f80afae2967de1b4d0cb83f0e1ae07818b0a8d6ec63074499f5d8c48573a8bc2587d1e7f06ea3673d0b6cffd8542a2f63d284a88acbbedff050000ffff8c9ddb6e5dc71144dff51504df19ccada77bf42f46a0408411c4b28c98090204fef7a0e66c0651af39e1793240c81279b8f75caaab567d90f97bf96fcd7a0e99ecf8ec4240e31405e060e95a404a0014badcaa79fb68427e3be4d736b0f56dba5b26d5aba2c3e680bcb978b4aa11e2eafb43d404a9fc28abbf3375cc84804b7bea05a54f3bfa50571622db9cad3bb9a8a1bae56cc699e2b7604988a1bcac3f10e756c0bd914e19f62397f0769a76b5e866f95d510fb043437c25acaba1515e5e9518d4bcdca8aa82fbf11f3325271bc25d6b2a289129a3dd56666ca90fcb17de72d0626eeedfd50819934d18d30a65f77b0733dd76f352364a9d52ee326c54ec6fea2c5e3e99b9d2798936129d4b2669ad53ff1a8479e527591823f03b0409d913e130392aacaa9a67d393c217a3e29aaf3e8802b4b4f5cd20c431770c27e276d7c01bd21aae51554e4fa9fa672d0203c9b238cea9541930c94711d0b266d8bd5e6b7907c9fa9bcba0ec8cd1b130c8b4583d6b53b68b67b3b2b7bd7ff3831b40f953b334587d77f9c7f07c6e1d1e253778149b05e909b92ba5d6e7397826d1bd97b159b05a4b8c8f009fb2b73090598f8ba8fa97264dc943d6cdc1094f1bf8d516af3da71764f25c9cad845b653e393bd6df01cc5617723822768182af8dc46c263155059b68aa5047d10c3ff024a213eaae51be41e333c9977894ad8b718b1bb904c1588fc03e8638112cf33a860d8886b9bdd1cab8c6ca87a0cdbac87413fdd519d55c75c72c9315070a33e6d7bc9a7ba6a4b9e47bb45b61ca7db578143300a093a6701dfb7dcd1118c897c9fbf0f67528299bf3eaaa1880ee255e3dcba1d4e97dca644a1bcfeca2b6f628311da3ba201ad9b4d37bcb3fb0366f2f23fb7625d365f9f2fc135caa644e8b2d4956295435f6d398bd633e2c17ee1da37935dc0bac5021587de6313513102b1e9a4c985e1c4640d68c5573d18dba76c2dae1d87be2af29ad6b19cd57c31058514fb137f2ea5b539b773e69341d4f735b48414f7119b33aa4f1b385b54c13696842c98ac80837415a574e0caa11c923a7eb198eb9b8d2361a33a9650d43a3e99045090537d9aa79214d67839327e60ecde4fb6e2ccba9b0227cbd760d487c0709b874c51a563e3628d9ecb8e81c49439a5faa793bdb58f1f79ea19eb7da2797811c4b958ec339e0226ffd6414e4843baaae83128a823c7a81615e3906f16f3e18c15d57a55d2885eccfe4f1a3eacf39513b2afecd9435b9a74727cb570b25c6ffb58bf90a67ba78580b132b012003e15c26906e5b9920e803e745f9a719c1dcb677e0b7f63837bf58b4b55ee1a0ee1387050112d664886777b1c3cc5efb6eb14d0f8aaaa047341cc61a3a328ec6af6ae6bb4020bf19daffe9056fb3971c00bc77f6eb626a5bf8474380eb38b529aed94c3405cda29b57ef52c3d211ad7045b2d530873d83faa49aca9084eb5fef8b1f8512ac60ea2d1d72b2fdea046d11c0bf35d6579f8466c559a4f8e75f919ef792e51891dfe1315da61d169ab40edd9d44a16188a98cb9d804a5a45139b49fe97766f88bf5c2945884c1ce168d8027d5220e58b0aa1ed75508ffa031b6ebae8b8c33003e571ed3a22fb23766e4954e07bd8cbddc75c9ac7caa1d2f7657934296baaa54f2dc0ad475ce0319fb4861dfbea59c733dc6f8ce2cdd36d5566d6c921d0be0fa3bcae03e6b13955cc3f8edc2fab93125d2e43aa4c11945e18b3c30ac21985f96f0bcb193475d232d4742b30ffd262136a562d3a53e7450cc64bce503a81dde536f4ffcd875b8f90357291acc29c7a046552925420e8c335c888f3ad9738659eeed3daa52d4b3e62adece4150778849552f39fd8a6a3dcff3caeb520ea625a9e9ca09a9803e3bec45f5cdc3c6ae4a0f9475ae0896b9ca7463231f8b6f1eb387b05f77a89e6876d86f4d6d15bee0a6f08853b54e92d5cdc76dd12a84cd125e1c41118b4962a04ca3c683d4d0a03d2ba326b36e3a1a7517f207a392a8ea17cd61175d0cf2d2238675e7b4d49502c656b1b3cd60f6ca6b1cf9031f26cf082c7562714c64c348ea8f9907ff1a2e3ab6553973400d18deccf250578a5906491d20d297df668e03b62b1de7afe346f55a99a1551fa8e37159e35085ae6f57753e10f887e73d8188aebb34835ac53dcfe3417e0bc770f0d5cdda7f34a2bf1f2a755da91f915a4e59eef7cbdd68f92e1c368bc33db6c2a6a1ff589b1242eb5ded9b902f5c897ebae29a1c7f64fd846240f600ed145bfb3567562929936ffa18b19e54a1e3f18c0e117bb2c160f66887969863f2da74e92045c9562e2dbc43036ecb8c4747952c955ceda73dd0729f52170784d2be0c28f8e26a51669b079df5c711c7ed2ca48e5f20e0851c6c0f242839b9bd781d8d5dc7fbc23a2bf4fde39aa0ad79e5deed6b108861795fd4f7c71aacf19af21867b907de88f75b90f484f465b106c260fe6dc53a064dd3a6f585fed0d979353a78d2c8bcbd9e4e41f7226de2a3590b56d5b73cefdb95d97ee862b30e74242a7c2e6dafae8acbac523496cd02270041091dc7ad3f2670e89e843c5871b144f245b2f621d833ae1f7d05d28ef2f440809f5a51780f5c438f01f176ca5b661a9580ddb072deb989e619c6e168713d864210b15b72d5a10518d91c8d3df259dd96a6fdeb233aed35c1573d5b63358d86e587d6da56abf3d22a0921a7c2347620ce290cd2fa3d535cb428a802122f28df3a456e9fd0724cf82c76d82b461380e40a3abbd25e2a2d6a12467bea4b39f395f43016a4a2ab5e12906bcf3b6cf11105f5eb7d78870e584b44cf13065d717597ca9e473db7f92d91606e08278e12869c83049bca662eb946ac93b455f5eb69c85b8f395b062e4e6fd89ddc55478b12fb4d24cd16e431a47a664ee0a1e7a88eae431c22dcbd7564fb7cd6b0311f194deabb6ff0ce8b818d49828eab504cabb8539947ab34671d99475b2ce049ac455db36b7da4b55fafedd2edc41e30f51e71fb75e68d4d148a2049487bd8aa18c12ab56ae8761c455167dc867595e4a44c202756411c086aaae7343484d06573dd99341147be6bad6c746cbb5b8cf54f6a99c9b449e5bbd61a2847e873d22d126b35a47e342bede00b98de67d4474db32884b4ab998c05bfe6244e7b6d154ab1e20c416e3aa91e9768268d30cfda0e69008572e5cec8af8280e670146954819265cdcada82e054d6588e669b8393e484e5a29bef7c697ab9df29a8a23ff85394336c878febac6e35f52b9c7c55b31f2aca44c96624774bd680ff31097dd902cc86396cb643c87a7c77a156acfc19896ade1b73d3183fdc8b328f5dc0045c6b4c396df32b9ce92f2fc734e611d67d8bcf0f58908e8b4593510f80913695ae38081485bf78db58efcc645b6dd357205a28df41fa5a6f6005dceb7834b508e6d5356c8d0c3a3bb106f4ec76383bcef17be244ae1b994bd09a79bdd28933af005a9806867ce79649c51d5a406090f262b99d4b311df7ecd16ba1594f96cff40af6467dd6eb016ea7a85227e150ced73a3262489bb767dfc3eed708f8e9cdf7ce9eaf301a41c0267663f2e68ff2d48bd0e6665e4383d2fcc29140848073176b7ca731c2e4fd3a20ba3551cbbe609dc79940170aa6e247eb1c269bd8282b53395d08fbdca745ea77559389b344a1cb5e8ab2bfa258116042b24b3b2e667557da65995a91e98ab0e24e30022e70a8cabb6584c7caa11ef918aa55ae0bdb5c4837450c3ed0ba0d07b44baf31315d8eb6933d79bd506c6b7086ab1a3cfc68b25e70e4d2745f0b2a59f26f64b3bdd08c0ac6e1a81d28922b42444fc40d646201755fc7679c60ab6066a07b14d730031eab6cffbac9763a6913071b31d9b735e4c8857cbaf3c7cef623efac8568e2054f38e83aed4cbb7c339bda4645e58d3e699f104445f95d0bf139a0176e275dd5f360613b341a089b52717a55c0b3d7c3b5b7469e669ca7f9e78ee83e6eb253de69b7268a8bc1f2c84bc811815e15e5cf031a4efa8ec4e89b1657f0435513e93cf7210a278a33c57e5c3de7bfba1499fc68562d3268da522f4976ccac3a279bd7fbac9d73566ddb2841736dcf98530ab84db24a265edf9ed6d9276299adeda500b547dee87fd6e93fdc322fcad7aa68ce93f2db88cc77d5be65aceef0511087ce068fffd36f14520341158c11e8965183889b211aa7e450ae85d4598204e10c1bbe4c6bcd7de52bab6a9360471e0205428233d90f5115af6fca73ec4193d60ac06aeb5600949d433b39c304433c0534a6f9725c9440d7ba172adf87f63941433f37a6284a91f5c2325c67a4fc6fd569874878852272a7b1b30d8d87aeaffdb4fffbc7a7a7a79ff4c79ebf7dfffafacbf3e7a7e7b7d77fbdbdbc7efbcbebd7af7ffdf5e7972f5fbfbc94d25efed99ef79ffbc7ef5f7e7e7dfefcf4effdff3ffff6f7efdf7e7bfbf3dbf7bfbdfefafbf3e7a7f787e4f9edfbdb975ffef7eb9ff4affdf1e93f000000ffff0300a520f7b8f78b0200" + "1f8b08000000000000038c5bcbae24d771dceb2b065c4b4246be93bfe2956412060d5b5e980b03fa7923abc7163bb2a9192eb8a8a95b7dea9c7c444446fdfd0f5fbefcf05f7ffdf79ffff5d71f7efcf2c37ffcf2dfbffef0c7bdf6d35f7efdcb0f3f7ef9973f7cf9f2e5cbdf9fffbfddf9f37ffef5e79f7efae56ffff6dcfefce32f7ffbe9e7fff9e1c72ff2ff57fe71d3ff3d69ff933f8b7a6795f61f7f7bd1208111ffc7c53fc99f456a6242eafdaaba6688e9fb5534cc34fdedb1a89e72adb78b125668efa4074013aa1db4866ef118ba5726d37909e2e513ef0b484bf77ebf688294497ed9c15486beaf7550709ff78b5aede879df421d9d54a5cd823a5c21ef2bd00e08c46805928ad0a13d1c490bbcaf0b9d256feb7a7e2c250d5674ab84678077d0daecfdbd100ac46f57f5dc283eda1c03fb52ddefb76a8e5547f00ea49bcffba2ac67501c01526e39f453566d5d7caf1954c568adda9e51b42b3aead674aeaa6ea5c327508244bc1f2c1c216a145856935eb481d996e060159dd238c1dad32d2782351aa54909d32a31fefeb262289b3a610cb8e4346f82d598fdf6cdf6aaab18fc3dde1405016fecbc9dc093da5298e123b4ac8e04af49e031a0c850ed1ec3fb7355ba3da7f9b92e33d9b4035e2ace51289998a493c59875c6297066750f6cac21ad1c4685f0133108ebac7336660938dfdc155d46570d0d349db92ac687ca86403adadecf4b24dde5ad9cbe4e3135a81448eaa82605ad201c420fdda3d927bf5d75b371095a54a68f899cb40f0fe5a8d70c747070a23c43f818543b0da05ccc6d08cdf98132d09f9ba63a286b43e05367519222a0bd72d404c57c840dbfff2dc5cf496f87e4f337ebc69c0667d3a747eede79737a3dc71a4dcd40bdc3f3749ea7c83ae8b0b6460e45abfbf6334aa3524dfa636c2f13e79c9f192b2e2df74c9fe32bcdb7f2f6ecbf8827f2d4fd5037a5c74a8acf7b04bca2adb226a9f36d061a059079f628b76ed7d2d34d45438d1b9f89143703f18d55de55cbe80a3b755890547221533a7400265ee138f5069679ce40c561a2f458d70809ce014f6f7081f7ad61205058ee5174a7636a0823ec1ba183b73aca3b1939c816c7f0f66400396ad6d6fc621ad48fc5b3caede2c72c1bda592ff5146aa7828914826fe8108152c4eb73b407144aa73697c19e569b0394c2e6adcf3fb9e589318eb78fc921e91034755f49efa620b62849a52c9e8464f119d81e98d30e2cfa0a576e659b435b4a089486aa3487b1968a2a573213716e0f6211a5f82e12b19834a93c23b24418154a2946cf8f7dac455a5a1d42ef851a34830771b50e1c60be2098365c3a222e8b98922c0a988256689c30d4b4cb2272c1f1c1b0db4ff25b655b9742e81c24e1ef28e9f9638b821e50dafb8443cc9604c092189786a63004f79668621b96d24640d1c418e429b2a4a9b20972b6ebd08e4ad4ec1b30ce846a58f06ba5a6d68122400fb8916c293e1c2e35329c8eafa6926934c4b79a3b31eef029ee6eb0e9748ad42dc4852106882d2d4525b7a217aa73fef8789de3abec402b7507749415758736d7a6d2965e952753d2c5d278ff7c1665d20a2cd28a22d06ae38a4ad036f1382ca5c7e220f787171a4309a4d5226f7e82b6380389180f05a3b9320d4a21a88705b8b466cacc30cf68e4c029da351e3cfd7eaea63135bc2cedb0b4a3c4002ac15910cbd8af968349b137ecfbd4b01ce57521c614e7cdcc6d744cb990cca2472ec4e8463567479b4e51c110750f14032df15aac36cc605cb72531ae564dfe31d3d9a8a3a7869484bc678d4d24e741680c8a61a6b45b1d02874a6fef93cb8af6d138efb5d0b0b84f0307eada6e40517c202214710e6763d908e9c05a269af7607a3a1900b6aa0fe919061b250eb4882647594f9172b7f3d0d90461122585ba3c3a33d585bba958cc4a88473d82e1f010dd1a7582799bbf9cda5ddb16293ad38341a9496835ad0ab505e5086a1fc0cf57b0ce6ce112e0157df84cb1356731199d7fc371f491702f1606266d8f8bd55b9b94434b3eb648ed840f6334e9862607abdb7639263bd6c5b049abd4087a3aa283e99b8e87791c0e6dab67ea3f071dcf8a66022c8f0188f4833b3f8a599b5397d79efd7f36d5cb3393518f3a38517215046365e004c06761e509ddee704f4a54b53063843113277d5d349613706113b41ffe5ca5cc8842c65ce7546b4d38556099cdb23e99be75c939821f7561ca0e7bf07cd726fef451687db5a2803b78c16992703d0d6aa1fe87ecc86912732ed67842cec5870ade6a5ec59a97b5460b8377d7ac1996bc4215de14b3beaa70711e8a544fcb70eb558c692783ad89956e822bc4e212dac62c78835bc96c819623f7569b318a455b707c45451cbe389aabb3b146b9277ed0478d6631afd295fc4f31bb62f12bc701d899b9fc8e981033952413ad9cb4ed9775708f2270ae405f914634603b51237a2666c2e7b5f98c3741e6f7cabc42ab8aa5ba926ec5dc5dec281cd6c54ad38b626957b01eb21a386bc5e5e3d6679c26337640912eae9b7373652dc7ad7377d9162c66d3818521144c0d397221505b58781513e88c130a884c637029e1e6d2f621c8cc71703a723c8e66d719075beca0e6bde73e59dde132e05520a5874f5e4ba29bb9ea6c48b3ca0cf3d538199fe59906dc79e5ab2e42eaa8aeb612829318a8562efcf3ba67c65ba8955367b2079d7670e06145534f963267c9e6c1dd9b91c86fc0e6571c6ce67051095b11864351a572fa4c1eb4e0fc58c95ced93419e9a8e708f2cc05dfda0a99c33ac92d9491331228d1d3550655dc1a53d187949ae5ec49cd91ab354f43bfad36a5e3a1753460afcc0dcee129eb53c118ffb6eb5cd48ca0ea8ce70123976f02c1e5c45556f690dacca70007458700ddb81f00643dec2540b7719d8f40acb9cb9b58a39133e78b4264fd543b2ecf6cdbc94157bec577dab81d19be98e78399c77729c7ef63b6d879c7c3621b323610614326ec7ef51e19624275884699f0a2a3b64cd649d62e13957714db526ad473ab304c7ec50605dd0d21eacc6ef35be66072e342eed75f8f9c28f3e02eca1f82f73483adb405611451e596b7658cff5a07d07ad04f672a11e03ada50109af7f46247f87c28a8c4b0fed949ac7b60f5a7b28cc7892dcf03964bbb23c5993acf6101c6a18cfeaa94d2534d953f0497cfd2c4a7f9c8f6bee81b029c4c427f9e7630ace6c3d4a95ed045289eee0d6eb63a676384c9ba9b0662511d9567364e14839447a1b5d156be580b8f12c5097739b7f4fc55264547165c0ceccd87e71e76d8832398a558d6ca3e7545b80377538df926e722398b53067ddc91c4ea2c44e6c714c255d1667421eba02037322351b3908aea240af25837558b07e9d16c2a2c1c7f47775e546b8a4d9b68651730a99e2e12ab6d471f99b4de1fa56fd7daa8744ba304e73ec70f75a5776f05edc5d4f23fd3a80ca296e4de6703b1c76d3fd4c7d03a176872d8e9d4d710f582ba21e85c1d7b97094f589da5a1227b7480af8aa72b4f17844aa6dcf8776612073884eac3788c7786b30cb33dfac1c19f08c5891aca0c3521387c36e1f60cd60073e62872a4a61cd6c0ceb4a60e62cbeea26d31990ae972f784cbca6a4ddf46fcce33e8394a76a95991e3d7699a11c35a4aa0fe6b6b102bf18b4cdfc8cb4b314c67042425a4c8ba787f6a8bfb486d62c9733a40dfbae6a86d5f0b36ee1c9d083ad23f59a8b3e0ec94455a30ea2c22aa335ec4b5dc6ad87031f57e8abfa218fb8b95a77d7b064180f7ca14a1d5ef636957b854c64e4f13aae98b1894663cdd02a634efa01d62d7352bf9ae3916e1e0cb0afc562c68eae9c99cfc70680a5167e86c5155a309ecb2aa6192f01664bf48e6c8bb549512e8dbca9c6cfbe4232fb9b71f4da6def3aa9b4687df2283fb19314bf57cdd8f191a926ec0d301d3086c40399489398acd13bcad8fa4063b70e95230f5f12f41a0b875ef7e68e8f830d08e2d5dd2c5fe2510f3800f7461b3da2a8d8996fd4d8f4a5e4cb7c71aaac06d4d9b2b30a4c1c3f147cb5b306339ea588ac6f6bcdf561ec62add8e929eea8b3deb5abb4c7f15daf1ffd681051d56c04961cf735df1fe7b6baf8215e9ffca692eb2d6530a2ddea71863dbe1def180736e79245174cc5872ac7b2d757dbef9a84f278fb760a7b3a4b630d5857f2d0e5848c54ab6b8eecb2c31196106c45723b03e68f5a2a4aa655ce60237690c97234d65acfeac658bb5d994a43e1474073e4ac319a4b68ea10dffc7aed7bc686f6a0c28b723e006b6c5e82ec941f21bce4aae44d5ddfb273947bc863263e3e6d719da08db91fb8bc8afd72a003340d2dc92bd0f5693b836893ec10e6163590376fc90b44f7d8dc3eda854ce4778cd9303b24a309c69a14910cc39fd9679cc3d191758c1c20afe3c94d679d9b29732c91f9383dbf27c657cd5eeecc83dd7cd4d8f77ba3cde458638f97e535bfdf2f3aeadbd3563cb5823f93119faddb077a4c4c6932c75e01ed9a9bbd9a3d3a8be9bcb98aeaa4254f4c2c1bd9fc06b63676ab93e6d38af3558fe79227368b4ae024de3a96591439cee01708c7ba5a19c1c6046b4ad2b03436cb9a6e6d3fdff4b40e1bbdb650f67e02c5b3f90fee1ecc6a55c65f9b4daf8be34c03d50fda0f5f7f000bbb95ed46a6d42d7b3d07bbc2c1463b8d8acea3baaf39fb5e5df3e28791489445f01e6ee57eff7ae7152f12d967fe628fede3485bb17325664733b66c9d95c559333947515b317d77933afe74b4038723af917ffc7c4f11f5a6c0bcca43556e8453d2f6a6c7f9724034f9a9363b5962ae10513d6c9b59c9f1dab0372e86336e3c26d9171cd6fc35c50227b5e449261a3ae75b2dc863b6fbe6667dfdae69c0dfe93c2527deec822fc0a075bef97b0280d5cd25004c0b3e8f7ed68b559d7194d0daef044e0bc44865820dde1391d7f9ff49d6b0f2692622226befec3ecdf998a95f9f2e9a0f2593ae933bef2ca00ad2d73ebf5fe7cc991feb7ec1304c279e5a8bf3618364ad91e66d8fff170000ffff8c9dcd8e654952845fa555fb6a85ff45b8cfab203643b7d020316c582021de1d59dc5b23d2ec24996c904a35d995f79e13e16e6ef639e23db81b39aeda68e1550f4bdb9c5ac2059a8ba7070ef131d8bf0aa5ae4da6813929125945f54931fb9ec99d4bdf9449fc1c7e7aa81c794f862064b2e2e9739d0aac93f947e1ea25e37716772e3284bfe7d720012893a15d5152147a9ab94e3c30b4e39e6cc11b8089e21746d7d7e3088b015f39be97b47f8ec081e481b6442356a3a1aca8af26cdefa0598d88d8be51cae8d0b1fbe8c3511927d8488d92709bbc50b30e3f040bd9842336b1f2866387a603091d69b344e7d28861b2b25aeafa80e5aabe140cdee1b1445c92c44baeb0deef38d2cc320cb54088cfd8778f0f912d4f3391625b3f08b8788959714ef9c8e0a336ceabef04eed6c9366fb5671b6a0d3972d34f9bd808ada1707f6518bd3f166e060d60a3aa6b97bac8da8dbd63c8498c68c69e705fe8043a1655f1094b5e731f621b15091ba9738573fad87210eb10bbe1e0f96423f46ccc06f998802186ada8ab7b23f5c582c39591c5928fef814fc4275f919d934b5fdd9ece266938f3940ca09e7ea6df8aae352b8334a3dc780895c305c90aecf6c336ccf086ff44de48e4f3c4417855aa43fd552cbc8f12c9f559262e02c44415443075462bd33ce99cdd44091c628d823b4c6e909e9a60e3fbdebe8b4f2fd8ae4d9a9ea949713963bebe6ad6b75a6787c9fab08ca349d5773702d158e46d4c5f5884d0daf26decdb5b25fef2d96572d0e01573f1faceced972b622c5812f9e6e87425a802ffece1323ee3b69b55ea604b45592368574249356787ae561b4d51cf3b3b2f066c379476ef5a3dde78b33d7188de5920358d2a26f4b008a74ffeaf078f7957110ce64131086483294dd3b24e09cd63b9d87c28dde5abbd5397b4bbe6375b3f5ec5e7168f04546404486a131d08144c915f3ed3b23d3d0c49cff09fb61da8c44bd8c45f63572b365246d97c935e66e7cac4d22b7525280c2162cc109dbc7398c5cd973a4b85f955eebb046156878fd3bee88d867d6167da47376f0780f5301699d76610871742660b9791c89746ccb60a3ae4543055bb8d4986482948eb01ad88df3ee8dd3e5ac5bc89448eaefa08c96b14618f21362b0e272f3cdeb389847b11292c1e9f18097a936770123391dcc8a4204731c9c5b1f823561d39c34fa24d37dcf4e971fed1808b0714d86592ff317828b2de77a2d9dbcc16412e4a9cab4464dc2ade376f4b5f280e37590eac9cfb9cd321dcb0fe1143794e1ea7ab07dd2a91dfbc493d2072d95da35316ed1fbd862f1c83e666091df5f5d909f2573d73565a9c48e4e571e070bbc23611aeba48becfdef9d4684517eb992fbbc17505a6ab98415510ace33b5e6aba3e2d5e8acb3c59cb677fa4916a877869c1e1b78a72d71c0c93dd3220643bc393cf039dd32c785ee8c39a19c2ab68bc7ebb9078ab04ce207772cab1b2a3c6f802e7462b56d57d6d781c285b2e5c8c4ac3dc487ff0c505930832e09235ca849f38de967d28efa82ee6b2ad255a1d092bc62cef9e8f27d39d272edc35e9b33674c6476362ebe7ee1464b69dfa9da9f8b668b6b7ce7f92bda628a3eb917a632fe0d8099dfe25a3e81555dcec49971463fd4bee97be1147022fda5f3991b0f65d646012ce19aba17343d5bdbddf98d71bfb6030d3c36d85922c4ee4d3a46ae33c3a5fa278cadf0136c2a72f3da473ed31cbc08df9155c3f218239b7cba7670a00c15fde1afbfd0371ef1f2b11de6570a493e00b3ec181e0af9aee0ccbb1c64ef6b354f1c85e38407727647aae7cea5febca757c376a35be773e3f190c53bef6283c8f6960ec011fc9427f624fe0dac7847eca3215bbfd01a8693d8e98f46c7d72b3b7bb774bf40c8953488f798b4a1322d0b2809a6c674958bc9a40bf027b90021feb307e1c833bfb785e677bad11809dd86275bf74d82007df4e09d127615025f4b2275e10772877fc18f7bf30bf2a3a3f3fd1366b706757170767165b0e1b8956050bbe58cb400ed629e7c2415b80355c6cefd3adb84d012e9ee526e3c856c9e3d3ad0c1f1cdee2ffc799fc4921eff05ef00b39f9365ccaf21f5e03d23491393b5fb786fe6275569277bba33689818d9850905073633e1ed9574a8edad3a529f3d1cad7fba940c23bb23410f74b7a6b79219980ff2c0c4472ae94b4101a14f8ad986ec2795ef27b3728007f9b47e8825bc008328a67850fc64e8c1d5b0774a3135912d538a88836026f720e6ab8745af6776df8289b594f286527d73f78c59fd04db26c033db5bcac7c7131f8c2e640b4576ea958a2bdc91ce4d84721ddfd329774ebe8105156cb77f1ce240b3da9cf34355ddacc2089fe73949f3429e4eb678291cc131ae52ede469315b3125f8f5eb8f9950bfc01ed6cc6bddef960fca482f3925208e2d1fe59ce076e332d1af4f516b1728a22e7de7c443c3706a7c0b06f1a9a8bdc31fc12f19a478c51a17c2424c191043f5af4c0f986c7c043e8d1dcda26b8f464ace516a621abe6071eb5889d907396b6b26cd426f7153b120b28ad1adf78d2cdb3cecf601bd53d40287e0e0027c829fb6e42c7dc146d961d5205d72adb0475ba14f9892b106d85d2184c199383a6e887570ad48b570c7692cff24ca889653684a7949d697dbc013fe6a19b726f8ba5b4c201be43d9ee8593fa8e462e97a377ab127b7cc8d1a579b9081c0ed158e4fcd47c1f01d7931578727d4f716e66c2ccdd4016c20440dc32f210731f45db5035df7acf8f2801ce5ff7941ac4b01b5ede86086259a6a0130eeba034cfeac002e2e7546922ffae7fafdeaee8b2e92005785e4cab8a180e1fa1efcb6cd89dc073b31d2e98b4f35b4f4aed53c388dd91c5f4e845ab67f875569e7f461313ea7f7562c5ff70e468c3c0685a3d6564c44201fa6b8fcc61b7ed4ba4518ad4787c2eb253a87ed9e4fccb2dbf8e583020399934fdab8533cae660cd45f093c795d7539d58decf3a0d63e8aa266302b8abcd109070a9f9435e5cc99fe446b9d3cce5a868e125f239109ae3dccc0afe668b7c4077f3eae0278ae07deb3f98a239c29645082ff591b139c60e2c653bcd6c1a412bc3b58f8c13c8427bfd2b3ec6457a6649841658758bba21d4f0d896185e7bebf72d07ffaa15cf573b16b24772fb1d3f8eaad75f9ead8b50f1f2633dd6c75dc09ff3dab798c8e7b6357cf717131c40462a4426e988f1fc1eb9ec68684fd35e70ff4c508b9d1132a2f438217c6ee0fcc271999fe3f91a79b43e06ff612d46850a52c98f78024aaa5fb8446d82574fa6bf556632744d5fe06c9dd566e209ad8940e43b0bc89e5b0b3f0e99d9045f35bffdac25120ee9b822ed0f42e854fb458ba75dcf64ae7ae9392ef7814eff282399ae566e01ae4499c6d2186428bc92af1c9cc463358df7ac6574c8f588af1cfb2ade5f3c23c46d79b9cdddc5e38367638b799cf443eacc4d9ed3a6a3ae01689c763471b0b018e7e6a18811f7772c965728fb39102a245a3d4667ccd99c3f257217b21b3df752338ec85cb6b3361c337f234dcbe030d64b2e22487731f9065e5bbb5c1997e140909402e57170fe9730c03a6e9b7af852f4b7e259f8f9de04be3c22121e7eff86976f1ef13993a178d03cbc7c73f7d5588fc5054e484e628e0e265a63e9ce0fcd2423da990153fbcb7e77da28ed9f0dceaf6bd2da2c440d8f806a77481b5bbd486e2c7bbc44d9e77f6220a50e00afd9a5efffee308331eef1ebc187c8b0a25fde76320f855c915044cb9001e7093601a2d89caafd7e05d7c9a75b9d874269eb3b3d853ca8de9cfa765472fa7d7c04ec4ef3659795e31f99e5173cb5ee27f53f1e3be87c75a0119fc1ebf89269d92f27926dd05cafc151a0426b8effafd4a2a2df74ca1c266a79e49c514b9ad044ccaedc88b72324b309b5e0113b5d04ac1d9147f165aaa9034d371ee321324b9d42ccfc8459620b0f27d8efd179cab961ee27db90506025c14d5c3daa7851d517614480a231a6f48aa58a3171ec8d652dce35d0fb5b83dae65bb8305c02cf9b942ad210dc26d7b567203f8a4165aaf09a908242ff9d2b20c171fabb6d167cbe2a574b88da44bac5332ee7d44b3e1e39d19d998f674b4200de0ee121f41bb6cb2266935d6527dc35a0e02fcc788fd1ba2607b8f0204b1e986af9fe70215e67c93e893250209fc38051e3e5e9a368086c9c3d47598e6fdb8e101beb712e5f111b36c80c4b4e0e5e08663c6cbf3ca0ed80c77ba8cc1e1166f99e176afc53f566248af814fcf161a99985b1f6943af233e36a2007cf33da0e4208f1de199f71c635d02709223ba30a699c1a5dec2d92105d413a04bc1489fa571d522f2d2656a6400ef71696e32d3f15e1c40baeb11ce088ce611950fe3cf11ef394c92c6db730ca3d39112ec919719bd9b5934cfac7f03f666697abd4ea6647d203ca658a50a349839f29b6d6f91d9f4387a59a51ab7cb61171805a17e3e4667dfd66d0c13390f5b3bcbe4ad47a37a842f5ced9c51c5569f3ad27ebac5122fe0c600989d328ff0ea27103bd2df63ca607a00ca3e5ee27e2e22d5e5d9a83952893bb67af0011371a007cabaa53d4b226a8ec940b0df09af92f15e1adbdd8805d25f452ef47cd1f6bcea880d77b3f8ae318e9222700df67829fb2ca136c8b692b3a658528d4bb92e41f7c3022b8c98a7d5426e7722cb1b634e1f937f2dfe3202db548a734bfa8caf7e6902b36529a35f9349ea913a1392c300d18c3f8386cb5bcb90c4164ab1c53e49b508dccbfbb5e238ac0cdc0e559e53e29c84319f3da151bd95de018e80e9ba47db7d54180d78f0d9b11085813ddd0c882d3bbbfc2cea3275a5855d5b36e2c2fde7241784770d37cb4f948de7083a281726231a109f95ee0cc51ec509dfd6a81cf994c073219e2003398df7f3c4cd012b38c140199578b1adc385af1db88adcbf9349c2f836b5a8df2bf08c0bdb09b0590de2b781174cd7159a35894f82d672c42327bbb2de0abd472ebeca33431826202c1e199639e287a19989496c78e1c9e2d9212d4cef192d1b1495f40e61215e21323fcae454272842219a902308d99376f41e6af966ebbbe579080aad1be194b66fef8a253b058813f666b023d724c4003ce0326881d35239564fdbd170294cab940e7623efdcc06d21d4c36371d4b50ddfb56892eb6e42938b8975da77a0c6630b1de4bacb2cb5e112f516b126dd05f0b83e0977e0614ca4aedf7c73400022213b4edcad306c01bdfd22235b264e8abc7f47e43cb4f6ad4bf3e076d39703cbe840a3e6ab863099ef4afb2e93e3b19239e207ca48b6b4c57e028f0b35e7470e3aaacca5a0d3691df0fa122561c3bdd12b46820da032b2644ae3a3dff4119bf2b8dae835e6b710b2ea0371efd5ca9f159c1c871a7134c12550a35f43cf05ce0615280f187dcb9cd57c65620c3a264a29f3ba5eae98d3c20f8555470e13f53dff7c5cf6f9de7367b2ebf1713c0a097a73916960c38cf42ad80120b0e58abdf7d299e71d04f2d2ddca705d038b2d40ecd9c3bc73cbea975f6e89f71ffef3fdfffff3fa3bfffdfec31ffff1d77ffbf35ffef3c75f7efbf1e7bffff5cf3ffef8dbdffff5c7af1ff3e36f7fffe3cffffaf197dffef1bbfd9fbff497dffe89a6d468e378f273755ca986bcb35dbac32bc9b04ae115d8edc3bfef6eacd492304ce9e020e10f1651067c86b3e6610fc92cee45ebf4e28b6d611bb06e8fde187b325b4afe53efcea442631b7b0388cf11c500498ae3b6c0cc018ec22ef1d9028e875a272b8931065dbc4df41e07120ebc287419ca6fcc873f6828f67be007e4fcf9936d2890808433870eb5459e447f3afce54ef8d97287558d7f5c62f60f7db2c42875d3aac2b8712c7d946f2232212689830fec576133876f1905428fd53ed7d274993c6c27d532c1c7766ceea436a0535c20e033f4380ab087834c3675dd8d5422acccd2055a386e53d0cee89ef3e3b2aff78bda23329b63991febb4707e60658f0e13bc654a7c4b9a07b7bc061a117a2889180e24b2e699db86df5f2ad8eaccb5b4b887ea5f341089ddb8a31fe0a42193c3c43697a3bfc4feb8d8f4f503b0aa5e7c9fb099ca6a1ec07283bf5fc7da9225150996cc669a722639c0b90ae372c62e18e205330c92c2be1ef9c4319fa874810360cb8169d0c3a4043da76571b01b8dcf7ecd5e435130d0fb2d2493b2533722640f8bdde86366d4570fbd44dcfa4883335eab4e3ff025f6ae929c1fe0fc9525bf411a86e8f473f1d0eea32bc180f44e5170218ecb030e418f3714dc8b60b6ecf0b1b57d9900fde6a30deba5dd419e90c8566279b054cc89a918ab2b73a577f638c258ad77c38694231af2c3e369368016e8da5ce0a80572d3685cd6c322252511ac5b9d7e94055fb020dbc22b8175b0390600e89fb39883aae60c4367c08c654b8ae11612772f9a523f21595c28bb0c6e403ab684f17029c64704f280af5f560738a647bc610910b814e11f6315b0e0491ee94230465a843abc9ecddba797c8c05e760e47f5066d25c754c66f80852dc6486889053571e5483e75b59f16caeace9391ae26393e96dd0069a42f21d22e4244e6ce47bac41e4cb37929f3004faf201a3b12d4812267990aa2892d5c26bfebcb749d50843370733570ebf1b0cf660b570466cd72a686e2f33b12de8172b6f84d427e3d78ca0f55d8643aeb8ef6aba4d3c5a209f9c26162e329fd057b720cab616493c41536339bd8a3815ae6d4ed86095656881cbf7c162621e6f0511085c78d2f10c4f0f43f74766ee1eea63310342d4b45988d50bb2e2b39d83ccf44943b0719ee780cb5a740a537029cbcddcff07fe1d2bbcea49c90d8c0e5ecef5e03679928bae82d7821e309e024057e0766a478e63c26590d9543f37d9f642a9e233bb3a5178d283574147a1b491b0149a8ea5c2c594f8fd34a505f7921a12300065f25ebad9f1be4b87304e33936a84312023e59027247b831932bc633ce4468871b57bd2f89a8d4c75f0005502dd9b4ecbe2647b2fcd80720fdf93ec223d6bf7a4dfb0bdbea744506d62949538718ba60d51ebac2ca0a19a4dd1c287f7c73f771721b7fe353c219825ca88858d82b74b3fdb871c5ef276652f98dc837e8f22c4c7b44ca4612a044cc8019c38557877f83e0ea30de6383327e406dd305d2e4d07851fc5c460740bc2270c5c18babf7f1b4096112a6c781caa94f40cf5a748b613039c3f92750ddb3e408c966700352a9ca6d00285de2867eb9495c46c0431832922f743c0cef142b17a6f432d6f34b8a976156c9e236f36ad5ca01dc46a290b960fb38f3447d6fb762bbcb49fcf62c4a3fb49558a7397a55356ca687aded805030bb15a72ffb95b0474d38fd88d69e25fe3a2c195fec2a3d8d4392cdafe86b65dcb3770afcf658f747b0f8fb758250cff6b68053476960397acd1c1326af616fe9d6f12d76342b60602723eaef891825485eb0a465c59ee7e974d74c5fad94b20cc83a2f17552cc2962be6c060896429f3625a9958c7e2c0eb48d91280b1c1bf8a37bac43113d6af6f503f244d873e40468438ab64455284f7913820d63ab0c504fb9578c01886555d6c8ac5a42647dc568d85ee4abbc3d7e829c41047c6e4b0ea73ef5c6abbe6eef096af36968213776e7cbb5c865127f09687e038e77a23b0c256b577d099a9606aec0930f540ddd0b1bc1f2b65c313bead68979db3f8226489eeddd6cdef32dc7c2cf8c68090288bf0e073e5c60d629231d2fca688e505bdd17b2521a0a314dbfe4d2062cb8db0b007641fbe4d506109caa0f08385e5eca35ab60d8241e249c455f640ab8458507604a915c85aeb4a66cc3fd52f84562318ae79c938b295e5692a6040c4cbe680dd992a020cf8bb6cf0da8e6dec0a63a8b565c91bb632f34614ebbd9829e148ba188755022e3d715da3df177ce5b153abbf560c7ed931b6f3ac21eeaa7a8e469e8bf6e1d317346ab19dc18f2ee9ebc4a2ec072838dcdc5255612b9700ef06f12089db47979815a10e9da32358ba47dfc01130b55d973dac09b1afec9a124ae2e58cc9b293cbd2ab9279cb1e17a71e4e9b2c5d57101b06404604e28ae56739c0d7e74c1ee66e23e52d580ad6e2a16fd06ab8c5c2ff5e5c40d82f9dbca9ef13b51133dc25d8e88807ba11f4945e7c8ce6f6285dca07bc69cbdedfd8f86cc5ea811cb988657b8e20cf905e4ad9938c63df379fe44ff39a0b0d685df4b7cb64e4e4309fb1a502f4aa8fdb1a5e0eb1d35b7d6e201e314e1bb7a614da1760c20f81df440dcbdb08daf1b829500e994c5a714c22c8cd1578b66af735f611cbfebe1b0095d0f5c208b448e87c3d608cd11346f36b0333172f05bd08e02518e333c7e4f8091480bc580788f0113b4263252c3b60ae3b5696e9f9ec9d8a368eaed8dcc1da5c9beec3aa9a682ae41319a8104b0522e7d2886066589288716ca5e68df5db7905105a1628dc627d7ec8a2a12213e305e209002ab2bc6c4744cb0b4096127c9d761926e05e008687d72f3c0d8ad563f1524170764abcf4c00725e7ce4091974ae22e1cb32add4d89bc917c0dc0b2b1d1029df36ca15862782019a401ea4cdee87dbc0483899974699abfd28570675808a88baab0962642d75fb7297705791dd2890120eee06010426047705c37d4227b77317ce9d2d5538ec07d0a2626927191102f8da773f80f958a0a80c272b0e75415278eee129f50f498fcaaeb00b4e6a918cda8a49323b0978ca523cc5f8cd78360dc77461680c327630fdb3231c9d4bb19dbac72a4f20161e5f09e16ec3e485d741c7074d8e4179e8157913427f913b331d841453e0cb10082e63d5bf2e596989814b314a286ad50f65a2825ed2b6002217a3f680afc4594d79114742dc4de43d01c50018eeaedd07cd8da036dc4947885137838f870b3b87208a3538510fb85cdeb85790014a785156b694a8b474f29f13fbc629b3f876884ece37cadf161dfa099ac4d5a175560ba579667bdef3d38213ef6ded032741c8375000270c5f832f22b03cddbfb3a11251e64c7d05d1c8eab91d3d22525fb88a7d59798b8b11f52825b7059b42b1aa3d1c58b23365732efe169008ce6e6249b98ae97426eb10d0b363b4af6419525072804ad2dcb24c16f2d999481d2582957bf85b40628fe5a9045cf4738da440ee1237aa6d9cc670d16c1b1232dcbb3086eb7dee5783e2c9bae1204b682f5e6f7d9afe2a0daba955886cc2eac5b5cef9863a967082bb18ed090f092c9fef78260a011a3844d9633d1b0784a1cf5bca2ba7c8aef2a09d44272a878c8bf4924010b7042f69d2e00de4fc80372a2fb890ac33e243066938b68c0c6cf1118fdd3d40edb676c1fdd7c82174f089a0f5a14140031d8a3b61d5dec15c82bf2636f173644d26cdd0809fb066864f93acd56d692e8c439b33567d158a1d152bb40e17f70bf60a2227c79d88a99f339d59e2e2ed0bd5b98de5a10da45c72c51870270271e9ae5119634c6518095b33315d4c5d0773696a85e58623bbc4bf5207c282596c389c60987a92789e17a0978440ceb626d25f1f766162264213b2e38d0e2bd1eef9849ea7e61c832ab1fa03c31122affc4206c3353624c3d95ba731e4a67cfa885e8721ba43a00aa4ce4f01b04ddc1cfd7da584c9b428d0327571a1c19adbec39c7524b08e350e5bfac7e74080f703f30db04acbfda502f9327d16c87932d700f848daf5e25e19013125ff9db81b83651e80b8a3e40fb1c973385368a64eaed47d5cc02b65ab921f789684b40659b6c8f9067296e49bac1a0e4c71f7db49de15f1ecd982cd106782dc961047742be2c3a1f23c32acbb705882b32a1b06b6cef0eeb2b23d52a0d56b651ea3dbb0c19c29e5eb22e4e5f27bfd71f3d9eb7d74a9033eaacd6e642cf20b358d80f037aa8c57ca623934eff39148f19269ab3ee2207ee13a1613f02e5019c016be0366bbacd71b04b065a74183152d9eece362a0974cca9b4fe0a042c9def72c2953170007a52f082230b200c1b1a7510a684324a56458dfa8135b04583c8cfc78026528419725a4f69b8b5ca21761c252679d6f6447ec60578f4caa7864f1f984d5c0ab62e1aee1161192ec4d26b9da0700d00c6936fcb47cd87666717d74992de2feb9e3063e21f0a1e8178e0e5dd79b7814f2219c3c8ebbbe92a56200576427e643f4fa135bda29849fe721ce3c5bb7cf428b1b4576c145258e49349dc2e676807e976e1007963ebe4ce5fcc2fe9f60876fe0f7d0f140367f690bd2bcce179e9c8498efee7053be5897903aef5e3ab9186b00db14d855008061c2057136dd61c1092f7e7d7a123d1d63b2e48c89b339d42670bedc0fea7f010000ffff8c9dcb8e26c95284f73cc5a8d70c0a0f0fbfc4bc0a627398113a481c362c9010ef8e2c321b9d328b9aaad548ad9eaefaf3cf8cf48bd9677f7ff6da14c62368a0e240858c70a99526d73099b08c70f60299c391ce6e8001bdca66090bd63dac613baa7be9d747cdad391027fb07b9bdfd8d4dfe44bcf7941b682ed86805ef00568ade97bdb6f424b363b52e09517dcbfb1adaf7e43a7946830928ffc2ad85c13d3c2ed7879bd037513da072e5ed1d2ca75b7c11b98d6f38fcb3ec30f6b5b0faf22f7ca9cfa9016385cc010c61e2218d49b40cb526ac6229919372f43dabb3dc929e70d94a3e2bae398ac5bf95d5c35cbc4725b4ad33825447689486552cb0cd59e731b05757ed02d8643364597c51c9c25556c637fdc69c8b7b2244372fb165e4c138f265857a46267879c222787f7b5b4e810ef451f7f4ebe7832e10b04c5333bb7a4bc4e72aa04b74a9c872ffcfe7988000084d5e9c718fe505113ba21f41c0a598fec48cf428c2966de66b7ee2eeb313a5c373d07de244e5cbb5218bc6b92c11822db60db0dc24f24137b8e881214e171c11403e2c33a9842d4ed221c2241f7d000969b2d98506bbe296deb66d2941128b4a939b79d605148f334d6c9ed36b988ee0f63983458503e4378b702ab6a578c580cce1c9719dad9e70e203b3635a7462b033fc1b23a83ac94ea2cf2c48014c82618f7a4234564897d8b217c67896a3b11bb266ab2f5c266f1915801489903143482787fdae41f748fc6506014688527646209425955733c5105fd81bf210edda3403f1e11201a03febdaabbd8f6db5e8afe1b8940a05d47869b4b81ff8098a4993611bb00a8a1c62a9faf3d43bf4a59a5d07efad8c2c12d03abf50098dedede8b8c3c4458df93c088462884d84a95d2eb9cefe4f8ad1d229338e500d168534db6e8b3b63b8e3884815e1ecde15a2ebf344a5ccb544a30d159276c086228c4daeb51f3159aca569a57809b97e6f0bb4243564b2ed7b9ec07016136023a159b0093885acf8709e49a809621fed7b08162d7cdef44e2fbe9db1369cfa516381cf261a68547e344484975ca2120658e2cd19bbda2cbe4ad050c52698c9a304cf1661f24021cacd2578ea3a38c03b6c2ecee91538c567fbb2a385d80a0fbf94b91007e8d861d79479e9d8f0412d219b2d7814ea0b8fe3abd0ddad35bdfbae2d99dc68ce84192d0eab57ac849b5b23c9c8e3f05e6c10832f748ef26462651576fb6aa9bc41f6f028331871025e3b4568180d5e62a9f0570943b6d65a23641f707c0a6a3dc00a5a062a96609c7dc3efd4a8d705e20be87b8af66dd494ec403c3331e440dcddcb741cc3aba0b79642a2b28bba362f4178377ec2445a175b7010c96ce33296ca518cb24c08db79f1568d150e1f5259dd727b21b267c9022790cdcea1d23e29b7e2e92e730ce14c7db228e7aae779c6dc4322a11079a7a9bf852c0c7e722704538c1cbe6dfee6c953557eed4e286dbe6a2f7f925711a52b0231e0f764f48da8c9555352e66b4e1780f8ed6573174b028682970bffb0b552504648246654c2a872446bb11cd983c38f47c023cc6f9585a4140d7fd8ab6bb77615174ba2e7d4e2cdf280566567180998287f911932c51c0b682296808acbfc315f02d8283a6df8144bc6be89044d0525ec4329e562b5607c88afd6a96f90d96e29f11a0443d9e6716ff616bb2ed348c00e8b8d5ff08920e057301ea00bf14ee026629d06c0bee02eaa6cb0080c79ccce06205b737c8cc07ddeb8312ff1a8205f81b1c9be203cd12af46101e4cff7b34d1e78656dd3ece7ab039107df4fdd17c60480e3527135265b6d2ce86482d2d84c4862690208ca37472c8d0358e8635c5a748fe4bb5e27afe39f907ed12d96d71c4be4c5f38cbfa913bbee990fcad9b80582d57c0aa4d512e304996c6d649b8a6722a3dbb96fbf613bb0cc6c669e8c27d097b7a9f32033532d6b05fe182b3d918bc11d3a7e27914bc0579f5b914fa541e188333349a2cb6cbc6dd8388df7ead472f02628578ff92b2a5a6634bd0674334bc4aac06c2fd9eb63d23df86946ffc3cac5fb24710544e2fe5563f5e0d760f491acc51346cacfc6650d03feaf71d81776481e8bd7a955270091cf792cf1577d41abfc1c5f86b775357b31265414e216b5dc8a0f40a070160730db84d19c2d260ee7b76816a50dfd332e13e3b1de1cb7b05b20d036d9863d49858c6ac1330b19022370a88d7c5ec27bd7547115644de229ba203140cd6e73012762ef2a4fe8c9a7d30e3f07175277e330be85c1e3ae09d60afbc4a1b0698900118be32b4f832b5da296d03187f89fd66ae81bf8a603293d25ed09c67611171f346f4aad7ee591811a6543cc24571f2b16d88af48644dd9bc1fb1583d73bd0572c8b4b685c0d179c1622e34b9561c0bfcaabe5aad23ea6ca39c5f2347a6b769b9d6995204a57c150c7561df6303dbb818c14f01fccf5a24ec2a160826c87ca2f458173f559cfcc348186e2546027beca139ec30e2b48fec626f0a0fcce052289ecb6b31cd948c25e5c7e71532386aa5b0e765c3f96605e870f73add5322ec25e155ff956b8a819035d57944f659877cd9daaed3cab058565915be1f9726b371f8bc84ef998e0f00a9e02cc74b90faa454bab30d55f7f72d465468855e3c75c871b5de52dd74dbc4a084bf4944d3a942b26f39eedbee7d0a085b95de0000bce78b652385cb79bff14c59a271796867d92264d035889d01da9b6b68dc13b6e74ba438453ba71fc9c9efa99534d3ede7b703f7e1d6e9ea25295dd4046e657eca967de8b3c3d8e265bb16416f30989b3707d252e71590e4949c24c4f584906248d4b68f84e578c2480d97879f1f5825e41c67f01f5ada08584a1f3b45f48ec6238d1655fff0875563bdf7db008ec143d6a24fcce22144530b4737d15e5abc64542b62465eee854d99230168c311289e7d8adb7247f638628ca97555d124cb2624fb91996a162a107c54e247dd7d7b6fd4fc89f8edc2016941a22f5525469022e79ce2b4c12b4077438e7356376cb4c6aa070665d98435527f20a0019ea92be1bde5b0ac47039db0c22eed4e85740735d4711b7b9deb9c307c7a45d5ba82b93e1f2382a22e579483365dd252ad7a727d22c888949788b450d695bacf1810a3ef53932945adc69412a6eb2e6eeca191742fc45e45bd817caf98d681ece004b4093b4cfc2e6db94b1054aa9cbab1f005871c4d93a13ea521e5e3295f4d09457310568e088913b6e6ca4284a550206f8ac2f71d94f6537924fe52b26067ada96cc4d8482886dcdd70ecd264b8ce4645479808017817f27c7eb88bfeb3313fc29567748997401bbe26c68dd9cd8e998f98483357471f5031dec585251dde0e69fb0b7409275dbccabac02a139d717138ef7401d38cfb8ea4648c5d268958be8434427af067a4709db1424fa519a3107288e0cb06c9f6d099765d1cd5caed1853c725ec4dd483d639fb69f853337f6fc82e44d863f8e238186fcbea1ea12a41780104ba34620485aeab410d2fed366ad6620ccdd9ba422c157fd09a08b6cd54fe871304c33b3524282a052b4efcc160d3d6daba979a5f13c05500c179cc19100b704bd5ff506d6ee2ec25ccc92a7660038e2b645a00ea621aa457d91e057f66fc8c67918fb74cb591f6152cf5d53beb8145901b5d4fac27df06ab056c838c5a02196acfbf397772f2189147a7ea95fdd36efbae709a7957e776d6b315b38def0ba2b395e0586a845b50417231f22935e0d913e8b277be351a26d89ef843ec2a3bf03671ba0fa8470e83a171f4a098c24df5eaf9a91878b05f7b53c4d86791ddfe139960f869e8b2ff049001ce98c522dc7405ea09f1ee01b3125101c26b76fd9a1d035e6e0990108ef2617e16ab530205a656eab84eb77ed7680ea179b1510433ad569b5ba621229fb5b5cdea9a2c62b7e16232429ec1af9cdc2a7bc4db56c2e503a75ed0621160bc9c042ca3fd7b97f4e42fa6405ef8094732c005661a0ea7f259c7eaf4b8bb01648f4e552f0df456b37acfe7ba4aab66ac6901a03a1e325f46e4cca39c5fb9871e4acc7d9a3119dbb3fa6b53c8a010d543e2b1b5849ea4b8bcfd8abe157148f0f1c083c029c853dd8d0d1085a1cd687610db245c5caa4aee7e5ba86641929ebf6ca83381f6b966db961db56844e613236c708a8c9f9dd1196cc13ec0841384b04ecb09019fb7558a92de24b97b6907d0b1ca26bb6d04c3143148d08925687c64a2f284d59c37445f46152b193097d3bd03bcae997ed7ac50f33b3be14e93d55da0886f0ce274f43c6c3730e1d8daefd84d3ca5412d3066610a1701276f5de21ea77ec0d73308818ae02cdfb0e34caf1e73eb847cd3da41283fce9127c1cb9f7e471e42d1f013bda5db25e0b43adad229b390459fab64cfef5b0498be74fd5a701ddbaa485c3e495536745379c4e74f460308878799e1b7b4135b2bee1a4394f774db62fb4217d94c382ae42f98915670a94022e2f41c422f91eeb6ae9cdb6380570f2ecc178acb1c079340db5462482ec130a0c3cd5d4b33ae16ca0b16b651d9d387a9f91702d1406f585f8e77912612eb1ef985627846102ed4a3c9fa65cab8f93fdf7edd18b0d8788171643a80007df252034648aa7a69bfe551fc18f649a1d8a956c7f09137b7496d94d8b93bb42fa1e1879daec2dac8d05d826ebb2b6f925816c1d3f8f10166f9e416fe08e5b7c93971dd898c0884ed9655c917bd0d626f4b9bc9fc71dc6198ad75e12962c9bcad559b535e5c8ba117db3bf31faba5f74800324d85ac940cfb2dbdd5801da73a648990d4297292e0879485e6bdac1e4d3acda616095bda3b2998060ff1804f73af9b012e27e65e2f61a3a84bf9d819f7088269e8866b891dce19fd0cf50e717735faeb11258f7438f282adc0e59c1df6b2cafb22d5e9e1ac50d10c25375cb0ca43033a81811fe29af10936e5b726eec7656f9a3c26e7e075f29068600bde20907c8282a845f2b36cb5b6053181706d8f11149fbb751668b019cf0cdbf5ecbf9e7fd37d4d08b63c14bb41ab82d2713545146ec54925577f4349e504c880c397f6ba7674b90723867a58b40f2bd7d762cd1b25ffbe2917013f0ae02e8cf2ecd29623fc03bfd764b098cc1fb644fd5d104dfd877a23334f35d3e65370ed4feeaefe88930c98586973e2f6aff9284688bb95b92b1327b2be89819c3ef8358820a19002332626ce2796f01e4a27f0a751a37bc3512e4b68194e75f16fb44755bc3eaac2eee1399aea93313f2ff0a890e2270f90347292841f89046a65e8aeced42de112fcf7bf4e2a52a5b1766733db2814b1499efa1d1280d5a0955984adcbe33bb1fcd794c66c71be2568239b82b0def093efc1a624091e8d79e29fe7e8c8d6da913e8c64f5ec891e71f0699d6580ae7361fb240c062d84ad02e13226f2e56f0ae2899de0881f91522d49aecda3cc7ba8aa63ba604850cec9c322e84321f9bc7f700edb37874e5deb263b3dc387eeb5b3f4b1fa7e72d12f8dee8834904e2a7733573ecf6592201d1f7e08abc610ee4991484908a3c11e2f6ab11d970256882c9a529b85a0e515860b425c48c14509f218058b03ad7c1c39ae62d746e8910381d36a029aea4bc2c001df983f5daf0da4ad1069a193fd01b9000fe1d90c238a7bf7ff82fe7bffffbfc9dff79fff0c77ffee5dffff8d7fffaf1db2f3ffef88fbffcf1fbef7ffddbbffdf8f9cffcf8ebdf7effe3bf7ffcf6cbff7f137ff7977efbe59fd948b29773149f79d78aa55fcf1a71f1bee360963706a42ac6a155204533aa0187b54fbe17a03fc1db5014951b3a013959b7094d0bc3e39ea4cc9f01d9e2e0aaac01f1978fbb91e9c9d367d03d58eebf56d868cdc46520dbf1c50d3e8331f2c4d1aeaeb0b15d80a74719d4e22ffc689bf9f53d82836b42e82b6b4a8180e2714a7e2fec7a7cf41c2fe4942fcbe2126904150eb4c962318a159281ebedf26ec6a07f8b5177818b212492893b993bff93162c8ebf7354f3c40b00d3d1128238f06b2d716d03e8a2d367ac3a3581c44b5dbda7955eb57413d4128e8ca1ca16052ed4364363831bcc427e9c317c682e87fc40bf052b56551fb59c2fb74a9ca3862123e31fcc374cb15bdc5a692ed765d552a05b9f58382e72a0a895827fa0b257d4fe4a04dfb40e295de8b498f5a4499c66465b4b3b86c98e7032c1849eec160e7c610c1fd84a27848f23c4520439ddd90d8bbfc32f95e28a6c96b560c1e31edcf9efc04530a558ec14500da422acd593bbf3bc1cb19b16a3ed0c049aa9856c84820adc474e5d2b4469820a36d34b38e67e4262f9a0f23d43f1fb07904b751ab26c2f3901d016720bb2bc171b6f02b997bc38f4a1d95113ba489989c19e981cf502391888b5dc10a7ef911c935d185cf3098552447c0678f94dc941ecf6319477ed08ff16f67f4e6180c0323375afd0683842d58eb5f8058639f794014842bc534a3398877526ea97c159b30389dc4a71c296d74dac21087f1aacea4b8f9b060080761178e1eb96482640d2fa2206ee05cab2280ba11c1982387760af38400ff98e6c1b443b9c561a773a4d1340f1e0f6126d129e66f1d6c18ec8a8870471950ea9b5e0979311cae1bec89d04b29cb102c9765bcab4050209a9eacff49cf6da7bee25a233249637cb63f3388899d791c86b1e2239807c71b1243dc3388115f4a4ed0c2dc4a4e8f4d3bc3f00c45c5c53e5738918049a7a01b123972b384cefc09f59efe598669a224bc27d0a8624178635b2aa7674822c85a8b18ca1d405469750f84ecc15ff028928110d41b371014a64a92d70ad50ede3d15e8b7fb9c60580677546f41c50ca85d14bfba82d8322a8765dfc9db87c5bf2c31646607cc2c49358c6c85618269365fa70866b8cae876f99c2e195c83319a47270c6cd9cbb6a9aa6221c6e82cb46364a9437d8e589b2018d06f828fcb9000ae7813060cc3df8d37a94e45ccf33834b21242c1b4a05c7ef3a157858fbe696e8a9319e0743226537dc86735ee2f88ce36fb46c7d36baa08588e5a4db9b5b07076eee46219c15620245220d13a72aa25bbfddaceddcd8bac56e71e421f3546291c013321ab9627bb082e476f92cda455014537a6060df4a2db3300050ff08a9dd470cd7b117c1d6ce75dd80de50e8eb16154aa6042e4cb2eafdc4a088c7714de17be2ffe6d1f4069545443435a1d154c979089bdf964f08d4798536634aae078c812d4ace7552de364b6f0b593c9acfb3930d1cf8fc5340e7031633ed5a2c7ad705019f76927a459185939737dfb93af7cd09832bc4d5dd997d4f9d7a402ab4859858c6d51dc24d5c4e930d30fb14fd6ef422ec66c056711314adc98b5470b287babc20b793711a247cbc96f19d5b772a8d172a77d5006c6e11f9c04fbe7b84b016017fe5791c02eb0507bdf125b0a2a9b106d3b866d80d55b0e82d02e66309e4093f4213a658fdd3b0101063a4e56016f23c004899522213ea224a3e86157a42e0df53580ad444ab2c2f23e3608311f65492f88a2d1a87d01fba318fc8ac11ef2d7b53843f978c8b37421e423ada9068ec05753d431ff2a42b8af8c2f705f6027929cc8a42e95865e232734c5ba4fd035678481585b8ebc128a16b19b9801a98ce6019bf20d3b44bfb741276005e31533a58f8e11513882a4836228095b4509e100e2b645fc406a969b6cc45ee3ee248a86562c2efda6730bd53deb570e64ca67bfa8ee4b1ee46be012722433e605cc622c1d197a4ebecbca8b737982ca2168af19136f93cded52533b7ee257d2fc0c8ea9705a2d6bf7192dbced5e271417a63c8f420011fd36c812963192474a4847207921e99365447962f1c585802b5d074e38a0a4c7dc48f8b2e0b2f12490b40f59772606d38107856bf40722a3e9c62ec21011727862178e2a928b1d80866537ccf1ad143d48f996d1214531b13183e9c72c512f2649c9fe5df981b4355250b6fb006c6e0735c9e8a9fa50b10b93ca3de81d1244b06f05073b310fdd1c8fcfa5d2c78bb0f2dc89a8a03c05dc80f067414ccadc4e01d0f318f182610d48ab4cb1e329cdc86be951126dba6a67f2fcb4e81f5ed88e40a12421b97bb789c8c491360f688a80ed5ffd3fae01935952da1b7c922ecddaa0ce5175d2722139b48d7d94180bb2b5f4ecc8ff1312f6caf5b65cfd7cb3013b6e98b37e224c92b53193d8d8b40a04633e95e2afc5f3f1d6321704050f978f9fb62e30e56b726eabd691b59463c99e92ef5776cfc12e2b7f5b363930c18c459b36809d89ba92ede9a42cc032130b7ea99b14461a10886dac06a725951eba3cde72757ad8544e5810d0417e808d19c52352f08b7240701ba85dad2801d2df16448201c7a31a6a86bd72589de0d49d9dc0f61b5ce03aa1a5b5258c003e9ece4de1a24063e59b5877cdaf05682fd9e706ecb8d0f7ca42987df3ae6257a8839c7514092a5ec1ea17ee37203b60ffe506043259b710a596b625b81a67d68b3dc9275765d105eff7764d9464b97896dfd16aef5897a629d3baec0662dddf41d739712fd91bb31bf7358cf91101ac61745e86bf1518a5fe24370df82de5307a7e8b0ca78261f01af9824ef964f61f66e1c713c26c034b4957c3945850064fd2ab52a57e22288600b2e7d7178c2af21586b04e3689a14242a85306b911363502d2b849853340b85d113cf940dd9b3a2c37a777734773cb1087c10c09ae192d0c79b9157a55f7b4844d265b06113fe44173ec612f7d575dd04e4706f01db620f47c70018babd58f7838919ef90009ad85cb2410e99936bce79cc104376c4587ef38dbd020f376f8bb68d107ffffdc81948bb956fcae02a9476e280c614821e55ace1457cb24c8036b4eb9b0573d0ccb0075d7712c7183fb159642ce3c210cb64198b5d0955bdb9e77065a9008f229634c4c9b809a6145a83d2d4c53d2e823b5fd62e1e40244fd610e454c2bfc17e1ba449b6c8d451ec5097eed9defc64e22942e2b4306c11a55bfff80fff070000ffff8c9d5b6e243912044f3440f2cdb8ffc516c6ca19acc258907e1bdd33aa5226190f77f3fffff70dae4691b97f55615ff85a8a5a4d9e5771a3fb79b6f22e3910ebe6aa6a9d05a730e12837b3fcffcb142d0613af5c854e38a92ed1a14b89538aaba72c6f5010a32fa7273071d2ed03894bf889fbf34101826d283da4bb3e6dc8d8c7b524f6029da1a77947f3ec98df2cf0f8577fbf76513a1df7adf203f632019ce6d8d25c565e7b0a211773c873e18be69f6fc3006eaa9a2f0a3c8f011138ab8b6738df35c64f31f74bb0eb5dc0c9bb6ef0c4506cdd2a831c398bc8e8e3645de9e30438668d2080dc300d65f7f8191afd5acdc85a978295f093566c50e707cca7e301f62820fa8430a7ca077871954683248bbd95ab9502d33e6feb3886a5fcf510d768d519e2ef3d1c3973a0b53228704f4add5babee220af5c8177fd90bf348e6ac13a0b29d4f1d60650c3f4c8fce0773c802451119fd726d5c074e18d954e30ce400626348b1f45594520f94516421aa816c2ed8203f42b8ca561e39efcbc99250c690540aef0b414eabae4372e72ec35ccdd3bfad24cad1de65c62e1904c54a5e2029c9e4377a67f5698df6310b6567535224bc29b64416e8ac395e063990da8e51b4d5e07097ef82e6d4695904a07bebc9ed053aafffad5c99ac9f7d2810791232ecac78aa95f16b3f22dfcebd9e9f15f6bfdd9f32bb6a21594f7844a0c0feccab2c10636987ccbc57f77dacd12d183ff82805d8d1792092cc3f436b610e0cbf4c7db45af81686e1476b49808cf47639738ae1661e5a23c72d1693a091ef0ec3a2b396fffba6304090395b46b9e3ea02f3af4128a981cb03edabd694837bd61c648d9d69896cc1d035e45fe575cf63bdd2ad4741afb6f3f6aeed327c84dcd49415ec8d23a05912491e58d63cdab4dc868db20d40a7b5da9a9db7b932158a2dd790ab18e67d4e02f11fbe10f8674049cb46d9b966d6ec2164efdac2921ab2765eb550ee6811ce2dbfbca9e8ec0446e6e3d6d25998e62e6802adcd06e055a796c344184f6579d757b42da759f9892efe148351bbce2a3a59b341981475e1ddbf9cba1fcce223bb0538325a1ccdb0b018954402c5ca1c36f1c2bdca23bbba58f309ea93e4d0efa1f0649c3ddbc556ba84adb3e54c16a6bd8299e17a44c69a378478e3f2f801966ce91addd7584f5e645578a179b1b2f7fa89087e675273ccbc735a2376542518ef8d1a4a47301376c7d2b4d859fe583e7904794dc03163d230bf6eaf1e5b8575a46995f656ef54600fd3f5eef75644d98fda82719e5045e46503d7fb7c65bfdc0b549c2de3deb888b6633a5aafd048aaa930433c4280095df8adc6badc1088011a47eeba439d7f644f8344144fd62106a6df5c00079b74a5eeb67e18fc52f7b7216b6ba9983df3473b7c21d5ba6080336de6044fd0d9e7f7b7f70bdc463fd867053898e9a4691019b8eb2ffa10c400a38866c44870f91b273827968dc378e16a1867cf205490d07ae05af9efdebc49ec5cb324a4f09cafbc2d24396d2c6594b5e3b3cbfbe0d21fcbb800ae6d359981147ffd41fc5221fc147bc96e5fc1174d63eda54e273c6c14c7f260b226d224bdf2c554a33dd6e3f6823122eb26bd6b24d2eb9444bab7869a8658919bedbec65c79ff82a5410ca793719c753ce593c8a3eeb1ee9e610c207085127a6af4be9baa93932fe1f0f91e686125b0a12dce1970ebe88ea48e22bc4ccc2e06f5627671d5672fec4447211426f571963cb7d24292d932e877ca5f643be5841d59e0cb5cd0f4b90f76253ff8c716eeb68fb6a0c86fc2be442edf43f914fd68d5ddb7021bea336004ab675ae2fbdafdfcc20211d069c403d448448656ea6ebfbb84a9a0ca1246b7f6d29f3c4889678f7509b3dacfda4a352a0cf664776069f71821053170d4221b65d04eae8cc91c44c0e78befa8bd35aadbe3c2a022fc269ba54f899a677d44bb4e45df5cb708a40aeda9f5779f60f5b36711c1fad29c0c7aa71ee71875cf9ad5e673344d992a4199f2ebd1b186c6d10d09d6a30048664f2d4fbfbf58c3b3ebf155048f93f390163425e6d2b07e904ad285110211d0f4d8cc8552563ce1da903c646d5279a2578df156ec98596508fcad9b710887758466f00cf1b2afa981b8d57f005081b32ae2c9805a2fca3e6382f0428804797177e901a6140e15687926d835de545fe8ad8650d3100d1ef908503509f3ccb621af553b73e48bf8729d7d81b2cb573f86060d113dec78200916e5fedc044c8524208599422c2fda8d934c7761784e76a04e7338586869e4028a76fbcd86fd7973769979f174485b8872ccaae9d544c5bb7c8fd494a20832c28951f8aa932261320b915b3c6aa45cf37daa568244329d0799c5fe4bbb540fb4340f944f8dfe6488731f7b3b6abcb69f14cd970011452ba6ca6cf632b7229623cb17065318b53ad7f6709f742a056a13b72edce665df82c06f79e7cad2ca34168ec42603063491be87f05dc067f2aeb094361c974b4e52773c417b56d60655d2b775e2df964ea776c832a286a0ba3a217a9da0d647a08123584977fc5cec922e0cfcc58127945bef35cfd93a9f4cbcb246a32f56c1c35837b7247725ca009660e834cadba20838aca9b50a184a1096846e6d8e28a59836f8fc4ca17b576ac7f2a7f1ee652cf1acbd623aeabaf14a0831414056768ac52e4b8cb6fbe26761d797f998b08c36859689a640171b41df6374a995ae94bd8f060a6b6599182f7eb64bce1ab5b54c68aad83515377b87e090ebb1439f1fbda74a2de4c4e30f32a7b23003697a432a90e1a80338b3247810f61eeb123bc8c8ec3e4ba498bbace27374acf8f9da7d2e901a9115fb1dbd7a1e14f1db2feaed1fc4638acfc34d2df0cac5267fdd5a3c1d535fcdf5019dba72b03ec4b796dba9f7c510f5020549747f5d4bc115eca0b95bf5ff2bbc5d4fb77e7b3eca8523ee2f64f586565e74bf23a31f39e31e248971e958a78b2beef121f1e48be8247394fcdaf5aeebb13d97b4ed41bef1f85581fecf37cfa19d717787e8e7e41bd9be832367dac084e84674051c592debc137081ff5e54cecabb46a44edaa82852768031491c70eb347783c8b3cbad792f03e71c7590ff559cc48be47334de7b9a573df33611469be59192a6d6364779fdde56a590acd036630455b014ed3862009fcddf99bf8f2bfc0b61eba758956ab790344f66346a353a60ce7c146671f2c89d1c479affe91f8e995f1df851ad237f138915aba5eb28bf8b3c55abdbbd9cb45f7473d59a616eefc2a2b95987b9ab15372556dab45ee4b6be52cfe4de07716661304611e4a014e1839e1b5c678a62292c953dfb93285c2329ee19561f2fbbee57d0b61cf2ac9e2196af0b4d8ed1258795764505906760349fc76bff87beb78a437b9b320cb892bd304e8fa536085ced6bcbac9d091da844c98cc9bb8a8d8de73880498f885c3f1d67a7d4575781fab4e194b22fa93ee1d4adb251fdd188349755624ee9f2caed77ecf543c23658010ae5f75ee6f879072245e1ae6133b51a8dba284f662219b593fa5e55c1ec0dfe69b27c7b3e4479cc0a3ddc213fcbe5a71fb843a36a762c75cab6b7c3dbdbc0d787679fa6340e47dc2719e2d804b9218938c595b0ee96a2332fe192b758c1cca30d739aae61f26758581dc4cf8bcce7dd39ce454d0276a3e8b51b93b66acec7109dd5bbdf63cab9b73cce598edd232446130f90e51342ebe10af87de4e64aef465754afbde7e130a7d99257d158281d1840492ce59c23235e29e3c43c3e6fd36a5dfc12e33bb6688dc9539a5f136f7c610bfb378e78be2bace9355b1ddd43f17fdc006e591bf6eba366fb2e1a14ac3d0ced9ab3a6040c669ba297ad41d7ec5197e45cec6184778214bd48cee2891678cc0b8e0dcead10de2befa7a59e9adff484cff030000ffff8c9dcb8a753976845fa5a9f90fba2c2d49f52ac6937615a60d6e4f3c3018bfbbf9b4771a6784b233470d7f67e5e59cb3a57589f8e2e3a03aec0bdd06316f50b12f481364e9f6a3322e1726bfad3dd2b7668f288fd84a67208ac1c0fee8f77ba87e66b0491ef67ac5662fa8739b9e98d69487d9b96feca0dd65da5f0bae7a2c930b411ab5a9be4b8e5fd729797a3ac69c85749cfc096e859e9b682c1b492971f58edf7ac757e4f89a2055a548cf2c061c9e0e63a2b33d537fd76470bbbf5717fb3ceb39c45a340b17b8835c3b290046923b2b4853468c91632938b0011f362d5a63c4b0341c2c99f587b7f76854963a456fe8c10e7476a507d3e2b5d765232056b39d5349db63cea428b489a48577e35805c2122626dd39475e7c5fc266789ff45adbb2c1859960af2caf37cd6cf9549daa88adb17ddf1dad9b61b4573839ba2c847d57ac8482fd5195930351aeef3083efb5b935f4da9bb2be6d20b047e6560d3f24fc50e23d83ea6a32c4fbf0e35a6bc4582e3b6b65cc6abe9168b8a1ab11d9e8953eff0278d2a606a79fd0034dbaba3209b12a250e20e580add18a0f8d9dc97eb75c39f2ea631906b6aba999da51f301c1d983289565f1b578e0a8431d2a88f9a7aef233828f11909efa813757b5b4e2367ca6726ba82cba91bb1cc30e89be76314923b10bbb9b93ab5656c17607e0ac68c33368fb2587e9aaeede6378400c9a99e9731b914a3ce5292e46b333af6125518d24d4a77e87187d9a722ee3b006e17408aaced3ddd073ee006fafbe485a23f5cafb0a43317874159eba48afb6a5a8c22dbeb444b4538d6bf51441ff250a9f51bbfea258eeba66723802e20d8d23fa461110d96359e1f39438767f6825fe7876e216f2c392d04e38d295d5e58dc5b7746db4095aeadafc5e3730fca40b188259b69dc62489ed72a18bdcec275f78736869d3c615b7cd485d4c51ac021dab5a9e595b44eb6a7b71ff143600f6661deec7993e4d8bb43107986c299786c2b591739a4ef5b5747b6641dfda13f287f56972bdcdd02a3dcb86fc3b9fb4dfde60e2cf2d7db4653bbe879f00c018513533fdf713dd6c33e375b2cb6c157fdf3e2a6ff5fd69b1863d258388629b138e308f41a1ff7441d675e96e4e91c74c8025425b2fe023d347e48f7bcc6c3428fc6dc2d2768ce16c78d8ba36d8c4e1b7bb6555b4854d59876a248fa52aeee8e8aaad866b1956b0af3d9a8e45eb9ea154f73b886fc4ec96228bc77aa823133b66ddaacabf5e7757d267db28ed34cb717df6307cbd5fc0d2621c81bba80fa5f5ac960feaa8fa0a273fe6b726ca0fd24bafb624ad31e645bb4f39bf8c4e401cd2301ed698b3a5b9335b239cddb8c78118c396275ce27b2de34c9c305ded6298acaa0888aad8f7b48b53357dddb44bdb468f40336db9f7dca369cde46556ba57c66c3fd91e3366b36c5e1e97745efc04567611e9778439d29570f248bc8d83c25ec3165177f6f98033389ce43f5d5f02c2bc6b561469877e7a072587aa02fb9cc82e4235ef172a874f3a5ebb658f34c6d3a0e9b577817fdea991160d7dac8db26efc828ee6b59850796360b2bb0ae545e88c0f31479a73e88039554a967b14fdcf47c46a1a140af2215dfab2b6250816c63fd31cab6b0c82bc1c45b1e5e4c17c39147973a8eafa64b2f408f75f3209b56dd66d91c19b5db66ea89d9472459afdfa4a0cd8f02c77edffce506bfaf50defd7c480f7323bbab132ef1e0fcfd47a5424d8b455283590aaa9a0f3aeccb042f0d73503e6b9677af75a255b10e964a79ec6cb5d8fc26762b84871b4b31fd2f736fbea64c963938bb6da2c8ec8453b53f45bc0cda5d25661142b5bcbacb19aeb23a6ce62820a0a952886a65164db0b1e21bd5320ff898cd538499daef982c9cf5dd5b96cde9e177c306b73bc0039d33e0ea5951d3a138e3ea7bd6fd1dbaa96007d9fb601ffb78bf110036a6a99dc45b0f1eca7a1012946adc06874123b536553f6e31ad69b3130a34deb0fdbd03eb04133497ff4ea728965cddcc5374a4187ab42965add146bd0b55f5f926e100875dbe3ce366268e0192dcd34f66cccbdd2e6e72784eb92207581413ccb1c7beaf45679ed37c30e708e0986edf33b56c723c7de7d3bcb6f8c6d7bc8eb6f80046edae94383d19c7ecbc5625850bee95c1ef93868979a52cbf0c3bb937343273710f45ab6f83da49db06e9af5ac71f2688914e279762b5eab43319e2e2cbb10de6a964cc5369814fb4bfbdfe1e4cd398caf5eb617d98cabacdb2c98aaebb63dec3d219398bccfe38be721edcd419cf70c08902d6d6ade438e66e21a37723cc52bc32ddb31b35db5f1fd6a63ea47e6a098ba67b2a229db4b8b5adcfe19c6b91ea3e95ce642e4fe78f8367196df29a7cfdd34ea583a2f9a8c5a8cceb8eb36e55466b371f009d6d680f53bcca951794c9d05262a2dc58ae4dad3cc068daea09a41954ad346ea88cd905fd9ddc8f0e073ecf83b3d1e651b54ab56c4b1f507e4377a1612cd4ca9c5bf6ac0e1aa474f23a535e2409b3308f0fe11dc1e8f889ee134733a503972573dc20115ab6d64d436637e43c378ebc4650e2cdc6d7b3a488abadc5a66e468aa0f4ae282b69beb91cda88e05a59f2fdcb567ff079c5b068e46c731ddd34dd1ff559a0c78735571723f34f30b938f6673e02bd61f8e20c01dd3a948e6daaf2f2dc3f7401f02d61894dba919165a76a599b54046ed5adc86d54c5300ca86f8153ecba873cf8b3cbc192505fc55a822c43529cf41c01c40e935d7d3a16f98c42a5203f8af512e4a027dd752c1c24ce3d1aeb4e68b27ffab70b35b6c2b3df0d69a99bd98c2b26b1fb83e2d93a91389f8a3c084d631897ae41ab3521dcfefeccd04ce4ea8fa6810baf77afd0c0354813411a16a34a68a70dff2b692926b90b0c85e2c2cb9440509a0f2ed9b39b28e4904b04ecfd446751fbebd4ae06207d1860c6aa515b34ea325e021c4b0ec666342beddb83eacd17340f99711ad642d57bbe7ada2b8fa131e7beada59d4011d9414ca4b4453506d17ece185d8ee4c317d13299197cab9a3e73301126e2b2817695e8e5dd47a62539fe797c7456aa9541c4ec34a4221587f11f15b73cfe16627548fc56a9ceb6532664c1302b4ccb96dc2c8e5362e5deec67cdd7e42f66370ba6a778475f636acc2a869378463b41e0866b466622cd05864b7bcfffacfe77fffe7f9a2ff7efff1b7fff8ebbffdf92ffff9dbef7ff9edcf7fffeb9f7ffcf1b7bfffeb6f1fdfe7b7bffdfd8f3fffebb7dffff27fbfeffffba2dffff24fa28ece6e2874680cc356ecfb54fc6aa61c256d3434183f6e6f38223c08059a5a5643ddee7691a233abcd61795fb5630868ca46643ca5d33f18f316688c71ce48088bcd5f53dd7c3d89f4468880696bb3cac12be666a915b5e970a695cc71611c03f1b41d2c7980b64826bcd85a7506597d4eb54eaf8c61cb90e462550d2029b3b30f4303e705d547e494eda3166b645d4bf2f76f299628d69b072813fe3874e8d599d52e7bf6d798dde4b7350696467737af66524a780e68b79dd148e0838edd7b747f778f03de46ec11deb31c011ea64473a7e2e2700bfac60a628b4f52c5ccd9054bad2b9dff39afda4ecb1aad6ea1dcec22551a317b694d8d1c47c126c5ffa466d10b1f88a8a15860dd5797869078b134d6977175b1415d3603239106539ce00f26d346f17db61d376c0c4a2d2be5e672af7d8d5cbb58d2d68a5c69b7b3bc85cf86b98f708c0b1a796554ecbd4b7a9c15f62fcf89d95dbd5be56c4ab66649d4b17182d89b9dab6ac44667435134de7a2debbd99f7445acdd80eefd8b4ce35ea560dcc5e75d7e2e6f39d10904402d3dab20cc67a9051e1c3deadc2700c372acb3e092b734f572b367c2f4ad88907a92fd3d3647b649ad1ec87c5671a9a65fc93e3351fa1656fd96c62b52b4188a91fb81339ec1aee84113ccdba5356adcd78edab97a5f3adc987c8d55484bdab5a2f9285bef178d6e1e0594b0082c4d50331f0a1d8cfab40b286fb8b098eb00957eede764bdb77cd34ab75598b0a46bd65c492ebdaafd76199e06862bd2d6888664c723e36be229750c7527be049669f4d8351cf4edbec5283d3dfd46a31c8dedbbe560223e99578d9612f1779ad3affb99d142db3a4b73113c9b51408bb9b88aff26e5b99753f95fbe2fe0adf554ddb69b723ed106f1b2552d13d7ff6bec236cfad5850f91a0e753aabd543e9f8c11f0565bdd46a876fbdc50b311d708875a3e7ea3a38d906a022f54bbd4550c18d328fbdb65f480b75aabe1720f5b2df0885b2bbc9705758f8661e6b84bd80030bc4fad1a945bfb5f1ee6a67bfb7119ef1f8335cb0b7a019b819bde6be07f05dce6934342b8cfe31d70cbd42d94e2b8eb68fe9632eb2c7b7dafb89520a1324f3fc6ec5c01f41a45aa8c868d28b83c99071a359a0eb346ed48c6ae7c7888158c316e35445da391cd38cbb537114c9ddb919f337d7d55a175e4fca868ec94fea8e03a3472fe9707a886faac1657abed312ba10f45b607004999dba7443075db6a941e9e96cb384c852de162b959e99cdf94c59034b80a32e3fd6a8bd784c51cd3a2f2af3651c06024a5735df7680b1b41c0138789fff2aaee19eae4be60ed3dd1ec238db29f53e5ad3e8b693aa9bd6d0720ae85265b50e4a42fbd9dce1176ef63d8c16bcc9c8b32006d6026ba9199a3c3d17de505a6c736dc106370d5589071b68cacd60dc5ebf3b763f1261c374dc7c36340c0c6be27041ffc97756c886de85ef90b6870d008e4cbfaba2e876c5a019c9a22ad7c96bbbd2b178817e5f4bb45d2ef1734789aeb213f9707c208c67b7b82d1eba2cc3cef186f5edf3df95471d66c18267566a0baad8a8524d080dbcc7c6b201076a5a501da63ea7f00fd2ae9a8a413621be7a203e82bc1f9c92877d1b616e268c06d3b8d38bc8207b7390f4e8f8f0b8daa71a7fd61ca598d0148e84b5c47bf6de95ae034441e1848d09bea13808b472dc1504ce5d627dd3cebdcab2b2fb4e4d5b3fd6e86135411c557afa74a7b6618161d0add21c73a8ffbbf9724f54ecb6e704c593e2a902558f717f768c54aaff51df0ccb6d66be3b2fa1c7d084b629dc1a7223e541b33fd3ea0273f6b6c6a9accdd1a472eeb5526388db1ae5330effdc0d78d5ac613f1be366de9256b5e3e744d83a886e07726d5b64b651f609b342e655078ca2b89b7260a5e126943eecce3c5125dde83e6c9c9bd40c647f4eddc4b75cb9a438c1d7b6537bb6d91921987a14c34d1a8bd6fc9625f61aa1ab75566961e2ea4d669c2dee58e22ba4c46faf7b09cdaf84c2de8ccfa36cdd0290800c4d43b184273b5d1bde032fb5b310d3af52e97b700a98b569173d3539c6aa7d7a0ecb64bb75bc6fa3fbf6b6abcb6993dcf266d851cc368ec82340a79ab3924e48de967e7832aeb29dcbe4826c732fb13a00c5bc6fdb58b34cf332b35138eb71b1ea34fdf20c28feba577cee181fc6766f48639ca00bdb25e534397d5b4965a1624ca807db6a6c98bb69d920e42beca6399a187646338a78d5e91380ce66638eba804339500209b6a98990ade8f66e8f19865f046292c6af255ba916cb82182bf65a86eb41cc61f859bc0369d35fa420b6d9a7796eccf1be6dbf5f8d3c28255daf23199780e10a8ec62cc5d03ea62557131e51ed0f66aa4f67237f302f8f2bc366997385595c3162d8e1d99b4162083d2a3a996ec160d97e14e8664bf1e279b22d68edc71bd16c91eb177d65cdd563eb1890a8d8edecf89cd671528aa9adbca26e74a3431f238afe05c82397839f6ecf633b348b6d5d5cf7740518c07a7c8fd1bb967668c8c33e6db59151e5d4c0daecfaa87806ccca75e8d5d6a861822d6155e458176c14b58e45fced32d5811f30f28d9fcb64cc96947d93c76d281d0c53b359a122c3c4db8bfaa68980a1d7302254a17e4f1062a16529560807779008fc991efe210f98dd2c47042a4c5b241ddfd6d4068ebce6aa85cd0242502c11254227bcf660bd4942b55b11de12b675da7bb03d0ab452d719f01905d9747688efdd9e7a3b631a2d6ac64996d03ead71dd9a9eb28fb9dbc55b847b4c05eb6d1189a6e2b6a9795b1558956b4758f019700b2bba16f17302e776466dffcc017b43478a97f17c2cb254e757edde542d8788de02b8eed5020c525e57bb821bf37f39cdc9f049cbab5ec7cf6d984df6bfc56fa4e8a69c6c356bdafa365716cffc3821475a772f1a3c3960b3af6688ee024bd7cb280c6ea61d8f33c155b324340d236fb2d69f6a204572565397af57a14d23a3391525999146a1669836f44baf3fe9e41e0f4d74ae3854d4a9e84b8567523f5af40b68abec6dc7e9c4381e1ea7300864d7e564aebed443db407987cd416c87f09a0faba941fbc0bf28074410b329d543a3a30ffbbbd8c22d7d1213f993a38178b5f4d8e2801876f29509bbd38a71ed3edf27b14155ffc948b13f7e765da4add6aaa77731ad1936760aa0497af4864cddaeeb26ecf90673ee68d88a4c2482d1a9e7debf033e7b59b158da848fa813f3cb020958d1fb370bbae77c07e7a5b8226e88656422d25bcbea46cbed6133dd3c44d6e679bcb35e52e8d82e387cb062874fff620669a1dbc7331e282e4c669d92e104d0ae9aa460b6a53eeddb36afc4a1fbe84bb65b5f1eab7850f7b6fd4257bb6ab84f9d59e072537ecfe5abbaed5281d61085d9398befcf60f9fc56565b044634bddb2721ccf3121b9b4661656aa268b933a11fdd33ba69627548499054ef7a8702c48a651bb4797e33ab19a6ca3751b5e2e85621f7c96bb66513347723e969ebf3eb1fcc59012c174f4d18adfad01e72a0bc5cc49f85bfb23d96c1efe9aab729deeae33a337414e20473179fa856ebe3a7efc52760f0702836491fd5832732e656ed3964738b16786295ba31c86acea24f59ede30812ad6a6a48ccec60e78170b838f7bbee2e1a80cdae14d8ec46d8c0c2c370586e0b26c3dac3a966ed7994a66b1ce948e6058450d24680986297815341eed968e2001eb239e06e12cb6efc96b9e8eef49c4c3019ea111b6184a723df4afd7852b8563d7d8ff3dc964f3c9eaad301c253d5650e60d0e7d5c70b8d00cc861e747bc5d1172b8a05a2777c017b7eb7b57d11c9ccfad4fd7753343215cbcf2e983751c342545a3bd692a57bfaccd99dd1dc1d6d4d7ae4f275d2e3e2bd4419b7992a35218ea7ea63b7371908f295c1dcc82238d978ba6b05edb93ef97d14b941ded113835fd38eb3b1b464bc6b01ca3c7ffb6771a3cbb00e351686aaf9a33df53c3c0a3d58177c9a653c8c35fb6adb2c0bd3afc1dceb02985971c0d6d6494d17fde06befba16c264c46a4ae68dadce555dafb0db32b9828d57af4a988fd8b161f83f620bbbd357b1f6cf65a51e8b20abcd6b5f50967dda4f629d7a3cb5497c9f7fe8c0fa988c8d43a27b5196e11b2270b5695acdb679d3b4ffe46ef19cb3de178b62154672dc84df4e00873c191bd16bb7b77844b5020842808d7911c7ebfc3c76b3bbb425c057cd52a8735cd8f841a3db5d1cc8e651136cd7383431a949ca411fe83e1260bed9d17c3ff20a2f32f4538e6862d8f330e628dbb4f577310611b669aa4ba2ced6f076174480f5a52730cd9cf1a40c145f11a1d636277425a2c96c4418359b531b5b4e69f7a06f7e06873dfc4fa49726e13e990ed375a2a36e1bb722f859dd9821bc3dd384dd13fe83d1f9a12f9877bcc55e4d034679fcd3aab0ab1fc05492afa9e6249feb26223f07febe629be56854e0f3d89ed44f8e2f552da064091a52adee1ada1181b073c83056e6b9d24798a4191820f6c4bc5bfb340e822dbfa9e7dfc7b76e953fde7439b5ae51f519fb62c500b6b8d66d6890ac58ea957219b3ebe801a37e4ef37903a4687e2cfab778650e5eb63e742775782273f330d1035ed4b630169223c577eab5f5c6a6b730bad4ec8166d5daba792116253b48ddb97236c3a9b71be3b656a1e824274c25bb2b3482d1eb8f67ffb65637c5eb451b7af4236b5b08e7890bc1e6a56f6447dba4b7533e1f67fd16f04d2c8c9ceaa18fe589b73d955656a39d87edbbb2f17dd799dc5dbc131797e8583d73ebcd452b5d6c17189451fabe038d1bf6f6c06755d09f8d837f7dc45a8c4bb647b4dacc305f4e6e8b5996a322ded412a68fbc1029a81f964980b3cf89495b8176abb7a58f4af669a343c88c9fc3715e620f6e0c6b5758860d132da296b7120456b8ae6738af86e5f3b4a0c8749ec2f4f0be4519e490031412fb521cd1f459c76282cc1766d9eb25382efa1c2b75d2d977ecad490736d4f808014b977f5ecfa77a6062c6c12234d7fe750d2a7b9df211afd68b0688e2ccb77857862dc6e849285aea47a416d4c673ce9b212862c7b6328c0f933da6a03d2c1ba492903c745601a65505e237370084b76213429289eab0c5d7c5830c5ef3e2139e25b7673d56b49176a8cdded3865de6d97ef7e5735afc348be2a23679340ff624981fff05e76cecd9d398b4c37d75dc6368e704cd501eca8d0e396b9ac2fd66e1ab8823fd0ba1ea16d3f7cd587af137e685c667a9e3f9c0a91465b561e7211b04bf2cc0efd6307900eb6add076d1a66691a4a72d2bbe37c0d20dfe63fe9e4d1aba9960e56c580e477d8959b89c6c366c7c859dc2c5ddba14d29cb64f5a9d2a1eb42eefecce0865d45571b15aad3b24a0d21b855a6818dc937eb24e7d99e7027dfd93cb9a4be6b283661691a9902a3af5926e5ec35ad3e2927b8cee447db09e8d7d54a19ac3b8a0dc6eedba1b98edac94085c0c5f485999d8589af77c88c33092d047c1b9060b11d5b6f243ee0169972532d30a30fdd785fc51415cee1f6c3c42f19976abfc70ea6a56dbbf51c26818315a946ae2fc4e2f4aed0e9ed023769ee0b684b8b57efad7b643223c04b00d50c37fc4c80a8ea61a120eeb6c58641b5d44d75228d8c7f038cb98733c7726cdf5eb21c6e4507c2771ff85520e7f4857722b5b689b97362bcd23a6a1e70979338e748973dc35dce6a99958b8250e1409c95b6884058a357762777d004b7ee42fff5a52b0da7dfd0c6bc12d63dd4af094c2aa6f5ca0164da4b4179f23ed273b4873f58422554d58502574b26f328fcfa6a0e5b88b845d7a0b03e1dbf9d8ba9ecbe2e532762948bbfb7c0ab4dd3b8d7acc5d759bb548fa1aa63a4ad21a8656735354055e67aafb529baeb0bbcc9edf8eda40b28ab8f0bc0b7b2774f203ebbd63d4b3e597c69530fae4f774e93144183fdd51325606fc2cd3ed776d6a19a01168af6712dfdc6355280d02b763edc2ab9126e0b0532fdd8c36b65e042b812139f8e1ea8ad578f5c257a6eea79da36346d8bd93d20d1aa2a2e5d583d237f7ce876d3e0f532ede30665adef6b801fb6370bfd4d497722f3f36cabb338f4cce18d3ec08ec8daea027ba9af0dd220db01556400c65fc7a74efaa5d3f4613de8f6841ea8991aec562556fee2a95e3f93aedd6bcf8f4a37acfe6d1bf1bdb7007a65f3564c82d70c06dd7266f8f4629effc36ce5a8acf4d9c77fbc6d42701b025f4df4085917a37b3504f1820f2707666d2ab1bd7b0def3b3a58d2e9d97ed8878d2ff0859d05445d5a18323cbf61392f9c6abeaf1d636f9390d32537db32b866e791f714876de25ba9ba5ba2f3750d7d63d6ea01da4799ae930e2e31cbb76284dbc29de49cb769f2bc684d85daacedba65a8133f90b693a96ec16a5054bb27669d5d8d3493c59467a010964694f05f8e107b4d23105d8778a4325db8428c21d3448cb7e14b8d89ec4cd64c0140d23e00c97531bf3796d65e76ab7dfec490d5903d2bd6f23ad2a9a098b7bfd004f4ba6ee22e1364d3d67c413a98ab5bf6ce0210382e98e5e991a2d9fdf38eb9dfb201af988aa3ab675662629b591409d60f90d9ac798ca3b7e727abbce11d37e130691ac675551705d2636365b42cb65046341600f255cb452a993c0873d6ed6f1972a352f23b69e7598b8d6e2e8cb2a9f1347e9933cfc56076599d7f246fc4fca80d40c0fcc900a75684e2a5a9c40d13bc812a511ad8f47deda89e239b6c0097e925f0f928c3ed6692b615f7fb6a43b1d2e2ef46cac4daf0b95178333c765d3696c20992df30a3de6a6a35fb0c20a9b4d8e6677e35bf3315be915375755f07ec93eed5adff602c546d96cb2453c318729461b06c3492fa2922ca86ddaa361027a6c76a1b20e6674ef1bf000000ffff8c9dcd8a66b976445fa5a97983b4a5ad9f7e15e3c97537e61a7c3df1c060fcee66e99c34ce082599a386a2ba2aebfbce91f64fc48a4fff6018e2a612c078944af8c9319894e899bef6d8e1898f6ba48925554afc5a7aabf2be89575e462bd9938865cd299d6b7bba14329269aa65e2d83adb303d4c901f98359b98e656bffd649ed118e31a8362e646f0e853a8035f34837e465c42e9b91af367724984583346ed2e4baa6e19e332cbadbd73399cf9d4c88e2bb39352938840a3228675cae3d9b4d9b017ba90c7ddb3ce31c30f19876a8a400aa6727152bab649d4306ababe7f22c5dfdb474ebcaf76fb3324a3c5b03d192b15db53c5689f9bd8a79ba1b30c4f9320b3c3dda9cb229dea86c2e190294be23c436f1474f69d25cc1e5b366e00d80a781879b25ff5dc242bc5718fd098cab60f5e6144efd476ad54ab178f348607c38974df3826b9c9e6f28555659fe3edffb761c87377f513afe3338693a062756fcf542cd6286d5b941b3795ae615b5b4cdab4002021606ee775234dd4d31015830dafe638b9225ae18b46fd1168cf6107a773bd3f8e536c51beac4171699238803daae0ab65ce34a9de84c0614d8232339f6e2cf2026ef6c2e21978e27fd251cdd51c8250d7d52f66a5799e832ccd165e085a0c6ac5f8cafcc3c89ab6285ffa71454ccf2daa3bb4f07779eacb0b60aaa589087964145601ec698a40e6e8ab74bbfd66962193263aedaed6f20b38feb49ff45a5b2d096d19b40fb3445c48dd27c15cf71fc1c4a29a5482a4bdf438ca4a4350ace2b96a515a62c633111380271fb819fff9a3e14b23ea6d3e72d345329d0d3fdaeb34b1523d79556d7da347fb0af1c3ba2a3cce8dcee1768bec32d56b5bf6cc662f7985ae562f51472d4d09d11a2b6193ad32bc9e86343814309dc59c8c659b8a41ffa93af7202fbd0eb792c4eeee4a6d84e5d87a2b983218c7bbc52aca46a4a2c55ee1fc818be7824b96f1ad018d2fe0e003935d32a938e19f96c9f945d7ecbdf04730692f4674eb33a7dc2f81e0d92e6e24d77c3aa92ef58b2eb0a2ee36eb768032b179a11b313eba74e388c5e671d46c93db86edb2cd7a7eae55977279c01d640f67e2e4683a5dc2c4446d6f678502e07fbf562ae7eb1d44e21ac247cae1676479a264e5ccdc489bc39f1997a791779adb12982f5c0192b54120e8493c4029a653c6a9c79556b0fb9e2e641bbdda85be6653af3feb794c5c5676071e5005a26f833e3acee49d8ea226309ccdac86516607f23911ec4b2ef71dfe43faded00bf23e21273b3353eea6eb4e987f3d8989ea219312e326de7c1f801ebb3acd73760b4aababed393c98752e53326e7838b68f8b4db2b8cdf5c004d8ae859cb1f46c85d1735a9553f0a5852f7c6e2e9cf3bd84690e6eb8836be44c441f91260fbb2a1f2fb8ffc7bfd5aa4a2c88bc19d636f114ed5e4df24b48a64c3751994e5dc645b449dfa3d5f29cdb44f0896dc1ac90185895ced5da4605af3fd546abae2d2dabbcaa89939ce5db67c18c32eaa51b6c487b96aba11973d8583d0bd0287df26f56c0398f0fd7500cc34c922ad6793c1a2beda2e9786515c5a122c757168c3e5a31fba09435d11e6555513317182864fcfb272e243e11f6656145fc6797e7f32640ec7481590da42f66abdbf5448a1a38718e6956c4befaf49672ad2ca1120d9699e66f2242677ae04e6fe4756acd526798d72de0f03ae0b795b50004ca4cebf0f54da64160b68e946217dd0a9ce8e474fedc21002810eb3aba24439ad01fdd7176ea473d972f92596fa7de6c1c54355d9bbc91ae840688a5c6b31064e28b198372a545b925a53c93c29d86a579e1a769b26b64bf3ff315f6130664a391358fe84a98ac97582c96a427585a978f142d0a5009880faef80244e4bc1b461be677e491578dfd7d9e8c3454f4aaad9ca046398fce10d3281206f67b8c3a71b1c85fcdce2bf17198a5907c1e3d394c9bfb65dc9961799e0f65e0c15681f6058cecb2ef778e076edc86dbc4e568883980ace29b99890fd7c8c2cc087c06ac26a16774c03ef47b62e33bc78e6e84fb2fa0910bbfb5718cd9df2aaf8201e39ee1ba3b70d6e18b2b6c815b0f3ec6353a9b110ef2db769334a1f83182c26437c412c7dc4f6d4013b3911da779a95631cda206f0fbacdb6d83cfa75d099cb4b6f2324bac397658ec9e25253e7fe8cae6ec317ed5aec42bef0e2fe0b496a46d32ef6c249df8dab5516cd4f461ce9e15cdd4111515b2269e62b6b1ed75ec989e657b04bcddcdfd0a7379ac25ac7a2ffef71322617f7095c8bab75d3beb2aefceebb6b3d790b50fc10712d4fec906fc809ee74f38a583cfd656559525b2172c7b45b71ab1cd5d87e1f9ae1b8789566b796708d6ddb4c94ce7d4d740d8b5a93f6ff087589da58b94a3d76d2695602f7ec25cacf2012ab37a5a1a55487559594bd5e5569c2c9a6fee71995f77f7578ff65d53c423d00da6b5eb8129581917cbd9bcf756ba900bad168639919d4f9f22e6ce65a4e99916e15b7798c4fd8ada298d997889fa13d3ccb50820d1d25daaad3365d275bbd7967172011c5c069ad55605f095bf936c5cf7de0fa714b1b49973341af58d040edd41950c8a63a3d3108f53bf237a3fa369b03de6026fe0174c47b381f658a79bbb8cb0841c918fddacad8f0776a4aac5dbe869c38e58039199bdd71ded998de76e54f79b5afcf640302aa8ab36f730f9103d8e914347e874f4c3a8271d28f03283dbeee66fbb135a670e0ab069bcc3f03d42463d6c1d4337507cd8be6db6585aa944dbd4255a2f1346e4e9cb5702073b4b82557e42d1baed792a133de5869e70eed4e44cb809d4d7da0f76e0c63a5639c7954d66905d8cf489e60585e67c93778cd13c6493de7bc572c792e6093ff7f4859b328e87a77d43a3bbd60e5fdf10004f6ab3f9e575b17f1747d4406d53b5524942552c395d623aafc2e92b90fd05a9c4b6c97ec1e3b0d5f27d0b9918c95862d8c7d28b7e827043b715bcee92f8ea9de1309cfbe25abf4d20ea8e3459c371c6d6ae7103b720472cda45511d9e25f96221f7508c32ca1f69871974373ff779e12daba0f6b18b52259fd5928f027355a717d56c756884f9eead6c1be42d8a700fb97ab2a0d5a8c91b33cc4677e439a6446bcd566c750fc368719cdb998364d916367c529fe9695f67a6dee4c95f70d26e777f6cce31d59ac48ab8702a79331c00d7a869943d69188ea7efadc3a617a4beee483b46f6886af7e76d481deda0805484dacaf47847cc7d3eb4f5ffffeeb445de7d26333f79366b0c82526c2f82aaf2c6c55adb0483b19741d33a5a1973c73c1972c623409c6b253c799a6a0665dd314c36b659bbb5ef9454af40bc8fd2dbfb8bff7cfefb3fcfeff9eff7177ffdc7dffeedaf7ff9cf5f7ffcf6ebaf7fffdb5f7ffef9f77ffcebaf8f3fe6d7dffff1e75ffff5eb8fdffeef07fb7fbfe98fdffe4927df9451764db692a31b439325bcf7d881acd4debb96cb368a89bdc6283ca8376214771e126f933e625b8cb40d12dbd8b59aeb19f5876976ce1ec734808bb05783141eb6a663d2663d0fa58903b3f4a2fb985a6b9d2ef6987bc888aaef3abdfa24f77a1663351d5d9b0e0f093151555ca375f4656781af6f1dd55c5585b9d807f56299b9c37741357b55bf441d3bfdec219a333d4c7b4ebbab3b584dfb0ad799e174d3b40defb3f1cfb257356d0175941b8063b85e71182d90cf99699ead4baa59d11b240fdb2a0051665b7bd347a51293381657d85c1f6769d38126062abf01305e1637f1ae38583e2b846ad72d2ed39632dcc036bb191f4f63b9ec9ce83babd1a4b0f00127b620b2388826b91e1a3a19353966325830c86bf6559bf550b30de3a30da0131a70da578cbd6cb882616ce819f16e78b49e0633ae0cc3d5eb05e88f266636cf012bb0f70d79947ed8b279ac6660e2268bdcbecddf635850414c05315d0fae8a75540d726d2071d06e8fdcd50a0fce4dc3d503a7fb86f1a1f35362fef262f5e75b57eaeb9c1c9f1e8b4959a5efe4b34ed13921adbf553f41c8dcb66e63b75ad6657a28f3d3161314d005c3b89d2fd498755af1c668db72f22046d4627a7e725b35b1bc9024331c9893ea6d431d562da5a795b325914de34854ba46779ed385ff748bdda4c665d43e0c44375af3914ae4a602365b3cf2a066748b5cce4060d25775fe0739d8c41331f8bed4a228f7da073cbe6e2b8b21252871ba65b6b2a6427f19e09b1191f97378c036c14be1c47dc88ace195d64d7d866b4bad77400c46a26dee89c3add839e5271502d26f7b0aaee4858d77fec71e7a810e0fa129c2a48ad10edc98e775b350c83f0095c7317715d5dd3e172f4d6d35af6398bb92edbb0cb8f496151245dc1ebf35927fa41b6d8eeb1c2c8af7f5532fe77d40fedfd32e5f8fa9cb0fe9000906ce8ac390e11524706b8bc14b2702f4c4e6c62e8f42fb83b6da24819969a2e93ab163310117c3f0c3c5f817da6ef9c06d1d8b6c0deab9666db8eac6e23dfbbed35cc11b4a80e4d25797d89f4a27f05bcf81e9b6e9b99efb70b2db4879ea524d416a3516f2bf93b22471398cfbd6b37f058c0a4d388c9384373299fa81c9aa553d431e6377dc08bd18a3e1c49dcd8c6165de886c727742af134cd641fe610aaf37835f4ce9e611adb9a6b976e43b7dd660b8f850048ac351278dbea935bfc4c26169c704d14edd076eeadbbd4dae6fc1c54f6f4279cb6e672387006930666ebe61243824fdfa06dcbd068133484dd825f98ba665797f3114f779b4d94c3531f3eb8da6be9d0e4e0d89b29f8d00a28c40b1e13a03a25222d92d57450bd0bdb6fd59471c55b3bb7e9be349c77f64bd66c43b1e2f27e18156b4fcf633c2c4a7dbc5b519c8857c61f3288cc9816a57b89b02091ba98857cad704bd9463ea5d3c78d0950176a0bd696f93682c98a9c4d56cfbc1d1efe4a6b4320ed16e5b6638b37501f0b519c797af22f644a1a37b437ee7a7dbc27827fe56c84d8399ef27164599694d30f5dcdec86a3de5501f22e9300fe3944f6b9fca790bddfc132ee59258371556bfee85c6d69d7d98fcfdde69cbbac65ed743d4c3edb2ded655fc03ad19d5612e6a1459ad690eda906dee1fbda5e26ec5a2f37efc4ed2ccfe6dcc90c4c35c96789b05d1c03ba7a190ca9b5ad69849d418c25a654a05b7681b10b2ac6b061f3b5adb76ab5299295ef75c63653cf06946a3ca739b6c30d2012361d4a8488a79e054d71de00b0dfcfe2d017e4f0190cfd7e0b71746dfa95f7845a6dc82388502e50ed0cb9b4d3dfb1a1dee8233649e3b25fc5d8a82d2a3364c56ac571c86a87b8105e2e4bb35fe9c9cb0436f850f9522fb2dc9fb6b3afa39d42c8fe80d9db728c4e4d1bd025337f8dcae4a6312a188afbb2d2614001936f5be71b558d51c07ec337d89d28d78bc135b7a51a70a2ebf22a4fc699491eb5107d5ea49c3a7c8e3358b270c2d672684231a2f63439ccb332d085d8a2f3f59d055d7253987faddd663a1d3a928d2d375347630eb4b66f4cc19eb7a427fcc8fe112e13d4f4e2693d0d3673ad3e29c7e9a3bf97f8187be1fa197b86c9560b722c23971727aa816dd75a7a4dd8af7af9ee98da0af6b3ae3189f358eee5a4f177f1215b33c12235fe80743516edacf9d2b84decc8abab6e8fb79e9b38685ffc854930980dd762d64ae2fb54f232e7b493b1ee3dcdab0641761ab136d848a85b100fa11b0bf74c8ddd3b0d760ebdfb93eedce2a6c61826f21f19cb2443a05e471ae607ee48f894aa922c5c6d497af250fd2ec4c669fb88ac8c7c75ff3ce674501be4ff3aaa7977d95bda0c93182c37ef5f2bcb3a12429751b017260eed688fdecd4a824eb8a34e8b2a165d5b2e916bbedb0fd78b47dce69a6c801a532bb120de65e97873f46e3e4bc81bf4bb8e3f6be502c31df44486e0cccf38aadf5ff5109c1d95a45c9e3374a497c4a67920049e1c7c0e344d51a44d52791c2cbe7487392ef970a66b14e3b4429f1d556bd41e54014b1733e37354f5b37cddd515501327b9ee604a06a42efd01c8699ee32212204ac0a7063955fd789d73c7519a6a3800e23c7938500c4ebb817bebcb26fa11fcfde60f3989f5ba54a9407dad5eaa6712a7bfbab34ccd49a9478164bb1a26061a38779ca67569ae4bae44bf2c9fcac8a237382cf2d295df7bab564aaf4b42521efbd4f61cf8ca6fddea3698b8238d5a1be7e7baa9e02c3ba5b419c99ccb181275a93d8fe1bd71bfd81477a79adeb67e0fe6dd09e7635e2df6c77da4da0806d0460e40d954b46abd9f479857884af36562a97149755c863b3de5c4b0309fcaa1d89ce35a19ec39bea9ed560c3c343ebba63fd8c863589cd6899b339006c6a0611a8d8974b17ad4e39c06e963c36222de63c8b8e0c880a7d9c4d7d2910facd3969135a117d864f364ce380fbc96bca573666b6ee4326ee0e1821aeeb997f478e783cc53c21f1fea36297fce1c4a75a6514a2de74957b054dcd3aa363bfc07b27d87cf4cf69e7a46efd177b1b51ff4654bf2b96faf0b9000cbc5052ba9525f848a2db552448e68e50d004e4df380c1aab132bcc8c86fab11c8ca52f67ad0667a8a4d9bdc5269c619476dd2fdcceab09f153862ecdc6136ed22d846735f4dc901986118d77aebf7dd61c128a801fa4246680982045b7dff950cc1ea1e9b565542cd70466e297884ddc6e2b3aea2dd4392636d7bb4bdfb254e9c8029e3af7221a7a6e38dd5d30ec6ce2e75789f5a6f083ab4f62d2d8babb7cf0ea1773d0735509a4dd643dd110f04fc6a9d332983ab433a09edb60513c116de42669a2617ebc84ec5611fa1820a893a6da94d502621f3c6164c983d36b19abd0e53405fb7a1f77eb1b2cba9ce3b213a45a1096decd4610113d26e64cb9394b3659d4ab8e7702512a4a7354ce5b517a7a6390174ecf7f63e04aa58a5b0630e0bfaead9daf21fa2cfbd1dbccbfacdbc6558e3e6527f7f72c2da3208e4ca2817227fad536f9f8aabb5da1f915ca0a1c51ce74eda0f7148119eb1796067690902ad1af965f41ec383dcfa6a167ee1d3d2675252b6b17f61ae4ce56d62fccc35dce63977dfed274a2de839e3b315fa410ab37f3199f8c637ad9fe2bcf86a82dda0b7bc79ccb6a6b2194595c548cf57a9ee10cf368a66ec75d42361d3a2b2866281d0632a3c1f0b098070a94300120cb76946672fe4f2a1181e5cd78a5af483517eb7cdc7adfaf71dc323901863192b7a22efb6a2f17425185cbe179a561e7955329269d942450e3b61a9aadc6fee651d6419739bac77c1b357377ee97de95c3936377375bc0c112cce4244c0ad94480a19335133318ce52a839c5b6512d7997dd456535788e47c4d974fb18a1863593e4838ae096f8d85a3b2f7012d22efe640c8adf6304879ae62e4a41e4a31ec0d46be99fc629b911eea7e352310d698e11db775951f61cce625bbce213a27ba5dceb753ef8064c26c77f8eeb69950fc457e8fc806f1d93077800dada2cb0976c4c4fc273f5b29866bd4b064563b7673e1a31e46aecf8b0a2d6a2f4d493423faf220bd8ec3c9d09d33c265bbb3178b466184da8b23d7c1714f0ded00a3b542be04f6f86b549fd2add12e5b82a90cc79a1325a6f6c917ef0923ee185dde835ee72a46296acc5c4c6c3ea31faa910dad9befaec85f53d313a0e95e743c83c86599dc3d66cca1e4854aaa7b33fb21f1cfd6eba2a0d3711c0c5b0717b11132cc041301d85ee37bb179853833550dcc3e72ede695e0283d75fb8672c43755d4a2c64a2ca3da758ae871dadd0bf2b35f92a27b9f5a11f4bdc1a0684bc1aacd07eec9b0d5aa2ddadaa63b24821f675ca2838bca3189230ecdd40c828b94195336212a06f6a7d33129240178dbbe70cc24e3e2f006b5a4a2189b4e3d03ff80a7acfe8ae32bfcc9cafe71216c4b7bc38a6176216231eaa8c6a2a47f31b7e2c294af74e0ac1b6d903c1d9cf275dc10c796d5946c0d4cf7805afc5b01f15b2b108eaa2b83863960fd44fb77025b5db2d54975f6eccb58611f2dc496e569ba9d28d66298575ee828970c8bd59696cd54b76eddc6d7d3bc189b2ce72ce997a5b276e99891bbc2c8182cabeca992e3a52890ab08a7edec637a043435a68de9ae668033165ccee1ba4bd7ea61cfdb44a0eef27981ff18124ad7c7b63762ec742eca9648557a65e53447cc98a5ba9badec6d51f2dc97305c4dbd709bb7f692db30e815196dd5e7bed7dd8b3bead04d5dba6844f26adac26f3fab0e566727ac53f7726f7da1eb177c9945a6a3d7d99acbb99ef2acf5e1f8537e59f516d62b7e28af99cfea775b67567d114802b7b53a3a3b7c9426ce9845dda6600cf8112c1ca54fe3cc055d65d32f6135b2a5b5b3d66dff73fc06b5b64e37c404fa748a408bb5f09c00600d3a7f312bddbd46b899336dbc793060d084cd98beba6208ef36e98e07dd3daff0f76cbd3a59bee8434040ac7c5888efe15b78bf1d9b7ad0922466a5e33459b84ac7deecae15864fb545d307e8d952bfa17c4ead135dcff56c934f9c94b6e2731553dd423c3473fd60bf6d36f105ccd9882237df2fdaed36ccde342a2db35a568e26c6699010228bc769a828e04dd76bd69724e8896dd75ae0313205224a3b1df1e491c29a090599b519dd931ec6b2ea3b0a3c9d7d441f66e5ad230e73deb05f9778c1be86c5c6c6a8b1d38f7a408636bf9fa34363fc81e5211b660e6d98132c890928e7e7bcee977abc3f27583ddfc1dabb5b4c3b95130e63ed4459f8d9e3958388c5eadaaaa18231a68fed3398f67c5ee41237fb0c6637aa1599bea9aec6801d55e5a6887542b72d927e5052fafb7156eac63b61d4b37e3002ec8c280ca50442cde18c3d060c5525a83db7bb7e2ed953fb5372e1a64984af52af8e75abd8f888a64d03ca0fc12b3955bf97dc0035ad9f43af9f2b24766d5efa35fe36c326f28e584a206612e3e4f7933db8fc16e863d867865a01a8746acfb1782b6cde434a89e9f9c2f659a51f62badd378b29d2f8c13c9df94331c83d7e8818a6295d10b43c0db0cca2c72ae087d0679c9754a31a83edab69bda9267bf46e1af2590c3a5b6b21ecd19afac13cd356d240162f8cfa2511341f8cb831746cc70a752f13241253bce5571b74024bc61a6c86b4fe3cd12d2ab9c896c0a253b58f60eeed6b30c5eeb3726ad12e51a4bdd7623dad2d615e750343362340926d59edca2ac65b3aa4be39b4e738e20a1b9c55c620cb53be379c0a43da0094437a68ff644695dab8906fe5974963cfe6ae0a06371e53712ddb0fa3ba99d4f7ba6666e742aea3359ba8fdedf2e2e69a3935ef0d628735cce6e67dca280a7a054e4c803d4a12244456cde899173871529759b26f04b4198384ce6699c373f5be9bc78cb7cf8ddefb77cdda4c82d2cb5a5bc53d27dbb65535a4c660013ebd296bd17d4e34a7631e291a9b2f729922bab40002a72ab61beb2ea7cd135cac3e4632d19b2e21515d398f65e1ca575cd9aec0e1d4cdca6ed3d97206160a00292e60684f04bb6e8619f5596c0f62510b22460b6616bce34e4ae75945c74c601abd69d3957a829fc3842caca6a7a2a47344d7b5bdd7702f076f372751ed06d3532f33c86e1e9f7d8241fd92dd238b5b3cdba4cc76b60fa327ab09c65ec58340518d6c7581e31b744051e7d09d66ff594d9332ca0998b795fe41e7f5627a5a064daa08c065a05e6122164bb1c9f5ce6d326d4631bee2e52e4c79177277b6b1d3d14fd368c42c7815bbdc706a795b695dddf332905c6f9e0c66191613d7309058961a6a1c0ff66d9bd241c36c984698b5bb748c354593821afbf3f071f4f979ed5c6d23b379fe412b1ef5cc78c2afbc8145d0c00d28abab6d1eb36cdda9a3ac6f2b86edb2b0364f7712b46386d27aa78d3092d1a1ea5a9214aed0991efc2215e69b5b352274f63c13c8a9350abee7c52351188937bb9e20ddfa4c1dad92cf4fe8dcab359daca5e5e7d2dbf42b834fc550227ca2a016b6a20ad7989d07d4c175776db608cff405f4029a36be37ae11c134cc79929443e98e50ac3ad5bec24104b74d697a37653bfc9071c982d967fd685f2c0a8ff98de4e2f7ebddf2ca09a39a412016129b614bd5646d162ea9c58f2058e2be5b6bf647f04f1bcb6517d0dd86f596651314abfdcbc0aae8d4c82f606a5f603aea221f49537056a0dfc81f11706c05f8fa1a66195b193847288e492fbf693ddf3822e69a5671243354dddb428f36e6d00323c8ef641d984e88da5292e48865919f257bdf1a54487ce230bcd671ab0b5fff7f010000ffff8c9ddb8a1c471044dff515cbbe0f546565ddf42fc2acd1228c75c35a1b83d1bf9ba86e8195a7dab34f0621afa499eeba64449c58892cefe830118c6cd30bb2e7398aa1e72c2d2bc5e330df92371f86ee8bde7c84af57d9e3d42258909a60aeab4c95e996aa3285f815eaac11776f9d257ba4fec33ebd858cee8253c71da5e9d01a0563d1cd12b45d978ee238beb4416f6c2aab72b5dc5b5aafc9004a0ea7a8d72a5d599169bed097957e85c54de0b0e8a2cd535e6264ba7bcd8ea8ef1654ba957bb34848161d280aeb0352b7f3e5ca29cba75d43f1565015ac63476d913b214343a915605a6f82db1040177d06a719aac90b6caf5b6264e2cca8ee71991b71ec74e91630e81394791a1b84d8c521797941623fd71052df293f29ae155ffefdad44f380d9234924a9aa74b2b418d9f1ae5712327b2da3424a345f4a5effff24dd31b8d01c1991a8d63204026dd4d5f9e5f4993150dc2d150274372593f09ecd36900600bbf27c24f3ca8b60652eb2054518acd4221451c9c8d741e35b61681bac711d95754bb9ca41cc4e9396ad35b494a9ae8db7a37811bb5d7e6c885b5ebdf142a63a4e5d425c5718c95215d77c42b53b40ee9408b3d900535b53fe89e2472d0278ccf31a0e45f574c8b18cb3a3e44463b96af16862926d3f17987847ee15466ee566c6003843b16599d7e3ab2ac63682bb5536d8d80ca2eb61b43230b77b1e6a87129bf5de44fd1887d7661d92cd862ea76349c601a43685d599d60c72f7818dafb5935e8d09dbe9b1d0f3c16aeaa4b49cf147d462ac068deea4f3ced0bdc6716711cc30568eca905132da60b457cd7c8f9c77d6530fef164f6722734592f1143d3f0e56b788e62d6d36775dffc34546945707ce4f0388ca0dc6ac45f2d30eff9ac5822418260b148632db92e47e296490e799f86d45dcd979bd92c31619a1eda04f103974f7c99768252e97d2ab0153d046302b468255ed1ce153105c79f638a954c0d5e00556477778b0a44b614533f9416a82c56294823994d75e1c97e45d4e4be397f9b39a7926876db20c50c7c34e2c58b552086d9fca95c1b8363abb1292764d507298263c9f257d8cb1387be49e09937385270131c7f27519d15353619bb1d04bd587863ebde52acc3dba2ab4e1f4897ff168ea63eb772651b7abf6029bae7535866fa2547ab27c4b2a1128276f0ff2bf2a0e89a045a54f7342755fa4e9de2e87f9f80117f4a4bd9e4a7df11023c6c45f5f15bb954307b9217cb2186948ea057ebbb41a1179024db61e95d32eeb1c52713b4ab43abb1a4a1536e7d0c31c350d4841a9a9f1209cd62b8e853a8d82f3549628c4c3e6aa70e23454d3c828eea7ea137db2a9f422281006872a6a8b672c751fe428590863658c67ea7b81a15a87f316fd2f0c0f9d6ab0d08c98bca8350a74148467ae00de527d9ba58cf6b7617960c81b23033fecb54d36c8305051c316f6b0622ec40debc41d761bcd7a138d4849f08c1953ea69cc387e4eb58bc785354a668cc93b91d2dcc85e48808f9bdb0516698bea601ef507a46721e15f71a5d27d6803724ccd1956599feecc81fe53741ea31cda6bc7aeaf5eb109248d4428154545676104361d37f9b1823471591ee6b8e81dd60d94d8a96b15f345358f7a5ced15f464e448358b16140eaf5e11256b0b2442e088c04ab85e6fc04869ae4eef4da363438c5a892b68d262639419cde672750337a85908c693827ec1e6b607c9ec20d92eb631f1af32397738d7f60285788ff16252cc604910b3268d34197e918913dc74f56c6524654777d638b7816b94daee1ba144a58a90e1ed4e56f6ec5df19f33a1fb1aa1637ff792e1f251a90d6cb7e68a86c7a56b0b1adf0680707e3fab89c19fcb53120336100daea24ae122258dd7f8526c0a658dd1649d2603239653b9eeeaab8e278a64ce3c230c6556d938c352947b931f3a7e071a72e34552ca2f47537951772526e54548bc38e35aea8917d8910eab3be4d62a1134f601c6d691db0eb473dd72a57ed9cc3ec456d569d621cc0ad90ea2817c191e8e18ae210cf80bd98ac2d871d4075acc31aa50af79d426e4129e71f27cc8de98fea9a90cd7a0b65a6711a1d46126dfd166aec8509a4f2716c2ac9a42b4d369661b81575b97b5125fca98e3366a35321da20c77a22e0cf8205b2757fc45bdf512477ec9652bed5ca14aac6015675d219f1a4f4cc68730a95aca6992bcc8216b0e174f9e241e9f627a6db17d64072c12ae75d466f74c93572ee27da4a794240b22e2d9baaec5d6aeada1742b50ac501981b3fb66a9cd4c79d99d13aeab4587fc4e3a96344f8f9fb66aa90b1d9b635171e2bebc0a8be20ae332fc97e8c2744a812d4bf725bf6139d5221a2446516efb27f11c1a78298d24d858e8b0a5fd1c11d6663f43efcf57d12689af2225748c792f2ab6e4674d0de52222b720a2d79bf8dbc8f4e4e6b831316872c2905aeb85d7a0da582363cacd2113aeeea88a8bd436ed939ae94df5574dbdcec0e920d4a9598a3678f56fb5ce6c8f1049500e54f181f1ba3c6f93ed144d19bee8678868ac95bb6d3dcebcac4aaf6577d0e277807422ccee8c66f9a264f97d3c9e4e64738c0110c1cef5681aa163e03f6c54962aeee9b04d66d70e78954e0d70c6691f84bd794d31225e8d3ea9538a1079df11d8645f9684cf8dffb4cd050a8c9f7799954def7ad927beb2934e6ab861ce78b45e0df28ee8d7bae5164c554dbb512cf9dc81518ad636b207f520ce8e9faa792258891a928e0972abba303621004ddaa2b94d8fa8c5864e9b231b8b06b554c49b938a5eac3b1adcd5328a4e9a36d4591513ae7da64a8c4ae0195d3263b28427dafbd42d34b0d18ad557a385553f13ccb58d2a765073fab44918c1f49f0595233191c648e515b00c519c3377c45254230e029f4e66586e85d6f08211860acf0be25c9e46ec8ad3c1c204fa8e7f09aba2e28695559d26358e2b8b880a688817e1d4b05cf7e9a863d22a5835a40e8f825e0683af6ed7f963c32b5e86d4ca748a9e554b1b6366f2b5a1a460cbde278f659fed3baf23da7fe3e148cd82f1062aff194c0b900d4f414562b5957b8be0d1fda4400bee8a4db22bdc903d8fca84c32ecea9c4a1e64403c028996e2310d2478976b97da3a8b6b888143789429d1dde7991e66682b945ca463ce5fa482844b4654f88eb70190bce1ef1314e3250167a25d6a52866371d22982c47dd12fa3a6a33ece870c19d9e14a175222a73178a234affe0bcd41efd2fb0bf6fedd9c7f5cb4b4685c99888e92e2267ecfddbb3a1b306030573ba0876dc8ef94e744d575c1c737859cf62d9ae9669481f0add2596c66b7ec863525fa539f79ef7332a348df711a5aa7a0cadeac88ed56801d1c6a62750fd04862f968c316518443988e4b6cd9699f5581562d272c1c05babbc67706c5d1e8438f2b0d55f059ee9cc08342e7570b6584624d9c41da2a31a56201b6f69a2d2eb46b668eed0b5c5583659d4ed45fbfcfa7e3107568cc361625c273b1cb94785813b7b895345e2c38f2f5c1c906468b2d5281ecaebae443209485c1dc45a7c8c97eab50debda35cf5f7cb7fefbfdcdc3c33bfdbec74f5fde3f7f7c7cfbf0f8f2fcf7cbedf9d3afcfefdffff6f9c3ede9fdd32d25bbfd658febf7fdf9ede9c3f3e3db877fd6fffff8f58f2f9fbebefcf2f2e5f7e7cfdf1edf3ed474fca98f2f5f5e9e3efef7d7dfe84ffbfee65f000000ffff030052e428a68d8b0200" ], "rawHeaders": { "access-control-allow-origin": "*", "access-control-expose-headers": "X-Request-ID", "alt-svc": "h3=\":443\"; ma=86400", "cf-cache-status": "DYNAMIC", - "cf-ray": "913c0019e9f57c6b-LAX", + "cf-ray": "913d13277df983f7-LAX", "connection": "close", "content-encoding": "gzip", "content-type": "application/json", - "date": "Tue, 18 Feb 2025 06:36:01 GMT", + "date": "Tue, 18 Feb 2025 09:43:47 GMT", "openai-model": "text-embedding-ada-002-v2", "openai-organization": "anabasis-llc", - "openai-processing-ms": "142", + "openai-processing-ms": "73", "openai-version": "2020-10-01", "server": "cloudflare", - "set-cookie": "_cfuvid=11CygvB1hzKml9umEwdopp3rN2l3.23iE9gLzZisM1Q-1739860561412-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", + "set-cookie": "_cfuvid=QLeXQjWMwezdD3DigO1GSfW_O.Zno5q6n.y4RYP9N.I-1739871827705-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", "strict-transport-security": "max-age=31536000; includeSubDomains; preload", "transfer-encoding": "chunked", - "via": "envoy-router-749cdcf4bd-nkbwf", + "via": "envoy-router-65bc697f7b-cdv6n", "x-content-type-options": "nosniff", - "x-envoy-upstream-service-time": "64", + "x-envoy-upstream-service-time": "37", "x-ratelimit-limit-requests": "10000", "x-ratelimit-limit-tokens": "5000000", "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "4999948", + "x-ratelimit-remaining-tokens": "4999953", "x-ratelimit-reset-requests": "6ms", "x-ratelimit-reset-tokens": "0s", - "x-request-id": "req_8dc47a23f0725c02e021ae8de07924a1" + "x-request-id": "req_bf7743cde36400ada130b0108d7d4607" }, "responseIsBinary": false }, @@ -58,36 +58,36 @@ }, "status": 200, "response": [ - "1f8b08000000000000038c5ccbce63e771dcfb29065a5b41df2f7e95acec48081c24ce225a04f0cb074d520e58c5f13f5e78f18b439ef35dbaababaafbef7ff8f6eda7fffecb7ffcfa6fbffdf4a76f3ffde75fffe7b79ffe787ffbe5cfbffdf9a73f7dfbd73f7cfbf6eddbdf1ffffff6c95fffeb2fbffef2cb5ffff6ef8f8f3ffee35ffff6cbaffffbd39fbec93ffef2ff1ffafd9bee7f3fcbbf886846b8abfdf11f7fbebfda766f57fdf1fdc33e9231f9fed971f5f67effa8a99967fbdb47d554b4d2df3faabb11e9f05b6a1bb11defbf151d5ebd019fcd4d1b1dfc6ca9c504be998e85be3f98a854662bbcae9975b7c1f34ac48886c21b4ba6569bbf7fb3674facc29345ae243c9946c4cce29297665968e2a3754b95bc6f9b4aaeb4e0f3a66485be3f836a875b18ec5ab5ae297d41b8f9d233546e462b6c46e498046cbc78db04bdc4baa46fbfaf9898ced2164f6c0d1d924eb52d780b0d09b5553c50d3510bbba6ea598dcb606aaef8be56e35ad9f0663d1289bfd51e610b075276da67f09455b8b8d1d98b6ecbc0c7359fed695cc92d93c1a32ea9695a56ef7ff689b81b8bb730465a16fe2a95be09c76c77aae1ecc9aeace8e2eaf8d8fcd85e5ac58e1abed98897c055b94bd9b4c17a1773f02c6ccd06fcfb4c71a1b51d9ff0753c0ba52909f1c27d7b06435ee5da2c460bad0eb87ca5a631467125f2be1ac26b4bdbc0a96b95f4a415d47581d0a621650e7154d55bba137730c7303286de1bbc3fbf455ae5fbe9b699d0c49828de35398b4be5b9b386b14ea6d61cd73a7ad673e10d267d05e35f8ba958e2c91697753c183e95b9efe7d52363f0b045de01c26dcdba7b0b074b72443d20faf9aa8be02db80d9c12c1a72d735f83ad890cf7155c30ed5257294c66de519806d4376b1377a23bd2129fcddb547123ba7332e1807878aa156efcfae8063e427947f4500886c3f8fc86c8b5187cb047c4c66f903409a3d0ae3e5310a6ca2ab5851084a6560505e1aa56bc916ded85a9f336c3c68b825d474beffb16598b0dad4e5a85e21e73ac786205931e0605953e943a35dd82036ba90f5e581311695c5f89c95233b8f09a360901bf3cca0b32fab806e52c3f60024b6bd9ab89d146caddf002de99eb35ccdc327df00123b3642ce63691dbdc01f861ddb92e10dcb6b7dd0380ca81e4c1ccd055e346e162dbd310ae3d02e4d28d1497195857f14640e236cebf249b7dd721215e46486960ccbe57c093e1565b1445f34e1c1e395b4d697cd8deb2c6addd3b070401634bd321bb85892d5e67b1301577cccfa1ee029b50723903915a6da9527a8e2a99a297edd1c205d7f116f7e10c2f3e86516243e91d4a35a429dcc6e57e436819d5de78f355a213f39e5bb452f49a51439866961198f92d726b12728e1e1e483a1d7601b80d1741ee050cd7c624576530068fd83b887d1cf1abc010295ce4702c030fc9bbe2cdeb8b1481d5a5dc010d8738f59d183eb6561974f4bd2b03225d4f0a5e3eedb4168560ff2989b8694ee11b8ccde0ca5a4dbc95a68f4f7a5e44c2c4afbbdb49a5c4de31488c2893c6183c53c360b5bd7d038beb2ba7f02bef640981946c1fd9f735adbaa88e597c631542947acadb82be305299c0dbdb7d32dfff755c86c140d4aad6f8e3b2ee8629cac6ccd5e19c6af5eed2313391497ca6eceea4943ee341d7d5eb0a7a2598ea16517826c63db3e14ccfaa0ae53e69c58d124f93a9a008bd918545ab983f6a7a7c3329292a611e94c92eb249395b4b08efe29003da96dd5e03b8a41297d68a21a2d2965fc9a9184aa53b2208fc5ee210c15be857648b60e8d68ac34c451f6ed778ff6b5aaa74d3e2d45629d6ff16e61fd8a4a95e6daaa7f200033cb15ddde7fb43a82f33c6a301a01d10482288641412abb6e52eed835c3d9d51b86bad077ff1c5742e8750996f5150e51e6819c372e16eea36ffd56a53e01d2caf72c4e23b5bb9e289305f22925a73a3bf4eec6aad2e853cdf914ef04ce25a771010a176766141aea1e1ba544549aa4922b9745fd298fe6e05ec8dca7a909292819849b3350b30ae5a7936110de211ed5443c966504e4d711d0d4a1f69817b503646e7451f0813dfc07defd0c131b65d1da4132f81604cac52cc7d62ed2b9ec9f861f50d8d3ef6206e6921ccc5581a7e81c7d86a50385197847b68263e4d41f5b6a5b28986d6d8096239732a31a4ed7a232f946ee2f05abe73143b540e7a74a611f97bf43e46c3dca844ac30161e840a52b61617cbc2359bbea0cb134b32b5f5f95015dab4a14411ddda84005da30b1fb5957500ad6a57c4c7aeb6d2884d24e64a4d20862cecb20d04c89c135fa0dadd39889ec4480bd33fbba93a4c771d7059a2bb0e211111fb21bed2c23c4e716f77429e3bc663a4696beb141dbc31696b86694ef724163c9a1675b43896a51a552170653247e86a5476afd03dd2711ba4ec2ec4ce306d5396212401ec94419e7b7cf19a02c9fb88073e81a569959953e43b2ec090791ccb9ee567704181c57c52890da180fa58c6d243e444d47a5561aeb34ab320685119ae18117cb37748dcf3ae36941727d41439ce57155ac40e4a276a181a1947b7517d2e547fd8c9028108f8719a171671bcbb8308066f5d2ae4edc827bc24a7d92077ab79f88cb25a9f5c884a9b4f8ca70f16e23347a1e17ba54e3b463adf753a5f9feb10b1cbe2d3b039a9baa4fc4a1d71fb03649fa69a271d8363c063b136299d4461524253101f6acc2568f8f7e126a5c4089df29ca4d3dde15822cba6bd0cb380544566389d245f33a495aa32938270665fe586f26c0ced6ef61d3b5201a03a7f9e83a8fb35240dc26630b44bceb0f6a71e9582446e56a5204f7eaac050bcbe5aae6c051281d4c987eb0c728e965944239253cd98ac9375ee8314d282cf71482f924045ed2897e6aec7765341b7a7dd16e469735d38e69f83f34980a548fab99cec8bfbae5982e4ef81704d47b0a75a1183d509bfeeb30ee875e246e6fd88fc2e35a54cff00d9a39a515154e2a9668f3019783c1e1a24c2cf4d81b5f6b1361f6ae20b423a6100efa7dd07e17d14691e7a7e07e58370da39fcfb5bd9a05a46aabc0b2eb5d49cfb8542aed583a0a06ba9be7823324a12210823becfce84a73830d1181c0fc02890817ad24413c9740100cfd1a7b072e045c63ed0a61773e91cc8962b962d2956b2a0da68a8c3f34b7a2d21073dc439c0e3d861894c74ef5c39d790726ebb57624822de996ee44a50ce7f625ed54c342f9c90534b1cabbb911626171591a4cd556fe434425cde77eb59a4da1891359e47950f52af7e7aa27f50f9361833bbe5807fc37a4f6121dc1f134117b4d7dab8c809eb00aec0eafc1ffefe5b998f9a0caaf7e3ab3a50eed86da122ab2e7091c3e718242341afb47d885a3a417105c3778deca0c4ad92e3d5183f551f2600b29b9c470deee2d9bd94c9a50f260aed8d2912c3574f7cc29a507b06bc0ae2971416e3377deb4711e519bc6702952f3947558e7d2981fcfc3d65a07210584b78850ee3fd7717c99392ad07098255441c5d8021ee24cd362c906436ca0c41b4d6dd9ba5aff864ba93aedd22d02e55579d139208d5316486e7914bfb8be2fe01facb02419296cfa4a3bd24c769cb58387b5d9c3ec995d4e1312552565d26d3086455b641b0bf105ce3884d6724ab91b6f0c38a8b4e1413df0b623f50c11e578ac59fe68e10c8eb7c847b3ca0176c8949c899252158c367e992caf40ca99a779f17c5fcb12da27d8ea20349c5acad63c90e71f629a24774924d8027b2210a69371bf24ed9a974824a2bf10a4f5abd63e1109fb8118a5985dd274f5d181dbf4fdec8ee15b092ca3370218c88cba31c90a66531b5bb7a34792633f76a08c8ade9e5c83594c6f95cf1cec8fa3af1e21a57e6a2d1ab228999d74c8f45452b4e4a41b7a454168add9a678c5bdcad2bfbf0b64c9644a13a330d1e50cbf449ba009b32c4d49bf6f12ab85227459101f3b8a2c28268af76c225f9948f54ac23c865a453925db47c16440710ea7f6cb4f5e0ada4a8ff44bcd6d95f31b4af83ea96c890b8d4c3ed4d4a8770b83cfb22bb7b27f5441cfaeb08922ce76b635aed0e90da2e5affd6b60b8b86ce4c453a36c2630255a473433b1299796664ba977bb604ca84c7672029a5bb5a0151dccbfb8301e1c9eba191f9427e2f4511bf8682a022ed1e975d143d4bf8252bf58361e1a3dd5de7da0c5816f63ac444a2cff92d831a1dc49023d1eab3c0931de1827952c51ec78ce30169cd2c1242fa0c09cc4b4d5c4684287fa40e10407ef12da92cf6082073cfc732415ec4e99d22d52b363a06ee881f9fbce827b7936c1281a8e5d94e48a8ed3b78e89db0ccaa22db41f787f2497c727491676e3f004084b02dba84e5cc5ac145558d948b12077f8e422895aee02fdffc8a677ade133773c07c9f6ded1ed9e46493e9ac180814b711e7d7a6561e50da9e09b093ad31aab7ba08f72e2d924378f6a12c12415115c469b9e716c6bac9bd8a35e928dc69c4b2ec3c34466ea7714ba77e8ced09500b7d3d834480930bbc518a393641888fe5baea7194d68ffd42e7c55af017e8da2079e32e5346b7fc33277d9467a398737f3ba734fa3af7241284e8bb160826b33483ba1e2e95a6e19d9635294be5ae968ca2c74d29474e256c7d85562ceeee057dab24e199aeab3e8c4abbee73f37378dfba4e1c0c01a7b22f01a84325498f415cc5f3f4cfdca182053e760a917db86a74b3ca618a46d053f483fabfe2445aa5dafdc1a4a1dbaba2838c19aeb96496d4eaf3712e45d72b5dc999ee19d68036fc215e102b91713c2b4163996bd900a6f984db58c651e7bac8af8cf48f6fb82a97eac38b79c484d5a9d5e8bcdda0f2941aa91ef7c98f7aa69d91433568b999f3b6d01266cc14c238c99a5951bc9352edae58a15d730c9d8eeb1b2b19c225edc9f5e4d9bdc91326e58a2d8ee71233f2cbc70e138c54b8becc815e8525a284cff4901ab4076ab0f43879316c49efefcd6cf94a707b1d841348a8efb17b74a9f8f450712519e0a44faa8a88b27fdae8bcdad1876d67de9921b636ad0a0bd8138aaca908f4f19e42577264397b248e03208920ac4a9b5c603546eec9efb8b0f3dc32540655c507ada9b7ae7d0811cf65765cdeaabe0641fa3117c02bdf29844f7dbd7382fe13716acfb946e7f5c29c78598ad45bfa82efc96dcc0cbfba582e15cd574d9e2fd2db147d9a76a7912a36dbbe180c6c549fef915a6e2cbdd9cbe173462aba0e17432abe72347ebf61575c4fa7206492b669c896f65cd1869e057b14daf6cf7db117efe3baeeb0f67f900c482f9f8d989a8634fa3c2654ae9d8443f0f218457ca6ae5901e47f5dea1f6afc6bb37563436789a145ff000605cb2b269451eff946de7a475f5d1d3341a2d2f52d3521e4be02883c8693c76eb347db472b30a675a822ffe115e28e765b3d632eeb935311446fdb7a6721bbed6661ec5a9e6b1342ffe479a64fa8c6959c51aaf1a56abae0cd8ef75f34b4b9edf968f12899c52d3104d0cf020cf3353fbf48372e4cf49de17ffa9dd42c3021472b5962a26532d87fa3e19eff9c597d1122da454cfc9170cd48ed6425f698ec650bb2fc3e9a0b08c65ec74293fe7f09a00b0beca39ca9bc4e3d2308f29b57c7d22defb31151ebe87526b0a6bdd78720f123204eed0cc2e85d978ea4b91c9a73d016b72cb3833d10e78d0280afea67262378ae55467954374f3f2063c179fa647e8475934a1d2dd295382e7f36b8769ea30e731337b498cce378e0ef8c9d0b02535b9d9305bff343e576830fbc88e3e85d64de2f4c1e40c0311f2092bf7a97a251acbb7e22a7be2d3f2e941a826e9c41a26ffb63ef50a82ca162adbc6880546aec4af0fa5f578490ed48960eb65df35f112f779d3bd1aca37654163b71e6466c90e3e4dac6b96c880b3514f95ce2246480af9fcc83767245803542fad691d49e3e43b77393680a46efbcc92e4aab73eda14366989a73700ec2c4870b8dda20af31b9beb2adbcbc5a47b3905d61338496f1c098a2e422e575efdb5f552d2f7ae1315a80fa413b2df09b73ab6211199347f8d9073d0780f40bcbe8abc5f0b42b4a2ee8ac7c5a4f669702d235b4125efe9c09ef341cbd86e807fa975e887d82fca9a771592d61551839f31d76e163378666b536a964e4617f52a16725a1e1369b6d1134a7c35da9735f33240aba5fecc87374043d591fa2dab3457810852d59f6fc180bf2d59f9c5ae2485e7fb28848f6515a54edcfc9aa0805a86be0e5833bef3592087a5d0b84d84fe51ae92f7a379e207cae8feb075a8a2d669414fc0f3ec01b3e12931faac65eba5cf715c1b4e6295f2880cba8a993d956b7752ba9743de62cb9d5331e3e15ba4bb1893149cf81f5e6597b61945c4b14f225ae93369d3dbf75b10605fe986c2e88e214daf98a53fa271ab7bcb7273ddf4dad0605523b4f23719e7e023fce553bbaa229a25c3f628853653e2e51741ecedf8ca383ce8b859ca3f4f993c98f200f4360fd887d3b6e159447bb7cf0c87d472afbdc5baa377a2485db4537961ac84347697175649612eab94dae3183b6c7dee5ebd7af7d9adb75661169f499dd117107306f371bcac8eb9d7e7d244c867cea2bd31b99847e3259de9ecf0287ae6f79e37db034c15689ab9ca2cbf802ae4ca3ed68d6846c00756d98b411560f8b096ebb9e811ad6ab46bb68d723ed70320272e633ecc6e024b6757c4409ec3a7a566fc33b702dc638eae47a1b89923bbf038f17bb150c6cb3f8e811be1150e4f6df8b284ac4ec653d2c6963231505ea3e7f0b2bf21ff999139c4a3f6422553c811728374843b1bdb485a5bd6bd6a0f38f0601fd3ede47d0d17d04b92925e3d41ab48fc7d839548893dc1d96edae411a6d37297e13cdd0b4625234d5f2005d1174fae4d9fde8b4b03811198bdcb32338271a986ff68c38fab842f0a8f700854d278f922ec8b55ceb551f0626823cfe1a2ab38d2127e77d12d4ef4d278a6b75d1b888f87b44cd68bcb03abec393d774f21e2269a49c0d678fbc76b6fe81a9477e7266b3f1f8c2d01069bf79e3900080e2a48ee7d95077746e235bfc9cfaa4ada4399c11e9ddaaf67cad7b54ea59f9d4fc645e6a4842eb592c8a9c13a4f27c973bd58b458ec22559965fc3386b0351f535c6deee40d4b7da08a2416c7369c6d4c7a97c64a27d9a6d2e440f4e1b6a5586ea248a7f77aacf271ec762839abf2e37199250b93a4237e6146e6aadd3db6ec3690d1eaa47fd9235e931418da068344d9c089f12c2c2123784607f6c006cd4b92697fce193cbed489f06ec695e0b0329f55da33c80ec687127cfd4c5e4f2591cbbab172871ec277a089ea0f1faf3a84b67efee52efcfd164d8edf6f027a2d69e67d95da2ebcf276fdc09f26144e02525e123e2a147b3d1e8d3296be5c11179fdaad88c61470db3a34c256ed62b1aa5cf534d7d649f8b6dd6ec5f6ae6753890c9a9c9572fb7104174d48dc14dea7fe661c72f5ab0956447b30e9adf70425c3969fe710df64a435b326fbe191e9d4be714b3c3d50ae7a89ad636598668f2cef3bae916f51270d3d4cf1f678bbe74f583c5940c21643e47e96ebc91859fbdfcaf911d563c8aea7845b5afdafe9f2f769ea5229c71e3cc68c0485ce718aabf9676832428325cdb2ec6c2993ba6c852dd2c1aa230cbf3fa53495c3b8f2552c45cacfffc6affb0a2afb09bcc978141eb1e579df48acfaaa86df0f097bc91563ce9f3526de034c66049f4cc312e1c79cd0e1fe3f589ce13a8b093d2caf9388857d1b8841bddd84eb27fec0decb1fe012d46aee987a7c55cf5c96ec2d8449fd3b1c64b0df937402c703edc8d34a0d9825af36e14fbee6488f35d91fd84bb9f5f03830e6ddc69fc3f000000ffff8c9ddd6a5c471084eff51462ef05d3dd333ddd7a171314b49810cb32f1260482df3dd439476075cd7a756530fe937c764e4f75d5574558c0d35bf3458bc803e3378ff3039f53d29e30075558304e2ae831b786b6c32d030b9d50fe19eb0dce4caa0ff21161d95a8e1543c4bf3283088f78f8fa26f6c5ac97145edb1237b3cf264057918375c5add24072a4334b7183e4d5c10031a76174dc6ddc47fa3c63b54c76e86ea6c31bd34fe6648393265857f55f613874d329f2e70386a8c181614489ab028686879acc45d0a24af320b70623f928d8b23f78d870125c71e2e1a599252ce18afe081b722682d71559039754dd9aa0cca2ca2cf078e6cc0f9dd8693992c2a3b0b0f7ca2a94edd9a5e7066a6ef5a4056628632e45b7d6e871dc0e26b9418058463c0eba59ce468937ce071e97c6304a5d7a8c498fad25444c72e60398c53cdc5002c123e8421f32b8d4ad931e6109a06095b51c5b6e9a652506252c5d6654016e53899cd6ad8820d70d9788da24bb0bd615b8e4539009625b8d9713bcf7988a125a0905ac245349c7c5324a28e288abd564986b4be5949dc530fadce31204c5a876bbd405c075b8cd0c73065b011ed09d2cce829c5a35e15554f0e17b72cdba0c1258df835d3f019c59d255b94b54d332d1ffdf88f1d88b515c186c05fa63d76482e50e6fb96e1424d2949317480c540c2327730eab58d62301a28052d90b821035605e7d20bbfb8d39011891bcd178bd32be2e93f0ecaedc29bc51d9afb81bb4ba800590af67ddb2ccd890aee40317559f0b72eb14293ac5923cd77161107a8f5b409b1406338ff71d49bbc95d856714d1d9bdd7b70ac029efb9fadbb48d10487d8118c6723aea5750f7d17140d4c034126b52dfcba13625094faaf4ac4402505e65841164868639c9997d3f3672152942600ad6f62054b8740a856c31fc24c973386400da36b3ba7800d31095f890774410a18299b4a4ad1206795a3fd4dbfa758bbfcdae1c7a2d368fa32ac3b4daffd6e8daa565557d78a7d836c45c65696e7649da41ed4323391c429b9585e1505723460cac37ccf7b8c28c9489d72df57a20cc1ce48023faecf5d49d1a0c38512f782111a4bf9b901956745833b20005f80355afa3a5ddb1dd0c1410d5975ae298aa6c90e9c0cbd5288249124f06087217aab40122bbd543c63446af393ab1b9bd94285c2be9dce113092f05ed830106eeb5d30259152d2a225785ace9ea8795694ca7a8b7c08e9164fed061c9fb57382f08b0d1000288490b6c37adf54e1048077f7bbd073b1c975bdd841b83557442f21de23a32608d323b0d9b1ffaf871001b4a0ca212a4aeb434974a9368bec939d57c05c1c4b93b6b4164bae24f57a473c84cbeac01c227702c98872b5404b23cbdc29b0c7b50e6240360a284724bfc230815a5a9202d93f41473d18953cdc587ca0b7ebdfe5a11da5f1a314279b1684ae05ab5219d2e2e50ec81b3a321da7b9d96b0c90f329aca9634ac1bb4f4145e2085235f5b3fa93856ea31387a8b4ee57d33445b5d8226e4a48a2d18f8ec563b04f094c465a57a92c3b900ef02b530f60649bbde12052d609599eb9e4a767ea2041ecb18980e693206c2829c0fcaa91d4960ef69df412bdbeb4e7a8cbc6d567242c7b331aaa297c9e0bed161faac34e29ce94c218fc575670b9504d5e321b7d5852b8488837908629a526f02882eb5b6a80940328d5e0e256cbee4e15f979cc9af7315c92c98b6a53e5e4b61a0252270e5e0629ed576160ca8058c26db864d92e8015aa697b4092ca6a3068c4229cc89d2ac913491280eca4177e4813f98eea2abce269f507d82dc55d569fb8bbe4a34d1a5121876a0558424a2b620257948a3950febcb0f7b4c09c76ad57de083a4b50a7c2ccee50e750adcb761da0806bc424e4a84b67afdb436b5d3d00d350b50762ea7e8d289d835d3ba7622a4c0bb359c7803095da0f242fa6001427a36d77e23b373240dbc47cd1831fa74ff12b2bf1f2ef7f2408527ac3ab965500d1254be46943b181e1a3bf73709372b750a5f18c549adc322d36ff0160f3421b94814bb0faaf75d150f772c6f832c953a9dbe5210d37241ef98d3ab083f0257ba3ab040e56ce554079ba551379404b0c25e97a42b921b5a1aad56cf08ca640751e3864d73524f5b8ad59333dc83a66fb4133596d5a33266d120218cec1bd66b61223602e8d0ac26a045ab9e38fca08cfec5f05edf526b3e7e8b309bf57ce405cf7e3f444e8650135d605123f538dd699e37dc6ab8b4b5bd3fdd96dbce63f1846c3cfdb78e181c16a27de5d52e2a83a38f04cba58117041c65e28fcc5e4d912bf012ddcaf65b334e6cce6b9506c3fdde02930cfdf5f5ebbf1a7c44c0ad25019a14b77652a0ac8fa0e665f644eeb7eb86c8eeb801157d43a6c07fcf1d0530ef54ad26bd8deaaac0e12037c97d6fe19d884e7d0cb38fcec108f875492f9b035d135476387ba7501063ae769902a270cd58af908468e2025a9a0442cde4f2324ff424dc5cbcbdc5db641a075d96f9c1258b7b8b2b4c8a7c815c4ea5b51c763c1a7255f5367c66dd0803e6b777d2ba6b0fdeeee53609aeb0c8698d477f4974b25096d6710faf59c79143dfe97b57178da8ec4ddeb25111f875d5507a474f305d5f1683f351b851237ee4947feb6046e3ac5462806f0160b276a0f0940e61e0ee9d424cc8ff20f5c1d328bd5db7d76b633fe816b6e4bb24519e7e52c28e9ffbb4fdf8e3eefefe137ed9e9e5f5f9fce5f4787fba9cffbd3c9c5f7e3f3f3ffff1f5f3c3d3f3d3436bfaf08f9eb65ff7f7f7a7cfe7d3e3fd7fdbef3f7dfbebf5e5dbe5b7cbeb9fe7afdf4f8ff7c737e47479bd3c7df9e9a7eff077fdb8fb1f0000ffff0300b0c002c507830000" + "1f8b08000000000000038c56bd8e9c470cebfd148bab9d401245fdf85552d9b943e020718a5c61c02f1f7c67c4c1c769b2c516b3da194aa4287d7bf7783cfdf5e9f7975f5f9f3e3c9efef8fcf7ebd3fbebecf9e3ebc7a70f8f5fde3d1e8fc7b7b7ef5be4cb9f9f5e9e9f3f7ff9ed2dfcedc7cf5f9e5fbe3e7d78d88f93ff82febde9fafc643f9b3933018ff73f8eafd3d8eeedaaf7f7608c3187f7d881a3d1f7d0f008b0710bf570f322eea1be9b49c85b1e9bb99df7b7b213d59b12cb658c8fc696474e6a663e917e07666e45b64bba11d1dd21782d73ccd3256323bd3a70bf19ecc97541965ca320f3cc9c592d79392bd2a9d0baadcaeeb4b971ad4df1d258e9770cee9d880c61adda37fcb82011d803437199ed424672c2528837744c1e492c8cd8be57ccc2670f8a27b7e61049d3634bb2f0b4f45857414d67adb0e60e566b19c203aef9460dbcd892598f25f5ad4666ac08d2761a33aab24a18e2d05e760753e106667b5a2bb915362a75a333bca2eec798ccab63b50b73ac6de5d48a588acc76a75ab467bbb6e6abd5c1c4fc3f2ea372c743331b4399b4cad5947d10ec57638e6a616b36e5ffa4c18eda0e26b1502d94d3287e016ccfa8e5153766d52dbc3aa5f9cac373e2f095e475b5d86b5bc788eada8de051415f98589ba755407cd41d6ddd540639a1ce987e6570c71fc928ded51d33e9544f34740d67b554e0ce867a9d4d6d406b9d3d0bae6430c49afa5f5bb80555d9065ba8303045ee5daf48e6a8d89297809456d6d5b7222ce39823c5fdb00e33ed828bc02933455b016c0835c904d6b460dee5702b1d66e82c1d038e652d9589ee6450b1a1c35d89e8e690221024e8514afc627c5321143ab3e7b06011e3f71b921b390aeccdb1f5066358c661ed8e99129baa287adbb14138bd2a0f13ae6ad78eec68948ece8b8c18d461769d6dbd778aa22de6a80ea3d295e3d32bbeef0a613de75250c41ca3d389c8d358cb31dab06166d65a5fcb61798434bc338662f8852c944cf481e731b3702d2652da60af53ddc60a086dc04b73bda193dba6aff5419dd998abb3cdec227764fd886e2e4ccc6d7b1b485954ae2579743274d5200ebbd80643d7b53783dca3230d36237535b42e2488c1f9922dfb6a078a5f665a79aa675f29a83210b575b8282fc5a9e4629dd60ab6b7a295dabd7470ac80b9e5844cb70c8bd576b6c8f8070000ffff8c5b496ec3480c7cd100dc97ff7f6c403973709506c935481ca99b2cd642abb8e37c0e7517b884929b19c8d46a4b95c67354c914bd6c8f161eb88eb7b80f4f78f13144890da57728d59026b88d9bfd86d432aabdb1f355a213e79e5bb4127acda8214d33cb089cfc16b9350933478f0f2455871d00b7e121c8bd80e1d998e4aa0c62f0887d93d8a7c44f81215338e4709481c7e45db1f3fa9022505dca156838e0d4ff60f8d85a6550e97b5706205d4f0a369f765a8b02d8bf0d1137cd297c83b1193c59ab892f69fafca6e721120e7edddd4e92127b6590882893c61c3c53c3e0b4bd7d03c5f5c929fcc8ab2c219292ed23fb7da65587ea38c5375601a2d453be0ef487239509bcbddd6fe6f75fc74d1804a256b5c67f2eeb6e38a26ccc5c1dea54ab7797cacc4426f199b2bb9346fa8c07b5abd7097a259aea16515813e39ed950d3b3aa42b34f5af1a2c4d3642a08a137b250b48af9a3e9f1cda4a448c23c96c92eba49395b4b0cef70c8816dcb6eaf015d52891b6bc51451e9ca4f722a42a974470491df1b1c22d8857e225b04a15b2b8e3315fd72bbc6f74fd352a59b0ea7b64a51ff5b98bfb84953bddaa4a7f208033cb19deef3fd13ebcb8cf16820684704920c221985c1aa6db94bf720a7a7330a6fadf5e82fbe98cecd1092f916052af748cb18ca85ebd46dfea9d5a6c03b589e7244f19dadac7822cc978ca4d6dce8df07bb5aab4ba1cf77a6133c93b8d6150232d4ce2e14e41a1aae4b2a4a524d12cda5fb90c6f17727605f56d6634a4a067226cdd62ce0b86ae5d964348847b4938692cda0999ae23a1a343ed202efa06c8cea451f86896fe0be577450c6b6ab8376e20d10c4c42ac5d927d6bee299cc1f56bfd8e8730771470b30176369f8011e63ab4170a22e097d68263e4da07ad752d964436bec04b99c39950869bbdee80ba59b38bc96ef9cc50eca41cfce34327fcfde4734cc8d4ae40a63e141ac20656bf1b02c5cb3e903ba3c5192a9adcf8b2ab469c38822bab58901ba46173e6a2be7005ad5aec88f5d6da5919b48cc494d30862ceca60d0064ce852fa076778ea22739d2c2f6cf6eaa0edb5d475c96ecae634864c4bee02b1dcc53c5bddd0973ee1c8f91a6abad4b74b063d2d60cc79cee452c589a1675b638ca528daa106899cc116a8dcaee15ea231db741cbee2076866d9bb20ca10860a70ce6dcf3c16b0a26ef83073e81d2b4cacc09f9ce0b30741ec7b267f9195c3060319f54724308509f632c3d464e46ad5715ce3aab340ba21695e18a88e09bbd43e19e77b561bc38a1a6e871fea8d02277503a31c3d0c838bb8df4b990feb08b050219f053cd0b8738dedd410683b72e09793bf3099be4321bf46e358f9fd154eb8b0b3169f389f1f441213e73161abe57eab423d2f9ae537dbdeb10b19be2d37039a9ba94fc4a9d71fb07b34f53cd93cae01cf058d426a593184c4a680af2438db9010d7f1f6e524a8ed025cf4939dd15c7925936ed653805a42a32c3a9927ccdd056aaca4c02e1cc3ee586f16c0cdd6ef6951da500a0ce3f751075ff0d4d83b0198476c919cefed4a352d0c8cdaa14f4c92f1518c2ebd372652b3008a42e3e5c679273b6cc221b919c6ae6649d9c731fa590167c8e637a91442a6a47599abb9edb4d826e2fbb2d98d3e6ba50e6efe07c1160299a7e2e17fbe2bd6b96a0f97b245cd391eca956c4a03ae1d7fde8805e276f64be4be4bfa82965fa0f668f6a464591c453cd1e6133f07c3c5c9008bf6d0ad4dae7dabc68e203219d30a0f7d3ee83f43e8a320fbd7d07e542b8ec1cfefe4e3648cb48957741534bcd6dbf10e45a3d0605b5a5fa62476494245210667cef9b099f7060a2111c8fc02898817ad14493c974008075f4062b475e64ecc5363dcca53a902d57942d2956b290da68a8c3f34b7a2d31073dc639e0e3d871894cdcde3939d73072eeba57622822de996ef44a30ceff705ed54c5c5eb820a7963c5677a32c4c0e15d1a4cd556ff434425cbe6feb23526d8ccc1acfb3ca07ad57bf3cd15f52be0de6cc6e39b0bf61bd97b010ef8f89a006edb5361639611de01558ddfe877fffafcc4793817a3fbfaa03e38edd16125975c0451b3ee72019057aa5ed43d6d2058a2b08df35b28311b74a8e57237eaa3e4b00b46e723b6ad08bb7eea56c2ebd2c51686f4c5118be7ae1136a42ed19d85510bfa1b088dff4a9af21ca07bc6702932fb98daa1cfb3502f9e7ff9281ca41622de1153accf7bfb7483e966c3d2608aa8838bb0021ee22cd361448321b6586245aebfa66e923de96eea46bb788b44bd5a9736212a13a86cef03cb3b47f11f70fe92f0b24495a3e938eeb25394e57c6c1d94fe3f445ae940e8f2999b2ea32994624abb20dc0fe20b8c6919bce4856a36de1c7151737514c7c0fc4fea060cf2b45f1a7b92344f23a1fb8c7023db0252721679682600d9fa52695e9194a35af9f17c3fcb12db27dcea28348c5acad63691de2d6a7c81ed1495e02bc900d5948bbd9d0ee945d4a2798b492aff0b1d53b168af8c28d509c2abc7df2c98571e3f7e31bd9bd022aa9bc052ea41171739401695a1647bbab47d3ce64e69e8680d99a5e8e5e4369dc9e2bf68cacaf932fae71321717bd2a929c79cdf4584cb4e2a214dc9694cac2b05bf316e3166feb641f76cb644914a633d3b0036a993e490db029434ebd699faf82277551142d609e57542888f6b4131ec9db3c52b18ea02d239d92eca2e3b3203b8058ff73d1d6835d49a8ff61bcd6d9bf39b43f85ea96e890b8d4b3ed4d4987305cdefa226ff74eea8538f4d31134596eaf8d6db52b20b55d5cfd5bdb2e140d9d998a766c84c704a648b70ded6864e62d23535feead25d0243c3f034d29ddd50a40712fef9705848faf878bcc07f9bd84227e5f28081269f7b8bc45d1b3c45fb2525f16165ed7dd75ee6b061c0b7b1d63a2d0e7f62d83bee820861e8956df0a3cad231c982729f638671c0ba435b32808e95b48605f6ae22622a0fc993a6000f9e15b922cf60830736f8f65827611a7778a52afd8e818e8113f3f79719fdc2eb24924a296b77642416d5fe1e1ee846556fd84aaff020000ffff8c5ddbaa1d47927df75708bd0b32ae19e17f3183078b669876bb9956370343fffbb0aa4ae0132bb7ce79321ce47da95d1519b16ef1e703651fc6a76515253d71e66d68000810d69e2ae105b196f35095b5d29610060f45e1189530f0a775bc8733ddcf89a9dae8f9ceb276f3d8a4645bb523bd46a1c00f01bd36597906d3761f803b581a2382ab3bdb3d1c8ba410aebe98450228329d302db3e89cb5aea231b106dd0ab81be758060d8d92daa94cc3c88fd1bb7cb085d6164e2400e802db938a019ab0088fe5b9eaba95da807e4de545abf30b486b4df0c66c552a3de5674c1a90e79e640efe06a5f4d475362892d9a277abcf663252c2c9f580a334743ed3ab75a586b0ab253ce9e3c64a9b988a6b5b2fba628e67cfe95557503fb313d387d268b737d4fc5cde3be1c49925002c7b530385ae24e863105671dffd55b8a9c605063a353b7b3711df9b590e95290405a3efe4ff7290b442b3fb85a44db557fa76126698449358527243c7d9545d31ba9232ddc2758f6ec32ef282508970e0acd41aaf82656320cd206ebdb98f82ea22de13d25faf802997e643d43c42c2126cf554deb6d3784a46aaeb793240cff4cb2c7435537253d0b6d0250cafcad9c6adc8aa5e329fc995db4ce68406730cdd1df08de52aea4bb605cf93907b93266ca5c9b4384225a6a497f72e061869707dc481963947c4e556b58bd8a0465333470fd08bae4d7cffee88bdde23dc9e1b010409f91ef72e691a3ecd6599100d00ea93a62282ec6f199de5b6a9c3568877aa08ad0dcd9c032c8822dd34045ad9ae9caa648f34d6480003208ac0355336a9c0b294d4932f54d801b50c8d41997ee09a7627ec43b3e3c1c93e2f6fe6864190deccd6e8575e0cc2605f719f4cfdc932b2e7c0e8dc96f34cc42945ec2dbdc02bba8d91e1c7c582a3a8de33793ea0b7cad4692aee469ad8b4376af040a336748f64b9d1b0cd5a0e2b08a9e871400d497f4fd1f8dab0bb4cc053506712daa1132ddd85a16d6a16f41ab4f5c7ba58d47b87eb6ecefe17c830e165c888c93424bea131a1710d140eb5974014e767da59bd46e70f97fa61c687cdd694059db9744af4d16050b1c43021dcf54237f2c63bfab83aaa9c4825f8963675c81b0310690c2b806eb346db4ad2674ddb2e32f10f4b5f66536e2b10e6323f59e94ef0b6b6edc8896e9baa2bab960b36a1a99f84661a44f5bc92554233fecaac9de39b01f7ef2968336de868e7ada4eab8c4a3809e0918c66bbe3ca01b0f26f216e1bff54ea2eaf340f62d2489f1bd2a9cf537e266f16364f50144642721f100e136776aa0955863d2382d48f27b990ba88d85636113ff8f0360e71cb00139d3781d0221c8c43731c7d253be212322eb289c09cc69377c08cb3fd2c48942203cb5eb6b7b502e8744a1b59d3f59c476d640401b351a7c1183988cda73c9543a47a503fc01090ba0e95bf511d46d65484912afc475f92c70dd0145dd3c9bd8d0a2abaedb63be4f295410f3684b2859e66b1e2637041f5812c6b1bb27f28e32890661c67c0c92fcf12ef99e641dfc4446be2d03164a8620c419c4d46d1fbd432eaba92b960c548309a57af772befe70452c921dada61b5b61fe4bc2e5e0dcf1cd3ceaf68c64254e2162831427b08df3d8e0283554f96c3928e4d1be9ec4830abac28734626d5c47627b3604ddc626d158b37a07925d84ae0eeca14562982c28386bb689970a8d6c903026e77bb29547ab059885e40a1dbee832a2199349b9acb4c4f7ddef4d2d0fbc70450b901f7487fa7ce5e84cefd9199346f8f641171a20794732fa580cc15dd1e1329595b7f4a4baa920c1d04afdf2f924c4dd00786d763fc3bff474ece5a44f05c7a5d9d4ab8ec89917e8c2d18d21915b36b164a461bfa150484928dca663ab3be574980939f7257c790ef78b023c9f8aa01bf521a83df65a1c44a14d923d036241ba7ad0a9b96c82d72789c88a0d488ba6fd02ad3a5b01720d3c3a3868af278820702d50c70e96abd67ec7bb7137e1051fd7072cc5ea55420cfe410788f011af384c8dbbe9e1c24b38c39a60be2601be4a548cc4b6d25b3a8346572067c1564fbf742af42c79c7ac490205d61bcddad3a3446b4c227f399cb461acf94dd49a49f07bc5e681c8c1d0d67b98d20f38eef5d69e747f37d1ac49902a348d84791a08fe99ab06b8625345811fd197d1645eb63ce97e80be794607418b3531c7b5a14f263dc2ba0481f911f9b6e32a0847bb1c34722fa8b2b3b754103d128beda2ed4d06729712bab852ab9a0e54a84d60cca09f47dfd2d7cfbb9d72bb2016597beacc708b988d665e910da5a4f50e838f84c19093af4c109934f564abf9e739131cd2d6697b3e0f1abaa655029393ef547e007bd59eb2a36a5d240348d830e987d0bc2426f3671708a8c7f5ca929df4ab7b28fae4d990339ea188c18969eb387609ac3abaa7b7e25f0016e31975026f234172d03b70bc18aea04f9bc551238c082852fb372a8a10308b536f8eb4de1e3209ea0d7d0b33f2477c068453cae124129977200a653b7128da38b6e6686f125953f9474140dfe37dd65474032057a1c338246bcac7bd140a15c224bb8b693b18a4a7ec269621d16c8a567425a55aa2a14b6a9d4e9adda3d2421d24f21c722147303e6846bed95d71e47a84c647c507c8693ab9463a27d572b6651e0213073dfe84caf49e2527ea6d12d477d389cc6b856a9c04fc5d55d3f77c60a5ac8b93d7a4021f2228524e8b4f8f809d6d7f20f5c840676e161ea30c1581f61d88431a0de84ceab8ef0d319bcaed8916dfa94fb28538070891de4ad5eeaf858f4a9e9593f9492d4527082d905824292788e579899d0a6a914de29224cb4f1867b6cfae1ac658fc3aa3ea6bb63bc120dad19431754ce52311ed2db64189ae9936b445b8552752fc65aacf09c7516f27f317ce269d2054b4d4a227060c3759eb043fb7ceb406731140bf244dba12d4a815f54d89136e958b7ae1e50821e88f05c07a4235d9a40faf68b6239d02f624606120a67e67090790011637d24ca126a755cfd85d41a19cb19f534370378df0e7914ba7f1ec92f70730d974bb5dfac4c9b50724bb4d703d74f2ca4e904344200ea5c5b788b90066a3e8d34addc2c11101bfea346328a0615694c97264bd4ea13434d5e4233b0fdbccd93f6c261c0e2472daa4ab5fb8104e7014627083fccf1c76fcc0825b887654dd4ef90d20e2d288f37718ec85425b22906f366f1d1ce754b3dd4473e6a8aa646f920c51f2cefdb849277909d834f5e5982dfaf0ea688be9301c25f38ed26d7f03169eb5fc4f64872647510157147dcff67f7f31689692fa0cc49951c088c33936d95f0d4590045506d876672dacc26d3a512a64d110849916f0a712b9068de584887958fff2d83f34e92514c97ce1b368e1e38a115f716645b59dc35f0291569cf489a3d6671aa333250a718c2daebcaae88fe7e3e33b40504d27a5a6f1edb02c93e21210ddb88d687f6f04f6e8fe0017b360fae1b4184c9fac26f48ea973026adc64c8478098cf7c38441a50b6a064bd158abd4c8680ee8ae427ec7e7e0283d06d24030bb87ba7bfe86079e0f8cda77ee03925ec097dd00c0b46a5021ef35ed3f6a86520a113f23f83de60cfa466908e0864eb282b068bffcc0ca278c447d7b7c117335e32f2da8e7133776f82e82a52b09e72abb4e01c71ce52bc42f26663009b531895bb2bf7919e6750cb248776338d5c9c7eb2370b9cb49175353f85a1e87692e52f0382a860c330acc41301c38687e9cc85d16242f3486e2d8ee42363cb7de381e1a470c58d9b977a96b2862afa23d990bb61bc9e913550494dd604cb2c26cc028d67effe50c56eeb68328f42c2ee33ab50ae7b97ee1ba0b9539356e8a18c7329dcd6a2dbf12a4cf24e02c4d1e2f1a49bf55ee478637fe033349691eb322b36ddb6d6003149998fc02ccec32da52078185de821834add9cf0086b040a4e582bc172532f2b15e4b04cd93501b80b254aa25b61419e0c9788da26b90be80a0cf9646402d836ede514defb74450dac840c56d2ad84e3828c12b23862b4da1ce6ba5ad965671546cf3d8620204673b7cb24005e87dbecb2e4602b84077892c459e0539b22bc1915fce89e527b924102e97bb1eaa71067d6342abbd4142d53fafff7c478f062641746b602bdec3999e0c8e11de94681234dd97901c7c08c616467ce2315eb5912000a282d7b8111621acca70ee456bf714e005aa45cd45e9f84af47273cab2bef14de9ad9af980dd6246011c8e73d59965d57a42be9c04535f721b9758b0c9ce2983ce7181884ce712b6093c2c1ccf17647d22d7257e11e45747bfa3c55109cf23657ffeab66102990788a12da7527f0a750f478198866938d6649ecba5b6a5299e54e95ea94640f98411a2480c0d715272f67d5cc95584082153706e0fc20a172753c865c36f823c23010310dbcce8e2139806abc487b423020b15c4a4c36dd510c813fd30a7f5d7127fdbae6c7a1d328f675586e994ff9da36b8f9255cd4827db36c05c65686ebb34715077d3480a87d26583300c4d35ca8881f486f33d5e6446cac6714b7b3d60662e52c051faec6bd79d1a04383507bc922ac2df4d480c2b1ab68c244085fc8189d71169f7b09b850544f3506b94a9990db213f172d38a60d294278308f2145a698388ec358b8c69854f1f9dd8be0e2532d74a27eff0a9869682f8600403fbdc6901af8a0e149157859cd3d51f2953ec24abb7408ed124fed0b066fe15ca0b0ad8580802a84d04769acef54e0048832f6f7ab1c2f1c8ea36d4188ca25324df03aec303b6c8b3b3c0fcd0e3c7066c2031b04a10bab2da52669ac4ca0bce99e22b0026c9bbb30e894c2ff4e90a770e89c98f6b80f004c621f3f01415012f8fcff026030fca39c90830518a726b7c088a8ad256242d13f454fbb013678a8b1f9417f9f5fa6344e83e342a4a995834a5e05ab510a7c105883de2eca8894e9fdd1298fc22a1a95c4ec3c9a075b6308154097fed7c52515666190c5fe5b4bc6f97e89a2468034e9ab105816777ca21104f49b9acb49ee4512e40bb405b187d01d29e53a2600bd8cccccd6c25393fa5043e640c4487d41923c282940fcaae1d69c4de13df4194ed6b253d5adeb5677282e3de8889e87573705f38449f338db87727a790d761dcb94c2545ebf1e0db72e115429483f90062da3227015897d63aac0980338d0e8761363fe6e1bf869c49aff3329259d06dcbbcbd8ec0c06a58e046e1e23cabab1604d0028e26bb9a4d82e811b44c87b40924a6310d46a564e6c4d2ac68ea4814853268460ebc30cda2a79d4db981fa14a9aba6d2f607fb2ab189ae958261035b4508225a87a4a42c5944f930befce5b629a1ac4edc073a48a255a063495eee30bbc09b0dd34561c0a7c849a9d235c74f5b5b9d9a6ea0590865e7e5142e4e895dbbcdd5292105daad48ca1b68e002332fc4830108f15ea9fe8e67e7711aa4d7f41871f4e9fd15dadf3697f7f24085266c2ab925680d1250be452977103c2c56ee5f106ecfd4297c31b2939a4322e3efe42d3ed184a42251701fb4def7b478d841de16492a75277d5324a6f521bd63ef9c207c1446bad9b000e55ca3aa239b65d16e2829c40ae724494f496ed8d26873f58c60996c506a5cd8b624f474b5d8ac9c9559d47d633bd16258bd66c62c36480847f685f95c980846003b34a708e8b0554f127a508efe45f33e4fa9733efeaa32dbb33e32c173cf87f0c950d4840b246a841e7726f5f386a98697b6aeb7d5edc8763ec413bcf1f4b346059b8588af7cb98bcaa0e823c0f228e045028e72e28f6c9fa2c853f0124d65f7d48c8acd7eadb1c1f09e5b2092a1b79fdfffa5f11106b7d514d0a498da0981328fa2cdcbac89bca7eb05cb6ebc132afa3d3205fa7bde5100f1cec46a3a574c55058a83bc9bdcf7ddbc53e5b48f617b381b23a0d725bc6c07764dd0b2c3ed4ea6208eb9ba610a80c2d3637d8a24c4262e444b1340a8ddbcbc2c1b7b12de25debedbdb641b1b5d8efec16316f76557d864f94272392dad65b3e3b3215755df0f9f396f8441e6773a61dd730fdeade536295e61d1db16b7fed2d8c9425edac41c3ebd8ed1a16ff0bd97442356f636b36cb408fc356a28eed8134ce3cba1717e166e4c8b1f29e5bfef60c6c65999890179198049da8185a7548411779f646282ff07ae0fee46e974bd8ed7c57ad0cb6cc9b324a53cfd09097bfef6cbf5df7ffff4e9d32ff8679f7fffe3b7af7ffdfcf3a7cfdfbefeefb72f5f7fffcfafbffdf65f7ffbcb975f7ffbf5cb5afae55ffaf9fa77fffcc7af7ff9faf9e74fff77fdff9ffffe3f7ffcfef76ffff1ed8ffffefab77f7cfef9d373413e7ffbe3dbaf7ffdd39f7fc27bfdfba7ff070000ffff0300b0c002c507830000" ], "rawHeaders": { "access-control-allow-origin": "*", "access-control-expose-headers": "X-Request-ID", "alt-svc": "h3=\":443\"; ma=86400", "cf-cache-status": "DYNAMIC", - "cf-ray": "913c001de84f2efd-LAX", + "cf-ray": "913d132ccf812f43-LAX", "connection": "close", "content-encoding": "gzip", "content-type": "application/json", - "date": "Tue, 18 Feb 2025 06:36:01 GMT", + "date": "Tue, 18 Feb 2025 09:43:48 GMT", "openai-model": "text-embedding-ada-002-v2", "openai-organization": "anabasis-llc", - "openai-processing-ms": "83", + "openai-processing-ms": "108", "openai-version": "2020-10-01", "server": "cloudflare", - "set-cookie": "_cfuvid=PPJ9vzd6aXWEGC4Afhh_TGrb4jclW4phRCk3f86d4MA-1739860561802-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", + "set-cookie": "_cfuvid=O0XHiuX93wNyvY4BUcYzXcWSVDxe_cnX0SNjzuibOd8-1739871828641-0.0.1.1-604800000; path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None", "strict-transport-security": "max-age=31536000; includeSubDomains; preload", "transfer-encoding": "chunked", - "via": "envoy-router-dd569d47c-cfkjg", + "via": "envoy-router-dd569d47c-pmx5r", "x-content-type-options": "nosniff", - "x-envoy-upstream-service-time": "48", + "x-envoy-upstream-service-time": "52", "x-ratelimit-limit-requests": "10000", "x-ratelimit-limit-tokens": "5000000", "x-ratelimit-remaining-requests": "9999", - "x-ratelimit-remaining-tokens": "4999996", + "x-ratelimit-remaining-tokens": "4999997", "x-ratelimit-reset-requests": "6ms", "x-ratelimit-reset-tokens": "0s", - "x-request-id": "req_b197b006111b33df62907d2c3e08ff89" + "x-request-id": "req_08930f92311198e1ba6770bf0e76dce0" }, "responseIsBinary": false } diff --git a/src/services/code-indexer/__tests__/code-search.test.ts b/src/services/code-indexer/__tests__/code-search.test.ts index eb27335dfa3..95c985d82a3 100644 --- a/src/services/code-indexer/__tests__/code-search.test.ts +++ b/src/services/code-indexer/__tests__/code-search.test.ts @@ -14,13 +14,9 @@ describe("CodeSearch", () => { process.env.OPENAI_API_KEY = "fake" nock.back.fixtures = path.join(__dirname, "..", "__fixtures__") - nock.back.setMode("lockdown") - // You can re-record the fixtures by setting the mode to "record" // and running the tests with a real `OPENAI_API_KEY` in the environment. - // if (nock.back.currentMode === "record") { - // nock.enableNetConnect("api.openai.com") - // } + nock.back.setMode("lockdown") }) afterAll(() => { @@ -60,8 +56,8 @@ describe("CodeSearch", () => { expect(results[0]).toMatchObject({ chunk: expect.stringContaining("testFunction()"), - start: 79, - end: 123, + start: 73, + end: 115, type: "function_declaration", filepath: expect.stringContaining("__fixtures__/test.ts"), }) From 32b5b0804ed2f0081b85898ffa0edf9665247e4a Mon Sep 17 00:00:00 2001 From: cte Date: Tue, 18 Feb 2025 02:05:40 -0800 Subject: [PATCH 4/5] Fix integration tests --- .vscodeignore | 1 + .../VSCODE_INTEGRATION_TESTS.md | 0 {src/test => integration-tests}/runTest.ts | 0 {src/test => integration-tests}/suite/extension.test.ts | 2 +- {src/test => integration-tests}/suite/index.ts | 9 --------- {src/test => integration-tests}/suite/modes.test.ts | 1 - {src/test => integration-tests}/suite/task.test.ts | 1 - package.json | 2 +- tsconfig.integration.json | 5 +++-- 9 files changed, 6 insertions(+), 15 deletions(-) rename {src/test => integration-tests}/VSCODE_INTEGRATION_TESTS.md (100%) rename {src/test => integration-tests}/runTest.ts (100%) rename {src/test => integration-tests}/suite/extension.test.ts (96%) rename {src/test => integration-tests}/suite/index.ts (89%) rename {src/test => integration-tests}/suite/modes.test.ts (98%) rename {src/test => integration-tests}/suite/task.test.ts (97%) diff --git a/.vscodeignore b/.vscodeignore index cb18c7021fc..6c6f53f66f8 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -5,6 +5,7 @@ .vscode-test/** out/** node_modules/** +integration-tests/** src/** .gitignore .yarnrc diff --git a/src/test/VSCODE_INTEGRATION_TESTS.md b/integration-tests/VSCODE_INTEGRATION_TESTS.md similarity index 100% rename from src/test/VSCODE_INTEGRATION_TESTS.md rename to integration-tests/VSCODE_INTEGRATION_TESTS.md diff --git a/src/test/runTest.ts b/integration-tests/runTest.ts similarity index 100% rename from src/test/runTest.ts rename to integration-tests/runTest.ts diff --git a/src/test/suite/extension.test.ts b/integration-tests/suite/extension.test.ts similarity index 96% rename from src/test/suite/extension.test.ts rename to integration-tests/suite/extension.test.ts index 969087ff02d..35fd099d935 100644 --- a/src/test/suite/extension.test.ts +++ b/integration-tests/suite/extension.test.ts @@ -27,7 +27,7 @@ suite("Roo Code Extension", () => { while (Date.now() - startTime < timeout) { const commands = await vscode.commands.getCommands(true) - const missingCommands = [] + const missingCommands: string[] = [] for (const cmd of expectedCommands) { if (!commands.includes(cmd)) { diff --git a/src/test/suite/index.ts b/integration-tests/suite/index.ts similarity index 89% rename from src/test/suite/index.ts rename to integration-tests/suite/index.ts index ffb8de7473e..df790f36a63 100644 --- a/src/test/suite/index.ts +++ b/integration-tests/suite/index.ts @@ -1,17 +1,8 @@ import * as path from "path" import Mocha from "mocha" import { glob } from "glob" -import { ClineAPI } from "../../exports/cline" -import { ClineProvider } from "../../core/webview/ClineProvider" import * as vscode from "vscode" -declare global { - var api: ClineAPI - var provider: ClineProvider - var extension: vscode.Extension | undefined - var panel: vscode.WebviewPanel | undefined -} - export async function run(): Promise { // Create the mocha test const mocha = new Mocha({ diff --git a/src/test/suite/modes.test.ts b/integration-tests/suite/modes.test.ts similarity index 98% rename from src/test/suite/modes.test.ts rename to integration-tests/suite/modes.test.ts index 2fe0eaa597f..89792365c66 100644 --- a/src/test/suite/modes.test.ts +++ b/integration-tests/suite/modes.test.ts @@ -1,5 +1,4 @@ import * as assert from "assert" -import * as vscode from "vscode" suite("Roo Code Modes", () => { test("Should handle switching modes correctly", async function () { diff --git a/src/test/suite/task.test.ts b/integration-tests/suite/task.test.ts similarity index 97% rename from src/test/suite/task.test.ts rename to integration-tests/suite/task.test.ts index 2d34bc78ff3..cb73bfa334c 100644 --- a/src/test/suite/task.test.ts +++ b/integration-tests/suite/task.test.ts @@ -1,5 +1,4 @@ import * as assert from "assert" -import * as vscode from "vscode" suite("Roo Code Task", () => { test("Should handle prompt and response correctly", async function () { diff --git a/package.json b/package.json index fadef45b00d..9eeb7b28fa5 100644 --- a/package.json +++ b/package.json @@ -290,7 +290,7 @@ "dev": "cd webview-ui && npm run dev", "test": "jest && npm run test:webview", "test:webview": "cd webview-ui && npm run test", - "test:integration": "npm run build && npm run compile:integration && npx dotenvx run -f .env.integration -- node ./out-integration/test/runTest.js", + "test:integration": "npm run build && npm run compile:integration && npx dotenvx run -f .env.integration -- node ./out-integration/runTest.js", "prepare": "husky", "publish:marketplace": "vsce publish && ovsx publish", "publish": "npm run build && changeset publish && npm install --package-lock-only", diff --git a/tsconfig.integration.json b/tsconfig.integration.json index 0de0ea736a9..c9065fc8f46 100644 --- a/tsconfig.integration.json +++ b/tsconfig.integration.json @@ -9,9 +9,10 @@ "strict": true, "skipLibCheck": true, "useUnknownInCatchVariables": false, - "rootDir": "src", + "noImplicitAny": false, + "rootDir": "integration-tests", "outDir": "out-integration" }, - "include": ["**/*.ts"], + "include": ["integration-tests/**/*.ts"], "exclude": [".vscode-test", "benchmark", "dist", "**/node_modules/**", "out", "out-integration", "webview-ui"] } From 4587c75656fce3507d4d61e543409da20ee1e525 Mon Sep 17 00:00:00 2001 From: cte Date: Tue, 18 Feb 2025 02:07:58 -0800 Subject: [PATCH 5/5] PR feedback --- src/services/code-indexer/chunker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/code-indexer/chunker.ts b/src/services/code-indexer/chunker.ts index 72b9e3e57ba..c7abfa87027 100644 --- a/src/services/code-indexer/chunker.ts +++ b/src/services/code-indexer/chunker.ts @@ -1,4 +1,4 @@ -import { readFileSync } from "node:fs" +import { readFile } from "fs/promises" import path from "path" import { Parser, Language, Node } from "web-tree-sitter" @@ -26,7 +26,7 @@ const supportedTypes = [ export async function getChunks(filepath: string): Promise { const parser = await getParserForFile(filepath) - const sourceCode = readFileSync(filepath, "utf-8") + const sourceCode = await readFile(filepath, "utf-8") const tree = parser.parse(sourceCode) const chunks: CodeChunk[] = []