From 7c406b3b448c73f114d9a3abf977b1e1f6107a13 Mon Sep 17 00:00:00 2001 From: terskayl <97208428+terskayl@users.noreply.github.com> Date: Mon, 23 Sep 2024 23:52:09 -0400 Subject: [PATCH 1/7] done --- package-lock.json | 4177 +++++++++++++++++----------- package.json | 2 + src/geometry/Icosphere.ts | 179 ++ src/geometry/Square.ts | 19 +- src/main.ts | 36 +- src/rendering/gl/Drawable.ts | 31 +- src/rendering/gl/OpenGLRenderer.ts | 15 +- src/rendering/gl/ShaderProgram.ts | 73 + src/shaders/flat-frag.glsl | 63 +- src/shaders/flat-vert.glsl | 2 +- src/shaders/lambert-frag.glsl | 114 + src/shaders/lambert-vert.glsl | 150 + 12 files changed, 3192 insertions(+), 1669 deletions(-) create mode 100644 src/geometry/Icosphere.ts create mode 100644 src/shaders/lambert-frag.glsl create mode 100644 src/shaders/lambert-vert.glsl diff --git a/package-lock.json b/package-lock.json index e1a47a34..6b7cfd43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,628 +1,950 @@ { + "name": "hw01-fireball", + "lockfileVersion": 3, "requires": true, - "lockfileVersion": 1, - "dependencies": { - "3d-view": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/3d-view/-/3d-view-2.0.1.tgz", - "integrity": "sha512-YSLRHXNpSziaaiK2R0pI5+JKguoJVbtWmIv9YyBFtl0+q42kQwJB/JUulbFR/1zYFm58ifjKQ6kVdgZ6tyKtCA==", - "requires": { - "matrix-camera-controller": "^2.1.1", - "orbit-camera-controller": "^4.0.0", - "turntable-camera-controller": "^3.0.0" + "packages": { + "": { + "dependencies": { + "3d-view-controls": "^2.2.2", + "dat.gui": "^0.7.9", + "gl-matrix": "^3.3.0" + }, + "devDependencies": { + "@types/dat.gui": "^0.7.13", + "@types/webgl2": "0.0.6", + "ts-loader": "^9.2.5", + "typescript": "^4.4.2", + "webpack": "^5.52.0", + "webpack-cli": "^4.8.0", + "webpack-dev-server": "^4.1.1", + "webpack-glsl-loader": "^1.0.1" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", + "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "dev": true, + "engines": { + "node": ">=10.0.0" } }, - "3d-view-controls": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/3d-view-controls/-/3d-view-controls-2.2.2.tgz", - "integrity": "sha512-WL0u3PN41lEx/4qvKqV6bJlweUYoW18FXMshW/qHb41AVdZxDReLoJNGYsI7x6jf9bYelEF62BJPQmO7yEnG2w==", - "requires": { - "3d-view": "^2.0.0", - "has-passive-events": "^1.0.0", - "mouse-change": "^1.1.1", - "mouse-event-offset": "^3.0.2", - "mouse-wheel": "^1.0.2", - "right-now": "^1.0.0" + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "@discoveryjs/json-ext": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", - "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "@nodelib/fs.stat": { + "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "@types/dat.gui": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@types/dat.gui/-/dat.gui-0.7.7.tgz", - "integrity": "sha512-CxLCme0He5Jk3uQwfO/fGZMyNhb/ypANzqX0yU9lviBQMlen5SOvQTBQ/Cd9x5mFlUAK5Tk8RgvTyLj1nYkz+w==", + "node_modules/@types/dat.gui": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@types/dat.gui/-/dat.gui-0.7.13.tgz", + "integrity": "sha512-LmG4Pr0mbsB/1WVttf8xaHx45BvSBDGY5D9+0/9AZCbI4vvOguwBHZdKyJMxt5Yst8+icRSHKmr7ClV2u5ZtDA==", "dev": true }, - "@types/eslint": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", - "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "@types/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" + "dependencies": { + "@types/node": "*" } }, - "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true }, - "@types/http-proxy": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", - "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", "dev": true, - "requires": { + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { "@types/node": "*" } }, - "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "node_modules/@types/qs": { + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", "dev": true }, - "@types/node": { - "version": "9.6.61", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.61.tgz", - "integrity": "sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ==", + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, - "@types/retry": { + "node_modules/@types/retry": { "version": "0.12.1", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", "dev": true }, - "@types/webgl2": { + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/webgl2": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.6.tgz", "integrity": "sha512-50GQhDVTq/herLMiqSQkdtRu+d5q/cWHn4VvKJtrj4DJAjo1MNkWYa2MA41BaBO1q1HgsUjuQvEOk0QHvlnAaQ==", "dev": true }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "dependencies": { + "@types/node": "*" } }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, - "requires": { + "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, - "requires": { + "dependencies": { "@xtuc/long": "4.2.2" } }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, - "@webpack-cli/configtest": { + "node_modules/@webpack-cli/configtest": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz", "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", - "dev": true + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } }, - "@webpack-cli/info": { + "node_modules/@webpack-cli/info": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz", "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", "dev": true, - "requires": { + "dependencies": { "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" } }, - "@webpack-cli/serve": { + "node_modules/@webpack-cli/serve": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.2.tgz", "integrity": "sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==", - "dev": true + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } }, - "@xtuc/ieee754": { + "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true }, - "@xtuc/long": { + "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "node_modules/3d-view": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/3d-view/-/3d-view-2.0.1.tgz", + "integrity": "sha512-YSLRHXNpSziaaiK2R0pI5+JKguoJVbtWmIv9YyBFtl0+q42kQwJB/JUulbFR/1zYFm58ifjKQ6kVdgZ6tyKtCA==", + "dependencies": { + "matrix-camera-controller": "^2.1.1", + "orbit-camera-controller": "^4.0.0", + "turntable-camera-controller": "^3.0.0" } }, - "acorn": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", - "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", - "dev": true + "node_modules/3d-view-controls": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/3d-view-controls/-/3d-view-controls-2.2.2.tgz", + "integrity": "sha512-WL0u3PN41lEx/4qvKqV6bJlweUYoW18FXMshW/qHb41AVdZxDReLoJNGYsI7x6jf9bYelEF62BJPQmO7yEnG2w==", + "dependencies": { + "3d-view": "^2.0.0", + "has-passive-events": "^1.0.0", + "mouse-change": "^1.1.1", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.0.2", + "right-now": "^1.0.0" + } }, - "acorn-import-assertions": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", - "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", - "dev": true + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "peerDependencies": { + "acorn": "^8" } }, - "ajv": { + "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "requires": { + "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "ajv-keywords": { + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } }, - "ansi-html-community": { + "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true - }, - "ansi-regex": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.0.tgz", - "integrity": "sha512-tAaOSrWCHF+1Ear1Z4wnJCXA9GGox4K6Ic85a5qalES2aeEwQGr7UC93mwef49536PkCYjzkp0zIxfFvexJ6zQ==", - "dev": true + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } }, - "ansi-styles": { + "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "requires": { + "dependencies": { "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "requires": { + "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, - "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "balanced-match": { + "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "batch": { + "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "binary-search-bounds": { + "node_modules/binary-search-bounds": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, - "requires": { - "array-flatten": "^2.1.0", - "deep-equal": "^1.0.1", - "dns-equal": "^1.0.0", - "dns-txt": "^2.0.2", - "multicast-dns": "^6.0.1", - "multicast-dns-service-types": "^1.1.0" + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "brace-expansion": { + "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "requires": { + "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "requires": { - "fill-range": "^7.0.1" + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" } }, - "browserslist": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", - "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001254", - "colorette": "^1.3.0", - "electron-to-chromium": "^1.3.830", - "escalade": "^3.1.1", - "node-releases": "^1.1.75" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "buffer-from": { + "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "buffer-indexof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", - "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", - "dev": true - }, - "bytes": { + "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "caniuse-lite": { - "version": "1.0.30001255", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz", - "integrity": "sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ==", - "dev": true + "node_modules/caniuse-lite": { + "version": "1.0.30001662", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", + "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, - "chalk": { + "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "requires": { + "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "chrome-trace-event": { + "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.0" + } }, - "clone-deep": { + "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, - "requires": { + "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "color-convert": { + "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "requires": { + "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "color-name": { + "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "colorette": { + "node_modules/colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", "dev": true }, - "commander": { + "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "compressible": { + "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, - "requires": { + "dependencies": { "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" } }, - "compression": { + "node_modules/compression": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, - "requires": { + "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", "compressible": "~2.0.16", @@ -631,313 +953,342 @@ "safe-buffer": "5.1.2", "vary": "~1.1.2" }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "engines": { + "node": ">= 0.8.0" } }, - "concat-map": { + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, - "requires": { - "safe-buffer": "5.1.2" - }, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" } }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", - "dev": true + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "cookie-signature": { + "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, - "core-util-is": { + "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, - "cross-spawn": { + "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "requires": { + "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "cubic-hermite": { + "node_modules/cubic-hermite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz", "integrity": "sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU=" }, - "dat.gui": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.7.tgz", - "integrity": "sha512-sRl/28gF/XRC5ywC9I4zriATTsQcpSsRG7seXCPnTkK8/EQMIbCu5NPMpICLGxX9ZEUvcXR3ArLYCtgreFoMDw==" + "node_modules/dat.gui": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.9.tgz", + "integrity": "sha512-sCNc1OHobc+Erc1HqiswYgHdVNpSJUlk/Hz8vzOCsER7rl+oF/4+v8GXFUyCgtXpoCX6+bnmg07DedLvBLwYKQ==" }, - "debug": { + "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "requires": { + "dependencies": { "ms": "2.0.0" } }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, - "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" - } - }, - "default-gateway": { + "node_modules/default-gateway": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, - "requires": { + "dependencies": { "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" } }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, - "requires": { - "object-keys": "^1.0.12" + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "engines": { + "node": ">=8" } }, - "depd": { + "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, - "detect-node": { + "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", - "dev": true - }, - "dns-packet": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", - "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", - "dev": true, - "requires": { - "ip": "^1.1.0", - "safe-buffer": "^5.0.1" - } - }, - "dns-txt": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, - "requires": { - "buffer-indexof": "^1.0.0" + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" } }, - "ee-first": { + "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true }, - "electron-to-chromium": { - "version": "1.3.832", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.832.tgz", - "integrity": "sha512-x7lO8tGoW0CyV53qON4Lb5Rok9ipDelNdBIAiYUZ03dqy4u9vohMM1qV047+s/hiyJiqUWX/3PNwkX3kexX5ig==", + "node_modules/electron-to-chromium": { + "version": "1.5.25", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", + "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", "dev": true }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "enhanced-resolve": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", - "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, - "requires": { + "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" } }, - "envinfo": { + "node_modules/envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } }, - "es-module-lexer": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", - "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", - "dev": true + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, - "escape-html": { + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, - "eslint-scope": { + "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "requires": { + "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "esrecurse": { + "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "requires": { + "dependencies": { "estraverse": "^5.2.0" }, - "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" } }, - "estraverse": { + "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0" + } }, - "etag": { + "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "eventemitter3": { + "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, - "events": { + "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.x" + } }, - "execa": { + "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "requires": { + "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", @@ -947,782 +1298,889 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "node_modules/express": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, - "requires": { - "accepts": "~1.3.7", + "dependencies": { + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", + "depd": "2.0.0", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.3.1", "fresh": "0.5.2", - "merge-descriptors": "1.0.1", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, - "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, - "fast-deep-equal": { + "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fastest-levenshtein": { + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, - "fastq": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", - "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "faye-websocket": { + "node_modules/faye-websocket": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, - "requires": { + "dependencies": { "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" } }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "requires": { + "dependencies": { "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "filtered-vector": { + "node_modules/filtered-vector": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/filtered-vector/-/filtered-vector-1.2.5.tgz", "integrity": "sha512-5Vu6wdtQJ1O2nRmz39dIr9m3hEDq1skYby5k1cJQdNWK4dMgvYcUEiA/9j7NcKfNZ5LGxn8w2LSLiigyH7pTAw==", - "requires": { + "dependencies": { "binary-search-bounds": "^2.0.0", "cubic-hermite": "^1.0.0" } }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, - "requires": { + "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, - "find-up": { + "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "requires": { + "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "follow-redirects": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", - "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==", - "dev": true + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, - "forwarded": { + "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "fresh": { + "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "fs": { + "node_modules/fs": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=", "dev": true }, - "fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true }, - "fs.realpath": { + "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "optional": true + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "get-stream": { + "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "gl-mat3": { + "node_modules/gl-mat3": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gl-mat3/-/gl-mat3-1.0.0.tgz", "integrity": "sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI=" }, - "gl-mat4": { + "node_modules/gl-mat4": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" }, - "gl-matrix": { + "node_modules/gl-matrix": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" }, - "gl-quat": { + "node_modules/gl-quat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gl-quat/-/gl-quat-1.0.0.tgz", "integrity": "sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU=", - "requires": { + "dependencies": { "gl-mat3": "^1.0.0", "gl-vec3": "^1.0.3", "gl-vec4": "^1.0.0" } }, - "gl-vec3": { + "node_modules/gl-vec3": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/gl-vec3/-/gl-vec3-1.1.3.tgz", "integrity": "sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw==" }, - "gl-vec4": { + "node_modules/gl-vec4": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gl-vec4/-/gl-vec4-1.0.1.tgz", "integrity": "sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ=" }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "requires": { + "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "glob-parent": { + "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "requires": { + "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "glob-to-regexp": { + "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "handle-thing": { + "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "has": { + "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, - "requires": { + "dependencies": { "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, - "has-flag": { + "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "has-passive-events": { + "node_modules/has-passive-events": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", - "requires": { + "dependencies": { "is-browser": "^2.0.1" } }, - "has-symbols": { + "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, - "requires": { - "has-symbols": "^1.0.2" + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "hpack.js": { + "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, - "requires": { + "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" - }, + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "html-entities": { + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/html-entities": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", "dev": true }, - "http-deceiver": { + "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", "dev": true }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" } }, - "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true }, - "http-proxy": { + "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, - "requires": { + "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "http-proxy-middleware": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, - "requires": { - "@types/http-proxy": "^1.17.5", + "dependencies": { + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "human-signals": { + "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true + "dev": true, + "engines": { + "node": ">=10.17.0" + } }, - "iconv-lite": { + "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "requires": { + "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - }, - "import-local": { + "node_modules/import-local": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, - "requires": { + "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" } }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { + "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "requires": { + "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, - "inherits": { + "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "internal-ip": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", - "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", - "dev": true, - "requires": { - "default-gateway": "^6.0.0", - "ipaddr.js": "^1.9.1", - "is-ip": "^3.1.0", - "p-event": "^4.2.0" - }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } - } - }, - "interpret": { + "node_modules/interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true - }, - "ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "ipaddr.js": { + "node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "engines": { + "node": ">= 10" } }, - "is-binary-path": { + "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "requires": { + "dependencies": { "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "is-browser": { + "node_modules/is-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" }, - "is-core-module": { + "node_modules/is-core-module": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", "dev": true, - "requires": { + "dependencies": { "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { + "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-extglob": { + "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "requires": { - "is-extglob": "^2.1.1" + "engines": { + "node": ">=0.10.0" } }, - "is-ip": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", - "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "requires": { - "ip-regex": "^4.0.0" + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-number": { + "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "is-plain-obj": { + "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-plain-object": { + "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-stream": { + "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "is-wsl": { + "node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "requires": { + "dependencies": { "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "isarray": { + "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isexe": { + "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { + "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "jest-worker": { - "version": "27.1.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.1.tgz", - "integrity": "sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA==", + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, - "requires": { + "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "json-schema-traverse": { + "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "kind-of": { + "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "loader-runner": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", - "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/launch-editor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", "dev": true, - "requires": { - "p-locate": "^4.1.0" + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", "dev": true, - "requires": { - "yallist": "^4.0.0" + "engines": { + "node": ">=6.11.5" } }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "requires": { - "p-defer": "^1.0.0" + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "mat4-decompose": { + "node_modules/mat4-decompose": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mat4-decompose/-/mat4-decompose-1.0.4.tgz", "integrity": "sha1-ZetP451wh496RE60Yk1S9+frL68=", - "requires": { + "dependencies": { "gl-mat4": "^1.0.1", "gl-vec3": "^1.0.2" } }, - "mat4-interpolate": { + "node_modules/mat4-interpolate": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz", "integrity": "sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q=", - "requires": { + "dependencies": { "gl-mat4": "^1.0.1", "gl-vec3": "^1.0.2", "mat4-decompose": "^1.0.3", @@ -1730,780 +2188,834 @@ "quat-slerp": "^1.0.0" } }, - "mat4-recompose": { + "node_modules/mat4-recompose": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mat4-recompose/-/mat4-recompose-1.0.4.tgz", "integrity": "sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0=", - "requires": { + "dependencies": { "gl-mat4": "^1.0.1" } }, - "matrix-camera-controller": { + "node_modules/matrix-camera-controller": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/matrix-camera-controller/-/matrix-camera-controller-2.1.4.tgz", "integrity": "sha512-zsPGPONclrKSImNpqqKDTcqFpWLAIwMXEJtCde4IFPOw1dA9udzFg4HOFytOTosOFanchrx7+Hqq6glLATIxBA==", - "requires": { + "dependencies": { "binary-search-bounds": "^2.0.0", "gl-mat4": "^1.1.2", "gl-vec3": "^1.0.3", "mat4-interpolate": "^1.0.3" } }, - "media-typer": { + "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "mem": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", - "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, - "requires": { - "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" - }, "dependencies": { - "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "dev": true - } + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" } }, - "memfs": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.4.tgz", - "integrity": "sha512-2mDCPhuduRPOxlfgsXF9V+uqC6Jgz8zt/bNe4d4W7d5f6pCzHrWkxLNr17jKGXd4+j2kQNsAG2HARPnt74sqVQ==", + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, - "requires": { - "fs-monkey": "1.0.3" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "merge-stream": { + "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { + "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" } }, - "mime": { + "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, - "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", - "dev": true + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, - "requires": { - "mime-db": "1.49.0" + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "mimic-fn": { + "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "minimalistic-assert": { + "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "requires": { + "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "mouse-change": { + "node_modules/mouse-change": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", "integrity": "sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8=", - "requires": { + "dependencies": { "mouse-event": "^1.0.0" } }, - "mouse-event": { + "node_modules/mouse-event": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", "integrity": "sha1-s3ie23EJmX1aky0dAdqhVDpQFzI=" }, - "mouse-event-offset": { + "node_modules/mouse-event-offset": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", "integrity": "sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ=" }, - "mouse-wheel": { + "node_modules/mouse-wheel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", "integrity": "sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w=", - "requires": { + "dependencies": { "right-now": "^1.0.0", "signum": "^1.0.0", "to-px": "^1.0.1" } }, - "ms": { + "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, - "requires": { - "dns-packet": "^1.3.1", + "dependencies": { + "dns-packet": "^5.2.2", "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" } }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "neo-async": { + "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", - "dev": true + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } }, - "node-releases": { - "version": "1.1.75", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", - "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, - "normalize-path": { + "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "npm-run-path": { + "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "requires": { + "dependencies": { "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "obuf": { + "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, - "requires": { + "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "on-headers": { + "node_modules/on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "requires": { + "dependencies": { "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "open": { + "node_modules/open": { "version": "8.2.1", "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", "dev": true, - "requires": { + "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "orbit-camera-controller": { + "node_modules/orbit-camera-controller": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz", "integrity": "sha1-bis28OeHhmPDMPUNqbfOaGwncAU=", - "requires": { + "dependencies": { "filtered-vector": "^1.2.1", "gl-mat4": "^1.0.3" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "requires": { - "p-timeout": "^3.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { + "node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^2.2.0" }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } + "engines": { + "node": ">=8" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "requires": { - "aggregate-error": "^3.0.0" + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-retry": { + "node_modules/p-retry": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", "dev": true, - "requires": { + "dependencies": { "@types/retry": "^0.12.0", "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" } }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { + "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "parse-unit": { + "node_modules/parse-unit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", "integrity": "sha1-fhu21b7zh0wo45JSaiVBFwKR7s8=" }, - "parseurl": { + "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "path": { + "node_modules/path": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/path/-/path-0.11.14.tgz", "integrity": "sha1-y8dWk1XLPIOv60rOQ+z/lSMeWn0=", "dev": true }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-parse": { + "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "dev": true }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pkg-dir": { + "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "requires": { + "dependencies": { "find-up": "^4.0.0" - } - }, - "portfinder": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", - "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", - "dev": true, - "requires": { - "async": "^2.6.2", - "debug": "^3.1.1", - "mkdirp": "^0.5.5" }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } + "engines": { + "node": ">=8" } }, - "process-nextick-args": { + "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "proxy-addr": { + "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, - "requires": { + "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, - "dependencies": { - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true - } + "engines": { + "node": ">= 0.10" } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", - "dev": true + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "quat-slerp": { + "node_modules/quat-slerp": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/quat-slerp/-/quat-slerp-1.0.1.tgz", "integrity": "sha1-K6oVzjprvcMkHZcusXKDE57Wnyk=", - "requires": { + "dependencies": { "gl-quat": "^1.0.0" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randombytes": { + "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "requires": { + "dependencies": { "safe-buffer": "^5.1.0" } }, - "range-parser": { + "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, - "dependencies": { - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - } + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, - "readable-stream": { + "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, - "requires": { + "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "rechoir": { + "node_modules/rechoir": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", "dev": true, - "requires": { + "dependencies": { "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" } }, - "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "engines": { + "node": ">=0.10.0" } }, - "requires-port": { + "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, - "resolve": { + "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, - "requires": { + "dependencies": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-cwd": { + "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "requires": { + "dependencies": { "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "retry": { + "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, - "right-now": { + "node_modules/right-now": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" }, - "rimraf": { + "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { + "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, - "requires": { + "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "select-hose": { + "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, - "selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, - "requires": { - "node-forge": "^0.10.0" + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" } }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "requires": { - "lru-cache": "^6.0.0" + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, - "requires": { + "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, - "requires": { + "dependencies": { "randombytes": "^2.1.0" } }, - "serve-index": { + "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "dev": true, - "requires": { + "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", @@ -2512,458 +3024,615 @@ "mime-types": "~2.1.17", "parseurl": "~1.3.2" }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, "dependencies": { - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" } }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, - "requires": { - "encodeurl": "~1.0.2", + "dependencies": { + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" } }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, - "shallow-clone": { + "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" } }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "signum": { + "node_modules/signum": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, - "requires": { + "dependencies": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, - "source-map": { + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "spdy": { + "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "engines": { + "node": ">=6.0.0" } }, - "spdy-transport": { + "node_modules/spdy-transport": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, - "requires": { + "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", "hpack.js": "^2.1.6", "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } } }, - "stats-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stats-js/-/stats-js-1.0.1.tgz", - "integrity": "sha512-EAwEFghGNv8mlYC4CZzI5kWghsnP8uBKXw6VLRHtXkOk5xySfUKLTqTkjgJFfDluIkf/O7eZwi5MXP50VeTbUg==" + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, - "statuses": { + "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "string_decoder": { + "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } + "safe-buffer": "~5.1.0" } }, - "strip-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.0.tgz", - "integrity": "sha512-UhDTSnGF1dc0DRbUqr1aXwNoY3RgVkSWG8BrpnuFIxhP57IqbS7IRta2Gfiavds4yCxc5+fEAVVOgBZWnYkvzg==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.0" - } + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "supports-color": { + "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, - "requires": { + "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "tapable": { + "node_modules/tapable": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, - "terser": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.2.tgz", - "integrity": "sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==", + "node_modules/terser": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", + "integrity": "sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==", "dev": true, - "requires": { + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.19" + "source-map-support": "~0.5.20" }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "terser-webpack-plugin": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz", - "integrity": "sha512-eDbuaDlXhVaaoKuLD3DTNTozKqln6xOG6Us0SzlKG5tNlazG+/cdl8pm9qiF1Di89iWScTI0HcO+CDcf2dkXiw==", + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, - "requires": { - "jest-worker": "^27.0.6", - "p-limit": "^3.1.0", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "thunky": { + "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "to-px": { + "node_modules/to-px": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.1.0.tgz", "integrity": "sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw==", - "requires": { + "dependencies": { "parse-unit": "^1.0.1" } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } }, - "ts-loader": { + "node_modules/ts-loader": { "version": "9.2.5", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.5.tgz", "integrity": "sha512-al/ATFEffybdRMUIr5zMEWQdVnCGMUA9d3fXJ8dBVvBlzytPvIszoG9kZoR+94k6/i293RnVOXwMaWbXhNy9pQ==", "dev": true, - "requires": { + "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" } }, - "turntable-camera-controller": { + "node_modules/turntable-camera-controller": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz", "integrity": "sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk=", - "requires": { + "dependencies": { "filtered-vector": "^1.2.1", "gl-mat4": "^1.0.2", "gl-vec3": "^1.0.2" } }, - "type-is": { + "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, - "requires": { + "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "typescript": { + "node_modules/typescript": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, - "unpipe": { + "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "requires": { - "punycode": "^2.1.0" + "engines": { + "node": ">= 0.8" } }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } + "punycode": "^2.1.0" } }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "utils-merge": { + "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } }, - "v8-compile-cache": { + "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "vary": { + "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, - "requires": { + "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" } }, - "wbuf": { + "node_modules/wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, - "requires": { + "dependencies": { "minimalistic-assert": "^1.0.0" } }, - "webpack": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.0.tgz", - "integrity": "sha512-yRZOat8jWGwBwHpco3uKQhVU7HYaNunZiJ4AkAVQkPCUGoZk/tiIXiwG+8HIy/F+qsiZvSOa+GLQOj3q5RKRYg==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "node_modules/webpack": { + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.0", - "es-module-lexer": "^0.7.1", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", - "json-parse-better-errors": "^1.0.2", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", - "webpack-sources": "^3.2.0" + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } } }, - "webpack-cli": { + "node_modules/webpack-cli": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.8.0.tgz", "integrity": "sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==", "dev": true, - "requires": { + "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^1.0.4", "@webpack-cli/info": "^1.3.0", @@ -2978,143 +3647,341 @@ "v8-compile-cache": "^2.2.0", "webpack-merge": "^5.7.3" }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true } } }, - "webpack-dev-middleware": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", - "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, - "requires": { - "colorette": "^1.2.2", - "mem": "^8.1.1", - "memfs": "^3.2.2", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "schema-utils": "^3.0.0" + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "webpack-dev-server": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.1.1.tgz", - "integrity": "sha512-Kl1mnCEw8Cy1Kw173gCxLIB242LfPKEOj9WoKhKz/MbryZTNrILzOJTk8kiczw/YUEPzn3gcltCQv6hDsLudRg==", + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dev": true, - "requires": { + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", - "bonjour": "^3.5.0", - "chokidar": "^3.5.1", - "colorette": "^1.2.2", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", "compression": "^1.7.4", - "connect-history-api-fallback": "^1.6.0", - "del": "^6.0.0", - "express": "^4.17.1", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.0", - "internal-ip": "^6.2.0", + "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", - "portfinder": "^1.0.28", - "schema-utils": "^3.1.0", - "selfsigned": "^1.10.11", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", - "sockjs": "^0.3.21", + "sockjs": "^0.3.24", "spdy": "^4.0.2", - "strip-ansi": "^7.0.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^5.0.0", - "ws": "^8.1.0" + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "webpack-glsl-loader": { + "node_modules/webpack-glsl-loader": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/webpack-glsl-loader/-/webpack-glsl-loader-1.0.1.tgz", "integrity": "sha1-cqDjAZK9V5R9YNbVBckVvmgNCsw=", "dev": true, - "requires": { + "dependencies": { "fs": "0.0.2", "path": "^0.11.14" } }, - "webpack-merge": { + "node_modules/webpack-merge": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", "dev": true, - "requires": { + "dependencies": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "webpack-sources": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.0.tgz", - "integrity": "sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==", - "dev": true + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } }, - "websocket-driver": { + "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, - "requires": { + "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" } }, - "websocket-extensions": { + "node_modules/websocket-extensions": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "wildcard": { + "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "ws": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.2.tgz", - "integrity": "sha512-Q6B6H2oc8QY3llc3cB8kVmQ6pnJWVQbP7Q5algTcIxx7YEpc0oU4NBVHlztA7Ekzfhw2r0rPducMUiCGWKQRzw==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } } } } diff --git a/package.json b/package.json index b7820dea..bd49c393 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "build": "webpack" }, "devDependencies": { + "@types/dat.gui": "^0.7.13", "@types/webgl2": "0.0.6", "ts-loader": "^9.2.5", "typescript": "^4.4.2", @@ -14,6 +15,7 @@ }, "dependencies": { "3d-view-controls": "^2.2.2", + "dat.gui": "^0.7.9", "gl-matrix": "^3.3.0" } } diff --git a/src/geometry/Icosphere.ts b/src/geometry/Icosphere.ts new file mode 100644 index 00000000..a763c7f9 --- /dev/null +++ b/src/geometry/Icosphere.ts @@ -0,0 +1,179 @@ +import {vec3, vec4} from 'gl-matrix'; +import Drawable from '../rendering/gl/Drawable'; +import {gl} from '../globals'; + +class Icosphere extends Drawable { + buffer: ArrayBuffer; + indices: Uint32Array; + positions: Float32Array; + normals: Float32Array; + center: vec4; + + constructor(center: vec3, public radius: number, public subdivisions: number) { + super(); // Call the constructor of the super class. This is required. + this.center = vec4.fromValues(center[0], center[1], center[2], 1); + } + + create() { + const X = 0.525731112119133606; + const Z = 0.850650808352039932; + const N = 0; + + let maxIndexCount = 20 * Math.pow(4, this.subdivisions); + let maxVertexCount = 10 * Math.pow(4, this.subdivisions) + 2; + + // Create buffers to back geometry data + // Index data will ping pong back and forth between buffer0 and buffer1 during creation + // All data will be in buffer0 at the end + const buffer0 = new ArrayBuffer( + maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT + + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT + + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT + ); + const buffer1 = new ArrayBuffer( + maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT + ); + const buffers = [buffer0, buffer1]; + let b = 0; + + const indexByteOffset = 0; + const vertexByteOffset = maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT; + const normalByteOffset = vertexByteOffset; + const positionByteOffset = vertexByteOffset + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT; + + // Create 3-uint buffer views into the backing buffer to represent triangles + // The C++ analogy to this would be something like: + // triangles[i] = reinterpret_cast*>(&buffer[offset]); + let triangles: Array = new Array(20); + let nextTriangles: Array = new Array(); + for (let i = 0; i < 20; ++i) { + triangles[i] = new Uint32Array(buffers[b], indexByteOffset + i * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + } + + // Create 3-float buffer views into the backing buffer to represent positions + let vertices: Array = new Array(12); + for (let i = 0; i < 12; ++i) { + vertices[i] =new Float32Array(buffer0, vertexByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + } + + // Initialize normals for a 20-sided icosahedron + vertices[0].set([ -X,N,Z,0 ]); + vertices[1].set([ X,N,Z,0 ]); + vertices[2].set([ -X,N,-Z,0 ]); + vertices[3].set([ X,N,-Z,0 ]); + vertices[4].set([ N,Z,X,0 ]); + vertices[5].set([ N,Z,-X,0 ]); + vertices[6].set([ N,-Z,X,0 ]); + vertices[7].set([ N,-Z,-X,0 ]); + vertices[8].set([ Z,X,N,0 ]); + vertices[9].set([ -Z,X, N,0 ]); + vertices[10].set([ Z,-X,N,0 ]); + vertices[11].set([ -Z,-X,N,0 ]); + + // Initialize indices for a 20-sided icosahedron + triangles[0].set([ 0,4,1 ]); + triangles[1].set([ 0,9,4 ]); + triangles[2].set([ 9,5,4 ]); + triangles[3].set([ 4,5,8 ]); + triangles[4].set([ 4,8,1 ]); + triangles[5].set([ 8,10,1 ]); + triangles[6].set([ 8,3,10 ]); + triangles[7].set([ 5,3,8 ]); + triangles[8].set([ 5,2,3 ]); + triangles[9].set([ 2,7,3 ]); + triangles[10].set([ 7,10,3 ]); + triangles[11].set([ 7,6,10 ]); + triangles[12].set([ 7,11,6 ]); + triangles[13].set([ 11,0,6 ]); + triangles[14].set([ 0,1,6 ],); + triangles[15].set([ 6,1,10 ]); + triangles[16].set([ 9,0,11 ]); + triangles[17].set([ 9,11,2 ]); + triangles[18].set([ 9,2,5 ]); + triangles[19].set([ 7,2,11 ]); + + // This loop subdivides the icosahedron + for (let s = 0; s < this.subdivisions; ++s) { + b = 1 - b; + nextTriangles.length = triangles.length * 4; + let triangleIdx = 0; + + // edgeMap maps a pair of vertex indices to a vertex index at their midpoint + // The function `mid` will get that midpoint vertex if it has already been created + // or it will create the vertex and add it to the map + let edgeMap: Map = new Map(); + function mid(v0: number, v1: number): number { + let key = [v0, v1].sort().join('_'); + if (!edgeMap.has(key)) { + let midpoint = new Float32Array(buffer0, vertexByteOffset + vertices.length * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + vec4.add(midpoint, vertices[v0], vertices[v1]); + vec4.normalize(midpoint, midpoint); + edgeMap.set(key, vertices.length); + vertices.push(midpoint); + } + return edgeMap.get(key); + } + + for (let t = 0; t < triangles.length; ++t) { + let v0 = triangles[t][0]; + let v1 = triangles[t][1]; + let v2 = triangles[t][2]; + let v3 = mid(v0, v1); // Get or create a vertex between these two vertices + let v4 = mid(v1, v2); + let v5 = mid(v2, v0); + + let t0 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t1 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t2 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t3 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + + let triangleOffset = nextTriangles.length; + t0.set([v0, v3, v5]); + t1.set([v3, v4, v5]); + t2.set([v3, v1, v4]); + t3.set([v5, v4, v2]); + } + + // swap buffers + let temp = triangles; + triangles = nextTriangles; + nextTriangles = temp; + } + + if (b === 1) { + // if indices did not end up in buffer0, copy them there now + let temp0 = new Uint32Array(buffer0, 0, 3 * triangles.length); + let temp1 = new Uint32Array(buffer1, 0, 3 * triangles.length); + temp0.set(temp1); + } + + // Populate one position for each normal + for (let i = 0; i < vertices.length; ++i) { + let pos = new Float32Array(buffer0, positionByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + vec4.scaleAndAdd(pos, this.center, vertices[i], this.radius); + } + + this.buffer = buffer0; + this.indices = new Uint32Array(this.buffer, indexByteOffset, triangles.length * 3); + this.normals = new Float32Array(this.buffer, normalByteOffset, vertices.length * 4); + this.positions = new Float32Array(this.buffer, positionByteOffset, vertices.length * 4); + + this.generateIdx(); + this.generatePos(); + this.generateNor(); + + this.count = this.indices.length; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); + gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW); + + console.log(`Created icosphere with ${vertices.length} vertices`); + } +}; + +export default Icosphere; \ No newline at end of file diff --git a/src/geometry/Square.ts b/src/geometry/Square.ts index f2ee9471..b3d6cb0a 100644 --- a/src/geometry/Square.ts +++ b/src/geometry/Square.ts @@ -5,6 +5,7 @@ import {gl} from '../globals'; class Square extends Drawable { indices: Uint32Array; positions: Float32Array; + normals: Float32Array; center: vec4; constructor(center: vec3) { @@ -16,18 +17,26 @@ class Square extends Drawable { this.indices = new Uint32Array([0, 1, 2, 0, 2, 3]); - this.positions = new Float32Array([-1, -1, 0.999, 1, - 1, -1, 0.999, 1, - 1, 1, 0.999, 1, - -1, 1, 0.999, 1]); + this.normals = new Float32Array([0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0]); + this.positions = new Float32Array([-1, -1, 0, 1, + 1, -1, 0, 1, + 1, 1, 0, 1, + -1, 1, 0, 1]); this.generateIdx(); this.generatePos(); + this.generateNor(); this.count = this.indices.length; gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW); + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW); @@ -35,4 +44,4 @@ class Square extends Drawable { } }; -export default Square; +export default Square; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index fe526f99..d7d3a766 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,8 @@ import {vec2, vec3} from 'gl-matrix'; // import * as Stats from 'stats-js'; -// import * as DAT from 'dat-gui'; +import * as DAT from 'dat.gui'; +// const Stats = require('stats-js'); +import Icosphere from './geometry/Icosphere'; import Square from './geometry/Square'; import OpenGLRenderer from './rendering/gl/OpenGLRenderer'; import Camera from './Camera'; @@ -12,15 +14,22 @@ import ShaderProgram, {Shader} from './rendering/gl/ShaderProgram'; const controls = { tesselations: 5, 'Load Scene': loadScene, // A function pointer, essentially + pointsAmplitude: 1.0, + fbmAmplitude: 0.1, + timeSpeed: 1.0, }; let square: Square; +let icosphere: Icosphere; let time: number = 0; function loadScene() { square = new Square(vec3.fromValues(0, 0, 0)); square.create(); - // time = 0; + icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1.0, controls.tesselations); + icosphere.create(); + + time = 0; } function main() { @@ -46,7 +55,12 @@ function main() { // document.body.appendChild(stats.domElement); // Add controls to the gui - // const gui = new DAT.GUI(); + const gui = new DAT.GUI(); + gui.add(controls, 'tesselations', 1, 5, 1); + gui.add(controls, "Load Scene"); + gui.add(controls, 'pointsAmplitude', 0, 2, 0.1); + gui.add(controls, 'fbmAmplitude', 0, 0.5, 0.01); + gui.add(controls, 'timeSpeed', 1, 4, 0.1); // get canvas and webgl context const canvas = document.getElementById('canvas'); @@ -72,6 +86,11 @@ function main() { new Shader(gl.FRAGMENT_SHADER, require('./shaders/flat-frag.glsl')), ]); + const lambert = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/lambert-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/lambert-frag.glsl')), + ]); + function processKeyPresses() { // Use this if you wish } @@ -83,10 +102,17 @@ function main() { gl.viewport(0, 0, window.innerWidth, window.innerHeight); renderer.clear(); processKeyPresses(); + + gl.disable(gl.DEPTH_TEST); renderer.render(camera, flat, [ square, - ], time); - time++; + ], time, 0, 0, 0); + + gl.enable(gl.DEPTH_TEST); + renderer.render(camera, lambert, [ + icosphere, + ], time, controls.pointsAmplitude, controls.fbmAmplitude, 0.0); + time += controls.timeSpeed; // stats.end(); // Tell the browser to call `tick` again whenever it renders a new frame diff --git a/src/rendering/gl/Drawable.ts b/src/rendering/gl/Drawable.ts index d658d6fa..c1dffc78 100644 --- a/src/rendering/gl/Drawable.ts +++ b/src/rendering/gl/Drawable.ts @@ -5,15 +5,20 @@ abstract class Drawable { bufIdx: WebGLBuffer; bufPos: WebGLBuffer; + bufNor: WebGLBuffer; + bufUVs: WebGLBuffer; idxBound: boolean = false; posBound: boolean = false; + norBound: boolean = false; + UVsBound: boolean = false; abstract create() : void; destory() { gl.deleteBuffer(this.bufIdx); gl.deleteBuffer(this.bufPos); + gl.deleteBuffer(this.bufNor); } generateIdx() { @@ -26,6 +31,16 @@ abstract class Drawable { this.bufPos = gl.createBuffer(); } + generateNor() { + this.norBound = true; + this.bufNor = gl.createBuffer(); + } + + generateUVs() { + this.UVsBound = true; + this.bufUVs = gl.createBuffer(); + } + bindIdx(): boolean { if (this.idxBound) { gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); @@ -40,6 +55,20 @@ abstract class Drawable { return this.posBound; } + bindNor(): boolean { + if (this.norBound) { + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + } + return this.norBound; + } + + bindUVs(): boolean { + if (this.UVsBound) { + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufUVs); + } + return this.norBound; + } + elemCount(): number { return this.count; } @@ -49,4 +78,4 @@ abstract class Drawable { } }; -export default Drawable; +export default Drawable; \ No newline at end of file diff --git a/src/rendering/gl/OpenGLRenderer.ts b/src/rendering/gl/OpenGLRenderer.ts index 10b91c61..8c636542 100644 --- a/src/rendering/gl/OpenGLRenderer.ts +++ b/src/rendering/gl/OpenGLRenderer.ts @@ -22,9 +22,22 @@ class OpenGLRenderer { gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); } - render(camera: Camera, prog: ShaderProgram, drawables: Array, time: number) { + render(camera: Camera, prog: ShaderProgram, drawables: Array, time: number, pointsAmplitude : number, fbmAmplitude: number, timeSpeed:number) { prog.setEyeRefUp(camera.controls.eye, camera.controls.center, camera.controls.up); prog.setTime(time); + + let model = mat4.create(); + let viewProj = mat4.create(); + let color = vec4.fromValues(1, 0, 0, 1); + + mat4.identity(model); + mat4.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix); + prog.setModelMatrix(model); + prog.setViewProjMatrix(viewProj); + prog.setGeometryColor(color); + prog.setpointsAmplitude(pointsAmplitude); + prog.setfbmAmplitude(fbmAmplitude); + prog.settimeSpeed(timeSpeed); for (let drawable of drawables) { prog.draw(drawable); diff --git a/src/rendering/gl/ShaderProgram.ts b/src/rendering/gl/ShaderProgram.ts index d1ef5be5..94bde125 100644 --- a/src/rendering/gl/ShaderProgram.ts +++ b/src/rendering/gl/ShaderProgram.ts @@ -23,6 +23,12 @@ class ShaderProgram { attrPos: number; attrNor: number; + attrCol: number; + + unifModel: WebGLUniformLocation; + unifModelInvTr: WebGLUniformLocation; + unifViewProj: WebGLUniformLocation; + unifColor: WebGLUniformLocation; unifRef: WebGLUniformLocation; unifEye: WebGLUniformLocation; @@ -30,6 +36,10 @@ class ShaderProgram { unifDimensions: WebGLUniformLocation; unifTime: WebGLUniformLocation; + pointsAmplitude: WebGLUniformLocation; + fbmAmplitude: WebGLUniformLocation; + timeSpeed: WebGLUniformLocation; + constructor(shaders: Array) { this.prog = gl.createProgram(); @@ -42,11 +52,20 @@ class ShaderProgram { } this.attrPos = gl.getAttribLocation(this.prog, "vs_Pos"); + this.attrNor = gl.getAttribLocation(this.prog, "vs_Nor"); + this.attrCol = gl.getAttribLocation(this.prog, "vs_Col"); + this.unifModel = gl.getUniformLocation(this.prog, "u_Model"); + this.unifModelInvTr = gl.getUniformLocation(this.prog, "u_ModelInvTr"); + this.unifViewProj = gl.getUniformLocation(this.prog, "u_ViewProj"); + this.unifColor = gl.getUniformLocation(this.prog, "u_Color"); this.unifEye = gl.getUniformLocation(this.prog, "u_Eye"); this.unifRef = gl.getUniformLocation(this.prog, "u_Ref"); this.unifUp = gl.getUniformLocation(this.prog, "u_Up"); this.unifDimensions = gl.getUniformLocation(this.prog, "u_Dimensions"); this.unifTime = gl.getUniformLocation(this.prog, "u_Time"); + this.pointsAmplitude = gl.getUniformLocation(this.prog, "u_pointsAmplitude"); + this.fbmAmplitude = gl.getUniformLocation(this.prog, "u_fbmAmplitude"); + this.timeSpeed = gl.getUniformLocation(this.prog, "u_timeSpeed"); } use() { @@ -83,6 +102,55 @@ class ShaderProgram { } } + setpointsAmplitude(t: number) { + this.use(); + if(this.pointsAmplitude !== -1) { + gl.uniform1f(this.pointsAmplitude, t); + } + } + + setfbmAmplitude(t: number) { + this.use(); + if(this.fbmAmplitude !== -1) { + gl.uniform1f(this.fbmAmplitude, t); + } + } + + settimeSpeed(t: number) { + this.use(); + if(this.timeSpeed !== -1) { + gl.uniform1f(this.timeSpeed, t); + } + } + + setModelMatrix(model: mat4) { + this.use(); + if (this.unifModel !== -1) { + gl.uniformMatrix4fv(this.unifModel, false, model); + } + + if (this.unifModelInvTr !== -1) { + let modelinvtr: mat4 = mat4.create(); + mat4.transpose(modelinvtr, model); + mat4.invert(modelinvtr, modelinvtr); + gl.uniformMatrix4fv(this.unifModelInvTr, false, modelinvtr); + } + } + + setViewProjMatrix(vp: mat4) { + this.use(); + if (this.unifViewProj !== -1) { + gl.uniformMatrix4fv(this.unifViewProj, false, vp); + } + } + + setGeometryColor(color: vec4) { + this.use(); + if (this.unifColor !== -1) { + gl.uniform4fv(this.unifColor, color); + } + } + draw(d: Drawable) { this.use(); @@ -91,6 +159,11 @@ class ShaderProgram { gl.vertexAttribPointer(this.attrPos, 4, gl.FLOAT, false, 0, 0); } + if (this.attrNor != -1 && d.bindNor()) { + gl.enableVertexAttribArray(this.attrNor); + gl.vertexAttribPointer(this.attrNor, 4, gl.FLOAT, false, 0, 0); + } + d.bindIdx(); gl.drawElements(d.drawMode(), d.elemCount(), gl.UNSIGNED_INT, 0); diff --git a/src/shaders/flat-frag.glsl b/src/shaders/flat-frag.glsl index 50434bd8..345c34da 100644 --- a/src/shaders/flat-frag.glsl +++ b/src/shaders/flat-frag.glsl @@ -8,6 +8,67 @@ uniform float u_Time; in vec2 fs_Pos; out vec4 out_Col; +// From mini-minecraft +vec3 noise( vec3 p ) { + return normalize(fract(sin(vec3( + dot(p, vec3(127.1, 311.7, 74.7)), + dot(p, vec3(269.5, 183.3, 246.1)), + dot(p, vec3(419.2, 371.9, 156.3)) + )) * 43758.5453f) * 2.f - vec3(1.f, 1.f, 1.f)); +} + +vec3 interpolatedNoise ( vec3 p, float frequency) { + + vec3 scaledP = p * frequency; + vec3 flooredP = floor(scaledP); + vec3 ceiledP = ceil(scaledP); + + vec3 noise1 = noise(vec3(flooredP)); + vec3 noise2 = noise(vec3(flooredP.xy, ceiledP.z)); + vec3 noise3 = noise(vec3(flooredP.x, ceiledP.y, flooredP.z)); + vec3 noise4 = noise(vec3(flooredP.x, ceiledP.y, ceiledP.z)); + vec3 noise5 = noise(vec3(ceiledP.x, flooredP.yz)); + vec3 noise6 = noise(vec3(ceiledP.x, flooredP.y, ceiledP.z)); + vec3 noise7 = noise(vec3(ceiledP.xy, flooredP.z)); + vec3 noise8 = noise(vec3(ceiledP.xyz)); + + noise1 = mix(noise1, noise2, fract(scaledP.z)); + noise3 = mix(noise3, noise4, fract(scaledP.z)); + noise5 = mix(noise5, noise6, fract(scaledP.z)); + noise7 = mix(noise7, noise8, fract(scaledP.z)); + + noise1 = mix(noise1, noise3, fract(scaledP.y)); + noise5 = mix(noise5, noise7, fract(scaledP.y)); + + noise1 = mix(noise1, noise5, fract(scaledP.x)); + + + return noise1; + +} + +vec3 fbm ( vec3 p, float octaves, float amplitude, float persistance, float scale ) { + vec3 total = vec3(0.f); + + for (float i = 0.0; i < octaves; i += 1.0) { + float frequency = scale * pow(2.0, i); + float innerAmplitude = pow(persistance, i); + + total += innerAmplitude*interpolatedNoise(p, frequency); + + } + return amplitude*total; +} + void main() { - out_Col = vec4(0.5 * (fs_Pos + vec2(1.0)), 0.5 * (sin(u_Time * 3.14159 * 0.01) + 1.0), 1.0); + + float cloud = fbm(vec3((fs_Pos + vec2(u_Time / 1028.0, 0.0)) / vec2(10.0, 1.0), 0.0) - u_Eye + vec3(0.0, 0.0, u_Time/10000.0), 8.0, 2.0, 0.5, 7.0).x; + cloud = smoothstep(0.3, 0.6, cloud); + + vec3 gradient1 = mix(vec3(0.5, 0.2, 0.7), vec3(1.0, 0.8, 0.9), fs_Pos.y * 0.5 + 0.5); + vec3 gradient2 = mix(vec3(0.7, 0.5, 1.0), vec3(1.0, 0.7, 1.0), fs_Pos.y * 0.5 + 0.5); + vec3 col = mix(gradient1, gradient2, cloud); + out_Col = vec4(col, 1.0); + + //vec4(0.5 * (fs_Pos + vec2(1.0)), 0.5 * (sin(u_Time * 3.14159 * 0.01) + 1.0), 1.0); } diff --git a/src/shaders/flat-vert.glsl b/src/shaders/flat-vert.glsl index 7d913da8..a6b14357 100644 --- a/src/shaders/flat-vert.glsl +++ b/src/shaders/flat-vert.glsl @@ -7,6 +7,6 @@ in vec4 vs_Pos; out vec2 fs_Pos; void main() { - fs_Pos = vs_Pos.xy; + fs_Pos = 2.0 * vs_Pos.xy - 1.0; gl_Position = vs_Pos; } diff --git a/src/shaders/lambert-frag.glsl b/src/shaders/lambert-frag.glsl new file mode 100644 index 00000000..30fa7a45 --- /dev/null +++ b/src/shaders/lambert-frag.glsl @@ -0,0 +1,114 @@ +#version 300 es + +// This is a fragment shader. If you've opened this file first, please +// open and read lambert.vert.glsl before reading on. +// Unlike the vertex shader, the fragment shader actually does compute +// the shading of geometry. For every pixel in your program's output +// screen, the fragment shader is run for every bit of geometry that +// particular pixel overlaps. By implicitly interpolating the position +// data passed into the fragment shader by the vertex shader, the fragment shader +// can compute what color to apply to its pixel based on things like vertex +// position, light position, and vertex color. +precision highp float; + +uniform vec4 u_Color; // The color with which to render this instance of geometry. + +uniform float u_Time; + +// These are the interpolated values out of the rasterizer, so you can't know +// their specific values without knowing the vertices that contributed to them +in vec4 fs_Pos; +in vec4 fs_Nor; +in vec4 fs_LightVec; +in vec4 fs_Col; +in vec3 fs_Noise; +in vec4 fs_Center; +in vec4 fs_ScreenspaceCenter; +in vec4 fs_projPos; + +out vec4 out_Col; // This is the final output color that you will see on your + // screen for the pixel that is currently being processed. + +// From mini-minecraft +vec3 noise( vec3 p ) { + return normalize(fract(sin(vec3( + dot(p, vec3(127.1, 311.7, 74.7)), + dot(p, vec3(269.5, 183.3, 246.1)), + dot(p, vec3(419.2, 371.9, 156.3)) + )) * 43758.5453f) * 2.f - vec3(1.f, 1.f, 1.f)); +} + +vec3 interpolatedNoise ( vec3 p, float frequency) { + + vec3 scaledP = p * frequency; + vec3 flooredP = floor(scaledP); + vec3 ceiledP = ceil(scaledP); + + vec3 noise1 = noise(vec3(flooredP)); + vec3 noise2 = noise(vec3(flooredP.xy, ceiledP.z)); + vec3 noise3 = noise(vec3(flooredP.x, ceiledP.y, flooredP.z)); + vec3 noise4 = noise(vec3(flooredP.x, ceiledP.y, ceiledP.z)); + vec3 noise5 = noise(vec3(ceiledP.x, flooredP.yz)); + vec3 noise6 = noise(vec3(ceiledP.x, flooredP.y, ceiledP.z)); + vec3 noise7 = noise(vec3(ceiledP.xy, flooredP.z)); + vec3 noise8 = noise(vec3(ceiledP.xyz)); + + noise1 = mix(noise1, noise2, fract(scaledP.z)); + noise3 = mix(noise3, noise4, fract(scaledP.z)); + noise5 = mix(noise5, noise6, fract(scaledP.z)); + noise7 = mix(noise7, noise8, fract(scaledP.z)); + + noise1 = mix(noise1, noise3, fract(scaledP.y)); + noise5 = mix(noise5, noise7, fract(scaledP.y)); + + noise1 = mix(noise1, noise5, fract(scaledP.x)); + + + return noise1; + +} + +vec3 fbm ( vec3 p, float octaves, float amplitude, float persistance, float scale ) { + vec3 total = vec3(0.f); + + for (float i = 0.0; i < octaves; i += 1.0) { + float frequency = scale * pow(2.0, i); + float innerAmplitude = pow(persistance, i); + + total += innerAmplitude*interpolatedNoise(p, frequency); + + } + return amplitude*total; +} + +void main() +{ + // Material base color (before shading) + vec4 diffuseColor = u_Color; + + // Calculate the diffuse term for Lambert shading + float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec)); + // Avoid negative lighting values + diffuseTerm = clamp(diffuseTerm, 0.f, 1.f); + + float ambientTerm = 0.2; + + float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier + //to simulate ambient lighting. This ensures that faces that are not + //lit by our point light are not completely black. + + // Compute final shaded color + float screenDistance = length(fs_projPos.xy - fs_ScreenspaceCenter.xy); + float distance = 2.0 * length(fs_Pos - fs_Center); + float multiply = mix(screenDistance, distance, 0.2); + + vec3 cameraPos = normalize(fs_ScreenspaceCenter.rgb - fs_Center.rgb); + + // variation of IQ's cosine palettes + vec3 color = vec3(0.7, 0.0, 0.6) + vec3(0.3, 0.3, 0.2) * cos(vec3(multiply * 1.5) + fs_Noise + vec3(0.0, 0.43, 0.57)); + out_Col = vec4(color, 1.0); + //vec4(vec3(length(fs_Pos - fs_Center)) / 2.0, 1.0); //vec4(vec3(diffuseColor) * lightIntensity, diffuseColor.a); + //out_Col = vec4(fs_Nor.rgb, 1.0); + + //vec4(vec3(0.5*fbm(vec3(fs_Pos + vec4(10.0)), 5.0, 1.0, 0.5, 1.0) + vec3(0.5)), diffuseColor.a); +} \ No newline at end of file diff --git a/src/shaders/lambert-vert.glsl b/src/shaders/lambert-vert.glsl new file mode 100644 index 00000000..3496f1ac --- /dev/null +++ b/src/shaders/lambert-vert.glsl @@ -0,0 +1,150 @@ +#version 300 es + +//This is a vertex shader. While it is called a "shader" due to outdated conventions, this file +//is used to apply matrix transformations to the arrays of vertex data passed to it. +//Since this code is run on your GPU, each vertex is transformed simultaneously. +//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time. +//This simultaneous transformation allows your program to run much faster, especially when rendering +//geometry with millions of vertices. + +uniform mat4 u_Model; // The matrix that defines the transformation of the + // object we're rendering. In this assignment, + // this will be the result of traversing your scene graph. + +uniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix. + // This allows us to transform the object's normals properly + // if the object has been non-uniformly scaled. + +uniform mat4 u_ViewProj; // The matrix that defines the camera's transformation. + // We've written a static matrix for you to use for HW2, + // but in HW3 you'll have to generate one yourself + +uniform float u_Time; + +uniform float u_pointsAmplitude; +uniform float u_fbmAmplitude; +uniform float u_timeSpeed; + +in vec4 vs_Pos; // The array of vertex positions passed to the shader + +in vec4 vs_Nor; // The array of vertex normals passed to the shader + +in vec4 vs_Col; // The array of vertex colors passed to the shader. + +out vec4 fs_Pos; +out vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader. +out vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader. +out vec3 fs_Noise; +out vec4 fs_Center; +out vec4 fs_ScreenspaceCenter; +out vec4 fs_projPos; + +const vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of + //the geometry in the fragment shader. + +// From mini-minecraft +vec3 noise( vec3 p ) { + return normalize(fract(sin(vec3( + dot(p, vec3(127.1, 311.7, 74.7)), + dot(p, vec3(269.5, 183.3, 246.1)), + dot(p, vec3(419.2, 371.9, 156.3)) + )) * 43758.5453f) * 2.f - vec3(1.f, 1.f, 1.f)); +} + +vec3 interpolatedNoise ( vec3 p, float frequency) { + + vec3 scaledP = p * frequency; + vec3 flooredP = floor(scaledP); + vec3 ceiledP = ceil(scaledP); + + vec3 noise1 = noise(vec3(flooredP)); + vec3 noise2 = noise(vec3(flooredP.xy, ceiledP.z)); + vec3 noise3 = noise(vec3(flooredP.x, ceiledP.y, flooredP.z)); + vec3 noise4 = noise(vec3(flooredP.x, ceiledP.y, ceiledP.z)); + vec3 noise5 = noise(vec3(ceiledP.x, flooredP.yz)); + vec3 noise6 = noise(vec3(ceiledP.x, flooredP.y, ceiledP.z)); + vec3 noise7 = noise(vec3(ceiledP.xy, flooredP.z)); + vec3 noise8 = noise(vec3(ceiledP.xyz)); + + noise1 = mix(noise1, noise2, fract(scaledP.z)); + noise3 = mix(noise3, noise4, fract(scaledP.z)); + noise5 = mix(noise5, noise6, fract(scaledP.z)); + noise7 = mix(noise7, noise8, fract(scaledP.z)); + + noise1 = mix(noise1, noise3, fract(scaledP.y)); + noise5 = mix(noise5, noise7, fract(scaledP.y)); + + noise1 = mix(noise1, noise5, fract(scaledP.x)); + + + return noise1; + +} + +vec3 fbm ( vec3 p, float octaves, float amplitude, float persistance, float scale ) { + vec3 total = vec3(0.f); + + for (float i = 0.0; i < octaves; i += 1.0) { + float frequency = scale * pow(2.0, i); + float innerAmplitude = pow(persistance, i); + + total += innerAmplitude*interpolatedNoise(p, frequency); + + } + return amplitude*total; +} + +// function from demofox.org/biasgain.html (linked in slides) +// Assume t and bias are between 0 and 1 +float bias ( float t , float bias) { + return (t / ((((1.0 / bias) - 2.0)*(1.0 - t)) + 1.0)); +} + +void main() +{ + + mat3 invTranspose = mat3(u_ModelInvTr); + fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation + fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation. + // Transform the geometry's normals by the inverse transpose of the + // model matrix. This is necessary to ensure the normals remain + // perpendicular to the surface after the surface is transformed by + // the model matrix. + + vec4 newPos = vec4(vec3(vs_Pos) + u_fbmAmplitude * fbm(vec3(vs_Pos) + vec3(0.0, 0.0, u_Time/60.0), 5.0, 1.0, 0.5, 1.0), 1.f); + + newPos.y += u_pointsAmplitude*(0.125*sin((u_Time + 56.0)/60.0) + 0.875)*1.0*bias(clamp(dot(vs_Nor, vec4(0.0, 1.0, 0.0, 0.0)), 0.0, 1.0), 0.04); + newPos.y += u_pointsAmplitude*(0.25*sin(u_Time/45.0) + 0.75)*0.5*bias(clamp(dot(vs_Nor, normalize(vec4(-0.5, 0.8, -0.5, 0.0))), 0.0, 1.0), 0.04); + newPos.y += u_pointsAmplitude*(0.25*sin((u_Time + 4.05)/45.0) + 0.75)*bias(clamp(dot(vs_Nor, normalize(vec4(0.5, 0.8, 0.5, 0.0))), 0.0, 1.0), 0.04); + newPos.y += u_pointsAmplitude*(0.25*sin((u_Time + 35.0)/40.0) + 0.75)*bias(clamp(dot(vs_Nor, normalize(vec4(-0.5, 0.8, 0.5, 0.0))), 0.0, 1.0), 0.04); + newPos.y += u_pointsAmplitude*(0.25*sin((u_Time + 56.0)/35.0) + 0.75)*bias(clamp(dot(vs_Nor, normalize(vec4(0.5, 0.8, -0.5, 0.0))), 0.0, 1.0), 0.04); + + for (float i = 0.0; i < 10.0; i++) { + float scale = 5.0; + + vec3 noisyDir = interpolatedNoise(vec3(0.0, 0.0, i), scale); + + vec3 moreNoise = interpolatedNoise(vec3(0.0, 0.0, i + 102.0), scale); + if (dot(noisyDir, vec3(0.0, 1.0, 0.0)) < 0.0) { + noisyDir *= -1.0; + } + newPos.rgb += u_pointsAmplitude*(abs(moreNoise.x) * 0.5 + 0.5)*(0.5*sin(u_Time / (15.0*moreNoise.y + 30.0) + i) + 0.5) * mix(vec3(0.0,1.0,0.0), noisyDir, 0.5) * 0.5*bias(clamp(dot(vs_Nor.rgb, noisyDir), 0.0, 1.0), 0.04); + } + + + newPos.y += sin(u_Time / 60.f); + fs_Center = vec4(0.0, sin(u_Time / 60.f), 0.0, 1.0); + + vec4 modelposition = u_Model * newPos; // Temporarily store the transformed vertex positions for use below + fs_Pos = modelposition; + fs_Noise = fbm(vec3(vs_Pos) + vec3(0.0, 0.0, u_Time/60.0), 5.0, 1.0, 0.5, 1.0); + + fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies + + gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is + // used to render the final positions of the geometry's vertices + + fs_projPos = gl_Position; + fs_ScreenspaceCenter = u_ViewProj * fs_Center; +} \ No newline at end of file From 6eb1099c140d72d3665ef8cf73b7ba6bdc53e06c Mon Sep 17 00:00:00 2001 From: terskayl <97208428+terskayl@users.noreply.github.com> Date: Mon, 23 Sep 2024 23:55:52 -0400 Subject: [PATCH 2/7] readme --- README.md | 75 +++++------------------------------------------------- image.png | Bin 0 -> 156590 bytes 2 files changed, 7 insertions(+), 68 deletions(-) create mode 100644 image.png diff --git a/README.md b/README.md index 1a7646c7..d086802f 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,12 @@ # [Project 1: Noise](https://github.com/CIS-566-Fall-2022/hw01-fireball-base) -## Objective +## Fireball -Get comfortable with using WebGL and its shaders to generate an interesting 3D, continuous surface using a multi-octave noise algorithm. +This is my fireball: +![fireball](image.png) -## Getting Started +I pulled out a bunch of points on top using similarities to a dot product for randomized directions. +I used fbm to create smaller noise. It also influences the color +The color is also influenced by how far away a point is in both object space and screen space from the center of the fireball. -1. Fork and clone [this repository](https://github.com/CIS700-Procedural-Graphics/Project1-Noise). - -2. Copy your hw0 code into your local hw1 repository. - -3. In the root directory of your project, run `npm install`. This will download all of those dependencies. - -4. Do either of the following (but I highly recommend the first one for reasons I will explain later). - - a. Run `npm start` and then go to `localhost:7000` in your web browser - - b. Run `npm run build` and then go open `index.html` in your web browser - - You should hopefully see the framework code with a 3D cube at the center of the screen! - - -## Developing Your Code -All of the JavaScript code is living inside the `src` directory. The main file that gets executed when you load the page as you may have guessed is `main.js`. Here, you can make any changes you want, import functions from other files, etc. The reason that I highly suggest you build your project with `npm start` is that doing so will start a process that watches for any changes you make to your code. If it detects anything, it'll automagically rebuild your project and then refresh your browser window for you. Wow. That's cool. If you do it the other way, you'll need to run `npm build` and then refresh your page every time you want to test something. - -## Publishing Your Code -We highly suggest that you put your code on GitHub. One of the reasons we chose to make this course using JavaScript is that the Web is highly accessible and making your awesome work public and visible can be a huge benefit when you're looking to score a job or internship. To aid you in this process, running `npm run deploy` will automatically build your project and push it to `gh-pages` where it will be visible at `username.github.io/repo-name`. - -## Setting up `main.ts` - -Alter `main.ts` so that it renders the icosphere provided, rather than the cube you built in hw0. You will be writing a WebGL shader to displace its surface to look like a fireball. You may either rewrite the shader you wrote in hw0, or make a new `ShaderProgram` instance that uses new GLSL files. - -## Noise Generation - -Across your vertex and fragment shaders, you must implement a variety of functions of the form `h = f(x,y,z)` to displace and color your fireball's surface, where `h` is some floating-point displacement amount. - -- Your vertex shader should apply a low-frequency, high-amplitude displacement of your sphere so as to make it less uniformly sphere-like. You might consider using a combination of sinusoidal functions for this purpose. -- Your vertex shader should also apply a higher-frequency, lower-amplitude layer of fractal Brownian motion to apply a finer level of distortion on top of the high-amplitude displacement. -- Your fragment shader should apply a gradient of colors to your fireball's surface, where the fragment color is correlated in some way to the vertex shader's displacement. -- Both the vertex and fragment shaders should alter their output based on a uniform time variable (i.e. they should be animated). You might consider making a constant animation that causes the fireball's surface to roil, or you could make an animation loop in which the fireball repeatedly explodes. -- Across both shaders, you should make use of at least four of the functions discussed in the Toolbox Functions slides. - - -## Noise Application - -View your noise in action by applying it as a displacement on the surface of your icosahedron, giving your icosahedron a bumpy, cloud-like appearance. Simply take the noise value as a height, and offset the vertices along the icosahedron's surface normals. You are, of course, free to alter the way your noise perturbs your icosahedron's surface as you see fit; we are simply recommending an easy way to visualize your noise. You could even apply a couple of different noise functions to perturb your surface to make it even less spherical. - -In order to animate the vertex displacement, use time as the third dimension or as some offset to the (x, y, z) input to the noise function. Pass the current time since start of program as a uniform to the shaders. - -For both visual impact and debugging help, also apply color to your geometry using the noise value at each point. There are several ways to do this. For example, you might use the noise value to create UV coordinates to read from a texture (say, a simple gradient image), or just compute the color by hand by lerping between values. - -## Interactivity - -Using dat.GUI, make at least THREE aspects of your demo interactive variables. For example, you could add a slider to adjust the strength or scale of the noise, change the number of noise octaves, etc. - -Add a button that will restore your fireball to some nice-looking (courtesy of your art direction) defaults. :) - -## Extra Spice - -Choose one of the following options: - -- Background (easy-hard depending on how fancy you get): Add an interesting background or a more complex scene to place your fireball in so it's not floating in a black void -- Custom mesh (easy): Figure out how to import a custom mesh rather than using an icosahedron for a fancy-shaped cloud. -- Mouse interactivity (medium): Find out how to get the current mouse position in your scene and use it to deform your cloud, such that users can deform the cloud with their cursor. -- Music (hard): Figure out a way to use music to drive your noise animation in some way, such that your noise cloud appears to dance. - -## Submission - -- Update README.md to contain a solid description of your project -- Publish your project to gh-pages. `npm run deploy`. It should now be visible at http://username.github.io/repo-name -- Create a [pull request](https://help.github.com/articles/creating-a-pull-request/) to this repository, and in the comment, include a link to your published project. -- Submit the link to your pull request on Canvas. +The background is made using two gradients mixed by fbm noise. \ No newline at end of file diff --git a/image.png b/image.png new file mode 100644 index 0000000000000000000000000000000000000000..4ed56c927e70e98b5c845f6b757f0edc45ed5391 GIT binary patch literal 156590 zcmZ6ycRbbq`#&y{L`KTaNfJtqkM1;zAY-PsDI5;TVIXM~GoC={LdykA`o#PxL zdt@Ga9gfZSXuLk}-|r8{?L5!zaXlW_zF*hldPY3bRzH7^^Be^Q#d(eU_w*_F5J`7nNlpGv`{KS4go1*h>E!QJ zt80!81;ufe#y#c7-sVe(gXPX9@nbY^O1FhvE=yl^c^ugmE*z(K^C-S*@#J6@$zT)>G~?DPn7LDRJAdPPAoI^-yMGG%tSW0W$86;jdu zkutl)U(73Q^llGG(C7Q%y*$l=Az*PW(R)veL>&fPhO(bAW>fCTwH2Rs|1P`P%UzGY zDy8U}_^YPSX1f8rJBv2@$8a-Um>K)_%`qS4IyVjlvu{dYFw<3aA4=6Jh?A zDC>KRb&XQ{ut>gtPl7A@md3t;zZe~|WB5d2O85VxFp0L&fG zblcXLyNNmyLT@S9E+O=raci4HTB*WEE z(BxvZHYJh;mlV7*b?1#4^Op9Rw~$P?|of&xoG_){8Yi+*H2))#F(tZOz+gj&^Pm6h%!?ReI%zH5y``zA?bg5 zXijF!mf2`aEjIFhWj=ZM8pb2R2717IjZSdw{iDgLVhc*Hqv$3-yoi+XuJfe=d&T>V zE@6EBNkUR#@@&HWFUy}kUrR2|6z6BT+n0MG_-QPwA}Q^k-q%Yi8qv`L%C+|yjr@AQ zqC{5iCcBD+P9IN7IN<}$r}(AxZ_$@rmxxWzp?a(@%Qv#O;#|{hqQ-xE;WSf4oms4$pG|aRhYzf@0>~`8KEqDo9 zd(L9%!Qqv|>(xNzuTfzBL|=Tx&jZcLm1smiTIMAp7o)-|t1rA|`>J`{$hPch88E2M zcJ>P2b%RBl9l2?DN0*;MzBu>Ve@0v*y0nrbvw>&`@#xTB6l$gRtoLEWrl%L$`oW(E zz7pdu$H*(C&X^`7?N1e$0w4M5H(1L1rX*L6godl0YEGFKhTKtSQvJLTqy}iso2ntU z-rEzwr2m9Sc^&g%Z~bLxQZGm5Du}nkvaD(j%=3Dmp}o_g!TJR&xIcomicQ|(6(8Ld zqpu6-FPwN4RwtHI3h$UVI85bWP>rPKgkqbCVV~W2ArQ2z&*-nsq`N-mX6}zuSlZ@3 zGD>)`9WA2I$5?CN)`U<8M?|DtMdza*=`d zYp7qNyj1$hV320w8SthiW*1F`Q5OW7GW+i{?@f8Bmvco4Sf`dQ{`aD|KT z80k}^+Ame6z_DaDsewI%H#IV^U!QY&3wkD4)}{3F!4RUr2n9L!CvJk=$kI^>rzj|2j;cFNCzSUgC{USsTkmgZkSId5}p zBb<|VQ}~79U2O93?$67HABsg|RAaG0>A`hIoA1r`8-7SxaadF>W)R zrpe@ua97x2{u`LLY*SVb9h1{kxt7BO)p`G(5jD5w;)#f-tO}RZ^j?29uv1FVeDi(w z$Nlx7TFjp$I_dD?gogFn*D(+)=GIowAwn!4D%P0e`pSfO#ed=ePI(u%oT)8ar)J$r z$8wiO*y54>*z5yUO_lQAs_T3LQ<6{Hbul%`O32Gzsei0)eKO;OCimpWL13^t*Rcd# z65h!+{VuD1h3Y^R8A336;x6@BP8QMQTxR2^18FIlx8Qzcwu*gb;$QKTebp7QS;xsg%bit!^i?$=Po47R6xa2 z>X=QA{e#>6C#nz}{Ns>M>$14D#TR=uNuBri$}GmPZOafZ93C87$o&|Siw_CUtK18v zk6&b3|M^*Vc&yc0Ea6+tEkAcc$BM~HpA-&M{*bb)vRU%)lf_!w1Ls;vYnkTVpQ7h?kZblC9H2xMrvCJl68B}Q@pr!1iX=&oFWW4 z2OEt~m6$DTqgI@UDm`bFr%#cnG~ZnQtBze&G_zYs+g*+yB3o0GD5c;CKovsel|JKs zmjr};PLCN{*w=)O6ExQ}BU4F6}!oKKu*NB;&klXGA*)+6A`QMlx{wk7hlG<|I zGWn?3oc;su^;wu8B9VtWCY`F1Qvxp`dYBr3&X(N&7ocm{mp}*7WGlwg9^z;=uV*(> z+psDW4Y*ynP|16Db?U1Cho+(riY;@bRn_f}D1w=QH^{;ez>B~y2zf-XQ~;=JluSsYjwl#p7LpQl(4sV_tfd`^hFS2O+{TORLkqt<9N`}!Jbx;r1sw< z1@D~fK`(#0X5iIb%Zo}yZQa%@K~IVLG?rm#D_ZrJ;DmR#Q2!mM{rzNHsm0+%WVQHb z#8vf+%3T{@#Dv4Uq|foaWd(O$(o$u?Qpv;+gO?Ca|0FdTtAdVZi}6rCrIi(uyHMF@IGY%G ziTNA&!+LzL*p-cHm$+|3|JY{&UZCMcLl|$c7^R6q%N(mE6kyMoiN`#l=<^q~H`Je0 zM;$+D87|!Ys=N|4l-sU<46rZy&P>fH;0#Yi*C+xBvxb+{{H`bYPW(BKGyt3JC z*b_$FQ_k4egt!9Vzwg$J{B}{h&%gh{U03%TSgiQ1*}xU%e_Wg2HxHa_i#4g$RS=b0 z#paOu+_O0-iB6YTK2_foKQjja#mf6B^1m#Xz*WoXWn=B)Z0~%MDqg6)noWy5Zyp>jFX_{L>eh#4>-Z^*A<)X3TPjfJ zKOy385-zHH&nu1AcGb^DtDbHXrd+bt!gDN6K0{u;-y&Fv9hA1ps1G+2O4eHJf?t^j zZqBUOOMZf^8~&4liUMG1>`=rt6U?6|HK(wA;*mvKd(D+_do9Xk)zwkY2&(2{;!1S zkN^GXf2)fA_@KA{L>kQ0e}SCc{~gaQZxFUR-q-K&e@|fDY5!YikbUsqZ{dz_{=X$i z-M;I*^#2h1|1Di2|Gt1@{!fmk;FpB(e>?N$(^hwWBIl%kC(Gv*M7$Sv@A4eql@8DZ zfBBE^=1Wv)B!^F9Kufh+%`vY2Bsu=Kh$Z92>y7Zbr+oi+$TKS}mhz6-&fCtTvj1~- z#0nV<{FPj@WMI8m(NE9uBeF~UA2svSkFW!wN_okdJZMJFmcAW{{}I)CO_7LqZ{36V zI}Ag(FWfsH=@p8(u~|&8JhlJyffo|AvXS2kMLj|zbMl8ch63Hv7E#aw6LP814kDZ~Dv@h;%Tu8GbqaSZ$1pcbSTu%aZH19A+B%je) zj_GXn+xLE>v1S47^tOqY!d%M-2KmhR5ll(;`AD9@7Ozr!rDU>X*Gt$@(o@kWjXs=q zP1@wPIxY$uHqKcISbjCQwl1x)Gt4L8yxn=6{g(?F#(3_cwMTSJQ{$;~09nZ|do-9r zP4CarZL!~{iwZkH$5O-%^3LJ*optzrxZ!LAuJX!BLLh6S+2gtnJf=6)KBcmt@X0+x zJgrEw7wxPW{vp0kh}*9c!CYU_=B9fP`)MVc;5-`4G-=ed-KKtc?-WsfL16c&%9PM6 zG88HMjU=HtUeG_dLm!s#rs|KCR`jjKJqNiZ=Q+pA>MXuoaGUM)m>PiFdyi>T1BZ_H zrx2;qpz^JcwhAH`XnFs$rFGao=rFEyTxnJ=+V?g*Zg@X!{e%5cjZ%5V63ASHZ7M#i z4FoO;q%qfqo2IJgm^3?qeU=e5MZ>Sn_8 zYGC(V6rL!w#KLEjAkRPOIL~Ps`F6;Ga((oQyO62Gc=fWV)-4~`eUccS)^XeSnDMV$ zG*5}4{GZ;`(d{v?p4x0ZoSE@vJ$LIBo>+ZH#pLFTg+`{0PQV={|5lJw|1Jv^`yaya1+#b)` zQ6C*ruREc8G_ck8<`Cts%I* zIywg>eONBob5Ig#QeB%0MdE^nXiTkSPSk?zg_Z5cTYQ3;f)RMXgi>q_`Io3+jvvc&_Z9?G{w78c#YM}Jad)|dAup}yRHQ1vqb$NcC zK@ZafNgq~BKGdVKo!vyDRqAm(&w#Z_!g?M@8|b)o=A$z;@hOPY1k$%#Ch`GqGUija z1=^R{U)UJld&YL0fVm7&0d*X(EfXY(MHjpwgHF#GkNs#c8&UB!`tVFG=bZ#kgD|TB z&)rWGMxl*QJ%%(&6V`iq2_MgHZ6Z^*yw_{q|Ms! zcMvqgJ_gIaR>_l*ZTf9JIa%zb1E!k|uO`y*WgqI8vY@d}4S6`h{iJm{<;&ie(|1vj ziu^^%vF(~bn3!p1FF`>SE{P*(u|&bgDE#M{~rTT**lBDyRbD~IcDt$Mon5C(SM0QtNowg{i4l#QdF>R6VetGH}j`HdV!>vy7(uwNu`4wzYVwTg< zH5s+3#8Y?X@HHiNuR!n1df`YFXdb`yna|H?7Qolw6m5(1|FkQ=7R4bVpTIOZFJWH1 z^|Si$fj>9y({>5x!@Hsk2F>93$2nxIK3Mnebg7 zHs#y4X(K#!#X9)uSbU0S=M}^93DrK&v9i^v0zd8N{k5edA5RsS(g!bDtQalps5&pD*-80-d3qOCnbp0hFkQDbhZ0^8GTN(uj zKoGDxUpm0xyuEgGj|E`6vC>Nrxky2?=o{3c4zJ z9QB5|9*6j=bus3((6o(i1Z62U3GP7;*e@Ahyx)gO>MvffSq4BT_6FK2nqCjG6$1&A zgy*nrind*zZR_i;W_F{o@Ul(a*$clxR)5IoN!>b0J*{E>%WS1+H`dxb#qx>LX4P1U zy#vGE`pyBxjHgRS1 zpx;VGda>LAM=83>Uc$yzY9?{+VKI{}Bv&nL9s3ln%h}Y}WV(<3hcN*uOCmfb-8#Ws zCm?83*X^Du)kdS2X=W6rYhqQ_<%hK4utz)s4{Br^i1kjoMc{$BS5A3}JOdKHnDyHy z(fqp0(7_c4;p_b|E8glc|LAsv3{7@b1n!vCdpoU@Q~@wV*AFl z{l(wHQc-}CWo3})){WtD-}#Z^-2A0(Ya(2 z2~F#-r;a9Bfds5G1jVl%x3csf9>4nL7Fenz+K@L_W@0_O_8s{wD%F&+g`61@R|4iU zOoxIOo9gy7qOL7g{01OQlY3++UD4=d#@-}7R1x&vyt!YV{eq8pnDIghuQ)ujZYHI@ zl6{nuMvd7jJf??^HPF4LVmH8tzPbo;2Op!(s^m~ScKQK#$$Ns2ja#s%3tQ<2ywrVK zcHR$_IkJ#Gf05X~u)Jbr$)5lwOSEP{7#NU1v$+w&*;$`7LCt(orRa_d*t{e=6}V%s zlvh$dusY6mDr2d@CXTOcuzstuIl9o5W1oC$G8pgk?g}54>oE)<^*P(@`oGo%4{~(% z;AZ_%j=_Bu(^F+4WeIG%6h3>WUS8BJ%2APBkK)7D0MYRv+W=kII%N%F< zx-n;pIKtuaz`vD)K~Rkz%VhGa*9}E!#z@Z#x3;W%y5_tNm)eG!e(;pAw2`{pyO`|d z<>d=2A)pdd9v@JVsCb2z<<(ZF^7XdK&LU?d*S{WbK27!bQT<8rb3>R;7*0jbV7Pi> z!$wm@&~(>9-<8_#)pd7)_P41)Z+QOIM<`)3_BXY5uzY=sjzhmNW7M#nsy~by{kEwO z=N{#z6S-|)p&slNg{Zz?G_exX+bZ~Pr4E2x>EzQAFLN{{9}2(CL{hUH>1Jb-uSN>Y zXOBWU7%S|?3I?B1^?Vu^$gRAR^+)|G;n~XOGqi5#_G+<#mW;95SFH6yKe+rQPS=a+ zartXb4;*Yst7F4P4xD2oZl~alA(x4>;w^G-jn8U4X8&7Dh3iC)x*q>7?AVH*)O^1T z=p`=79Nf?zp`NT)j45nWcUm{$zYF-WHScoazw^RJU2|owHuFhb605qWY-3p+oF*5^ zC+O4F55e|Nkpgit7UQR)B-zFg(~e6~=+AREulp;y zC3SM>NvBPyd<&!wG=DU}Sx(?jMTb*xs++hHJHZpLSmo}OM^kM$DwUXOt44hWMtHPs zC6)0LxQiCk!_?SyZdp4a5Hje$?dD)6Lg9XAz;1ub&sZjdbhk>s?hxV(m|bUq|Ms`x zSYJyK`=KG4eNs!t9?jy9d$+6-SJ24a@}~zk)hAY^#3!YV24>UmrE4OB+Qdr9_&sys zPh1IKY*~>$=0AaUI1U{HIIbNIQuSOjYwLS0_5cwib1T@!tNbtr#%jjHsBuT*znO;sJ_ z4x=X&;7mXYeZFt?{)At*O9O|YC-tR5*mNzYupOdWre*Z9Y87Ltc}GdLt2O=UEhihz zzjw~2&Ytz_z>^yS@1u1Uwd2oPLjFq(xxS~ay;K+pc(xmUUa7_F;ESY&!%uzp-z9J` zlL6}qb3l4?dgb;;_%)-YJL^<(T!-j#IAsKz_FE*YtFQTfTlpPn%7qM+HRPp1olUX7 ze5VuMOLDnm%~|y?86CFYGU6TPe_h!{ahV5{Go>9P7-cOkKtq>;FdO6(`#ln zEOMF1ztuuvjiDjc&WHwh6t0B4I&D05>UFx?o|r3k`6KJKvK-wMq1mKaQhZ{aaRL^T z^+B5Bc>keKuD}z(v`kbRH|~uG*CJJ(f9+WtM7Q#mdVTWEOab9TjfJNEDcI#d9_{Tm zc(?~X*drxXF-=lWXqczY@~^5wW<$i#Qd=8U4!L)eXRga#qo7fcj#&?$LV=x3~LE`^=2|({1c8 zQd&V2`=qASQoG932R`o0Um5$=WW!8LDzp)+!*peKBc_o}ZAX98FMx(@I~C#zxR5D# zt=iM7D9)`Kh(+MpW#dNn$K!GtxRR0>=;MXqN{av+4Lb%6XD1domoC$M2*V~{Y!{)7 zU>o%uhUy+C(9!J%tvQR6n#N$uD|uFWdjsF%UwN1Iq zG3p&cOU!;C2@3Lvn2SbXXr6$7wOR;UdeGmUh1|Jiov$yc*FG@!+X0*5Cml%zag652 z-X(Dd;z!3jUs@ItZEzh54%f}H@Xi9ZSokzw>gb2YafS+f&DqI_u##FP zt131vwJ4ALnURvY?3Ip6?7o25c%50SzR$TBwJ9c&h`!lt=S4iYy<93Zab@4HnWHm) zn9F@>0JkBV(rSGqgL{$Myx#Z~kub7ymq7+jpu(UbuL({HI>I(t43$_+KYjYQ!ply- zgYcv(`C5iIT`-~cjuj8^YtH%cIr}xe(G67Cn?l|#)pQ92T&_TJb?wbo%~_FL5>Y{t zbzMs$gsmuZ!NwV=xR`2#3Fww`c0ML0jwB$A$ALSY1fP~&cCXlJv}bLXon6$t)K6U1 zTrrZl-W&DQ{T0!@Mx8K$uobag=G6~s{E4enYp~iG6wgrQ4F=u6*u}1?Bcs9qyq*Qx zuT&HC3`SU;<*6RE+`gQcPEwwJal6Gx|IawfWJke%>2dLic1+^gp45yO_W*Z!VrS+s zVC=F<2A$FQAnQV&(bU6)@ji?_2$V4FZ)c>G)zqeVKP{k(XvI|kpdXfS7?9#HQAAqc zyz}+kk9+Ghfjrml@)6I9w`|SJH;MIqu&RT;JIDWv8m=We`sAf--3oB7q-tEwjxiv_ zUuuk&5_U0rA&obq;1blOCsr}H>UY@lW+o$1a+11Hk;Cv4s>k*t)gBw43~s45)itY~ zdwUqOV0K;sl@|w6%?Cs>J%6{m`0?t4>{9=1HCD;5tDsGz>0cwGgoU<@aUM5;vs|^; zmIOoJem*Jc$Y7&oW%2jb@jGkNxuBW>fSm1)!1&t?oz81d_};Auu36jOW0kGDy7|)< z`RzMByFHhed!~|PkM4oY7j*QRDvqLRS5Xbd0f>Koa1+~?44?dC2+(_ELkO<0>-`w0 z)N%PD5Aj<{;JU|!Dn%l8-|eoQHT)`U!U@LPD+% z1;V1f>|A8I8TLoi$^(baz$jrIwG)5+PIolK(o>m)`skVHKcPDR;)y_mcY-b5EX}ME>6l!gr}%PJBe4Z#!ajFc zQNzy;1F~tsL;7N;-7gx3A{A*n(QCM`MM1D#w)Kjs-wZa}4je8YPmLdWzhhQ3Pe^%D<-T4!IVyC9q$RI)`T%Zxkc7*Cxe_|Fk`cdY!IQ7f2^{uow@(+F1Lt@bE z{;Ju8%+y&+^A@uLI%AasYU!MLcf+pqG|OHVwpy*c%*xz69ndf zg>AM^4=oL5D_^FlGO=pw0id!j8@C9`M5Q@`o9>_ah``ZrN5tO(st`d~DfgRd+{B#c zLk2Iao-;TQi)1yT7b?uXBmVOKECnfZ$8k*IOtRgC5jZfhKvu!K&<}c%`HzE>uO@Sdy$m;P8iKsITB0dFK=SAdn4UvP%swY5i z^5km$50=b|`rrM)G}ul-3G3ddlVeh(6KGchk5W8|Bw;z!|jF z3m<+~-*H%Pg0t-=m2v^hF~~v?t9VOKIb*!q{bwSq5(yqNqc>j6R&g?Kv-|0T_{A{& z@I5K+iA_`T8Lg}2j#*OK(Ufe*maojl*uBsNU}Ov0^S$Plw3dQH0rS@ z7Ki=hGZCPIvmoxW*W}o+6ya1ARn$DI&ommzAItpx?=90S2@Gr)6jLtIBq}k zrnQli7Tx6=J~z~arC*X1p9PznksDxXNuU?FePLsN@h2&JYl*XG@~L_>0eO?fPa(Ji zB9rTn`IPaZux*7FzcC$D;RG@L#Ze))n~?l-iJ!krYw;$?6@R4g=*=E&*-ZJElCQ*> zBpib-6LD$S^`v`>OVLz%ta5e}9TRx7YCOqI*G(oG5C&Ybr$suAAV+vzqX!mgZd z%+~p-zO|3%k`nfyn6{)Vc}V=1&q#be|62b{^k&pd3n|KFLFn!(o-LlS)qSv}RW1a9 z@9Az;0No-)l?pzVCs1v!`p=;DOJfST6(mCYBW`fl2gDNz0VIXh#gm{Ko&+OY)7&WO z@G-%kU!G*svmwNKM1>KXcy zt1h}l$2Xl{vfZeUp6y_cYqlv`Z~+P4F{`}R^4`(OY~OghQE8rF$F96A#@c=LyZCji zb2KKrbim6+B1!IiLN33NOPe#eWxjCs6|)(^Sz@)Dj`S@c-G;%&tfQ_FJF)NqFNPk6 zX^5crjyy)M@uAC&zg^ohby)%jMEwXO+}^HMw7WMi*TeG*7+eHhMI!|LQ`3UaCqbdSX;QOd(LVQOhz+N4NyHuh z)3E%*7ryRaL^_Ukw0ygMR;f$K_1OWgDWK*I^_Ue8w*{8;% z&desIVh|-_v_PA~fQSb4SDjQ$v%9yO77EJ8cB2|gojXCK73jz%P8{n!)jk8=XidGJ zzGs=0_SjcA?Q6f?9UU|4g7o8!7a~&qgxsc)s(6v%|KG`(LdJr+R(- z;&}y>>fbgv;}0f+ZqB-k^E8(+_3RoX<~e`jU^BJzv-L&26_D)D!13{fjgIfx2S}1O z`&bJ7E~sh4DurcNA619TE&9Y)9Xv1`)yN|8vrjLr-PK8PuU&#o*KqMohWJ(n>e}m#${&ZjLi)s*!E&W})uH71iQo=(a{FDen85 zgTvY8*EztW?T=&YWA zoG&a%SbbH{%FQSJ!CW!nm1Zu6b5DkiLed_-RYmXQJSurmd6}(g<|Eji4f!P@NvCFR z>F84=pHAFNF3Hw&h5b~gaX^Us=8PS)N=@5ZZPT8Ak?6}~^B3#D^+Hw@@sU$t$HyT1 ztzB^%5KBH)s>QFv&{etgK|+S2JKe06(?!W=0;;PHogD7wC#Cvi>@{4iucbv>?`Kz5 zzfF0`j>}v;TMDx~s}7r!YOMDxP>HDZ<;FIUXlTq-Y@XZNEhT%)rh4|pmNo49;SRw! zl@UvyA`6XD!TVP{7E#s)U! zP;Dd~tCS3JYXSf+^2H@_bQPk!dRCxSAST0>T<}z^4A^eGq>eo!f_k`3dCG6Ir`4+Y zf}fOKd^t#}wOfZVl5+=MsqmD5CKxTKVP_ak{97!LP$7x(eT6zC(aK`Il9O=C(s0V1 zf(_E`7dYiz_lWTM1>FOK`@XWDeEP(!j$j|O&Bj97xdy6QeOjMZh?t*l=~h(S_8&12 zkrP?kIZ8Q3oS^9S!u9Q8bbHuw0}sf713pRZqcq&MPUDhMQRo;JXFezMjD}ae`x^iC zW_F1lPnCSol^Ex5-5@tn z=`3lmlt;k5!dG4lUF9{gSF9~VkWcp{^qfD_)dR=hJ$s=l?Du@ev#K=>fk0#qu`bVw zuTEJwHYqKn8D^`SUc^hpw2R_Wh(&b9I1Lie>t+C{Qc}*^5lkp%DTAk9D+`Bp)JFO* zed~2cGWMlETww8EQI?AbRc-1B#uY?}bDi7?teQ6uvG&Y1(6Bak3AHzFB4jjT3S~_gg42c9#(!a_qh^bU zYod{KmL9;W>+JYyH)rEBUlGnga!;ooe?U7eE*AMIs##t;UhFUQce#i1v@~{odmyWQdeRvc+`2JzSaT2(@2beDI->i7*WsW&));gqbV~6$|-AkwEz}3vQ z#9?!rHU&^3iz>}=)6QGgsUV-(b?qo|oXM}FU|qdKayo8q<;6#ATp0H;_`$iJ>qV_Q zV%ZQ6rgN)hW8YvPCuPq$5npbEx6eqwM-$P0WD0;pk~rp7S&v}!v)y%LD=OvbyW;82 zByrrAHNW&%VEf$#M}lzSG@en2j);=6+!Pl~L(g zQ^ni$!kW%R1BJT>&u1ZudkWerVe&q$R-1M_V{5r)5pDMTd@ z_n{!9S7-jfkEbZ0+3R!00E6?iAQydwdB~Nj5?hy~36L z%z$xAcAA|zQ_|q|V<>_#WS46CplLi~A0)b81pD#pU^gEGCs?f?V0Dd;oJb0W1wv+C zT<9oX-@>M4Z;3@$&o%uYVcrM`SEd$I#uB8W5^Md^F72e?SKw-aw#keOh0p_EtTg}x zJ5^}lS61MuyDQ8WHP;L_6pqJ0X*ipQ*t933^3y;45oSvl@+h7FJUH48&yf9GuNNG5M`EHxO^860&ISjfS1=$h* zkSjx}I6f7vse|z1=QPb#7hVE&I2+U~ABCRGd0$}|R~ev_?o_N~*(zwIQO=1y*8N_Q zH=}Ug$#qlpr|qn#!iv;m@}$5#x3Yue;HFDoO^kJHk2b&-@7BPbN?*w%pt@_m8-}!9|Mm+-sXVD3DVj{|? zQ5m!H#rTdRH(D_Jp#=L>3qh#V(o1opH5*cBrrNrjO~uxXX95Cwp`@kPRBjxi<^7-cWN8X6gd@vciXflKjSfG9{_yT=dC4ActkP?rsdc%Ii z4xy?=Ydm=5QA7%7JH_*EZoP_APBL~jxODe`e50B3f#5A_o}s$B;l^J4BINl@Rg{d) z)*yNM!R=ie6|6HJ2pviI?mhy=4793R_qo*x@&61jPkCP2H{2rqs`q`iQ77_a4O*@Jm-81#}HY-%@r;i|2IERUO}kP-lQ{Qa}$|h z!}QM5*$(y2vilMALC#YLR@aq!KBzP{E_D?OGror?l&3_mN~Q5>?{^y^<;Nvl1IB?f z%}x+-Wpeb=!_WXx!rQKgS32m~D;D{e(8PCg@T+e(yBQM`o&rBsq=~(CE7tGi&X$*V zM0zu`t3#iy@69YqZp{$6`X)89lW>W^#Juz3A8^m>ww#`r;5f^isQ@(j5L5lF#8zAzT$*xPtNb(Rbx?aj?b&FtgGEga%$Yfk z??tv*EXNL~uSY9qe38|Wb2lEfvh}w^DnXhwl?0 zq!|e);#-_)_VjikT!;A6Ug>tvVo_@0*XOyrT*|XbkikF&C1Q^n?~1ad&S(R=4JvFvGDV zrvH1aHx6hl$ok0LH1C_yoiF1WeaQLm2iB+aAu5w6bGr$=;5!6~08qAA>S2fs{|0pj zn`q>PT!W63H(}!G62<^)HJ$T_-Oz6_#Y{biK)P$Y)~c4iOp5&CtvhjNlU4xD61!?Y zTZ7G#Zjm`vQJ~wiuLwvdYEzZ?e;B3X>r#xiI)&%R@!&dK;I@$UcPz_{qO!hx!C|h6 z#u9@qeV92+Yb9Rrj0j;i z$EjW}Og7=q*+*}V0P7ISC^{IjQ+85L56m~U#tT7wmo|T=!Sg}k6D#CXt#{`S6sTAM zL?MgXzx9e~r`ndst55O2@s{k<#C_nY8= zwGT``Xk-fFhwp?ym^w<>gB0CAEqgMaCATt9-e#JFTBn|`D66=`lUN^?gO!dIAJdmo z?iGpXP*tcuN4e1EHrPvd;iy$iabWzN{-3yJ0rtrL4&l9Dur$4V6BI#HQ+F#)~RU{gT+w+J74VQY$S zLidlRz5ty4v1p|WUh=K8ZY!aM3N4MKO>U~s=6PLvi^)|=M|(`w+<4U6k73aKHG)8I$zjq0lphAf^1 z-2&t;HX41c{2~%`G?>qGQ6%R{_c%CalM!9=!62Yfl@}9Nv7gCyzb5--w{s3O?7_OS zUB&*LpRqAwA?3fXp4YV^==S_SOq~%PGP~+JuT$;!#{QyGPBto$eq7vjx%IDaXg1YDUz(zK`Wn?$`Rc}Ja#W#+bpmPyFvnRv7{S5&F$VQ(M=yihl6fO6j z?KxC!-Ol{`7g~(q?F2TyVGF}9cV$Ra525W@XM;O7YOCY^;fs3gNa;6dsyw|x;|s4d zK9n#ifq>~t{$tvNXv5aFNS+6K${oGp0_gDmk@k~UF~hSp(~V_rtBIYO4gtyC(~75T ze%uwfS-;cC0~4|%gx5u16W_TZi^s5JoioJOG+es-_h&+qy)oUdAixxAZEbF>cJ$HTM67IBj z3Q>YdRxlqmjm_#Co?(4XwQp%gsVvo}9LK7!-X#7=vOK))(lsS?w=55R3krwbkhwh<*ARmX4G*&qTwsAHf90YmF#@9S=+ z1A2TV1ec7>mud7%By$LbRJcsb9ue0#+dSGGFD$fItY~0G@<+k@*<_dnVC2zpdwdI7 zjytQx*4^jR-RRN$ta^sVV|wRe5|yNNZ&Fi*uSB}n_3tzzu3?8`d`cUsL~|aouxyA? zt{X@GPE#%YdwBZv1%+=kdqbR(z5r~c)~r7d|}9s#@-3 zqU5}^(m|Vv`^E-ldFNfiaQm{!1i7$g7se_1SYBzLqzGidB+K`N8e3_6#^|#V6NG8% zfp@@a@sR2ZRf|gZ=smU1`wIPew=jq0*7oz6h+B`yd7F*g=oCMj+E^O7bwuHoAeNB#w?u!feMfv(!HU{w5eopArbD=~&oosUF5;%Rbzt_OJt zD~v(XlNsa7m?m%NMe^;B)$lOlSRpPCN5`%ET$L<1QChR2vtQAPbnOR+juRD;xD5r5 zeX8%Z(Zj1QcZgT1>c(EZbuPw7W4NbGt0rSlf8vug#nM7LBt9{QIvY9_Y`Hz}>_;*V zaG(wjw?*$nX@r*9)k+oHj}N)v@gABulYDYKXtnin|KT!H+i$*K>so41cTCk!*d8&H zht6k_e)XVSw(B-`J&*J7-VM`Bq9DS_(2+vk!$|5P%zYkh8QvMmjWbkGb ze4Ksc34OO3V4d`et(*VV8TaeWr5Fy4C>=l9+3AhYG2mM5lV`r; zkhb`;(_eZs^5aIlo4&fnAGS(%Zv%!lC2s@Ho#$CkYRFhHO>|}N) z{oKyEPRIJ~PSTKceGfwva=FLFkLQgV&Sk_209(GfoPj!w99Ja|Dn0#mAcublt$PD` zn*NPpl#bJ!>4Spmhb9=7OV-Kgw5)TR^+<$mHv{;B7`Xr>H_(QZwwsFG+@gBYWaiys z*>=qX+u+^;nea`HBeg`*#zQfu0R4yWpZJQ#Q|DCUf0`zgBy-#1n)+7bpz(#l4akv)&G^adiOoF|ebuX_2K7WmR~km-qy$h2d8PPNENR!vhiF$# z{HfHna?qPF)TC3-EJl7Ix)qmlC`k+LD4vTOTZ_rUn$D&@njQFmEM12q)c^ml5K@i^ zS!YFk!dYdXkQI^i31wuHdBz!cPWH?$WJhV(TgKT(#!<5OI_s9hndf((Z@<65dA^_P z^?W`akLPpbb73vJ)zhs;Ps#xJMB)c zY`VnyWKrAOVf`27I(@Ohku3jJeK*Lq*ndCdfoh}kkDgI?uo<240R3NS(%Ut5@n73I;j z$=y2W>GXH(JmuO1D{U)z!8m6yejZXt7D?k zv=e20!qRAqPna|({O_fWn)AK!p@aDaV)V=zx^>FXbHO*CWm(AUQKFFcs9TaCR{)fdYmzKxPdse_P z^ppkiM~2Scb93y@PWuPT>r-{itMlWi9*5C>7uZp=nwvaM_06q_M!6!|rHWfE2eUHY zaEoe&3U2hu^>ZDC*W{a;ZQdSqbX;?lpIPdVaBY}*+m$i>Hax?i!SRQ_D^3kQWjoGn z?IK?`*Jv~3me9qUnU=v^_hi{2eV*Z?+tHV{CPu+-QutqrTKOG$wU*yjlzG6+Hu3}u zB@ixx+D=Q~a7wHsrhN14Ptozg_$SRCP5tL%i0^zz$`w1RZh%6~gn<4vapemwQkxLE z;PnXmF_EsZW>#sr35dVmhK)&d$gI1DGD^S@iC(E^oX|JAm3fsKt+>Ao%IG0bPSD`)T1^ubDWi8voyv zdICy8sxKp$W^Z;jYeJjD8#QVDBNsiAr#*s{XXm(oEZnhm*Wp?5E|t$uBWZYw4iVN2 zAKKWrbm~bY>`gN8q)|N_MEjRa*ceqHwL2}}MzsJXX>d96Z9YpQFQ=~gDVKfePjB_L zZ+=Tk2+}?j|J~ZnAA!^Nr6w{daqCLk4qI(xQFlDgzDKeRiLCPt;GdjXN~|Te^Ln7X zUp2S&fI}7sEWA51kHMtwM&~T*4&gsk9W|@mTQ#vh*M=P_BNv$Q^YR0RbcYiaH@4;k z^&$*HL8p>&*E&}{uhkw9^z+^Elqu_+r&NS00HhjlQOJ74eDT$iohAFy_guw7C#%%} zu=kMWE0fgpuaT;24`f>_04g~(AWq5X7ZgXmd1Ki=f37Y&*rJAQ{f^z8DuZuJY#J6X z|C^Rl9gW@`K9e&W=D0 zC)BT>%eTeTssXRIzawyk#lxTi_Z2NfS2lWb^3W;ENoKi7hdKTq4;}T0;wavql=-Df zaVC7`44WqYd8ndYn}qkx%s<}87Q6$xz&O(8P5fk?PbpJO!i^P_qyb*kR6#DpO{%;E3WBqIrtkCRllxHgUsRuo^YNiD`h znyyY1dC^$U@}*gWyz^0yASDSmG%Wc3-$0DF6K3J$u7l$Vwceu_a>dGE z)l#UDUH6o`qpoG~_OCym+%L&o5o_)WhwhH^V2jia>Y#g@6SHCwjfs2mY|;N5%W??E ziL{E?ye2jchtc_s$Xf2F7>{xJ{BXDww0_l^()(y4C4(+aiywYS;(EA89lf*thn>}k zaqS!;Q*&_0wlek;zI6_YLMb50X>im-q}}S(bIohHfvHb^B|K%&+uZ8)ydbc84S929 zS|{WfP)~17aZ_%F^ictoIZO+Fy(j-pN=})zzv>91y9&1?)aHKtvb5WM8elp=#gjuq zve0^}wu=6Tvd>9hsBHcgufN=83pS7Q#oU9L}J_Va~MI^+8LlmzI>eunR<8J`>QYwuM(jZ-55@j;!)zs z{?Otxz^5?}TyKI_uZo~cn->D_7IyMb(XKyhPUeuA6^Q?ppnsWhYHpxl3<_I^+;2v7 z;yEuK`uG`h#a8@T)l%=Z0O++`dMZ*|8a1+u^et@lE#eCy4jm9&^IZW*f@muBZ^u!F zuY2AWe?W*Uo_%*wwV3nn5384Vy!NUp@A!Dgc3xg$%C!w}tZ$_jzu5ne&BbxRf-5Lw zg&sRjo`X3ZO3ErsLw5>QPstsX%Qn(};bL;j2nTx3=+jG%SwM)?2w+oebcr%kKhw(ffx?908Z9jl)U=W)J32bd;E#kZ6go3 z7$!tXXyTG79g7n~J`ab!xzs-#FM>U=Q9cT%x&dOHgk9aw$P|xY(La65fPWzFoKP|J zU^y|Bb-~ z<-vsc4t-M8sF~j*k^Xwmp$76M0Vy2+^Ff0j7OlTOpMrHh6cN z-_b3+(ca>Z>geZpqs;-#<7z)2-He>Ix>_YKPSxRPeE$F0Mr)@S;eW0WC#+-jg{vpN zsj5=i*HdgW>0_^UDW_gghw$1+s||C5Fv1ObpOhOMFa}*XDd0npEni}Ut^KKt`HL0) z_c`R(m6gp7AF!_W&3p1s!{X~ARqh1_#gP@|*uyo~bA>1u#NQOycY-cytBW|a?PuDj z+@cQcx7%_4l*r?djj5T3ZU5oVSe7Fl$cv496be1|Amj*EHm7#L7Mw?Tsk}DfvSsQ* zZS<_{0BI$eENvT01M!T=76l$Lz@POVdI-{Q>KLEMYc^g;SB3?jJ#|GAo+}?`q3de0 zy{JBRodO<<^-srj!Sp$_7D@gBB4(a=jT8*nRLD@ccg^fk5`O5eyCQPi!Gf7n!@>oM zJVv(!_u^?*+~`7XC$C<+1$mJMF@?BtUr(V2?!aaB3bYWL(H6E8hM^-2B#ZaIA0OmR zNK?j+SHLT%1_~cfBvzEDEHrFi$S65N{%IUG@?cl@Qdidl-U6|XT!6Q$#k%L6?nKQx zTzC6Dr^CkYES``#9pXzz@J;XHGG+F|7 z5St+_JrqA#uC_yB4RMBImmK9b z%&#sv=ylIU$A^y;g{D*W9{l5qLEt-&(F|Z2%jjC@g_}LB?0U;~4RtTypR7&HY%UzF zK@Y~iQwd0u5ugVx+Nkd`{ap4IgDd-PNf7?{t1T=`5W9}|o=v>Nh7B%lDjX^;Bdi0y z8dM@=25(=CbnBs@*c@9F_{hS>^Pseu;gE+5r*Fkh zTOPM0nZVTb@>GOq|Xvh||J7crJHl43w?f(`R&VSH9A`SfG6 z+2md(ZoPEnT3$C#a6?1m>F+*+ZN;w*<<+El(;~L~yatz4le=p*rB!)Ls_ z-SCX8=qzT4@wnyesGr|Gq18Drc+7m;C-17nhGO^+EDcFwR<6N2<6)vv$`P#hv7%m` z4|3<`dDU06y6yCeDxbxW%T6F$Zp~wkX@pf@ZMojJ?^PIaofy>Wq7JaGYvH)6p%H8o zzZK2-@E85u>>Q_($oz>)bXUv8!{d}~L*;K>(JRfIS{A!8==WO5Zh@S!Avqc-OA&du zjr>!ZvS93EWLoi@Of<{KMUaY9;3z(rc%+yxbw@d1ZiPfj9)+)UF77)qOqF&9gti>AAa5W@nEwKE=$6|xv7c!YPNF;eL zuE6dnwMb|0$NAJl0iWQ)@A^uXByT@*RS&Yu8?#)J@t!}W((AcQ zqjelNg%TZ{g!)=?nyYPO1LIaHVw3pVV8sCboesFgzpKus{EYbxgQ}p3jo1J5J&LQi zT8KP;P2G>fj(p|QsV_fJ|Rm`DVtza7>h<+3r!6&lYX(yEUN$M>Bs)2vSfDOhN z^TUraI^j2<4+LKlG!{78!;ZJ@2F(;c*!?u|QaM3g!veOf#o1VQEMBDA@;Op^*rmYu zmohvj5fR1-+=H`zUMN2A_zXgWP80=-TZwzTpKm@PESIbW@&jcqRayk$5hV5F7918a zvH4GZKX`%vR94Q^aei2u{Gspm5>|y8FG+F2X!abIW&0%0c5{J3wS{#0{kK^`&zJ8W zg+4hO;1%SLRNy#)d{6~B>zXEz5*v6kPzs5G$YL4!px$VHF}Ya23Cc!A>|R*w`ppC6Npx3Ldqw)VvCrdPl7~fX?1O zYcb{|J*i>)2Bu(~Ju4@Ox7nXs^eRpf%7;V#0XY(JLeAppJ7xk^E6FmpeW4x_Ot(ft zPk!qXvW3^XQo<`H8hvxG`2zWE4h7A50M@-k6JbF>+v#iNLmz9GW^`NUrC65bONX5# zL{P`HYv9=><|bND`(R18>8rz|cMiW;Ya~@FNvCqbOe*U?dAEH;sMHL4#dXJoplM#f z=4)RYYMVi~Ls2`wOPw}LCNPKAQP_dWlx+f#8rcRy zfl8-&EJ9bwR9Nk0G2b{-6+tg!FT!0lx8{YQlDY;wk^3_BO&3)e*dc81eh{q>=#?@h z8+RI7_?4&)P%IKJF*+nQ@uKTbN^8300D$Q~rfcro^Nn**YxpO=)18v(4o)lAW>b$B zPZ+8Iu&MpFwt!Zz%390N?rk9d7U568v3dHd!b=A(x@|wp$ef@zi46OO28==9M&o&! zO3g06JOTw;Qb)dapCQgHJD=NXq#{`^{ja?MaYOI-ll1lig_I0+RX>0yeh&nw^6-gO z3HUt%AquouFJF_+zyTo*Wq~T#7|jykGae$rFOL6pBHYS6BnJF7jSx%|cTG`J12lVSCCFG~kvNxsrin4V0vk^rq^Y=+X{GE*C*C#B+(b9) z1w>{ijVTVx_4V-}7#^)wCaIt!K|3+2m0M=#`X`&RAu*ERr}Boy(PFi}Ze`vHWHtrU zc5d9Yah*SZfL0NQ&Qn7z)FJ#=U&zFOgV(0AqJ*s0+`aKL^gc0TB9ZtFhx1fBHC-bQgQ+*j_5{ZT3N zy)=5zg0uV+-oT;hyYkaRM#$BJP|Cn7;xmGRJubMc2JU!W8QE`v=>SG?*6~x#0ZL(uQ^I9YmKIzWhc6w9&O>d>CF`-SVvA zGdfLnV(MKA&A?2suRU-JxiF1iaK+~3ZUpvpX&4jR@d;xebwN>+ll|*dj2RW~#umr< zV8nu|7&O$Exy@cXM6hHrdOYzv>9U4SRS~C(L0;$mxruvwlAJ$inkz(RIy%bd5Zh4L zn$tY>wSMFWN-gm6_6kR3vLw-3@xs1VnE&>AvkPJ zIapsvX)Um*;O&(3`6STIEMN*ZqB_$6x}|&PfbAq$3)dVBDN-@bpg#)aeR6zs;q(vv zOtxClP6RZ7$cUP?-5Fij7&z(Uz)Ln zANUkw8r9+it=MDhmv{nmT>Ws@#gw`{uk2RkxU^Yh<3AZHBZXX!oYG?4X`^x{feGYc zio*I_BH0Bx(@UbKAHxi-j<$HPb=HS&&HIt2GaWWf@%F7XJ$^lauL|X1ZwEdkUvTbpppZt=wP0c%hv#h7Pfr1Gr%(Aqjfgm z^GV6uur<~`9NDv^w=UJ>~vQKDj@H6P(xTe&%o>pa(Mn^HDcdpCKzMm3c#*P z#R-Ee`v0||#o1Cfn0CA(eWbxp*dBlh>ccgl7hjXQYXQ`La1tn(`= zN?KG^{<#1t*MhO8YI~$b%G+yww>>W-{ADz@_q+Ub8M^fscwY=T;?cHW{psZhJ*1LJ ztaho9yW8WRN6zDbjIS>2m}1k)w8o;>XvNa04!ONOv45?v*BrSD=JRZS<+8l<%zF5m zi#|3!%po`EBbQ#~DIi(fYIs-k3^-;H*QDnEwvRf+B zo5@&YX1^?;ZW?tzOna+-tlF*IY=G;NLn<#8Bo#DTgQ>Y_kFroyt9u;>?%KxbJQ9Fq^Hg>=d0EeHB^c7 zbL&hO)LiqAmds(BiI(vE!6HMCTBt8<0@vE+3PgOa zQx=6ll1j^b#LIiftE2FQqHzzzN$K3NU$a0HY#fSO@AlKXpWQ&+^4vQi&HfWw!MTHr zakQ5fnGoH#O6rr=Pfn*x`AGhFxtP&&Gdiy)&DqXC#Rw;>x*|{<&AdF!nvG$R;qEPX z5(ac@Jv%a;`L0HGgdKg)-%^|XkP$la%}j%wx5)Ntp~u!L{W`CHtzgYmjfE{w#DYvq z{)T9gq$&_fYq|GOShi%CC_Tq1YcK%Z3w~`hHbSHy$kUy;^IPAsm20?`5}cp8_765; zH1Z5{1!ddzfv2r1Kv zY(H&n{~LQ|I~4NZkHg_{L2X(L5%h)FZkbtDog$VeGk{U4S`pV=a|u-fik|dRLAMU& zXb$gwhxIbA#3M5iSL^AfgfgnETX%fi-#I1Q;&|)073{pUmEz%A0e9wHY6KG)jJ_3M zHvjYwjpN!zr=#dy0S1`&->k^ zQ7OnqVYR+>?JNiTgMyWa`eOwt_~+<;HfvWa_A9D*E(kJK+`~ZW#d@S~E4wEAW|hX+ zsPW=mxwgdn<9IIVP3U3DYUlmkgA6OzinBub8GSX<3*`XDbFKSA0-w-r0+J6UGG456 zTYh>9i@SDyd0?Q+BB|v z9?1lLyYuz9Eg_g4HaRwH5~FU^JmRB`fAF@yDc!-M$MZ8k$HyLF2k`M{KnciV($irt|4$m&7g@0b(IexmChZi@_249MzYS9 zE&pLAWeqOtfFd$OZ5a*sRE9*{RyCtP1kJt4sgb8C$qxLvsU+|E6Y^2eMo@wpiUJagW)b1+}@K4xwk=Dk#K> znIX{JYx)LZMWgXxjCf_Hno6{UA2SmYGm2}<2D9pP>i@;%07DB?05lXiQTE#8+D0 z?h`k>h4_tHUS38$=9kTJL@*Z!7rnZiA2rC>YT{Rfc{8HWA!A};a(WnNN9eB#0jqs% zdeYEAxRqAL3fN8l{OS=p+!m!~MS~bb_pA{weW^(K85Ek`>;kK-Va`nx&tv#I76nq* zKEdPjr=wX5(qVu}C=USVoJw%8vLYRX#4fwOwme&fF2hLE*VK15eK+0A^voK^0n z!t}VMu-GkJ2CC3W-vZ=beXSJY&ahV&lOvgCka&rH&uWsv`u=H~E_se2m^%}uTk}@&swweA~MzK-bt1*h7 zUp@A5_h08aUi%Vx)jFa7E7#LoxNlWwzER3Li<*{ zk0(C}0Ts8}{_FxS4C;u=^^O$kdcWyEQ_YNI3&|&u2abZ15p5Np+OS1`R$Q6^AtUZt zCMvOJ^g&0_k)7TmcdSe&^e5$?S`6YUD4@Shv~e)GEbZXu$!8#OMNaKm2C%%A zwC9v_SzWoQ$(2mt5y^L@*p;=6EL^5b&XvHggJu#Ab5okfPw(DyB>k9t$)WN7++^sR z)ODr-$ic*ot&NRuub!1VT3Y5ntsV{$I<+6UQdKL;_&z)g&z0Fd^&Pq8RwE?|SLy#e z`%fb8Dxl{5c)YN{Eh+Lq$c}dNeq9&zQ0e(U1obR#nojvZMMXK2-=5W5w=xw!dG>~=FtZE)C z2k9o`i~c1mfbC%-x^pzb>nk$cU`bWVVz|cJnG5cYSUrWX*3oyQFM9D=b2$yAm>ug_ zF|;C&oXY2>l)NLZFW+a*Ob~(xA^+V0pz@Nqs2b^1E07L+9X6B3ff3W;3-E)xJ3 z=iAA%&&8aMDppni zR&OUnxRcrsa=7SoX?(yR%*KY${Pi!b>kihaMt^ZR0esthS}&(jEA#!mbA2(nW2#`_ zSynq~39YwtXF`zZlq(;Ttf8W}Oz_mxjfp!!5mrGXwFL4lb7~ zID|m`4x{2f;C}~DHQU5%2zOY5LOhoA=5D{{-ZxCnStug_tS7HBFRpeI_@SN1SlxV|*urJZ_2z5MUd zCO}XMCZ&YyB(njYJYcf|9-yX?YK6{>F`RT)Ev`%Wd0o1d2h# zRx~B={N)grs}JnWdKO(}3{O7Txd92C^f=$Ub}o^cVEtZ2k*CX>`EV!YJnRE@aU_oi z>~iFHa{&hzdV6YW;L9#p6awGs4W4c4{AKN%``b=eC)};cPKL z)#;AUryqSV)(t$r*^x zCC}8}Boi;rhpb@5xqO~G`XpZL#so@vDs9Pp8Ogg$OIVw9P|1iF9<_a+Mio%S4_RFx zl07&y%^37lQIU@a&dPrmc&abZl#gg2-!YvY#pWttvN(DVQd3iOB1sT!;d}uj&FCB@ zJLjADt7?T$W$QQfp`zbCOZ3jeb8qfdeIMX={q#4QVrJo9)SeJi8horQMoFQPHuL(% zk|sse(mQV7s??RSJ-mP>#RJa;+4Z&*s!s|nch2A6LAsQfqC}GhqnBf>LD^_gRM2Wt z1FO#{~`^G9XW1!NqcVcm;$j3Tm$zBA*;Xxr5mdy@e!zeoLE|U! zF;+_fjCv0~Rzgj}^V_=?#70hYhwTD<6^{t?z*(PJOOFiGz$v8F7eWhf1Kqq%O0-`U zSxTjn7f5eC_uVBa|A5*vOgPE+-uQfOYRE4(?N&6n!S6L6NV*E zr@w`;-}19EST&i`dxw2SO>zrNGteZ2)^pEd8~9o}?$WLs>x3I;Ti?dTkugKt>59D{ zviH=cgDrz`V|U_ynY(9KouDag5puzdVASfrZ42cz04)FuXvM3I&Ub zoLdo{t!8_3;#q$%$|)f1xC5?cMRq_BQr@CFbx#?-FG$$_6DKrp7{Ax4%l@!5oYo`b z^7~_srsp}VZcZ|uZkl0k%2*%0Tp6Qh$M|^O$?Fy`;)P-`Q|Wo}wo#}-mmi>hr5w#b zNVmP``-ZzcDWi=B8{p=iU?Eq2h#DV#y_NjDg0m+@o;r*K1upj6-dz$4q@a$PprJf} zWcSL;y!oSlxC8wqiLo+#@4GfQ*>24TCvJLttcl4UQ%1mlXv|s55ef@17lm#A#Rt~r z1|WA=1{UN=3h{@R6+7>|=0>P*{-_&+gx-`6DS;ptm60`}RmBqyJ&7!Bc1Q;d4@gQ;PzgC!QBL4N&gbt$0Nx1SHc3{miQ#X4dH&X7BG=E6ff zy21I^zFFOLRnhiblL6J}NeUZ9RJ8WakGv~A2KlRT>n?NEa zXs8L#+aMZ^KC{?0e`SiXTagK@jzKLAS;EeY=G+?Ed=J^Lh^RczdFCC?^v7@W9^qOW zE%>NcgG{)+o!TUfmOFo$SR4Y%-qwZfdaMua#IG;QJGQ>5TE@6*cxN4*P>6OTH`Mr} zSG8o^d%p_g|7f<67K9Jpgj|?8|MGI6=}3NWV}qnNUH(qtZNjH0MAKYW4HvTbDt5+> za3+r_UZoQv`e)c2tJwKwjeS|MwT~E;9+y>-ml*JS2R?_#1Z2c?;9Ua5e0zfV@xLM} zgvYO)M7-VRR)SX=pH{A)-_>W=pG=nb?KW7-%<1|ROK8&8v6&QZ__=*0UsYo+zhT(k zV3njIJL7@P7kY3hkG@X@VKA`LcUG>=d9dzdniMJF?KUbJIe@NU4wM#&6LP!x^3dR5 zIc7%Mbh6wZ7(sSXHU9tRFVu8i)xF}3P&|hK0=EvmdNIE6m=Mk&xRBNx_jWftKnr`-XhIq0KGD4oy)S_Wu2e;NR<+K(@Sm^iB9+ky`M-qW^Mc&>KD9)x&rFaNANz+(83A61pK; zbGh1YO+I@jScYLW-CA?4b_h)bm)6_xh+$q=XzDNQ-kMV8<7-O2f*0abLq_sd{=O13 zX#HQqx0F%XHEPnG(}ZW9VCqA>$N=n{i5ZAcT#iD@hP9_OjNKq}vz2k8RJpa)m2BmX z#mS?miGU$W-z6P4`Y&%Lt^ofCU_2|jxa9&da0rlzUd^1! zel-?T19?~u}`no!hKefOvmKKrE zb3Ki#Hjwq=jf^Z$%G3;Yt%A3H?r}ig<%}$U>)}cM>ROPkB7XcZrRLM8pQ_sKx`Qai z6XJadTh~B)(!Lfe$k;L6 z%Z4Ahv2)1oxtI^BO7^8VGgl89c`@?Eok6Kh%7}86JwEldS7KFucllUU8uwsz+AN!;#v2Q>=!Rj`f`q!DneCw z`TQi-8F-?X%41fe*mlUOXQw8pm~^tKdRx-p!t=_M ztZP_%(3oSIJW}~9YdhTBO)_XCWgUTQ@1D(*`_~TQS(2jpU@EZ;QIGqDy1$;cyK;z_ zB@m+Q{*Zpv2XsdzDb{5ghbTY?on*W#uK&OHU$C|d#8SQgpjphF%%a7Z!~3u%AkY5r zPL<`qn67Y92xT$yN_^AZ;v}ga9~z6AeBOqGMMGEe!d%@7462mspKy3?*tOd@$vp%)5Wb>wKhKE?)EE$;gt08c9t|--JV9v)L(S* zM4+Be<_~ktcfaYgP7bl)88cV!dUyi;C@EO1PYT)IBX^fao$T=RA`%K)nLM-WI`wAV? zmyxVAX%0OZCl^y7clti}j7JsuQMgj$VrFQ}zi$Wuk) z^JO?zKI*2@rBZ>Zhc`YL^Fn~-_(zcL@DbGs-!6wL6m7kD_E^Ri7)N8_wS-HVXbY-o zB{Ip+l%bcQ>0)%ILZ)=x&tV~o%ZD^o!@=4My5Q`64WFpQDb?MdJC5wChUui$!0aV| ziC(XtJwHC@^oZtM=EIPLMd896l;SUPQFh$;Jj~lo^T}e5$2~g7uZBnBugGZt`q_nV z9BRlb?rwaKe20Kf?MCM{rE8*?uKwfZSe;K|MNjT#5o1u>3Kv4Y+!w)IRD3xNc1WUg z1gU7K2nP&KkmYpSFr9#``)jx1WA}05{pLhEIDf4&L~xOK?s9`{3`R^%65a zzb*p-pQRE8Aj;IWP(&{CBqI&Qk4}s#F!e?)2TbCgueIV*uR&VzGOF$>%zC>iZRp%i zfH%6L{QVL1{ZpC)GJ#&UMO7C1I*mApi{RS?7@nQUGlBkFYyt-o#@;19)d_?*{pJ8q_@W7ZBe9Cb5v(e^C@{{7&*RW4L zi+C!x0T`ibpaWSQ-=@db<+n}EpRP2hl8-{ShxsG0JeUs+wb3D=N5WmO42mgf)93VS zl~W9T{dRxxwXQGP!*v!ohuEU-lGTmVg=?Gb}@6Fc&zM%vXb$COhhL!ny8&SfE zO>GRf{iZbBR-zMt3gV8H4okwg%S7OV$iz#!qbVzNDT6CnJzsM-+SkQY-j4zX?+)SA zj`F|%?*P_L5BQcR!t0mS*|_n{T#p`IoRG>9A?*sfYW_oh+lNOkt(*@uK4iE+mKN-I zR}`U!%hn}<4b)uI3=N8KBrPSfA|+@`#Khw!T@nBTCK+QVzT*!{-=%@uvz{77ab#RA zMBNWWL$>ShSs&~8u43+R63#+^z0#MdqLaWO z_ZWW7_V?`G2~}sdsq5vf$DgvXq!9D~mH=I~yj5BDtOW>l*o?)9X2!9V4-)TQWR6*F zns0mSgtqL-f9;{Ic=^e*%qtxHMfo&0D`vMNG#Qg}6Xgi#LkIIGth;EZ0$h zzAAn1$<3<0Uzj*@I6-nQ4M`iHD=WE#({kelWhq+8D&Cmz+tC+vJZ25|q0Px?Oz5PK z-l;IAk$Gb+c6+_8h_4(wN@e^30o+fn3IQE+XT2YY}*PHdE8I~fcWPSZP#_yewo zMwytxKlP#oEqx|Q5*Uv?xf+^o{8GAN$9lc1kd z``{@$%Ah)(krd_s6;ej3MeI5A#yiN!W8Gfqg1<2{Z8IrEk!0hy!Q8E10r9^k80lCx z918+Rg+BS=qFKv0)t(Aj*>9PtYhVwXG##b=dcxwXI*&7f!ah2CPM-I zWgn64O^dNnNk`d>BTYW%fWBmKPFCJI5fR;er^Z%+tlq^f@q7qv+8s{m8bQqo7dfY1 z2S0kiw>pb?)3a>Z{eDQJGr-@BbsMEJq0zf*;O6OR2`c}--K5&aS7eSk(n~ntm!``7 z9KH%{KjBsOb{kFzjbVb^IrX#2A5kzOUh0D=*Fe3)J~B)jcN4#Ttq?x$O{z$gW$Go> zg$vdMzneTmooD{FG1!B$T0D2$(FI)zR&J^^G5{qk(q3xFS=ZB)ga7U_vNI+SmUVO+ z1&o$7HFQC7JKQ*1RaGTd9l#6aHrS*gKYs$%$Y$sNydCORy5e>W$NhTnsPYp4Soa}( zA8kTBV$b7f_+VEFPlgU_W(Dr2*cJFZU+)Eb=X%Qp)fn}&TF7tE6S6|XwC2^9C)gW3 zAQ%n$eKXwQd8QIt`hD8sKHIl#snV=Hoyj@8675IhfH%VN z%rP*-RT%#p+?9_we+g7G=L+j`vsST=M=FWc!_GrlN4nMVV$JUxX-QdJ*-n?eKFixm z#+6KJ7!Vfs=+9@Dz`Ql)m3^JM5^o+fB!X2=6H^=plywjPa1YaGufP>Id=xzjnqT~X zCG0B01M9LEf=8xVk>NA(!idgx$6QWrua6II_9V$R+k<*opItT+u}Pc}E8_#ctkKGu zS9TTyJmIS1B^6!|JM!YDeoX2$Lu1-s7zv3c-K5_i9(%pWD_JMGsGRU-mpqzkFa6EE z-IOkXG0>CAYZADpi!)A)8XkA$+F-XuFf|G zkF*g=tX@}8LbI`iTUW2!((r-`sWr4G%c&LA({2cV zOpPp>ff6+)5yY@}r%-=?Y+ZC2-$FynNpz8vcU%=hX+?{bL%aGx*d`Z^bTGc*OHL2 zV41%@p)pGLOeHmqYI3V4fnD$%zI*SHFW9WDA!V7&g52|{_~Z)zjUH%EZK|d!6Bh&O zW*BD4Uf35MI%L8A;LGpN7IF!(Y+S==2MY)2IZ^Gv+WM^QzsoZG;o)SX=_N9-es1P= z;-Y;gcbo`9C}rq+*$fdL(F17SIsllSb3c|l)bE-Iq`o!mPB&h&Yg1{akIs(px!8v%|F5VzSK^YWAea0pN!MnV22T-*B(JN z7zU1q1vxO{fBVM`x+|p}JoFmq)QSZa(mKHt;8!ynY>BinpepuN30~~!~X)to^6q^grcyAv;Ss!fsod)dlLCPFIM3vc$uv zQ{Qnaj{WH`)MFVLdla%LShh^C8YdyF{VS) z8>gZ%`F9TkX_*9DT)SUvAQD-xS%2!lXDn{ZIgy!XHZ@O&`wBU=rLGx9LZTUv=3SQ< zPu-3#?5Mxa3BBrGxz@G2yQh4swk~O9;+lTsduVVmw&Yde8r0iygOL=SB5^ri75+LAXBmhTkTIzF%LQ6i=gtKcpM^{y082#~SoP&4RJ zyv!s7<>pcAj8oQs!cKg~u0yE%K!0fM;!$5DjL2PY?=4_?is$GMHZ(6a(hK&=Q#JgQ zVJ=YgZz5~)w8f7y*hGINN!r%~6_Y0I8uV>23Xve#P=vv#M;*F zph;`PMd{TkUdX5qM^7p*-YN}ue*wqRL}dv3Q8OXR+QaiKB_oB(P3^S40V8fW{`}QH zaa}QF*g=xtj$yy0sCy-#?8h)CtU++DH$MC5^el~#wQ9W@1m3M41>RK6=O!KXrUW_E zNB_G(dT-agFATnB8NnRua~--N*1<;$UECLkTyd3aW2d9u-=4tuq` zLG49VD+47aY!&Ewz53i559vpwAwRQ7Zi$mR+JZH=UJ6T-sufc8yZX7^sbQy{sInDa z6|pzb;s71$yv20z+~P-oKHs61-iG2&)q&N2n)x}UM=YPuQH0R(!o~`U3K6q)XgC&n zG7Aj++PeE5$IrSv^{S%h0?7OlUB&j89`#tvNT~e9K8jx+f$WH2Hw+pKp{IimqNk*6 zoQYOp@|5ZMSH*WN*o9(^YcomS5#5Z`<_$ z8zaye_|_UZW2mO`+6e`ffdq{k?mQF<@$WX`HNXT$_wLs5J5>&n#%zZlgLA=L>cdz!BD25NF4NJszvmY`1WQJ4J~be4;;V~0)UJ<$6f ze=hieclQ2)*F8wh8kwk(by}4`u_SgQ+UEy?W#y5p488o@V2grwg~}NHLxD0MKAH7C z3vyEzwTizDXW1PD6RMgIdO1Dn8z_tV*xza=*Hfut=5$uCfWVL&MkasAQDLnGHGQK@ zf+i3V1ipK($;$>b)Ckr-dkBv8CKj z4zLlqBI2Vi!n3}XqX1cgw+Z;F|EUmdM((QpSoGH z9)ZAR{6zC?9t_XT8G-NAv~A2#*rUVoM&{CMi2b06PO9{!_RhW+0yj^(C5 zXAg&1b$8t4EGpUOKmp4_Q4O&X!21RRngg9NmST0LYOtE%11GE3`DdFMr^x-GC5@KD z^zfUgkbgL3ka6_!RcVR|V_V`~4Vl7TASJjza|q@CXu9%1rvLw6DfAK2;bw}`;RreA zR-sakRLGU)${BK-kwiJ>$W^XVN$zXzjU21C+>8ywFw9(Y%x2qf)%W+`{(C?7d_9lX z^Z9x{ACGI#E4Saqq^i6*^W(!y@4U~6)_s&0KjUrOn#}|wf2`Z8xO9OBri3zKjhczl z!bC35oi@{WA^DH-GX>vLx~JeL4|ku)&+hM0z7S`>ZJkWNATd|0yC*eysZ3n)R12c) z?;D|#Mh*Y|ZZdYmcjBoV|DK|}?1jYKnvG9S7ODRwL)tir0P6Cw`(0>wIIF6SK2W|h z#dyyYJG+p?6_|43(RWLChoU0=7qi^Yul9KOJ$8k~)erYW)&4u?*%NlKLhBaTCt|E5 zQ%~Px1$j?cLRrOM{3{R?e#W>n@?h&qd;*_ac*1$T`}iiwuuk!vB;(~LgV+1M`VBfa*Mk~je+oi~SP`m9{R-Lq{e&s`20 zab=6GmHVLg@>R=C`Y8q;Xo_TB6LDNwFjS$McS5qYFf@)kB4n5MvE^&wfXOwbA0e{K zK~#Uoy~*=-`NanJR40@>G$>s>Nq~a+#mj0u{1x4Rl`WA3%nKqh1mO9o!Pp7(8hHl1 zf8o`0N7qlQKy;^7KsFEJmM4&n99G%#Wz400%pAGs_OEWcF|*Q{9<(36i~Wh)#Vz?o zWN^x_ikBQY!BTYl`0NFR!#95jn-?BOZfj}4#_{{sfg-xk>+WAHfu1~Ml%_4;Q=%ry zBclyADw{Gm^erD9lp7-CkFGiRt6I0DSQZo1GQQJd1lH!Xr3o7VX=ei3*tb9UaKM_g zBt1vI;9&6T$~~zip$n1G97i4fn)>c3amJ>)D-+D>XLEQ%2MGWfht;xgB znMbaN3yd@7A@~1wb`IrA;7Zz|09X+oK4dC64Jk4B0P@jLy15jbR5;UmNH@I^H5U`E zj*Hv%g|!&RF};;pn*%)xaOv%ui5%XEqojX77MY zg+O7i>ZAuHGm*=?YW3E#2zxe`r25}kYs}jyq0=Rm0I5dvd}N zJ6y;QP?fyH8)fP%DM2kkiWU&ttJyK-QW) z;+DPV15Jkr^+$VZKDeN-TJ43+9m)4xX#qA=l&Qn={lB*Uds}@!o59 z-JWgkx-=ez^jvT5eQ`(7N!iuD3z!KL8{q78bV(z0876{WB2D#r@6b5Z{yP-@jf2~>3UeRdqULC^5I$=HwcgmbH1&K{b0ePH&>Mbx=ygG3h=9yHA)_(Vb&gVF_F#347@5J=Fe5!C=mo1+T~ed_ zKz|$>I{n%7ndHk?LwjBt^`Gq;*mpX=ODo6l&GWf|dnVwfO!uHmr&G85Y_oKi-#&K# zv=BXf&vk%1zkHUv?o0`9=8j~9tgQl@cVR{EIpTs})>3tC*t_vIjTe=eG4Tc;K%E|S zw{6^kJ|WLijErp*?DBM8E;+nIdzNZ(b8c9M@^GjcqsRJ6Z;UV#rbd9D^>P3sx~9A% zG@8GibU4RQt;?V|IJ{ZnT)<+ZN%vIZ=4!^&`Xal3 z-W=E&RA8pNmm?O5x!ATASqwnT>bCVk0PHuWD1@>bw-hK-o(dB=exC_ zMkdOdprRUCA*e&Q z^34k`%*G06nZ>i`o7CU&uTFZbO}3B`icf4J`J#0JPooFiOkVX`TH1xz9ypGf8(kk8 zJs4iI^&p3rvM^7-a4o9ZC$J48-=MHvH(&)64qND*6F%T=FD?SFmM{67e=IM6d?t?Y z38D6QP?1y037I~lVCN?O&fk6Wm3@@>3N}fsWoNGd+yveba`aS0ye=3yJ^QUXBKYX~ zJMIjl`fIzGlcyY7hoYeJfe_jDgv>uGpm#nW5DW;o?;#a%%<8F-@8f*k;2W4*0>!Y? zkW)Q&L<0RnhwclB!30SM;b`cQ6pLfym@AHX9Img;0t|f?n(h>A8{*9tnlIR0UA=Tg z4{7sh-3@;|F&F`eS=E2_`obgUPX5Z-f^)}%0Z4=IUsg}vQTmk_$FIydmqlrDf%9r- zvEh%E|J|!QV(?9vRmP5l)}F@2;KZv#lm_FFv&wIzQ-W?k-jogYZ3te4&lw8jM;5y1 zNy@199G$nzoh~8lBZdq2N<1+K!*U1t_-}!4dMwsnNTXQ`rI0dpD=0zl8|27a3fpYN zJ`dC#_xj`4_#@+0!Jzj&`M1912mFQ~1xWhc^o-nejL?;Y*hm4Zh{aRDC!6c*g>5_I z@5#li3bT5Q9wY%28**l*+A;ji#v>`89Bu?DH2SWH>6^wYxU~$C6UXzrdvy$jNI^5XMXKzz?LD!FU`f{rsCM{Vgnf@N^emECxA&z< zguh#>0i`{Z+gs*%ce9aKC)uQ7Q#f`dEZ40tR1zF-RdDiSV{ zqAtC&-r(j+mxFl6r1TfOhPFFm9lw8vzLn)TD|{y3@{3qZ6)oJpoo+7YkdW zSzK-LspY$8?1Eg}))eS!XK0LH4txv)SXCG~P^pi&MUa=C)BKJVbtq`+igm^{DZdI3 zD&Qbq*}1vywGJ#)4N{W+DJ&rRutN)565zvcN{ezpW?ZD&{bS;GnqaMRC?;x0a5*lm+O9Bcy(VdVmtXY z`h&QvV&Vu_+g9zlkvKujwiB`DVirlW40zA`(Ku9idm!c;ZyPNORHJd|7QpMa2dLEG z*RPdQK{g3;5Ak(ambqneial3|K^F@niU{vgIPUeml9}gQ*T9P%0lW4DiB>hK9yEyki_dd(mwcT=hHHZ zn@2hjF{f6c^EffTHtiixHb34yzq9sP*7f@BX<+2uS_D}}axhJo!p3d{P`fc$Hv}6e zfSV16${}>>H0NECUqtb9387-YR1fm>0ilMtNIw*-V)UKPeuj>H)aS0&__M1$=Se&b z-z=4p4=Nzo3d`SK?cU1wsvlQyox@-Nxib%ff z9=pHz!&>}$r<-PSxnyU1Jbf(QjIjRn^qvCPX_ccw(?0arGi`G*%DJU%C`Ut>da|q@ z+ztx*-3y3%suLG_{6i-ZvUnvKWFeK~2zpR_^@xt2PQ;JTwZu^+$y+VEKfQELfEPmp zhV%B7GPe(pG2;FP@y4EMJHp~5VP^)T=f#f?Z9jBV(6BkNayT38s>yVF7l-5`cgCsX zjFIXz{;JvQdHe-U>hC*rMj8tI1`0x}NF^NPnG&_n1y<~ zqDHS28??YuU}sw~n*U1Lmb0HsgS3l}($8`(Pz5@-gwUR?W4rLSM^DQyd6qlq?0+&F z8Sgkw-CQXX)$5^ILS`+=CW!TSM`A;ige#8@t!Owneloi5U^h`wZB>WJE<^FuHga=Z z=LzGRyX5gq1Z-oixajjph_HXC536mw$la9a($)R=MyG>HUtpj}U(wUHOZs`R`V^7R zca@Pk15FQ*ot7(?vXEJUJ8ry$3FG&MS#=k)0u0XkINTJZet+qLm%7(_{jd%2!g2=ZTf@IjT-&$T88GwI$rBo=o2FH>I?Kw{;{>DoiP_$C7DD;GDLrXu_YQzD@?(N#x$7O>K2YsDvh(4$E z$iEP4i3SPx)jvHS$2%R9)BRsM75Vmpe~3a&Yg9*dewH8g+U9E7=RPjW#}!*5J}t@- z8LQn9V7a!bT|Zkm>0gShP%UQ9oP;B27A?Dsa58muyFV4AY zZJy-IHMf?l`#j-;OSG(ccU=b*x~YbHoI5rzE&ppkUp~2N-rs-x!97Rc)7~kMXeDl^ zjLj{FR_BP z)nj%Br#WBA{h_)m!rVVv{DbD?ZAK#Tjpr$*; z&zomE`)l_A$XfTb%A&Vyra=EwcjWGE4!&9?N@o(AanZz3*RENB4=wkA+I*nPZWdGE zpW&IAuV~Pw8`~%tU3Y#wWXu%0B6EgE8aZly>gS=?s_bTP9^pNCbt!45zxS;iPI6^q z{bWK)0O1z*txzSxretEv`H*HqPwI&qdxhPSH4A(?2{IH~M~^h6y)_Vx(gi)WNQNuZ zNsU-yn##LjM!U7o*F?FS7ykL8eGOk`C0kKIAhFa6nSsN|VRHujF zdLz4oE9;WRtP|lnijFn2d))=7b2CfT=t9s=^m<{GfMfM+-kB5&>KOHQW?+7Ty6M7q z(a5p>1}8pdnp5$~0P`@t-$!(G>-R%`6V&(|PVs*YDcC!iT99+OIegC9DTX9Snh&ro z8pp(#)Nze=i~T1l7g1*0rBeV41Zy)otz3EvKj-xmm+KAw<)BQ0mMpo*chYx_(PK=W zV^#|pS&JJe9ajEN=0ak2B#T-FejZkO%4ofCL00$-F*7#R3wll7^qHL5r&otdTs|35 zx;%S-%C)LL0PciE=g`_rWb+=Z>F5z&bQ^Z`HSg_j`-PRpIG<`+#L4 zFVCU=SHWLZPc}KV`%6sry8+JSu2$&2>w5Tx`I7S3UTKg=$l|bp)OM2+)Dfk06i56P zw9wBv6{q`E$*S`7zdQk(U~O20(|sexR#|ffS~{AqXK!9i)Q4&rOJYNR8Y3HU99k|N z{8c?AuXI-CIwiFe;vr4daO~Tt)R(dzq0J9VLWhZEera6(`3$&|d;ra!pXcZNS!vdh zglF$9#cFn(-DAY7S3QG98rUd6w|7!NJeDuM#WVxHj^vy7o$K%2GoBK!f2F`9Z6UK! zIT}G8*+DXKj$UyKik)n%E79=E#Wgk(Nyl@hymfeXRwUoY*rtJ5pJR$Qt9W9v|Ghn~vH@tXxj zB7bmby(TR2NS3%9e8~&7I8`FgBV*DdGS#0_a6j)#FqwRYX$i?7`9y1n^s!qQ|Jor`jBbmmh}qa5ji7UjYh zHtaAQ9g<(u2c9Oa$|1E`E6hRG&42z0C9s#1Vtl83^=O}Wi;h2$m1eKY@$cLd25L^$ z(~INCK4L7D-yw54GPd0*UfVJUy>IE1lsGHQYhE@}x%CLunwqhZY9O!33IGN+{V)wL z6S%rqUzzsF?q2PJQeam@%b#w`jSnW*yPvrR>Ix%ATJ_g}IPs_-1BGfw3&JThe;&3YY6<6}uD zuqx#?Y{hjs;)*C-3)d?el!NUWlXts5Jea^K`rn;BJ93VEF`slm1m%CwF|PWl{de_v zVcM#Z=~n?Q017C}i;9T6P+&tP_3<7P)TrrK`cEA7ojW3tAkIPLwt1Wb2^kSxm^?c< zrdrKss%^C$YOCXzpPT~{A3gURFIk|d{h{S9m!@n(-mu12{9T|TXAA4!lolpMOD|+> zit$^E%)qx`dY=)0DDj-VXdwrzG5f*g7DtZM@-hy(7d>=@l~tG$dE)qyv?dpWm%yS2 z%STPp;As0_njR*$;l_x>`}|wgW#f)nro6UonVsL}>_mQ3n*siJ?TebSuP=(o4yYoQ zZGoM&I(%v2aXI5R>y3uPa#MD+j30$>t2E%OnABpNRpf>xJIri+e_V-=h}P;97Rrlg zYneYG+G9h(Pd=`e4(zM$@uQ0AE-2&K)VH$CY%%+}?{VU^OxF8f&Vo-k6Ks+zxxCjV zC3PK>cmXc7p$6-zSfL(~zNQXgj-*skb-{&f&hWFCgq_FvPaRZhn~Nfn_h|3Qd_U?^ zJ3|Cdy8E6oFinjK;2c9&`t>d8qSMr#_cB7pG8cRnZQGI*WiO&A-Xu8;2T6GOa2{n$ zi05CD)iRaLhXq3@KH)^nYF!*aa-;O>g*S6n9;Rlv*Lg*3013S5Lu04I{HSVULERl8 z<4oPUUz;yoo??_J)~>yKxZ2O^X3$I);UqT)UkG)L5z(?YcxI4|_LyrC zabP&E&)KejEsI(@C|Z}ae{Rc?6uM|tBHahbIX;No)^O=1HaVa-q7bRO!PHj$UJZEK3d(-k247J@7W(0ncKuN z9rrkLK6`iAGLaUaE~yyhEZ|%!d=IRBP}%(P>^3bFG8t3m9CHUnV2BIobM|y$D*RXz zvk~8i%w^;pDHuAvmbZ+XA>FP*2S=&f7+J4WnVr7R^>K0f4rx(jv^quUKhYmhGa0H* zTpCbq_iTYuGNI~2f>8P-WL@w6A28jn?b%&cPaJs?567({!si@Ietzd(74G=SyLx1= z9Riw*lGS54`GqHbzX{Vm^9Uwt)^ikF7E`C9M?9E<+V6Py5}qhG&whV6rId-xCv}iz zhdoh|I>En&+qFM>P~5SBGTOCwQ`DgnvRxx)dDZn0a%t#wAGZM^>~{a>`FS}=`O(GDvQ>(L)CxM`18zJ_5- ziu%ndQndhCZxxep^!8V@ihP!FlbtC0{Y9?9b!2-wY#=?71}gyujKT%zqbZ4dMuK&k zu0UP0gdsUeoPi&J(#G7WFbd^YBS zec~0Ne{|#4i}YN!vo^#9Co_VL*NaMJkyNn2kbHb)zjhVqWYW1*_SU4UlCvX7(r9&m z>Lm5v*;ff}f_J~6$0n9@M=Ht}`aWqA*o$Tu1IVQRFbA7`||kNpS$BBdi8w-lxn!I zJg;7SSXj_3YpmL%(PV2Y`*+~g#rH{f zL?(qDP60R#cRzNye6?wsTW|VG$%bX{MTC;J&Emi-=4->R52z^X1?)M^zgv2H&FkQZQ(yKbeMA6h*g?nW zO0_Gfx&y9rF@hh6J>{J{v3mQi^l?4L-VTlE@Fx4uwJ4t}h{e<^oBcr$kk#H!Ts)Mb zNnVkK5ew!mLk9R7-6u!sN+a9wut&J3CU)gUHXoe*Gfv`@?!VBtCk{7oc10w7eDz)l z9Xsyw^AnUEzTTRXTDRB(V}6LzC9^`mnbrf3(sIPApWFPp>Un30^5N`Sucj_h1`Sfh zQ`%14`$lK;XiEYgSY4|1t$Da)OXyDEOU@~Rnqt*iwZYgp_LWU?3i$ea{4K4D&5BfM z#l$&_sI*&;Ec{-=8lll5ArtmnmWF2Zvnkzq5-k&58czAHykAxV zgeewi>4!KMxq#f?JhzKh;&iQo%ZaAYK0%>!+by2Z#0!-9ZY{-^z|n1M1en5`BIYqj z#`%3* zKif6b7R4Iwe^-AaJ8CF7d`YO8HNZ}XSYpTekz2Dl{`=E);4KChd6&6~BX<}#mX9W1 z5m#r{r`HBy91if8&)A@e>Bs|*kPk9JsWxDgh8N99rasi9!+%SSKFT{R0&^|JWqZ+S^eG3M=*phbyhl4giuECo zK=m$JkAdGCXFte<$DCoeC9i1xWzxoNSSmCxYi~I zKjNY?d-jLy_&elx#!L0B)|6!-(9REULfFiqLEbHwM;<=_&vbo@{RS2&*ZTG@RgtLC zeF+B9rAn=RgP5l)CPE)t?&x?GobL%_jsLg>xu6?!Qg_W>QAxIJ)j48H)9d8?iY)N0 z(yH;4L==kGf&F5B*0pAZP_f%1PP&r*J8paCM8tcBb<9itL1`X|i*KLuqjwPRkbC~C z9O=XS*n@AxoWeUfDy6mHDJFXU8gYG3`L`6t28fV4%Tx2>*(Zm@vP3M~nf$Q23OXFR z&?i>FzbjqLe+w7Z<#bwyk-w@5xq1?RTB1({3Kh`|>pLnZ6wvV{U&O~!<(}=@dq26T z{<~YmCnseR6Q2S*$D%r#^Wn^jUR{iO!;EI9PClK{!G$D~@zk&2HAG~k#H7~i%E4*B zK}jrAv*r$S?W)x7xiBqwGx`+|Ys>9Dk2Fdntm1Bk!2G(^q6EQUB*04|OUZn@x%Hc` z1^Yyqbq$$K^DXgUQY~~|dB@wT-m`aocX!NmBpqGSWO6hKI(!)ftO^2h&T*4+P8|Y|G;l+X`pOqb zre`DHg}<>oDSew8BZ?aS3>CU?;EgKtw2mU@MbZ(z!aVch1Wm>7RT4gX-|4WfH_pkV zGobcDG_Ys$?8NquHG)h>vD_bzd3e(M}xTE%Hm$3_+tcL2OgQUjYw8h%Ws<33|T%4>1Z0b7{b)<;|Px2uVSBTSOa5DEEqR1 z@LIwkLfkgoed8p~#KvoyiOw|SyQv0GuO2!3V}JYIu)(ify@G^|-2SZ4!sOpD=R_{_ z*U)}a4Q$KVlSzp{&C3Ne^sIs$vgY4C(D3ZF&$4KcA0O;Pb$Yr`kt>16a6iQMw%qtH z7<1Nj{^^hekc*jPwq(l!NUYCae+`f<(%3AkKAGT`>Et20HKbhWc=%=ALa4%wtKjTD z%DS4v!R?t)hDqA7Q*zDN^v;9cXwAB6ZL1Z2p&v8vM=`3F7jB;>8d3jkxOp9*;R5};S%HfplQalR5rgW!Euk# z8%=#P*kQ1^lg)mZy*6-q*W&WVqGi;Qj8@Nqju+{ly-TICCW#Cl?e_{bA9)P5%YY!&63IDvdiNo0M!73iZR6Bs^~>p$rAZ zieFotk62}g8D2*T;uFu@kjx1-f*pMTqvwv_`@H+?zS@+!|B2wF>2a}c0bK~H=LOPE zSR^Z7@|qW`?r(hp%)Ogs1Y+P+O2Jb{x|S|pcXz1ZKg8eLlWGgZ zihZ+p2-!b1QF``Elc*t|;>(xGY$&Rmqo7y031=eY{E3_aD1VYzw&)pyw_dIX4X{23Eg1drSV&0qcPG2!-o5 zJklj9y=tzXo%Ikt3yHV4^&Q<(X50oqj*?$1F`+t_0(%k+Okr~${p?nE2DxlElma|1 zdIqiT%^wTsl}o4Wt3DJfoWe^B>2#py9^w{p>OQ-KyTJm=~)lxIay69YY-uMCgrzjohwTrNK^ z81DoJy1@k3c+dB}7bp_xi>MMm*h0H!W`k5HR~72MOmeG8mZXj0A2+=OSC_Y9+p$D; zbHRJ-^n&D+h8JY95B!47RYe5OT(n~?ak@g_ zl#zK)wusPf{h~#}8Qa)YxsP&4^Yg9uD}+eb9UYdfcxdAGom4{`f`6XS(&3^)-#!aW zaPk*j-vK$&SPmnVQ5`zzdf9lOCD+N(OAG3?lu{o(jy!R{hqJS@(u9dFprr{JJA`cu zPX4_!ewowrW9zdhTI=2>Nt2l&5ebgVIzZy#IFo-Gz+|=s5huBl5X#>HPV>IW)AyQS zkA{C3g`d)SrMoKSk@z3|N^)n|A zEPw;|9u~v}?ze7(#0W!K0rIv<@<=&QK(0%LSImstDg!E6r?obD{pKGK|GtB9tmy*! z8iVkGUAo1t7aOhn7F|f3h9I4s4j&PSlr9!DdZlZB9*sG6P5VJ43p3@r7D+S>r$(Ji z1tHv=NmA$pE4v%TI&aQg2MCR)1b~#B79&nOo7{8k`5GW1);YT%O+lt*|3>@j$&Ys)O8lgkk4c!V60inyYeA(!U5lwB( z(NZ>H-=8>jgI#T%kvzJ;%EjCj-se}5MIy;m>W7B(bZJlOS_t`jEvx^MD3Ypbpms*r zz;MxDq!$0QAmaOh1p3kF_O-#Y{Te=&>ggN37Ds&LZ9m>$sEhqlX*77oOB&OK{JEp z<-k#4X@1L(djYgT1i6#yCG9}zsTr)02L~y00?H$2Dq!bqfuu~*ji$st zl4_-8MKDY=l4_7qVg-wcQsF)7&!><;tB{bCtjlshOzP54GlJoNR7Po^(WAO;*Nd{n zwBnzre$I+1+9BW>Rg-(uky=lYK{juAhU8LGTJ;?q+BbV&Y$a)($cz=B)yVU(%aTpq zyb~a0qrAjGi83&SYU~;1@31N^4FcN5d06UBX5!!y?*mgvhF}S^-h|YI{5XoSVv`@K zs%apx-&57SIy_2P1Ss+F9>85$ZMjZ@Ml-nQy+(qYP%nrl$7s ztbT^3!Baak`(3BpL2{4sifMr2b9KAFvq*JsYxzOM4V3qI&0m}T9O+=21%N$4?QH@l zJeusAymPc*r+32kTNM|8HDp4W1VEyph>m3AezUPTZ33u5TQOy9l~hO}`OUBmk$Xro zy9ov>B1ltmt;K}OD26+Y2c|qiJJ4zhb#cDQNotC5YM3(&Psa+v`fqP^INW!#Jrj^r zh7rka=mnwYN1evoGg+;iuzmN(CF!BKdw`8!t@0@1lN7pC8z~W-D_#J@RZe+0GGi5A z{$|=c#Qgk%epNt6+kaV0Kg1KEDf)$+`1t z{pxGbd6;s3qr6cHE-p{ozhwtukJ*3|FrLm>GaSqy^nvGji>}uhnE2qynp-Q4&M(ALI;# zjD~n`QxA5kyYYtVDk667(O0tYUU3aRV=1VlzhPy_;GcPZ*3i{_y2hdw?XX!NEwnc9 zq8;6&eN}D;ZYvv}GyRxY0V-AX{R|3d6ftHSY>_zO1O@6Z7j+ol19;~(c%kNHq~ny* zNJn0k5x6NmV;+`nI4nR~Z3`_zO6QgHzJd#!k|F+{P-3CIp!@Sm>D@I9_`H?-B^A_~`D-fzmLxm&F6$1NwHxnM%Nh@baog3RM_Voe5s~rbjQLS4exn9!| zfF6Pcn8bPS#b-rgA>WlX_tRY}S;stgWS8urcAYMhVS5k5DUG+v^>YG-jg*7O^>6=8EtmhA!p8Ri zS4<}Vnq)&TVmGpdvMNDY-@S3dp|BD*j4^q;a&dW4mt z+^itPpQPPf$VcX;Q~Z(x!m2k56hmW6 z)b0JQC3eIN=s%E&P`#E(y3>nY+IS6N@E|Myx~+U1WM*v?`_5AoIeB`>V zp4aYF8%U_grb<`{DMb!DXh$yB5_{!4CvUsp68*SWqF>K4pl2-AxNQLq4}6c9@XO(Z z&B2?h@`|#RMnNbm#zfXjm2@;m$&iB&f$7abml-Qi$&6-`kIyB}zd)Z8DIFN*T9UBP za^MRhFO-XsDSDKqpb$cT+h0>wn~pI2W6~WRM-=`$%Z8k!J$T0mj<}NiN}P>Q&a1y^ znzjugw#eltUb{tG?1R-Gt5fRB^vx$I!$WnHd-$2-dL$4-1EcHeKG=;DFBli>&Q41(?6--{Bd%vcop87J_kf zy$D2}w)Q3uCTsx3ga1JI_*Q7F^~Z0X$zjh@pcnc*QW3dOvygzVed5NKO_X}j83Q@;rWWytq>AHLUN7o!b8{o35bGI1AtX+Yzq&au&fL@c2O}<&l}<P zJqM{Y@00Em(w_Ci*CbN)RzQIq_^lLpG0wNiQNgG1*Kmh2AI#sf(lgC}=hK6FU;=c! zAxi~k9LGg2g>03Qd+z>q?0C1My_Re%iWkac#~WBd1YMTQV=RFm}be*D5Lw#_1{cxP@Pad#SoPPQ^n5 zoyr7xl;QQgZ>4>GY9T=4gppUTEzE9prIM6E-Vf~`1sT~AD~UK!xFR0)Es&(@;k$nes%_iN? zvX*8`rLFQmiL523!2MH-pQ%S;p~o`VFy%m5!Rri7{$mS7G7s_{Kss2 zig=dyDXnjre&&>Kia+hHDxCCo=v}9Lj~KgN3HSP01&nN&Nu@`@=W{`bM5-a`ZfHK- zMG+jOiBXynOa(&k=iT>AmI3t+_wzgMT(|vB6l3MBp?q7h4vZ~N@&eg*^{>0h_RSQq zR9ND2Vx$!K7fZx7R*Jnpfm*eNZFUBexI11iS&ityo0W}HmdqH=C z2@D#%nA;j*G$#1lV!-j=c*RqAHTsNf=o#-;&PFK{4){62E)QYzbH8Fk1%Q|QDuy_Q zAEp?Nshu*;4`VJg?tLF33}z@KUlmOMl;xVB76;&hqf*|uCX`# z>0SD+oWs|YRBxHSs|c&Z-Xo^nQ1oTUz2&9SeS=SGC9>t)_V;n+d!1i&C9;MjosoDhVoE2uhuifhR+1(+Vd!n+ z*#K8LZfo2n7e^fYHpvgIS-eaV*B=Q^#oo^k^`{SIDw_uim~Y#wO>5)d1%04h!Y4c0 z!la#XK9wKiWeSakeP57Ela^pAK5ew`jr+qRRqB5aDrBO){?;F@i3;%r<6Bf#Azr$tkjb zPe~jBGuVtwy@m5ukp;3b0eUPsyy~v9ENwWQ=uU`0?(pC5lMSqK-i!Y^Hi8-Xr5F;#Ws zBneu+i5?9*Yi}Ut`IMWWQUY#-sQCr!`m3)B+y1n#FKj2>T<|@xI{E28PwDJr7VI&= z#J>liAUQ=_#vsY+_-ddF_`|pJxul%*80*u;YwkX_VE<#U_wPR)P+l;x`+LCMy zFJ(O-ZEa|s)yL~i05ApMFm0FNKRPfXY=Bs1tY`=<;h*DbXy}OT>b2@j?Pd6~Ye?{7 zIyz7Z6z=c9Bbe54(e3>t?3W6k-JYR`Nr8ESvgwfoaN!8>0RjXNo-7mK63F?HcIp>KGW{w|a zo@nR$Pdg#ep0EFgI)!8Fm1b*^YYe|I*4I1AKWn+Kc?LMsFU~#vxm-ThYB&Ipp7dvYagK}=^J$XN)`G1HjhII)1H~ITtyEG#B9U^Z1lYq~(uV=DhN~~Dz_3(|lwErYM z+pvRiC!LZ?PvW<%TAY_Z0l%=h+@;=8es6|erCS^uyQ^v%8f>xfMBs^i{Mdu+l)Ge4 zw5A)`SHOI~$wy~Tii8U)HICXTxo+g1}Ov!iO>{8{#dyP;X$>N9j1h3`f7p0*<+g4S6B z|H7v>-wLY)9`NaJNarp#HYSAYu}TTlA}uxO#CByU@hExqb=mBFZVNlpM*)L6$dsV* znUldN>N!=Q(#KoMu%^NXRbs6^;7!E2X}7tDLz7fQhQSp_Ui$c-)372v|d5% z%Q(<*;lA~|udq_Gq5k$rHf1$8Dmbew=%YO&&p5vPxdVFF6W7Lzt0rmdj~KSlt{ZJ# zzj!9p8)b2vi2Mx`!A*I^d=@mjS-g`6e@we0el^A*L+n0AK~G(b9MQD z?kq}&d;^sJNd!GdI(|;l3BAEnqQUU($!g#LNcB?6+zp%VG)=#X`=AmxgBy{PX9~4$ zE=zC_1-`&@yHxn~*&9WYCYE+E$dwUlJ@4WBrZ!;R5Q~FF{z;`fbgB2Wh~p!Tfdy}8 zO4WKENPP9KL&H|gbbfIja<#dK9m>j8KDShNZd6kVS$VX5mwG_a1x#CL+}SU$Ziw@> z|CghY2OU)YMqN z{?07jVPmq6q;M$tz;lo1C+yS=eHx0&2GUJXYA@!1xXgS5y5K}sn>QU#=8^o9(iyA&8bB&1uUYcxo0ba%(-4(WLKso(#zmwR>Z z-uaw!o$Ixcef#N0KKj%YmsEA-6X3|NcGvOYcpFO_cTDQ)hRzxC32FY<4hMIjr-}3Q9L~F;4duh}+GUK# z&ROBw4-z2dUN@$+@jjoXVB-Rd|Mxo zv_9rBvSRA%JLagXf!v=T8VdK4E$3Y}E1nkE+SXdmP?5B}E`~Zcl=~xgsvo~HQ5Cj* zD~h-OB4>xH^J7}({7=}kRad<`9x#ekH%#f)?atvd{~_g4*x_hip*tmJUiy=>+Y6OF zhJ?!hvQ=N}-x~HHDJitP&Kb43U7`HsJtJwab0iPEkFM94^k|D;LNmpCd zkZGsXV+)1_o1ac;7nGNilOi<^&PkJ}4ga1(`u`FYYOnse?QIMHB|3_Hs78QUA1Ebp z(Lc^MeiAKxkuT|}5?T&XiLqM75oNQ+_^gsvQvz9K(V{FGS3+3OkYE&@9Dc~#d|Z5i z(m-X1yC-J#rjS+>D1Gx}LR|J_pKvwU^S(D+!({C>u!V!5(vLk~%dtCk+R!-UYB{_2 zBp}p}b}|~Suc5!sEl`VqOf;Ww4I&B(rfGQaVz~sk^xaWNcDuZ%G2L;6^QQ zdX!A2i|Dvc7#vCYdN){8)e z1nXNUBP#e0oq&oJs-%+>$6j0d6L%>twDXN(;Sy&8?2$SI zOb4Wi*7@Xp`t@XBo6DkV{7J?59=L@{hn1n`>huW&9s-<}knnrOS93w+SG>cQ`NOz^ z;`ROXbz_I$Y2PG6nCrH;U%@_u@49~AWS&-{c#PCURrGM|-NKqNuN4(Zz=qJunn*Y6 zN@l28c(>OO(A(JzfXSEoTlde)8+1vUxMH}ixvlMQ{9o9)EJ3dp<(K=4Jv}|n9K2B+ z5u(jWge>1des+Fh!dO2&={OozBlRHPUt_;g1JkcHIG)U2<35ljV12EIjWG$**Zs zP2i@9KZ*gi{L32bsAQIz59?X=TkMeO7x%8q_H^bEpQ?(1;h*d1JaIhlriCd<=jJZo zOz)j}7yj$8Tzrn~{yZW8%h6tEUJz?a_@Kb8685tYnIyke{ayZPFnk%UlQj|E9sF!1 z%QfB5)k&RF!rT*($5_VT;aY%a&*h>3M1c)SFY?O>x?_*dw$U4=66c_NuXf4!3@LlJ7vb}_MoDyz&_6&m3>DbhblQKdwIwF@ zzY=%%*V|n*%P-%IH%i!|OobVhS-Cs$h2l8wrK`L z_FZ~I!AgxM<0yVkri^F|YSK+uq#l@Z{dD@ZY5lv=_v_U!IY65WY`PQT2|WwBvGcAZ z=)0j$Ql@@nATa2XHF4#Bdw1*ae|6>ny^QXyLS7qQR6_USyxTb< z1#|h^VKtHJ9I4-Z`p|4xu(fCPt9cP7@5Gv2$O;!mRfll2hkqv_y7~Jk%h;%Nn+3^FH>6EOY)kLpMMM}spHVpQAqznJG8&;tEXZ`SkJh zY#IimO&Mlkd*x!m&14c>)(Sx6>FI!Wr_w>Usbx~`9X<}yk+IY8lzmM zdbBjU+1|Rv0f7-AkvS+c4=%(*k$K*wGR;ko81sHJao}>qD9(G=^xv7n+Ff-@R}E}b zn4jNpFP+&(tx0$DdC$&w-EFX;mfZkAyeWm6fpCevHzB!wPFAT9;!J%gN7Y{Fu>0v- z>pyS!;D@gR^k2Y!e{IdIBWiWp=JfWv$8MK%iowpYnW0TGaD7xxr#*6#Pv4%cJ$bFT zt;OGW+`2MqRUZ+^A?v)Zpjx#^@n6(e@gr_dTQY9uHln-w@ z*^+QZu|5^ujZITtq9ErGc_So{P*nQF2MoVyu;w*X)0jTS$kXamv{P9$9;J|&&gb=T zwa&@1^i%(4zW0u*lz~D{JOc0rT?|#UJqklmvh(wU0`*(5h^MsuvqdtVU{yyo#j!>* zlihodr@{aB;n1(~r@_2z7F<|1kDfiNKQ48_R49T@#dO(7_(E2?O%!+|eTv7?b*BW| zoZ)(Rle<^`BcFfxcBlR=Y92FaA{GxnE)*+_CS>BC+2` z|BDaW#HJzVKP34wmeCQnAr(Hhp3*A4(salOXs!YniMxkxsfNa0)E zi}gGS1;$yn$Wxzz9LqQBibuwCI*~tksS9H<41Dg(ItLCA&^f7rB6|bs9dNi?Q+`tc zPce-%ZS5c2cMe^k41Rc{6eeO@%vtquy)ViLPqj>D>S<9|boAOB&Y06@B1q$_%(=mI z&NmC?`tP29eR0e35M*Sl+AzoKS6wmKSGkP^aoqc5e|D&}oR@la09`ryG%)cOQb+k} z8UG0y@x@{1s#;UR!Qc79wo+TeAjTiC6Myk2Wni z>78!$lhxtRa<925cm=fMq!DEdbAn|Gk2+|k9cGrS2^@vC{yh#D7+s*~9EHhXpD3~EaIH?{5ANh(xNJHR<_`~bo)hlv##X}2lt2imKFu=?QIYU3 zw3OGaEWSNA@5?*u+9*W)e8s%J(&mB)j#(7vp(ocqDxsWf`#{CHKx9t|1o^8R`pD+g z{sJLND_7cZW+CZy!}-`_RR;@zoSJ4zGSNs;HQ~s&PJOGe)0ejy(i&$$+=*a;T z@!e%|df<7(4vHnTBdgST)rR34rMEhFHHc-45kkK6@h89O)(b_Y-S&&Ttb#z`8)lxF zajW74*5Ta19V#WI!wN-JKAo(jEeWga2h~mDPHQXUGB{ z`GndpJIN5LBKQar5aBENBL-ZOMJMh628+Wbc!MNA>0C0OmMM6bK;{xZB9?!ez14u-1$cDpTx+)pmjSp&!BZP=PefQ zIrM`oiyfY%FoYa_%sLf~0rhc0U_syTiYXAcaLRQf9!?{pt0?u~gr;E2Wa{Vb3hk!D_S5?{p9OjTQ z(OBVQ&Ns-_Wv(*C@o0$+svcVTTiWK{NfDIftRl@aqyIR{Y}53a59oX(mVSzjDRuj` z+-}41Q1$VhRa>j+%=JH^>)FI@!u(PH6}aPXXq1Xv^*JM(of~b)-r#datQYU0pKx|? zPa{$eD#n3H-#M(Jl#3+3;cKH<<3iW1hnW-0j7zU*%BeQ^9?US69f(O;I;2jUm7feE z_wb-EA?B}#+E)qD)(+IAas#phf=@amUg)Ok7*NP4b@SFl&%MF zl`3>&JFF^B?D9VB3h&BpT4e?%Ieo0?08Zy;%MGyi*LQSPU#WmThs)F>-_z_c7jU(D zIo(<&&DCrn{!5D@dw*KRgSJ<2`M2zfNk&*nwok&Jnjofw>`m@>AtucW^Cd}lx-^fV zINGekP3)Ai8WG}&`T>4l4&IobVg&aI+M zPq;EGiFtDMKSN1>jNp?mG7Fxj!rzI?bSdo^rOa9i+`X_9yHBf*R@3ACn3Y^6{Gg$& z2yDJUz*GmiHr|OCh{x4~(P!UFT*~f;)$2`kpOm3FY12OJ_!WHHEQ2IA%Ud6oKCZ+_ z!S{~}=AN&uXV2nHeOLHO(ZjMRfj;$O6g6~h^ z@t?brz}C@kUvkV+i%r`byK5BLNFL@(o>LTxJuuhJ?#Y(7nn4H>9s1#e%3TMsBl3g() zNN@6pR_8hDxI58zd%j@}j(m|o|q_e2lDaZ-`h zJ5Hm^kCP0f;J@Mv=k$r>PJ!}#j?|(tDe!gRmhGqaZ6p zBu8kCU5Y_{W-nA==P0nsk0XxDaM1dl?8hNEB`NR4_V|gYM8lnaGK8=8L6?!mI+R&6 z(NX7aHz4>?wFAguYpnXXi_rKVoxoXgDzYkfq#ZCG7GI zE~EnUs6(@=lw@1<@J;t*TcyVW`F&mswxHM>C|}iM$kc&rFJD0#IG5TZSSeohP}Q0_ zXXx)(7P|$v2N@j=Mz;QVToyI_4^$3fEpy<8yv==gER zWzLWv)l8xtFgDJNfMg1U|TD}9i7Ss8mfN>6VUBY zEF&2xZ!p2p2|QPS{OHY9Y3u^{p(r6`1*oVNZ(U2d5}hf8?$O<;n7ml+h3*GFpZO;v z3>w{9csc(czcc0ho;D$l$64)-M*1r~@)a;9k(w#ZWcK)kwL?e?&gOj{741e&W;^49 zRv4YtVg@3O^K(fx)=LQ5>PWAQdc!u-+F$(S1j17m^{N=CtCQq00brjtc@vF_t_wBe zve&Nfj#Zi&Q|v+EQu38Ot=&XBVpbFZ87uXMWr(v!K+TUCwJ5sCq8a2c%wnE`64K|; z{d1FYAI_ayQJ+^fC&Zm?w(00U?)zu_K~a`hX}=u*`g~NyfxyfH&AlWAB~=D1gT5mc zVvpm!lpjJlBq2CT#yGV)Hl?p_OiZI*w}+LuhgKHuB;P$@+qqUv6i$+N8pcDhJP`kqhT*B=RAqr@EKBUjBlYDz!{eR2c|5O+ zoPhmCsop5I~rw3hT{8o&2*iuCWIhpKk zn)Dx!DIe(d&$EJ4)O0>peX^S9g|Dc>2;2_F_r71IS4w^0LPqBpR0ywB`c_?kOECl$GZLM#BX!`f@T0%t?7hMxVZNTu4(TBR zp}_zIqyjW&>3M!Q;eJA$TN>f{uPyj{k9bck??1S+_;?%3J{2ef^NF@o%=O2I-g`V4G z@7<4W@Z#XDNU90T2t@lHg?k&93HoSag0g>6X~N@Ep8nYY($U^fy#J@{??jbPn|iQZ zy2t{8qWr3ldBOedq_*(PgAoC%hySc&e2j6=Oam5q#ZyF{~b_$x4?P;@R0^KlE zdIXzAPHhiVd+cI2@TJ)^QFn7m!SC>4!84_Xd74Q|-r{3w#nJI#p?Mpu-Q zuhT0hOS8sV&`i0}OoTp(OLBt2cr$n}^xNNxl6;z}(wYGq*b(R=R+{d8n0}H^Qik3y z9Y&yuJfo5wrjrINBH89@v|$T1A86c$&Bgetcd$98)JW2KimH3yWt5$cpe-uCI#eU1 zH*{mV%f-6y&Ou~x8u7B|uMp{PwD!K~rnH>vh6;O1lIjxwtLg3jkcddVI1!&d_1C!K za3!sxux_p5h~B2(l4tz=-Xnj7R1Tbeubpuetm#Z?dDER?V#9WRk402?=$iGrvdIfr zC##fb-d(3)mLz3`Jx<4Hus|RQ7BDYu_M&<{YkbAy?qpN{wUv;dc@}@yHIyeJP&7BJ zEH_Nz5k7p&z{oBPiuh>%y>~v$xa@?qdRoT7B(&tk5vC9K7a!^ut82E;TB#{=BaQhz zN`uA6+>$K*heltc z9`gp0mb(*;D|)R8o2Um!Q1bB%XffJ63jD(6PVsud)G$Y0mqLKiJvRl=W;ZLyta}2W zoy-zq?EL&l-lZ(A9zm_PFTixG%d-=r>Dx97bg+Q7g%yxc8Qy0HTY|hO#Ih3kVN6R1 zd(rdBU{a4k5~VKdc&91Qq90Z(IQ?zHJ0GL&(5&Z*>KkTIoDVat%}YVdBiKB`#O}u7 zdP7c2qBW~6NjN8BAuJq*UU#ckEdJ&exmF(=M%~Mkf;Y%I-5nFfTwOL5-=-U7|%NrujNVQD91U>uBP+w53 zpk&_TH5U5);V&W-az;ly>IG`PZD!6N$|?a0p$is3mhLawkCg6qj0Tbh_-Gb+y3mt= zeYT?d{bqi8$QkqqM9Drxs--||eR}DRyZbJ_PPQ$EB-Ek!M=_E7&Y>95?O{MA!K{g9 zKwaVX+5_hZJE=yJ>2`cdR?bmJzKu9JePOx{^zq2mQhg@&(|S(Ro_12V^+M6M(mrr` zmYBR6z4TS>ih0uZUf41qm4Tz_QXVx~u3Gmm;2%3#k#HO22kdI`MC(^P3Zck}R3@Us zv~4vRm%J$w;x}hx51}m?)&9g!Bw1tF{U{mIp?~%KA5Tc=v*vX@j_THJk9x@>mRN)P zDZB)p2o>vX$5LI19v77JYI*h)cSZ@oeo4m?zaS zakX`m#xw?^`Jr1sx{LW^5ZEf!-xH5Ri!b8xwnH^yI4;G(JM)0mM?S*AXIb6%nMW~s z&Oz?rnXjPd@V5Kf+UtEr<@&ffN!;6^1Iuj!Pv78noBL)}j~sBmSlLsQ%nx1C2B!yB zYcNOBp&pHCh(-5QufN0_&la{S~G|KI*;K#>2iqnKg)vP{!;PPrproxlSt7_qs=!jQ3v0B9AybKHss zv~4Fyxb=|gE!$~S&M8cJ=EG2O*0fnFKvr4Qm-n-?n~%eWRjyvPo{^?6HZ@3zTE|AI zYuZzgxbh<{rmEz$RY7?{wVvhOHs2(eIHQ+Am z#v_ihIvhc=DEJVV5b4q>w-9r~{EeYMS`PDDcgpIuB_?+aA_E&CxE%v6BevKoJ z<-sgRtG1p1Pb{uAb2TxIG$wb;QF-wcK}N>Rnv8-a`NTOLsxf^*KRVHe;d#I=-gr`O zgP-Vx#7QM+{2Pr96$}_`La2gQ7v*gmxwY1q?7RxTz0UaOJ0@}Y&2V)$=ho7DLUEju zLSBsub8@4HkcB5)YB_jNCD{yfNR5|A<5Y8oBZ@ zgry*o=YXM31ncKb;PlU_ceJ9yY*$L9pnGkB4373bK)!NB1E^bP46Eaf0YqDXY*tWa z$z6d;6cR})5TPH1?&u!lfq{GjQp18gXRrMwUxpicLqk2Uz9!2p!|}seBo2N-+g3zQ zCQc*aQSl(8A^0Fp7h_(X-e`%2sIlYNHS}{*}WH=yy>fq+? zk-9&tvmN>oBk@uXDk+QTuEReoB506um^UnM#8mFv)lNE`FoveuN=bn z9)QFiv-I`7&o$sIHLah#zTfIC&uE(6=yZI}SkUT8us$LDDpXLbCWnNxaU%RE>JoD9 z5qjxVU0*=O!4MNUOAq`ag|q-1u*(N*sWJm^S5yC$#1xPEizCkPtCkWarn;*$k#^Ds z{{Rl7!(;zxuIa)j;lF|$o}+of)lS*KDa~|q6Q;C_x>rQYe48qy$3MeckSYxXf+y+z z1J4fI;%Uo*-M!%cVx^_s-RPvQRW$SgU-s&ky?{&J-7*UF_k7CO0 ztGD0Y643D*JI?ZpKryZDCt~j@E51oiI^^4`FIk9$4p2Ac-^~zD$0L?2)2Gd&(Q=KZ zjFkjwT4mq#KXx^3qM@6GCWg|s0x0v(JXiKgJu@37tghM`*UlQ`7@TH~Q|=~Ip)fef=^4<3)mtYtSd;er zz~dbs6{}8)^JFG^gkDqve+4yZ)p0XJ7v}lI9vMbAGrtFl-8Ng^o& zS4sab&xz{$^V%VsD2#mXoSVt^Zmxp_q&w{~!1W5|NNC3=*6+-2W9Sw~5!(+jX2Ou2 zX(_v#4J=&>`$Y7;!okFAZJ?1AJLD{(b!^TPba{R7e@E|^K1=cK75{^}&?8)UJNfc- z#OT7v1C=3}d=EBcX#M^(TOtD&JYESBKB7XVk6*%qXA~%((o#U!!i_#Nh7+p8`zN>{ zR1aj*9E^If%f6l7qw%oK80P<|kH?HxGdWNM6Rbf7(k@F!yOJ7}-7)3(3;KXscbt83 zWn|6mcQoN`U!8ocwh&*fe!V;t=fxhQ?}KoRtbI9^7%r>yh>dp!3d8{IJi!+*675&T zJLdclu)oARD(OKidpD}=2BL(dHcoRm64CKNJ}vf&$GGXVMhiI@XTZS0KlfBM^WYvf ziYRlXk0e!U&s9C3oitI|^yx0SHJn(a=ERhwv4q^H!&LF1w)>C4y{&AiwB;0Zg?d1L z_7Kv`S*9lgR}{`|vDiUrX?T$o1-hfZs8Bt z@>PVKX>Hn6eMTNA?~^ z6}1qUu!rZMyHL-fJE_Tm8%Rgvew6VWCeVRd==4h|O}DA{REuxfj7>2tb~6U9W%C)O zP9ATS6=sPggr{+i&`+oL)xp{rj~1i4r)z@_LfkQS zwobm(6Slg2j#3<@$C5P^)4&S(K&QlK_P|n{Ol$H^`hbW1gO|amQRjJ@;+rAK0-h>Wgv)>Rl+c#;Ks3&1FpGVm3e8C|Osf_X4w1BI9>hw|&ONW48 zjRPs;7rh<&2vYkPk1Y1jL>YGRqj=W|wjK3?c#jn)nB!&@4*h~?z$R+HO9Bh15KQ<- zb+SfJcUft0dN)MfQ-7EA@`Hqp>6Y7xtI>qBpIX0y$-gtMC#gkMWHp``sYj*r4Pn~L zMQt^PofDDCUhF5Ojmuky1Gt6!Od@bqC1bZ?ZI^0P*eZs-Z9MYhMd5Xl2Z7MN?&5?o zOAp%pQ<|pQNXIKIdG%I8rYAuQf-vmEYyVf2uZS`@nOmUhXxXTqwe#}wJ074~ZQ_c? zyY_Dpbt!}HH1LE^WS^BNIVW;vh_qncV-GLM%=xu+kAKk0zYXT3HucV1U^2+@o)FIb zcB^d^XLK5y2fYpOacBqguMZdxl^!gV0?jLA@#hq|B5^j%3K&mv5ogW!@dP?M0g2m; zVy*6ruL4OWmudI~>j`{lX9ziQU@W0u!>mf429}>dqWh}>@|1O4hy0Ehnv68d`pgx{ z$?-nbc_J+)m~>D02V|1JXVnU56jrLK(A4H;4dJj|V7SFGiKW6=rlicVQ7JI*pl#sl zLVP@37M;d26>P66$kP^?JpWrZSB}MZ{{8K}0F$QTMxXq6W4(x8kb1xj1Xd&_&)J%T z0>|LjG%yt1wQS2W*jj%tO6XDTYe*Jd0`!3fX}NFJD;6~*_|_ET1*kR*e=p&e!MO~? zxuD&KiZ8#zs4d6IN`VeW{Cx6BI+m{lK__{POBJ?j2R*16#!$8k-cs^*)-Sc!%7K9B z3v@h{QsR_(lalv@*dkyt+fzk5Nl4?oMt)pricwM1W)E=DcQWY*&0Axpxu+lo&~_1J ztywkA3xh~kGvq~YTc?&yl}6|T3##rGRHw%#tbFo_HBN21mI%5!<-h;9y6#W&UH#ci zuhtEs*LX2fZNG!8w!dDjz8D$KqUjH{c`k#e-z3PV+moF?j#^yFU)~>Df!f)1!kE1D z2zYM4EgyrDQsN(6w}I+O9{f-1#^!i5J`zTSpc&VUD~dsitmr_8yX$m`vQ8;3PShMQN!EJ0z_(H0ir zk&uxWq{WY3>fdx=w3*`^=bgJ+g(On@!EXFfi5ck9^YHtp{*_Ul&XIHB82qm z`6Mkbe(BK)7RlW04zg@*!v0Mgi}SXFDQX-S_y|~0u)Ki(gGsmsM9H>Z==A_IV8?>? zORsi=!)x^kcxYA_ujO)vfz-skMiz0E1`tmDRsFtp?+$;xxWq;2IBH{9HK7oiZrt?d zW*XdN_ySS#s~M$rT-|-huXQkQJYyj*_HrphWFpPI8M}s2DEAbrah)W8mKRohMUgO0T?vbQ5uY57XF*V%5pEmca!$IiPq4;n28iQ{ z<_$_FiB7I7vAc!sk`dFqyBI=5>p%anqf)YB&<%~Mn_Y^Rv!7UL)u1%q)CvZzjSwY#hm9arZJoTklW zm3%UBG_3XX&NxDs@aSQpBDDBl+n;i zeoiF1Pj}ySiqd_Q4Yl;pDLUDtUy5DT8L}`!XuH+1;mT6w04Tk0(D~M8`XhV3Ah;aj zuMJ^bDZUl}I_hQ<6S`y{QBDK2>#t=nR`fzn(mdkz_+kikb0K}bvcP?ai7us-!js4! zoEgmbB!_AJK^2{X>kg`2vVx<1JPw2>ICIr!3v|r2TiAgiE*2e&D^Mz2vPaKOh={IL zNGSxbik|bEx1F-zr#T@{^SO+Urt1(t3w-vVmvq8V+Jsr_tZbinZn@le+o^S3TpxQ#9qvQGWmv;^}eEb1JB$TOKi z_8ScwY;BMFhjUl9*b&+tQg-9|l+LEnRsOt(F(P}KP8`ptRF5@1Lf_w(2_jkfvIk1n zZH0a?vL@;~^4ur_Wk68?P8HV{Wx_aNJ1AW5@e~H9%?Oakt7IbGQi32eLt%yWkvvuE zNeC?+%P99ax~HXjTXcmw6w%*yc5RXJ_>OFLOERcIHzM1mu9aOw1z@)Z(oUI$XNAnz z5qth9!LbO^ii;^i21aqeFMzC+WF$<3N$9J{LScRJ|9JLy+qVa)+kYv(6c4@21^r?{?X*)rqdt1i-vJ;FzlAR<(mz_O)V34zeLu9CT z?ExXW#8sIqD3U^T@^YWuntbMMqk#uerx+w^9>R`ti4j8m68Wx_8fZatHBm+(^lP%+ z?_2+M?$`i0=~&TV%QEysWklrSch*8hPWp~jE3As%53)bSrPYccIzKzKN#@yGL?$_f z_{)FbcYVX&(8TkpCo8vqJ?ehk69&DlNnAd*2gvi?KND-4_x64s)NS5+AlGzAkZKfpb%9J*Z9{P!;!dqPm~311zU8=eqo@1p zU6MIC9QQW$*wylKoblLeE!DaSd%|Gz>;20;4yHT>ndIRx6W9`d5I^YcEXNb1>snAH z0gcH-#747~kdevW3+)LC{_rGDnLA4Lg+bSSB7Gn-NtFNkMftbGng^BZqaQADtvvWl zBQO@efA`1f`d)^8bUcfz(J1!Wl_~#Li@IL>+a7=ozcU9I@~S6mc-7(g@N*L8K8M7# zY-^y|v9PEkYaowG0&U)Up8B!OTDO`YXq)A3gwN>D5Hk3?Zx|T2$BM6|-wm6W;R-#4 z8x;J+B5+TCt5?Xhd^7S*f1 zbHTQ2+W-<2>D^h3ftX2%KQVRlY~GaH!!lNh$ftnzv{p}j<*Im8_I~wH`uzJ-l8YsL z5MjZ`|5uUT8@->!KImIDmJl zw=Gt4rA1A0pH{_VV*_)YY@VehuFxPnuJ8~y-@|uPbNNu1#V(T@Rs^{Frr@jAvB`Uu zdhO8*ZG#`y0e(TZMN|i8vI%X>Apk=VVcNi&Zcd$ImpE zI^l%wD%4!>3C)an;lrCYiHwmP%@{fF`qcIUrKm!a18AOcvdCDjt{u91Ak;PWwWY%ht#D7u_BcKcF%k1cXO<+NPg`-*up=_TL84~O%V7^ zrlGXNdp_(7e38A+Z}}r~sr{k2b*t)>dkG>p3fre2CJ=;bItp9rzQMfDAGai1#FY5< zHY(>v>oKK9Mt_=TJq~4!IFd6&yjvt$#Hkro#q+-tw9$OSa2fnhL{0ISaoKA)IG)}M z?LOTlPGmjbuKz8+G?Bj2d@>`*r;KTSf4SipO=rl_S zYZlMGXs5~5n<&Vqq`Uj9;YEhj^3N|zzcW19es$2_4r4@|IT$WnwV`!M+KK8pe;=b= zl4xn@W*JbYd$_X<^3f4~3=BFwgCerq2f>wM2PZ^VDH%pfxDV;8T1drNtKi4(NlX-! zzcGL9EuQ>OAWx;Ac(3udOO~(?5i|@RhkaJp&xIhD9M&?jA98b)MCzxjT5nb`VaMsK zVW-Ij)B~w`uQ6dAij;uKdPqydxnwQ!>kSX}SD*_X`|Vw2%MlF4}OnyG-L>;{a9 z@h|}8C6VBxwch>4JZ5E;J^bd!n(}sid&27PaUgtq)Tm_U>R=P^Py2xd zt56z{ox_`PLr|uI53ZzM`g81EA3F-$1My}#+83c7DnkHwwuwkAugs3;ojzcgD)7?- zwvJ;(yq^pd+Mi&Mfc{oO=Ou>DP8itX=i$;FF{pc@O9p6+e3aUm;CZ?y z?rl?l+a8CK|0HgKK$73Pyk0KODrBtVLZ4lum!BQblTavLsRJai%A1@QP#m|O$Kr&9 z#uAhVd?NJuS5b7G(jx4j+d(8GGM#eLbE)zna_0l*>$a5_k)8kR^;**Y;# zZQ%q>6yw;y8nxmTAD;N?PxBq@WWOcH&RCnPRk7*?r0WVP>n_2IvbWzKD5+x#h_d5% zdk>fDsiYWEKsSextG9W0PrtwV!1r6XhJ2)w_qYt;w8boKZ>P^hb;^wA(zm7<-42=C z6I3xz+QiK1raws0a_Sh$pFK}Nm8GReW3o+c%Ftw1UHh=gD#|?z);FEl*8o^7DhVdM zGSK0c-}*?A5DZzvx(6~ZY>)DXuAN)dir5btH)Sdvw0PZKzhqFSos|6LE~U*{N<1S? z8RAJ?PuEC(Q<>H{kzH4a#mn=RVLY@a;x@W<`Jtoa+@b=tXgq$NQG`bc|5Gh`NJ zVS8hS7e6TFVw;Y?^mlwpn~(9Hts~iP9{d{i_9;HGWJk=@o(Zw;=q#Q_Vq|i$vCJ?mf&_HdM5{>eh= z!{I(^TWQV)5bH6JJ7;;^_<5` z>)Pz4|1A^j(=*VdUg@Xk`%KMHo3=9kT%vfFz0J3*K{1f=4HK|g}RKrJvpa8&sWo^-hNT}^`&x;)pk;t zY-5M0-L$yKMOel|5tOevGFeah>1N~#yfFGQvv-K{of%0tz!Sc?p1l@Mi zeq#G#ro*GJGuaD`U&wa;cg_@>R}HTd{!ip}m_P4xxwdH%G`QM%4hiWOlYh7WD>^!a zg^|atB=Ao5ZTqauSTACt^X{&bJqZKb`@&8ud|9H3qtljcNt53u1L`_0wj-U;g=o)s z8!c$tB`}27P72^EIZ6q&)udUb=WZY~@~AnIo$=Yx9(+f8&vg+7=I;23*+$1|Ky^^P zfQ;$KZBxEkNLdSYj@QooNHzJMR$7^FBXvjH2Q9^GEUqxe7aFvxK(;iFfS644Byj@9 zc@7SQW*Dm8)4DdmSW@p#$lEksBbZ&&o5LS^Fp!B`snTT>GW()vHYVCnq6dLH;C=*X zf0&)27a4^Q88LtkFu7BSfP->-s7_5*^q%m-2JQ-$>I1u2$Q`I-psl`Ge596npa89{ zl2jpfK@k-FY?n=%!}_k^=Tpf;;r=kegx;@EjqU!>-d8XAu?wvAj7KwI-70R7ya=R@ zRxC~D8cP$DxLsZ=R7ax~hGjcD$tm`6Ot>!$kuf}RPUz2Ur-XDf_?bHO!ZxhtVH0%v z*)%3J?cyh0WXg@GbtU%jVD)-Q|IjUq@_F&|+ye&NtNBZn+g-rzx11Y`$9D_hR}8V; z>n^VV&4jWuWJ*ikKTEv^pNB*(2(r>78T9ObaxJ$|Ly(ify_MX z%^K~^S9+E!6zwtO3O#aY)YDzfT}s#a`BT3WYv?p5GA#XnXNtr3PkgB2iE&7TAv3WW z?JkC_UVMZx+YITG<26MV*)Nvy(`t8rdy>^JXd%%oprMZQgoK>91vJ|r7>4U)s^*NY&vwJQRqlH04$yj$fN#E~p7USq|MAgq&{xfQ*wi2Vo~JGLI;zWAB#M5i z`*~0$92fZV1DrVe7d>#sgfB#1=S(|Hb|Ka-l|=0%7<2nOYY_7m^QEb9q;CmzZy@O^ zlwK4-bK&^Zam`dXFv%C6_uP3RiABA`EFuyIer+u^qxQK+SdSka@k^mfvHOQ=aGJC@ z)6W|l$rbkc&HazGNvt>U}nR=h)lw~3957GreaU#*r zq}!n^8gfbuB?pgXO(-vhzbaIcqGGLV1P@pbbnBl>xZP|V%mFR}3&N<+zAT)kL{znz z3Y>V}%__Occn81sWdDCWU1dPi>)WPNVswmdX%M7KQj`#-I}{`bQqtWU9nzqp(lxqa zFgm4WFhc3>c;`9i|9<1+cz#dZ_jO-^B38Mbgdy8F6K8%(uK3k7^k?*R?;j|~Ak+JO zfMAXShN?>6djWRL@$`|opCY=-qg9gZ*CE`m!etbZx|r`cwEwxX7DISEgB0we=^!} zv;GIOLAP%0ta*pHvDuAgZq|NPvj~#IPk`fFCH;XV#QVAsKbmj7c>AD?1|$c~>kEDy?P+td84$bA_2P zTcf1qnjj)g!16dYwL6+xt@F+rn1V3{qD&z4tqb2ZnBfI?hvvU@CM(4Vzf*XJLOW>y zw(}B75VPx$?*lL~p3e2TlguDGLMKGcn|x_m-6PCn4cr&{A-&MPrzO8#2-`_FPez?N zmInyw6Fq06%?F!%b5)YC#kWsOc2xkCT!y=^fnCWPfIki@HlNcWj0@vUPD4rxDbf9lRSox6l86)5y>KgGt+-PJ7)6R>xiZuPQ zlq!a|>H#aBRH_Qx>B^wq+rUSPjAQQ&k9RURJ}sUuA|rGOWZDtg2NwRQ>Zx%Tsi%nT zYssc2N1buo$%>UKeXVqw{M17jcd;4eQ{=x{^#HlM%)gmW{1?Tr2Kjt=QnB2Q@(#Sq zbKncHT#axu9fw(Gv<`ioU8C;&`I>q_AdC%HAerT+Pk4PmFt;lX%v9Fuvx+6JeEIV; zG%IK|nZ=z_W;dA{!$~Hvtz$^g80l{^%JgDZ24iU;PL7wJ0Rda0y6#RWYOMav>8M2E zbkqV~i}tWFm+xf9$H}ZmQJG8`ZL>uckW&0&;DU6lXs-9+v5b60d+~9=jyKMPfPxtncp`$zg#goY|t^%eY0`>)Usp3gsR_jdd3zj7Heq{_%!BR)WR$9K1IdAq{cPm{BR(~%(WG$bA^ z13SlrPC%iAYze5b{>_8We@q(mDwKapMZgC?nTO5AuhkOWe^|NVi{>BWbAtj4wfDWP z!*?IiGH2Eu+9M-K{?yRgS=mAb*GFEH>V{ysAO4U=DSEtJDa?^;qr^;*+ae9F6JKKG zF&3S3=fhx1ly73PKN_$rCkoS4Dllh=Q`RTkO2vi36Kh$e=v4@N^3RiFW|K4YG)=I~e><%M~{t4D#016O7(-pGZd6QJ~ypdA73 zE}rYYYT7`LdTBrab09o!YRA_dC?F!|L!POW!On;Q`FIhzpt>Uf-L?y_Bp@B~$r5gj zQU0g!1w(nAIwvl)o-Sg4*56r=59P`CIU%`n&@gp|GuGvqjO?HSLX+irKZ)urQnke{&7P+7?U#$o1%_6H`T4(rRF-me$89CyJ^|fb9n5t+k zdePye2+z8!u*X%A@hu@oDn(6Wrx+n&9m?>QisjpsYC??yQ_E+w>5}SEiV!#Ev3U80u@ap_>&>*N!z*QG0DO74U3=4&` z2?o@1cTYZB2$U$7B1fp5uT6T#Y(etRs>XI(^>|Eo+m>&BiZn)bxY~@Nl z)eq=G)jKigGn-z`uQCLkI<392OHYLpi(=X4GTm`wvtVPktEEQve}L2%nG#;sILGxbvf~YEv*P) zDLo}?_!%1>!oRaoO;gg{(LMbbYQ;cDmi-KYrOpXVza_pFbyl}ZV__3g@)re%6sc@* zyIgiqzipN0L}G&n8h|H7C?mzrenol6)@9+oiv_(B$~H2e!Rh{(>EJI+pQ&4k`xR5! zw9?f=U>N4yQMK3;qoDYvSOc0vzoJH$26p^h^z zGFCHM0OP_E1mFH_=!XQIW$aD0I`sx^mBz3s66y1u_HK2Q^|+4Sx{7i73HSP&lZHIn zCl2&xE^ZrAOcHxc;d1i8x5j$L9?nb*d|r2C>2KGm=bhPp>YQ^%_?z{2i&KQOQbXDn z;h_sw@fR8l+R(->ry*}Cr~3fhE14Cn4Ce^zDBHth`;pNWRYX5YEbAfVKIpcuhV;-_ z%2F6hF?GF=GN;_0jRsS?Kuj{Rd_d9^I@icoMD*G7xJfKV+)YNVhbDQ=YE0TwOIZXL<&~Ap_G)7C4YNjeQQ_1Nxf($?W%pvs6@krhLFo|a5iQMS z%xVCee;LjL>|&WIz!PZEHjH|qLouUxAHLpH&w?8Qci&WpzuxHEs;-wH`^b~S&BQdJ zNPi$A#Is4bEV2H_SmBsz8b{vn=&880QU&QB5S4D628Iple!)1?LG@Nmh81F-{HwFq z(`E@Pdx@sMZa3ub^QRV3Er>co!$oeaeC*?n#Z+3*Dvk@7sBEm#lc+- zn<--|kH&g|iZZ`ZlQ^=nTU?v^oI^FnULiSmo24%#8(nKlS>5XY z0l#mstVSj{$2Bi$xfRLi#|ybTV-1P4njLnrx_`0(>3#4U-{MB zuT2u&(#p&{#Ly-QrQQmxm+geV36nW{;U$D{4DG}6PT<(o6xzO)x!&9XucSWh4eYWae zEtw&!F8Qp1vW9jGEeE~OfZ5;K@ri)k;SCLIAk$UtfZ?Bydb5`$fo)b>#%$(0&qz8_ z#Garqj0D(4gnQ^J?K`QBxysByX>#c`Tg+REDDtZL*G`BSfcfoYD2prmIrJy&&R#8B z3*zf87P|$?Z7t~P_*`|V*plB_LN4fEkeaa;<8F}EmhKDzJx^<=kx731l-SsX>lU`m z)jmfG|25u#X=PaSZ8aj5eDG}@61b2BCZrpPeI}BT6@JGY4kW%G>Xu3Tp-!H_O66?U z^PavPVl9}}S~r0{FWW5@Wvt)nu4S(lqYdh+^Ef&PQ~pj53(h zRPTAPIh#vlefSpZ-6zPN)4#PL>iyvIES(W_ITItTVtcWIxn(tF#-L+LOHm zBsaKq5%p}_;O;hX5bG)ch-wdH5Z=!C@kq|B@zSY9 z`qmpmQ>|>lfsNVs5-XcX-`e}fmDq+&g5tS;;{3E& zhJ$8)B`_|C%g69YWBeIFk>e+^2^j{(=b~9Mmrit&NBl1jF%iaGB}8R&3~#;$#V8WK zSnH&2X;5Id2}mvpb7PElR+*;{FQci8G2GByff}#1eZMWBL@Z(ly4>b)`0XYe@E5mD zzR2f~|MiJX{t_|VCgI$-YL#7}8o0$dkyTxRMKud#vuvH+|0WUopzqQ5HP#E=A@2Su z5vd8C%*N@LzNq~XUjQn7Jn-eAw1X7J?L}{b(-u)?5BvfXS%MKWQR8asoiA(x8j5AW zTXEw3I1&|St~V+K9MI{@9q+K+79FH9Wp2=)9z$ekOHB_TW6Kq|{nev@>r4&Q(gi7g zfZo?zg?gMQZk#}I8}@>Q$g~|TUXaQKhGjmcaf=cv_(2j*nNe&P+eOS0! zh*hi9Kef|Qe_(F$KI<}52Pg^bpC#^Zu?X~ReYnby{egl&ST9$>9U=Hr-32Fw{d|gK zr+%#xtemIrFU)s2b+AYnw5WH^7V}o{d%P2=SG`_nbI3f3st!|T+ z%yq{N>#wXNe}}La0{Y7XCpS{-hb>913lc7n-uEzDCBCLg*{HZkocxc1LIcBeUMkH?6so1;-v z=zPZ;7J%!tch`->SQpMI+Qk_rN8F3BwbgstTU6f=GW-=h&O}_t_0Hyx!lt1$0Wkyu z8(O&^z5LU0L-N7~WP9)3zBK4NA^wJNwFBq8rQ!n2*Ow%Lb9fQnF@y&@$i^3iN8Vx2 zFLvT`N;(rhrEd_pC7kT2-BX4}xs?&@Tgd?zs2JQL3<-c}`@}r{dizvxHJ4$EnuTMG zo+rI)Js4L@jHVQzD(Q$3>%+7nCg)u>?|21+kY39qX{sA@IfYUEBpE!-bO|g&j%t%5 zGssNzWMsXBY$|VM1c3DCxipjTmNRAngv2}H(5?&@`5Q(VM7x9Q+Dh{a<%J8f>>rn@ zlcUi5#?W)uJhr$fRlx&)CT{%^R%O&HJ=0ipbH#Rinai6v#I*V|z)0rc{dc)jHS4iR z(xo+#YYn4dhY5prl=Q=k@klQw_swlxckK)Jh;b;kzfiQa!iHDD|17PxZkibX2oUf@&;-$nnLc)zYcrc?c3Qm2)~@{GP_PVDP|36m_SBFE=l|D*xb zlN(Z7B_=0(7$)okMBG`TxK50x8LYj%px_IbVOCyEPw(O7r-BI)3QFETtN6J#l1y?i z5zflF?6U1v|ElVId%TeihAUZMU_Hx*;j3Sx0pjMD=iab`o1ljr_*pL7dCMCrW_~nZ zGwECJ8Ef6CairLN3*9>LE#tGOvU5Zx^wmWux_@kpgd4<@;p_T>F=Vlivh=(nEKK)8 z`c0W8mHK*|P=f||c`G<6+U$Lmu7C<4Y$$%H2#HblAPE;<2a~j z*TNBkPrPiq^*ENsq8(Gqv-)63@>nVvE)urB#HvIlAySk^z!p8qr%_{7z62Meddmhv zUbX|=_~Kb+U-=Db6ZQdG~+ zSvFEKU0S5I&GtmlH%+gpGwUsmP3v;9pwk3Z@7E;DT(0wtP!V&IO_GfR^6ZXN$ltCv zn$%)xqtpb9Bg5TH`ql&mZ{XTpxsCUArTa@--gHSf`b!8QnfLml$t>(#sXq?n2{x90 zYjF~1f>ff!6;E%&F{rq>Vx`P zzd0LkcU=PNLK8ep4P5dcax1>;?VpH$NC!z)%+PAAA5f#y0iUCXGQfRYw`Fcmru zmXZ6$9f}QH7qm?aiixAC!|je_it<4PC8SIt<674v;Ei84f-0-;1Jn}}q8`n7W&#{p z(b-nTEsR=Y+3MA;&rjmmpcqyHBy;butwX}S{67m+I=MtOxzD`;hQy2G+)TGgtMjo1 zZ(TBt?qZo$`X~_bK2ls#TP&uAfymiq40J0EbC* z6sm`2(jTuEd=AviX_?y3L;L>{gf6fdZlQ_9@>`UnCj_=gkjr$vXPflGSXQ$f?mNex z$KLD3@lY!@;O?VG9o93rPCRZUAWI^gXR+SfF3%BVzdjGt2_ahMr@;{?aYAgVaOWxN)yP*Rs`icVGJ9C z{u))BpYoB*iDK^|u)tC%f>+`7K5zRrcdPlgxWG8Huwn3j6j)`7G3?{$ z)9SPxyyTg3VfNIe*B_Lq#F(KWaX5(^8))h6P7;}9I6W_yZQzXRHbZhBuQ`G4HEf8- zV`j8_#ZNY}yA8PPgE%Pyr>f^9=NEmGKaB;-?`>T-w2PVF2tI5!9{+5yIp_uRid&t= zky>;bF(qOroMyiy6r2C+?bbN}X7Xw@W@sTLrDZ7&p?;)L)x$*5&#@p8s^V=D4IU@- zZ+4MiGOYunZCKzv;|AU>KvGC}Jfj)k#lvie0tk^$_1?=e3C00JpqJ}jZdeE=O z(BO`aQ46O6AVtwmYy|8&M*(QJeyfBXYz{F8@%&%kvMM|G}_NKH{VAEe$f6L||q{0nwG#8z_(c z@)EfyW^8QTBHwt`gr@^}Xw${>%}@iFqnHp}2K_|OI0n}y!q8ppq-TPGJ}g++N!;;# zfpysYxMJGG@LqQcqa3ooq+c1@L-JUYmC3z)hn!)#n@T`Zt?{Cd&EMCtJRF;{^n_k=5=4;A?d7wxwTmxpK6u)C6qkIH{% zRq(@;KNu;cKQQmZEcfQw7e%-{^SG8{XRwT90_kuejV5>5=6i)IRm>}O3ovV~2g#%@ z8@2oLHFYF;-=@WNf3w8#ci1_|y6Zz#cL*2p6Pe&f<&_@GqsIDCLgwZZOcfHi-ce5@ z^>e2pbjH0Wv__m9a#U3i$w(9cnAN$8ItVWJBM<$J=Y$H6p1@ zA)h(A@x^TJg8`fhR3Dm`;QJ5RiHW>LD@4ZaDIFndaWr}ao@cDcnvK&jO2Hx8 z=+w%Tk12fg-Lx@@mpK{)t5Z*r?S1BJAN**Y)`o^&3JXWK{!-$-AE@d)>0@9TT4vJ4 zn^#+9`yd$kjReGLnYUYjn#_8w9hNu1^nz|&Av+Hv58k`WJ<4Q#0BPtYAe`gTG~VZv z0woO@5>c;KvA!KD?m3vI(H(U0V|!(Zc*VojT#>(~;)e}6U z6c4yaGy(gSI+3h>Qq!Dht%pAlcjaj)39v8e;P#%0slnpoPaD*IirSz4?sEd*Icz<1 zf}_+2kj~douP@NZ%%xw89sH_EoUm6eR7;u-;^b^DNN} zuB6(CNu~xPRBDkaLLAE6XAH}>Fm5hW`d{hRr|i(mbO=SQEYk5yU30!GWOe5!N4rhz zf4pn|%sq=S0t-P>jaq6(7UK4cHqhNxpv%%_(EVO@QxvTjiWibDR26)X9i_%+9C23o zK5Sl=*z)KXfP(3R%nWGCLpcN!Xe4Ci)hLfAvd}y_7(u}95=KksGw@9S@oh{=H3!hS zap9F_?>^sB;QTn8?_)J~fk3F%Q_T{XgkT9=Uz4ZH&KgL#5m$pEjyrr+uO~k+hb1- zMSLNlQe;Mg0f|oWI`UabZ&>+$Q`&T~i8Xp)t?)@ZLk@1+nV7uI|09Oe@1f=xVzMYO+P2zD3F6KOHB zFjPM(7(pOwux-|8e6#8zP1dxcz9bfi&k=8Z<}h&TIFO&Cwv=HJp#D|unu_W6Rw{gQ z>F)SD$(;V3l*)>m^hM+^A1f8^S6$#n)YtbRtGbv_Lk?EnEugO8TL^6PJfQZlC%WPRpr4bV_%2kFq`wJ-acY(M(POmk{4!cN8^ogTX*@q+=YA*z%4Yz?YMNbD7&2B7ii4QJTxEtk? zeN1&d;a9cd4Xs#&rg&9jCwt;c-|u>zKKA&yi#RewHP(-GI@vlKXcPRiN5>S0HL?gK z_mptgsbjrXk$Y*H@Nj#)OvjyEU|<)qlAeW;q1zvo^Cw;S^RNCUT*QU9EjIM0Ro-1U zo(0{J^lzTa)>cV`TH{4?#25n=vC%t)wfkk|l?2I#hs@Zxg`}eZ&RIRESr<8nGwa*J z-K`gHkfcW~w+M7(? z8}vY44%)fS{9SjHy1i#p9woZ*GKaxew0fl)=$~|%3+$Sz0J#yHMT9~|0`ePvTI&LE zqF%w21h37S;f`EEm6JskU(p=)BU=iYf{%XBZ$W+G zi3BCPieBaRd&}W(OgUM;oNalRA_5pby7s>UqR$VwS;YgkJ&y8exV<|=RXnWD|0>&5 zx;B5?0|U2OkXJ!B4?^N7S7X9hwi_rS;E@pxI&QU2h)v!AxVrskHNBAZy`K+-YC0=E zxb_!JlYkqpgoQHRs}}=%@yu);e!YZDu!+vC6NH1e359ZN?&4nmDeAj( zFU^^wiTqqoOhpst8`sO;n1AIN{Dowtwt_rbgRo}D1u)Mp%3HqvJ;sM~E9}YmrivWQ zK~sG<3vlQR(_In^JsxQMAoT0X%!1B4zeQ3@fZ=~pW#qk^uD6vSqhkrcGOeFse`^)W ziKsil40<_}18SM;sZnT|iejYhHhk83UXZXr^~s&irm?mH?Qp}wEAVDvj!5$BI%^ZIbwJT2DY1&hRb+`_mODzRyO?N0^tm%-nzA+Zf`ei*qe-;FSB|8{ps?$#5*$X>-Dh|xrZrn;+hYuq?nK)j%B@s~h!mFvMs;peYe zx>w;%f~Lu6jbzn||7J>79m^L1N`|^*(@y*AxvFt~35|LX@|XHujMQE#GBrr@tUwiO2(>jQrBx&CJPl!{8Oi&v38XBRBL6cpnIBc5G6XnOpy zY&~1K8f?5c)kE%f4srbRFg}q}yd{nOC+E)o7NG!IZ|XP|R0D-y#1}jXEy8=w!L6pi zwe^99`~@YC5bey9)VTSQ7S+&Vp}q18U; zJJb#)v77=atu$n&zNX-fC{QGPm}9h>^my|k z*3>($iaS}ZErz}J4?oxGWR%+bLsor%>-)Uw(hOL`140{;GL+H!5>*7C&Zsukf5hL2 zZgU>+Z*u^Znj!NlJ)L1{aKe;TI(L;@><Uwf z2U)>X^qJ4~oqP=c$5U_);o5Xd_4meo;L!(8lN3)YWiwx33*Nl`Ir%)u>_g^dk+;KMOQs+-5-wK|IgnSW&PYDFK`zWI4b!yEoXb1m`I>1#$&BK7UOFH z>xL1Nh%JY%B6E4DBTU^{f>x-+fAHBr-9+shiLFw*Z|SJTocm~>m`Dg1DIK?Q`n?p{Gu9@vztT7wYWUw5 z1Ky_S|MMp`wz#B>?`9V0qmRQU4j~YPWo2_YAX!KOoW%K~a?4?q38(&jl92BR`wO zgCK+=Tj_hdr?#5%W=^oN(1Jxn&X$uZUsJcfALV=eE5wJCUx*HVqd6$H{9se%|2zeC zUP+_PVQ&eFOsO#CF^E~An}7f0r^nJhw(MKRP{zDd7b1xELiF&cz?_MNcLtl7kWlLOA&v0x@@~YK;o$FVJCk2R$ zCGMv<)bn_cwOT#7&fJNYO3Mfv;LGPdQ8$;~FC{xoVFr(EN|}7;C#g=>%ESAq*WA*k z!$Gr2z+osa*eo4!~R-(g1i4g6C`AJ5&M{m=1`RGev<@#+2cgEKI2Z^!1~d^yRL zwkxQ7)kOU;k%*~oq8NYtSP&zp8D(N8&p5Qoz(G}A?UN|q9t=g>*yxzK%+eD-Hl3?g zW7f96F76OD`7)B+l)OIm?y!$4<=sHAD;}ZDv39h?W8EX{^aOJ0GoLYvDH}E{dX~&H2}pJ@METTp^~rJdBjP2 zpuvlSZ13sUEB%}Jg3SpqH4A&3+L881LL+{ZC4t&z^P59q^_VIGa<_l&S`y zBF|kfFzeUjSt5%ataALf<0bqIpH;pPg9OAv+glrKQO=1>7ZG@}YaKI)7Jsj^?Z%VA zIAku9ALhS_4o?^X|LsU7DgPhQQ%R!PGS|urc&1W~^E$w$v;5lx&>#90;EnhG6-BZN z5tUkvLTF4SpQ#Q^f$LM=dsc!q<*W$eZsW#pKXEEwa7TiMADbl^8xZ2Z!OSRb1n|XD zCpy`}?$&`SfcUibsxUz!_!6d3v&RmvlV%`wYQ*8KfLllSS~xcUw}t1n(hzLYfhys) zep*Am!ffZg{sp)EQc?te_eh@NbaJI^YWVb@Vy(e})EezjsU&?nG(%vP24TDAtsLCA z&Ga>?6(1Fh6tUCaG0qmpc46)x=zn>I`nFqn;(s}{sOwQJ;vYIT3>$|8u_1Kd$tJ~R zMd*}lS`v}Z?!UHWBMjFPWq#@#(!&{bq(#trcyh|VqPKdm>Xs`WBWVgn)Zy%sn3VxM<#eD;&_0wH4 zjAb7hgnb?iJyH?pOYYM!XRHUg6r+(Gx3drJ>ja7{R+A~M-?PLIk?h-w5WGQ5CR9#I zvoDUy)psdv1ZoRlOuK@ECl@NICf9YHI22lU!-M6L=yXl2S_bglZUh#(>z}A>Vazqm zv6rWy^?k!d(L-t29>mU~@`D0eAHF<=!B<26JIFGR|78{na33QWk{@{)dQUWITpm4Z zbAUlhLL)Ws%eE4ga>O&qF$`?C$pf&{x+7zmO1S!^8?S!$B{w?u0yW#iZq$%xmG`K+ zJ{MKsw_G?Az%iola|J)7J!^dZ(x$IFhFhZK>~rdlfR4%LD<}T1mp9KJ9nW%4Ea}Cp zYj?-7l6D4+HS;yTrc-!#)Wg1>Ja*b-sI-Uyx18&kh&u3iu2nI#De@`#M(atJhgvj3 zJnYks1+!zv);%>p8=mu`7V&4S0h^Un#QRd+*OJco(5VC5;w*Iatm3ZFc1w7B9U6i! z)(vhj_&8m+;7XoL@q%@!Yt`pLP421O<(lK$zxo8!Yl*V<7yS1Ks) zf_S=$y2EyT*fFL=_IkLqZ9N=0K!t6i+;Q&#za*3U0LoUO<_8Q(5h71EyXkuIdCEK|`6}Yk zPC#(nx9?5fejOIW|0cz@^@@-=XkXGTnJ=X*GSc{RuGyp4xGauKbMbgyG*dekzsOkS*dMvp&Dd~08 z%#Sh1Z0J^rSKb(fMF)%W!T9CdfmT&0ar`SI&~_>CECS@e_uS{-_wN6X3C6BYIcx8$ zMxlN0cNBTYG1TfhSc=s)JfQ{lq5TF0vl2^hFl3Lfml;3(kTj|5{rM;Cx>&AscX2NN zX44zSyKh9_YYmU%LxdeAS+BZMi z_C52GWU{{7S!ys53N^bs)dnvL$~_%DKYaN=oA-Z6mJ^pO)>-~Ix=^0fq06j0|83?xFh+*w_~woO0w$ zS0|#MG<1{`aBwHJFx>q;zh$;=Lb z6{f5UVB0Pfn;N5+!n02>_9WFo2xUYtVjQV@reJ?II$V|`$Db!TIZ1= zYy6Vk;X((oJFGVLg6*Ov^=@5mHbDN+ASc*M0cyCVni zlo#^PM&l)r?$zb1OgGInjHk~N58zA>ztPY31Yzkqj>-}b>rS=16PKwCpDjh%It25X zRyo`2SqwZ5H9M5`@p14!;0p3zYB?L0*b7=k(FIXxiOt_B{$CU)m_Z|;Im{Y!`ukyG zj$R=_Hl9P|mOz=MB|U|l*6T-Iny(9)nED9cjO-s!2*=8`2GyN}J}147FvCuyQ4+c^ zQ}(|$R=?eAuHE?R*IRf`uu+iD82ntg>D$%VNdj4o+S>Acxq=G(3S+eS zg zg6?|Hr_0${-klc)b^%H+hgC{h?U1tSlS$Rv$&ZEO6f{i2B9N@Oh$Q~Sd3$1k1Z1{0 zq#3%`}!8|7oIn6gOxMU+jx=u|R2qwaW{AL2hsOmHmv z4Qw`Jr@gpjhI7))&k1S8PeeJFW)>vvx_=b3dPr$fc~Bf&+$Vz4+k+T=)Qz(8H}I0REn09xoWh`Hu}kstOO*44<+ z#hY@_!;zkFC8@y7+l^TuAz~%%iI=o)?qy?~&Y5M_4VE2WaCJ=F z1^67I8>Kx$%b@EXa$uZq7j*^dMSK`)&(tfhn5pqC1+J&`&vvs(xh``7=--D}xyf}m zuuR^w^WoX5k~wetGKS!hTCg?nous_$n48++-)jGKp`Au6IfT)lHBmS6%_Lmq;VlhX z!^(7DB=G*O?R@(3_t`8gspfWSbdIqn%3_S>?WYo#OeTnegb(H5;MoL zQGe_aKykFy++$de@EYzSi(kB~yVeV20onGixsxL)78A0l&2|fCmoYpziiZP-zq(K`_)`MLi8p4>4Z|8R ze&EZBX<+H$vduAsP4}~EetUWxw|H#cQzHB@OpULI8Uiv@;dSB7^BQr{={dH3l`eob zm&ElNa-=hdNC7V4_hUWf^TI0xROLpQ-F)j6oD6d}C0)9nS)pkNyxBXNUQPkQ!RU=) zSho2C5+dE}67A?;K?}Tu4RW4n;=h;*pmmR*SDWr;+QhjB)8I!Bb^i*9Pn4rp+vK~B z@8mi0Qz**!`ZI_=pe-HXVZyReC#pqu{vx3`m6ijORz<-8vMBP+h4Mnywv0os^6t&> z)imc~cP0N22EGDGqHg>Pxp$US74V~67U%_fL&Dysb8$q33^;A&dmHG(&QG8I1G*+_ z*zo+n`((oU`q?0fqOF6KsG9epha)wB#u&= zH5pqI`nEvO-L9fJ2AlH$uFQ4$Ifzc->ma2&gy`m6ZRM?h{Fr8ibHsXMOH|D+bq7_BcOOaAL(({5&r_Vlv z>$7>9UMN%%t!g_JYocFfSW&y#OEX1AuoBXOgvjK!7Xyd(-W3Dng0#CwP0a`Gjm$RjF1T9PQ)ATuWEFa*A$mpH>Xjn4rSYr_}eIo=)|T3HV+sPv7~p*|YEaK|j07T0_HgsH}cDI%R1>ySfei<*#Jz-bxcJR&QD^ z`K?|Zoohcd{^e2qor(I--7W^*Q}5E{ayhqzJ{6HXHKRU9`42-|(Z(0uRbYA@L&1MU zhld=)FknK{`dwdK=DjQ({8p>mf}mcrY%pKHBP7_yp@V<7v$bty49dC_hV1dv8g~*{ z(3c@9l{_Yp&LMdsE0kr!^U87(g1zL7XiOBJAY{<(oqxLj0U>35`YnnYRSN2%X&0LQ zBG)JXt>yx|VvzeKXEOoJM-ROCV0viN(_MQB^5P8QPn5-7y^Q87{`T8;|!6z$P7Mn?BdekXDIqHAkU7l+MQ+ zf@t}Cz;_|n(UUW`t(mdn`0~ddJ=M{z++%Hl^A;<@^51&8XcESyxaZ=FXoKwVSW5Pk zSsB(dMM=-T!F13(iF4?JPM)NK?;=KCmL)m*n_2a@^wBqd{Fv7-(2kn~L8R6vqOau_ zUb#aQueSx;aq%mfYluD=8thj zmq3Vp7dz77W2=H=xL&1B+RCD4+535yC7B6pOs#z;l9-x7LjUpzqvIhJzN}#cvMOR& z(s_kHyh>(AT`bGINc>v+(54o#?#!V{Zk!h%SWfuOyD78=K-)Q&PaGh8HCK! zPTAQK#5bKnyhj>@r8vrAB$)@^7?G_S$L(Jflu@D8IMnbfDW`o&aa6A1sW@K9lW`tY zq-8c}UtffJ@||XpzsWXvwW5M%_jU!mbx<#nC>O|yaW`+ClTR;cciMMv$PF(?zDuJb zUAZWtTHjU?@ics^#oc`U-JvBlHv;fW%>Dg}Nt)We{KIYI9jp|&U#ng0`!A^1A3gH0 z54qoxijq#pACT11{Y<6iU$fTRu_?uv^L4`B)Yd*SF_a0HE}=grY$ecR>9YI)oP7`| zQE{2e#+~@Pjm>81k<+@7RN7JTOwHzCuq8M*T@@bTjf3U#wg)Zl@U*Fwc}lYx}|MAqKJ=3v!A^Bt5qI z>$m>!?_rGz%I#?02B7fs!7Q`#hNNa{N9sVFjL=CU%(V{Fj@5Xx@`V9(pQ33pbpZB#AMb%ZV z&Rk`;)0rU?(=)6q+_j?$>T6u3FVLXDbhAME0~*B;tm^aSE@T{T6ms9O65Jx#CIrrF zev9I8|I=sFw}v|XQ^ka?u5YJ-{IABjve|FN@N8=j23(Uu}17WOz~Hm>!t@2ZHBOCVV*wh9q{b4 zloH%w=>Bo_L4ATrDJl_h_-O4q-o0Z8dhg^eZ8)ti?K#h$;>91$HX|{waNYj90?_eb zUn>uG{RQ;4@Tov)z5o8yThi(WwT?^q+yBJzjS>$c9DHX zcA-)T*%1zBkF!a#$tGm)y*c~rz31V~jI*6_{I0(J{yBI5cz-_6`+45)XTDxH0_A_6 zSp(gJ{72T*q=~^y3tA`WW`IR0?ujA&L**_>vCWrt>L1aJq!_R5t=|NSw}l)o#(Tdt zm~ATN!mc)64WRxqP_N6;Cm%v5>*=AR+)L0mrD%N>sH+YMwUW&qcPWmq7PL(W$I<%P zCGtB|;oA?{uvHG_@jQHG4h>EhpvEMDVg(1^II>{V?eO)+#p&L09O$l_8oETC{^GKn z1U=sIH|kdW$EivbIuQ^6a@rY1kgdWgz}1S8+ADXyM$m?z0`H(*!ZUH>S-6p()+e<= zgK-|xLUO}BVo1wx$`w1NPPIwED&_$fL*W;2YvwA+*!f|xm~wUZi zs&%e=rf`Clf+3AOifMA>V0A#8>dJlp(qMi=yY(u-bi6 zlKojB6^l;WXiUjCM6Im3zmIlA+A@##I!2tJ_0w&^7jpm)pp{W^t8HkklJ+xtyKK;`+<3tUbj77p#Qi0itaM_6cv zW@^R1w>i?-^ez&d2^0IvrAG8!EqL9oMd}>rQW$KdNv0A)@&4f}(GUYixyn=V3aUhk z51Z-&Z^a&4D7wd#?OW^BnDR4RX^IsMySLu_2OXP4jTO$aHfoV=SiHKlPUm{x9LrN z72u?VkMJH9vToSsBmB&w^4aCQ%~N=j;gHL&HomI{nytLuNUvx*C>o=v3FLX;Yt3G> z&qps7ayeUeGpG%WGcvuuz#SY<_f&j@ucPBF_T#zg$)l{+-zjQTUvS^XYSbD;PbJ)* zb!Zr*W4pyU!Z3OrPxq?ewjdYLws6A#+ym5wtx1AMQiaO zAl8P?lSU>Ib}$+!Nm*h%AqsV@UOdnkEiE9@1L3q|M^-!JG(bGXXBIVjU1bm z5U2CZ%TwEEmHvp`@scT4_tE1FE9vMZOm*{$O*n1f`g)v$2l1fGWmgfS+I%6k&cbur z5t_LzQ5N7wY{&aipvr(zQm#9q(5rZ2A(l^>=ziRJE#~rwfa+Sm0MQ6A85&E~8{?jD z(2p^$fV@=l5HUF~jxnfLdx!GrXV^qm!Y8_(5x@&|enSzx|E_2bT(5sbd6L8D=g>a% z4R@{07k({5Ic321=th`%_5}nn?y(jbS}Xqw}0mo&Id@r*!RFj9Bc9 z#PgRYO9bnU6s+(<=>_*KIUt~C+;D;Wr^~WJ3`k|cWn&bATkothPV!biysTP6V_t^# zU5l^ToL}{u0V-OBg86B78O6Itwmxx=clBN{NY+eQBz!BKIWK`PDd)cvDK_w*wXd1l z+1dQ`aY2tQqYXZZxSL!uCMI&mzR=UC+M*hg;JeJjs0sTd6ccJ=6Tl^a`nau@n#euX&9{p_B>+Nv(Vb8daZEp^<;NZnVi_VE`=le`xG;K88ETg*Rrb|?FWVTwOXP4 z^wJxrgf}mbPgIKm@+QOO%SyYFhbB$$Ig>BC3wazb`$gRkf?&s5@UTE{V+o2y|WLxnV#8bdp5{sGGajz`q0;}7Jbq@t?kj&**+{h47 zU(I=+mmnzm_L>e@-dIN;XpR~XzBimGt$n{70iSlLG~9nyvS3eNoyVQlnveRpT%!eZ zVYp`9Tn-8QxL~QvUjuEWzjtFg z$qFc_vlHZEHF4?+3;h-Roz+8_1Hp;e%T*+URrZYxKhb*WYyJ^C9~TJoZTt_1vv*~X zlZ_-tlb<3i?xncUq3LQa(u?l|`By!UDc|^7mE~WFf0&&B>QL>Ost=r-WsZ$GllEA0Pn@CBe=U_Db(_p(|S(iI`#h zN3kzUkXkin=lPh=deGrxktwN~;Y)!vCfJk9F3kNFx&%7ShV`%{-jDgl^pBrLc#Jm# zom;J7a~9=-sNXf9vQab%^57PR)fT8{%xvkr+T)BwNUgoG7< zfkpYXVM8r1O_omx$jWrCnI5XG=Lrtf5bs@%c%9KwM4c>C_zZ|ZU2MsFX-Gn-l(`c9)RDX{UH>p1!P9?0X+`wa~9fq zj;&)IlQLmOse0)B;I@Z?%xsyhZAaRSH}&=zg^9J8OvR)5+3(fyIcy7H4uS*Kl{A4U z+PcL8foPllxa>qAeVwnQ>F@2CedT$F8jDhffc5GE;J$n)*tx*tU_#%w&{T|6_{oU_ z0LcGML+*YZSKZS(-SklN1sJo%i=VW4oDupE6Y_s&w$t9->i>l)Vk2^U8$EPp4d3g$ z=&5&gT}NRxyJ8Uavm_om{C-+|*4)X0c&-e{8x2HHhzWfH{mAcw*0XfZX?t=?WSxYKv_rGWToNh4Ob0;s~rO=Zv!92dX;e6`f zP2S6sWZsT1y?q15J9y}R77jX}9P%dok8+qA=h_G9_^(qgk36NK!RZSFtl`=40gN7w zoaJatowvd&xt0_~O=&f%N0@WuK!`V##WLjr_V%7VmiZW0p!UuuNZ%-6F9vV-~3QyE@86VM>`Q&x)0uh|SV#&&AqvV}4fh zx`T!vA`Wf$)3uKOXSv*0BeZ`6h}1H5L|cx-?zCtlxW4(vS#NIjA6AyG1lP~`1n9vc zZun7h^)qqiPtozZ$}*cq(yHUnGWtQZMU(v==P>U{dR>W(ISp z8dbLTM|qdcVK5f&T2-+^%ezvBUG|rm82)ScL@eV+G~xHy>$AEP(Tze87bjcc&AkCu;-n?dd8wB<<|*mi(cLjC5uV&1*MVF>`2_;RBBT zWT7mXj*IBtEC&Mj+KrFA9xa1{1zCnWRe2x#Dx`W#m89#vgdu!kQBL}Hnq33+YCkEdtks|Lkw-0G%F#pQtJC*^P`t=7$%{1_ z4OnITe>%ta;9r}MhSa&;B8?}1v*>|glXQd#XB0YPMV8y1_^3!!h+3srC0U4qQ*%40 zL@fNtl!6E}zh%8z(9>Z21N`mux7mPtkAY7WW<=5Pg|TdW7nnA?C^>p~_ZRI{o58%) z$q_w=frtFGIs;Q0Z%I_D?Jf$&KIlQ;{i0rImr%5N69{8o685iu*9_mBAF6PND?vBs zsE7Wgvws=ik)HkEl6yYekdX9jqE936MZ}Oxq|Jv=LI-5?WP1o-UQa<9K9$njPi)Nj z`3(=1^rog>Ec6X8o+wW@Onbc_+!wN?|6bfsQA&$3U*BCLQ(;g%i+5FKI?JR{yXI;9 zxmWKx1ISo3@@zkhZBtMyGGpJ=_?u8DD^I*8{%Frmd;6^C#);|4siP@_{=I))L!p5v zz)b_-4|Ktw%l4|GZtHICVh?>DF`?~S5&rO?U*8pmFZVQ&>AyrHCAYI%QJ_yw|)lL#kc$sBL4&~-+KDKJ?ZrS-^Vq3FKNg^C?7 zw5`L0-~!)_QbCJHw%R8KO*A@0R2CtXMSKh7KX~+CX&$sX8aeehg02c^X{oroAu?@7 zlaoR~jtu*VZZ;9HYamnoN*3!ca4`-<81%jQb*h}TRZIMd*W+jSn`=sODjj>QF4ve} zRx-}=tM_62Us{c_D@(5ZHAFJ5o=Shx^=qj8lE7%~=TI~GZJueN%k{hR6GmF&Ym7(* z!Sy-n9_a(R_EyBc&%%H8(;$WP?myw@QBvn^D1YRTT3Hx;cLoi_7b37sRw=b(7`x}Z zc0UdM2@3pKxFw;AMnfXP{sM0jV)-(JdtB@6nFRV2(b${3Q1xW?Y018D3Y8*QlI1OK zjPq0TUs5yA_J3D=6e@&1*=SNgUaoDlSirsQy`Si-AEkf!>FK`La-~3}cop&AWy*(U z0v@GD{c}Lh%Nrb=Q}+>(SqQHeJcO^~F&)&u;a)0W<@Rtpu~TbdWZEqyU(Se>eu?|A zF-WLIyQ~W%{`_{C-6&ySR_6jA)ht+iGF9*FGj6Vy=J|k3!%R_m%5b9r7Eb+A3uywv z+2Gj+`I4^ewVdZvxF3aAxNbE5W1QEw`4{mZZLkn54Isy`835n_VF&d}!D6OAI-*-9 z^dqc9hG?Wd=Ez}={hg}gC^WPqVObVs^T3=TBny=n+{u$60cC`VK>e+6KkODD zM3ql-p&tyc74<7E_p#YWMBnN!kkKeMz!;7IAeepM)Es8=sgg=cZcN0h5V}7r0VjKwJ&SMsD zAIA!1=lNmeL9EU^KqV ztgo-%iZ=Mna4eE08);)XDap;(&aCtnbP%+KwA@6!#Vh;?Pcn7EtoUwtf|FIfhiA&2 z-v*Y3#GLCTa(EYw!bTP^%YUxCfKJHOvwf*vs8{>Cp zV%SK1mi%6Q(*Ax)%Kp5?M+Zcd^hlRDV1MGrRHKw6-ZLH8}QM+@RF?YE-*?B0GP8g||kF>apDa{cmZGIvZd zkD}lF|Y?oO}j9?AGpCRs-wqj>QeYEwdz~kJZT^+;t9#a7CoLa%`(Vc-_xc zq?6$s&*(DYo&jKEFW_WRH#?F`bj+)@tt0w2mwS0YHYTnv@=)1jq3`L#cdRW}?4eO= zXi({IHB^e4G!in#>)j*aom+~7}%|2&MdD^lz;wqa6PvEi@t z5wPLPHrm|TWG&Ozy3O+}YWVBMcvr%gBl)_ev%sF-mt8#3PWZhpm_Z`*7KI}HGV`DN zk2XYIyF+T*KQS?!uw=l*zpBoTWOyoahmlQ>wC8|!=Cs{Va=g9(QRf7BYhaSxApI-Nz@5f@gcMa(@_!_MO=X?f&Y|@$k`I70Br%C^f%LTU^PJ0N51Sj;g zmn1;lR%<{`CrKb!?hMbps8i9`ahEi&rKLNStT&ac%o6U8XG^PbWV`E{GO7_KE{s+U zx6}gM`i@Dc^xsCQ!4%}?$GHt4IQMASBVKEH$v`)5-(lh~TvMXADX?aKq;#3)y3D7W zIdA9x`}5l7Ht7GGgCOF#u#L>RSY}YN^LDh62D>t(9z~G7-sLLlDz6O~agD+#9|7|T zvLi_%%}q!rNb;rH62(HDHVv1++l)`j zR|V$aK9WAyFdieTg z6?_|=wymz)inU$7jCKvwT4QAM5Zo0p-^=Y~S4WDC^_;ehhZ#&Sc^Jfwbo~lZ6^~Il zEkQlX>~D&?HF)d4u#X!q6Nh=V)e(Kpb`GRc)DfU{OCOxz4;$e3GS>HAbp-YFc0&Jp z5NN|eSFsLZ`~UfXV@O$h7Z>pe+g89q3#tTkeBj!%IUGD-z|KRvzQl%6uS!V!EP=W_ zJ{2;j_!^f2ONiC3+otbZ^+?HZ?96Bj-B|=V?~W8Hx{3C{*j64W5jl?)(bUP&(cYspYjjGF;ir}c}TcV)M;^`~oFJ$>kU zUFqwQqso!yP&3F=v_^Q_On8wwEzYrwFOgOe?^mAsn~zWx>#nnm8LII|<&3y2$HjQ} zE>tt8HfYFG;r|Hs*bjggtDWuVHs-RIGar!lO**FkV)4IIbsX6%&$O>>aB^mVoOXlG zP5@Hp`&IvK%NWMLWXf}C%+$r!XA#nFo{OmEI_Q`ujPW{;1Kzf$Ys=D>W3eMs_QJd` zW4>=j%(6^KW3%!>_~t^t4x%p?9cR8f`Q+5z`BQ2OOamG@wtZ!x3ltT$jbE;g3`7uzlIUjRH@ z7d^M?disKCWnT&W1Zvv@mDRS2SgrP6$rTpx^@2@;9eF_10~m93X^ zWNAexzjd}Bt~tb zfX5G$VX?HvJkn-hZ2_p8ZLi|$^4AwV+)!f3c6Lp3#yMMY z_cvXM+FHGDr^AvFZRc6mIgUPE9kt+3tNGqDa#Y9`Qd_K(Cl);rp>nC?SJ!R2vkX?G zf`OKKIyZZ|H=jpJtUvLiKy6fdx6^vb}+HQyU>(>7(e`!!2Ku{$|W3CWsb=%e# zB`?Z`#FQ8ZYU_8u)t^ZYPjxE=#m73#T!cL1A3RyuTGKAo49VIuf3 zW3M(_6&?+_X=+pCbEq_?Abuqzz;`XRQv0%1w$!uAB$zIia8CbxUmnsM>a_-1?(!9N z=I5-7y|rPxn&9h|{_KVzhmX1y5~H%1Hy+~0@7s5qKai$)0%~QU6{`W} zjIO7fUcN#(Mu4x>AW!0TnhpDYQklxDZyJ)JtiXEtA|vhkQHvD&FVQ}jBFkO#C|~ch zNlDp*BB4hH*$06lHi-^hyjhbv;0L6`sGN#^{(Oyn$Ms=BH;fNseCO_a*Y`+6$uW17 z(pm8`enmb`KpmW1h#VL3uCLHV`nW_XRHSn-Mjtip5kw@UJagW`9=m0945>IogG`Cx z*-K_7g_a5^8S^oJqdEukJx$*9TwGmE0HPEBN}zgWm3<3^iw1E#Sv`_$5!2 ziZ(F9IBa;x$-_fP{m-<80Wu^vt!Z;h%Ma6VV3Q0D?~4u!OjZYnBawC@b+9XF{oS-( zxYPvj_kjWlM&3J#B0hZ)o!+Nhe9nD?c?7I_1!(kfLT>++Fl&ny(UZ?9jl(pGUwGB7 z`h;K0c=kHaV~7dYJQfQ67HS|n`%B{GaZa7LyDfEjFgh0Dle+jl+j{k5r#9}hwIo+L z;s>8hCX_uaaO8Wo3PG#zg8fr|Md}P1feG1ldBZV_(>e^1i`8K7I^4{|3RkjqTz{{0 zx8BySNA2>Nb|TkVr@k)C966>EWb&Ry{&9DU%1<21`x>IRuxCzLZ963;QbWJYfQ^a> z?|;jB1$9ZZHab{!q>wnbidd7amEs4M>DXl44tPN4;7@s$Pv=K@|tK5dv zZ15y%31~|=^{UIF4?@J($x{^+@v{#M|ftlG)Y1jX-fAx|J!@Y@=iY6bARy`=>B zl{tfgx>Uqt)-0WTIA$cVB$1~#qSN8)E6sG@MaZ-4uSQ=La7Hb@(Z0gtG3ndl?N~KE z6zrCE`nXuN0@wzG842z&c&*Dw?=7s{N|o*(RoM_Yt8NT3!~OcNFitisz`s*A+z+q6 zoIj}XbC){{!!inejp{4hE@#E z(SYL0iYdc;*eoZI(|jMp;Tu=5AqbkZn<^I?UGnx5hE&%G%dr}P5%c9pgOMAMBI=70 z+}&p+|1ut-4%T%?W0SVn2E^2TI5Nu8E8dHJX>lW&rqpT)rHpGkPCIll#(9$Do;Uz8 zwSqJJ0tZG)5STiXxP7~*W>I>S@%o!@9e(F|QW$m-@M-OW7dijIrLZ(W@MWYRwEIQ) zqhz|355;vqAfkOU`>t%2P^6o^AQMi}9f@fOMF&vy;P$_{nzw z2rr*Ku>r?q2Xn;sg7MLE;G&~R2(ZgPeTkqaK#q?3fgWs20Y;okuW_)%bg}Gdz378z zg0E*?KsUFS%VFLZrmv4-zHfV#Qm=mUbuzBGo(`-$Sn`5=jo{G9(Cx!_$z^R}p0?;r?g>wew<1}3 zbVU>s2A(^^@YHNVy8)if)+N(vnkZtcn_<^L=lBO^bj~fyo>i;S&iT!)*yQ01qT`hD zP2k#L?Cqs1OSCE5X^S4jXIMzX|1y5MNOII%7h1Lm`M6bl$sXM97(|TvvG~$*c#t|3 zuzvDnTcW(!A#8ZlYfri^Y2|8d!!3|IJ=n%7@ds{`yh{(Cujh{UGQQrSR#N0|_seGq zj(TYqX-VaYEX7bi2BJKT^dkAo^0G8I{?ond?v=$PmW2rq1s0r8LU9NMTTG}BY_dBJ?{uc)*%$AsrZIRsgRBAx9S=Al9|-|s!+ z1T+OHE_t=nG7D0?Xtzw#Y6zAcos2NG@UJ+{FVd(a% zSSnCNBpB1X_q(jfYAUFAkGQ><5%&e=mL2BGSYV!!UM+{9%w@*`H4A8!oPlxfX9UTS zm@kFZfd1F_JeMLjjxQf+D2f3E;LpxvBJtxP_p&l*=&WZ=Qfd=~Y9pzE=6Wp@6LY-{ z7Cp0IBQj$yQ)18J+KTT53pK@^7xu_rf-wHxx;!M<&||rGpRb#c>;2&McLo)cUcX-Y z3?1Ok;7FYQF_lZ=^Os+<7%2_E@11w&!f{STr4yUqb1G6`H?1T$jH)vzDoEo9e(+BC z0DCHm_6Z|;_pK2WfM=2KF#*&fyb$~_$2hIbw^E0YemBMf9+0hS63|#EWkKEr zz%$tjD28tVU0>%i7G!C6&WVaON<>I|_<)gVc3~H-mo=d4A-ih>cIgjWzY5>s?Y%QV z?j;PH5Jpj{2vZROKO(rbIU|mX*}itk1+B05S8mG0QP>PTBG5dMQzY*iZfifo`mn%^ z&MFMlePRmM002Z1O2bf{10p)~T)poEnP+@e3c$YwQJ-*BL|7weWzViUIEjckg$CEV zzaopc7Aol17i$7`GyN-UqAI<{k!f-nj>*91(z#dEpUEMU>lJTs$A#gydLY%lyaiTQjLmX!akX>SlILZ(bd!FYsSbQ zr352>{#DbF#&FHW^s<&S#LMS-2&PIYtYxR^OB#2p<4rx&xx&Rm%u~~_&Bs6Q>5}jm zxir+8FwT*|PXzr&3ZfgX2OgzkTd1x0pEwgGIvW1e>kr@bpfWzG=m% z;?ql!^>+*Vme=uDxjjD*lYUdecd!~ybJOx7MTu?{Qz>62wbw*w1M;>a*lO!dnBMkbM>vqFunXaDBmRv;apy}XFZ;1e?F>SoHHDZc2a~(}@ks15zrE3s~ z+}++GTfqDwglBCA8d!W#-0Ng)aq?|5jARXx=oztvZ#ysdwag-e_GG^}ZU#7ya0E1_ ztz>LZTrXjErxV%50}H(UP0?UT=_K2;@7D2+#h#oUt#_<#5APox)OnlUOvCQ%pq{Nq z*6`bFM8unW>^f@kfx@{Nl@sSHCWJE!kZQko6zp8;4?-%_1X0)D<#0uvc_;mZgSBQV z*Axo-yVnQ~(3~>p0%}TUXN85+8M-`kVt6S9Z(v4or3^A7&wAg6-5++W_8>^Scm06E zwXmZ$^_o>l06ZD$Be$0|uP8X2(ezos5AcI%mK17xB<&JG+6ssGmfd1>G(G-Bb8l%W z40Dtu>-gvg(2S2tQfDQq7)yoAn-cZrey+ca9{&F?_n!iOlIAO;o;A(Da zZd{A@=HWC)<=wdyAk!TfYl;)nlxd zA_fSK!dQjwWjsk!2sH@RC<}P^q_-yC&^3(HkV;8ZEZAjda{}JLf7j)9s|JuRmA>w% zzd9`ex$QT4@=LBgxWBtN!;DSZB%)_9zu)oj4YZ=FL}H~E!i%kA1z_~CpFXupBF$GY``ndyb0m+6WW z&0m#3&)H)A*I%FrC&XO#I~rTCi>QN~55V{Bz(6o^3C5&^Xq7mCwG4dsmsPkYttkIG zhvjb_E*}t7o=-JY?%`((KkO6cv4cAV6%@`$Lgz&Ah=9(?QU=El^i4pgp!#i6|8Mgni03_M zD~;oD&AIdz6|Ch#qWiAyLf>>ytcSs|v}Wd$^$=+K(-w#K6~F;GtZ{qZS?9CIK?1v3 zMKJLhwv?V0iccoW5wHf5N#hen1d_=SMAF<)NAJRJ!aMC&wuD=6QJtiaJ5*;G>c&v| zCa(3+ju~=y;!~9Hx?PTj!08ZHz@$?-1xaHTu7~>H_i?j0_o2#*D{rs@A z748{qcZbwq^4@Op;hlH^Iq3}6h9Ngs3m*hLLa!@FV2J(S${OENUf7YeUOsJgL*}HT zk~;bCa$0-S7r}RBH;bzShS%OxrL18EPuntY^i{3BtkMhH*H-!FIR3uB0&Jxt&<^tu;j98oeZIU|9-|(x1N^{dPCw z{7kpMTQ3ky-m7=l)FiFPRX#h1^sP5)!7sofec`;rK>%^U!1ROW&vPzwnUN(wav7Kk zuYMnfBf!BsO|a|b)w8-*FC^6Nk~bJ}8-eH({qtI@H|vZ#$}8GubMt>Pi1YRo z{lr8HyD9;AAVbn`TY_OfgA2d@S%5J5-vaH9D)x1~Ln-{Et;Y%I%^E?q-lYepU%TG! zcb47WjAYe5=%6$PYYdT>=snsq6u+4_LsXy%ec;=6l;9h&+~W+QT9ppuJvxt z?#MMgm^k=o-;UXPAQCmZDgn5B7mT>+(qM!bc%WaHtb=1i-8hsM=Z!D?98Z=6SG2L2 zDp+r}s@UmAoVS|92B@bb`?y|O{IL@6)t5TTM zxhDGlpZ^BOxEsQ|!$WRf5#JFX^4|@PFhK5z03(&V%wSzAQM>DA>G9RW?z&cIg+MU;lY|X{Ofm6M!qS!Ds8P`xMoBd;$?@Gt~R-1oqqY(>8bZ zL>|FVFPOc5U)+|Um1XzVL-@~I%GF1b&(QSab-gIp#K^*?*G7rw5@)S10eGq_KpL$bYY}xPu+C9xrZ!guRU1iK>SqX&tbEW6s z`=<|B83u*`le(Ej+)7n9HG6aimwwX!B*^?ny{PZQ?=dFI7-2T%Z6`K4@*xII^4yd* zGFcMaT?q79&KzYvlVKC)IxX*y{%|3256fODwE4Kp=^+EF4SV5$ zJ7!d!>Y1w6xT=^=MSNYCHI6L9%Yqxa=f=N9%DY4N$pz-{)D;{3o9UeQvG>(XVXtV! z4)0-H@k>lr!Md4vwfNLplKv>NoF7r(F7wUi>X6+n9{+PbLmvF^vBk6vQ}hy zXn*YY;8)Pq1`mb^R72zPk6V7M-;v*jGho5$5Wbm@j zqDv`zHAk_%&06t98eff&%6eWOGCoEfP9ETU2%Fsf+6V^SY~99_5=JyLr>tQ6lYhvp z3sjWYPGcC<3E;eE$(i3Sjw9b_lc0@SgCEEEMHgw8ky4k{j(pfj$A2#$K4SVuH~%bt z*j&JMuD3Ofcm~KW68sX3#$EJ$x@9vXc)EDTy6mVvu-_)r{RNg~W~l9srjf%Hcv!ui zLEzmH8r%-&Xnw)SV*JsD{6@xm?0u=w6QokBXWxM<{8C05Z7%OJjFj=^9`7`rt}l`PM_s z^fdj?u_l~|p;+RG`|+gpt`TPzVhb3APD{N0T^Y)KkfLmCZmS}ZA8|-#FQ|rZd`8GM zI-~QS6e*Lc^k09!g!&J>(_97?7a8bzLO%Q&_!6KZmd!B>)bKl2Z4AYXb$iwIxCe)M zU%-!F<;E@eQt7;;EME1{VhM%F(T`8xpeDO{jN9Mu&f%h^oClS}@qdz^KuDyoNHme; z9MVEGsvRO-A`$u?-;hYh-mcYB~fU19w*1!57YveFU zSTWJ8hY@Qw*r2H~U>wlr%q!adxebc~h%cn>oxI9|hgi0ZJm=VKE)`xB#$t;wjV_j# z$mg{1`z<_Ymxec~l2D}%H%Xd#?-KV>DL$ZG|KYE#tY;%1)nkIm0DHZ#2d6TIVW+xEBR|H)nEHnk(ufvrd8%V=8V&wwl;mfRm{P*x zn9b@aRqm9S9d?1XR3M8wHnssY81$$&L(#1YjIq%2QjY%0(f1cNrGzd~HJ$iwl*s-U zS&7R0U40U6dEQQqYfZU^C^IT&w+hHf@q2F!`XYm|%OwV_Ip7?szV&GaEm2& zJJ<7&K@1yUf-iK%7pZ<#*G2+%BFkQ<6U~g+3aMxEo~Art{DLE z!$*C-=VeuE9a{UWcRWh$EmNI)UAniH&)en8zxqWcCy<&ssOv(liE99hy&PJHSUrxv zdd%t*n(-Bzs9DYQHBgPwe0-}@!pj05Y|LJZU$yi@=#A747kR&+k^`l40TlO8!6%;K zUAP|rx7~mPML~CQL1t+uEJ@1bY@f|>6Xlhsgpd94*L_(EJV5CuM!ri!OO_nNRleBq zo)h_gD&QR5xVOg^vmuu93mp(_u8u)ovxj(-|Z{98-lI_WBAR-5wO zFFSy*3*l%6gJL<+e>Ng1=V4pkA=Vz)U@)g5LHh=HuHfik2((iRjyw+#{~dF48NwXZ z7Z_~vp&^$e*{E3DtJV|a#rc%;eSx;JcU#f3*#^t!Cw1DU&ztC`i%M-vv zI=B`=wj2acNA2{SRV9nfUA(|{9j33&9QPs3 zH76{6sh&xy>LjG{y~Zj7*p279Nu^xU-9exZ*)U|=S&~@as@U-HC(R$H5d8v7xXyEt z5)Yqe_TVs4T#2=B1;ShfoTPSXXk<_iSY{XAYRh1F@E(3dZYzB0lgr(NwlNveXvWVb@~2|Lft0h`T+FJ9=i2 z>)7x-X7I8fEf0h!tk2Y* zv%38sI<54q>h%J~y$b0Snoe`7iqt+L=l>wV>HC7HSTBYC5?o4#P!Em*%qj^v%RbKJe z**o#4h&%hG%7NObzKcJ(8$b8rJ9Ge&cYKFP-ILL3JWFGUdU0FE(JL`Jw&9h~b2C%+ zOmhsj58~)8cQg^3Z)4t@av_3b@nuPDPh9NvI4kE`6$gy=j!2ki#%Jgjb0B1>C z!r1R7f#L2vj*Zv{7d^iCPRe*se`sUKJG2m)QLN}J`~Y&9HjDQ@v;oTf(W&Fj{{T^E49r8A%?+1n4XFHP{W`7fL(#Ep% z{+unQV3=mrur_;-hp#h^Lo_Sj$~c1uZ?=Orq$^avb>Rw@p06gEb5~1xmM5u{EtycB zvxF^8x2x9IR8gykLL(~G;L{ISp#h36_QTM$qywTI6g@Dh!sR@DflUlfZQOy)3wJ!3 zt1Z5iCYe$@k{2&#AQU*2`_W3C+s9Q;ZY<*6Qx8Q&@$Ub+-tyJr8?te{wjo$WArDu2 zO*7Q>cSA}v<|p~ZMaTWfQS3^S+z1jr$?mFxg$38^MP<5Pyn6xc#k(?iZ_fb!+$GvA zbcMXILqBr&=VZ^{&`TMe|33Ar)X8f}XMGxkwwuUsNE`pO(*x-jvFzvY zzG$zXN?RUQyEPc4&%h;qTV+Rpi=#&D8DdVoG8HF-Kx^Duy;6Fshjal=Jv9VB=M>Y~ z-qY(NcmTj$E$q4z7SHnia@iDPHqXs8or$w$sumzr1S{tmK3BI#&OCIGpJfIzBh5TM z5^$B-lIDrpn+F(CA7ozmQBv&zuKSz7;5^#Id;}vFHRFwuK|)_Cm3+GU+ywRf)P)DQ zhY<~I&>BfpCn~bi6#4wdQj#^Wr}Jn;GJ2&~(%=X5zWPTVPA!qj5@$>jnKq6_(0Hc; zCLfu7=1Q9)<*Sru<-_e!Z$JOUws&8+?2x7A7@tyi86WeC>!hmOw^6g}{M2~-KC&2F zP&tdVE-vluAE&J$iGuJoi-(+MgNTj|3mVM;s09PQnW4CsNX98SwAvh8H{wnPl;0b; zrO93~^pdLBVfi|dh-?GQk9MERdW8|SlU$lY`gKR1Fa@6E94=`BQ%Etl+>5%lZiX6s zYBGg(&o`FTXT(pgOz@PhBBk^7%Is!Si5l`1xay&q*^K=jX$9ZMFB{&?oUgl>ULU`> zIz%qo+lq+FECVZ0Z@!PQbO~i=b zG_D>z`{<$VInt}xVezX6N|V&pTSqvU4-k$iUUs$o-STs)?fL|()@w+MTlq)<(PQHjBSpT#p22Z1)mL;X zTb2T+POOayxS?kE`FZA{p^>nAI~rmH<|R7kH-FyxEkLs(Dap3;^ABYysvXV*-XPhg z>5suJ*~^3V2O)me-yuesqt0L1x%Dc$+_g*vjnf|TX&Df;XuKdM+H|2`C?6GmRaX<> zSiH|UJ<{#rlX$4B^2=HDTu15C*()#LMjIjeMzZ~6H|8BiPIRGdnI5~mZ(&d9j`Y2= z>hX?%6e$hO-?ixy&T^6E00!r%q2G)m%Sb6l}InGU}VE-1eM zP?yCK`Ba0g_Ze@hnE~B0@+hIuQJU-YCi$%GlGd+ObT9=tW>VP)o zyLJ0n2IWJD_T+LBS;tJj1in%&zN#7nT@yof2u=hx)X?KYMhg$;Y99R_WAW^qlh|`v zK-yK8W*q@%M}r`k*lg6>~mJC0}0#;kYtnpl>W}wNij9=FI;(bhQAvyp&?4_k%9<&tXhkj{mesWQq=G;l80O_^x z<}C}_cN*hQfACzBad+z_=0-|ul#7Y4Sv;GL&~0ev=lgqpsOS4lcXUtFs|p!Y*vc6W|r^6?oS@j)oNo(}d)-cDC;Nnx#qZ-A3 z_K=R^I7K>2a(Tc1Ln)CB2O59R{xV|#jes|;{d<2cu>b63E=9_&B-N~DN9V7yjo(FY zE|X{Z!$e%Vb%ePjqo~EBKOOTEiMq$f?pPbAqvN0QoX8@?{h(y(Y`@ujVFmVz#PfGlFF!=0p>%+2&aTeyuGCd`LDp)vU*g$rg2QJy zw_hvb{oKY-bI8v%XUe_QkId$958KVmbRzF0~Pk|`ln`usREpDV{Q-qC6L*} zgFIEl%Y}76Mom87^NQ?orR~80$D)LP!o0w(#`s>FT&@KJEIINk$iOyhd~thl=aL0? z8Sdlxo%#avE3Vy>l!8`pKzxNXECg_BVJd@)F5emUmielU-?H@y<1d{9>Zz2>0o1trt~)b z?&|r{hh6BC>?!HCQtGcV9NFE$GbIkicA_NJ@Wgv{O6dY`!*d zQVt_5lfE=g?Nof*NMWUm2lA#bmqsV%=)4%x`thHQ@PAa^p0%Y^`yJ3f{=h{va^+WQ zBOfvvxk%Le0&=$S+Ice0=W%_z$)`ofaSX%3fvs~)zxReJrSs2PxOXcLurI^!vx1%7 zN*>Rh3e%J-xVH>gt8(acKJ*91`x2IgW?m;#c}Ll)_!RB}!umKM7b!uq#8+d#P}?8r zNiW}DyAKshi}EpWxGgr6n7(EVu;1J1T7gOqp9xoc_phy+PK*4HrLXXdf_uKEmj*%U z5a|X{nx!NJ>28oxVCkio4v~~ry1QYQ4iT16x|bA?Sh`_}m+$X+|AYIvG55@zGiPSr zz8(hY#P}h7L=GQZJ7?uL7+q)V5JoIg;iQ*zkLO1>J@)a(*E)cAc0girDx^%z?-dyF zubK_nATf@kfrk1p&p-wiH>Y0}5+u4+QQWNu4_MQ>+|=AUmuZFLJVs^b_7==_eQv#Z zJbpYxvm~Rf#2j^?z6#qaTq@bub@fdX{%Pr}U5ycnO%d3-s;DZ3g$g2=0y`qRM{m9w z9w~Hi==MU+C*)f6i*;kXP%3av@T14hk8Oam>6gY2*oOEN{6Ven@(Ngn|J^8P2kw1j zhz?qx#zLdK%Z!#|#St4g6Q?+{66?bd_{bl-g%n4&r28PM<9s7B1ib z*~#JNk}>@A0<`(pG#ZLi7EDiFTGzKME_B4b&V^Gn|8rZI3%!%ynqf`gWJa5W)6-dS z#ckjwh;WZqV_e2v6c?2(LGv2gLsJ12a=2DwQ2-_2GwYuqx344TIMS=vsc zMysb9VZf{NnSjKHhd|cZ7;DW1V5C;#W;+N))oUFI=9&J|G{DwO<&9Q=Hrb1T%~?_N zdrhCHwANXO@4;#n1~K@KLDixvkB)~eXs2o2bP%YL^DvDK21Pa0$cq8;1+72O%wowO zoHUGrD9TUCxSl}HmE2rJlCpTy8dc$jYCJDfcHwKD6XgNS&$$S#UJ&8f=M0#ADEjiOZw(9dgPmcG_fx{<`9C0{{Ug`*UvbnY!zR%GGNqFEV!E-O-q2nEluR5>$j3S`D17Tzj9g(|kTOa*h7_lSC z!uL`OZTG!^Ba_xFS#8BpTk`E}%md%W)!t^iWxI2q*M2+ul0>dD8W8SHOk6@@GjQ$4 zS!_70^nE~#1+rK>BGQwM`WVD4+Vizs5x4M{!{Q@5}NS)MB_2%aapK!X|Gb>6jOEXtMA33$;gD0xo$Gw zDr^JW@kPy6Wx}jOXy^xvyxgVKiI5N>a%u-vhI8>}O&*z0deF63Ho516WXVXyW4=(W zgw*w_$DK~@1z+Ny7ETiblfj1=HkbyxI`K=rC|#+sOXrw3h8J?+I;+T=3A@i@n*q2- zn3p3&^9I$zs7{Aze$Xx)B*#ZPdK*Evw}!lKJMRkP}1v4&X-pqmMK)?IME<)+<$LogHO5N1b( zSk$;uXx$u}u#TK6pX0i$UWKp&=7LTD(FUj$Pq(0;|4VAucir#oAO3BV(cSnQW88w~ zBS*aJMKTDT0t5eAhVv~kS#7*m%O?OkP>iOVZBKY%y(L|%b2-PBSHu0c861)nco+>D zYc2(9qpF(DltjPR{h}(bNhU!0T>T=@<1iS(2sB9s-Ws3MnG_qx3if;$93|lIJA_>%o2 zX2nP17RUkQzZ+1Ov^HpB#Jv|#p?fUApYmG9kK8p`vvtZu#C5=U~I#9AoXV0wHo z`j*>WN>oVv7P}DhwU+kd0lY2uV;9kv-@(xV`MC|-92E1NaLb{;qb7inv<%D8$fitz z%P>c{-^*T-qD(J~^@#cpKK0!%$MP`GJS^nI%t0fPpr!=b*Yh$GG*(tj2(_+XZAWqU zi_lXuefpM9^bn#<)+4vqUw%GvxIeI;L;4nO=qwY;)m3~0}X*uX*-Qz`2YF}s(Ttw7s6^z=({K3nz%vWECyo`Bg;*fn5 z7w?_|zJXh2pLhN_k|O_gR=hQulyzaoJN5?1NrSB#2cKj`LTS%^ROKWjdTl4Np6h&+ zla@01!P;J}<=p-wb%Cb7TQC~lB3kZkvCL{TA^=pyp&efVQ4^MhO9))^f4Df(`X>C4 z=Jv_N%Hm_Bp1U+^J(D`!YW?*k$%3_PKdy2U(cbp8pOlGy{#>_blQgE%fSamzwQci9 zi{LI}WBa$}sYa2O-bOiTR8zDidh$fjE{lDnY0HRD3n>8pe_eHc385;N_bB(^KX4Hgl~-HDipq^}M4dH_*rs6QeMdzD?GtcJ|h68fJ5V zgY;u^1ROD(mvJgKXt7hF$b8|E%}#h!0IO6c#(~PLc3)D|3XsNs%UD1AmU~`b8JzP_ zJ|1*c%r#i!!j(|}vaZLC3+(!iWOaH>S92g}hR8wS0B7T`w#qtaf}pFurvU}4ifHJJ zvn!C@{wy@YX~ZIi(|FC8qC%qjEOP2&xP)OhP4zrZ({3m9zw%WFPyFNWBX!r!>|QJv zt4xHNkl)X<*4{i(Y6Ss|2K-~Y<38WT_Xd#nG_qi^Fy_>n8atVyFy`ZCmb)dps+wgF z>mHF`Uh992k9o`Sm@8uxTufrXS--U`wdxj}Bv4{5-dQCvyq@QwoUU3MNg76S`=ET! zXJ86Jp@4c~TfST=O3e{L_RF2IWK{Gbi8RM&>GN8*&$LhT9HAi?(tUD~DaQN@#PkCE zXt$Fk9E6{_@t z@N=ICg-V5UC(Cj@=}|~%09E?s1uqTzXX!*{jfl3l1#Ac2X_}t2JgRkr2U>g}D(#lH zpGSH>(f(g?@`)_m$W?jTm^Buc4>o9?TdnAh7zNQ2zX?Y89tU~)cKgFObQX8w5M^aH z8XvUk7UM$Xzbz-$ZCCCs#q(~5%KbQ#5STdZ-aC^`$yu5-V3m}P@J@M|5d1--;7Ju{ zbY-}5YmIACzURGN6VJ)%#}) z2*+y4TX)Nk!vf+1xvV;`4kBjRAJY4ZYvx9ag`rG)gBY! z_SqBwBDP97pzfz-yeb42ile^0Yz*A(&~-^2S}8H~$egg0%KmSgaIccr1`Q&}TNlF< ze7XHzH)pG7DQ~%G`cjoszsD9{8v2DlSL}Gp~a}=;BFNpmj6@;t^7CzneZ_A zwAD{#t&zh3&Sc+ai$MM95aL@|`b8P9F0wG(aVvPR>b712V8gt#P2AL6&+kIT`=9CV zdJADcO{qAVc}zd%Gi%v{Y^5_;qSb6*@QM> zHk-7dX?`Khg}5$>g&N*nk9?F|XGNVQG4yXSYwF89{<8Mhi6#ypKK5{v12;$&7vJ~<2T>r8TE`_B1=WG;KD@YIj$ za07~RiZj){&lU}};n~b}yAsMy09q{b$UoQ^tQAM= zu@lhHLlswT{PqVl73Ha4X5O1i0?K)KQlXfJB*pn2ca2%d<-q;S0*b-28X_!!V%OwO zhpjB^6uY~EPZdDv3}0p=E?FZo!dK{Z)9%fTX}xb7t>eAp57eEI3*om{u%|F+DtE7; zgjxdvs7Pfo&(U23Ld|BbmNn|&%M#TllR4I0k5n-Dn6v7o4`=x#N>L>*aKd{ZHY7If z^trulBDjetZ^eG@L*M`Zi+IMkMKK0C(8v??{mJw`i}bEFZE(7T*g~%AHk}|Ym|y?$ z(&kl)nCU7W_0BE>ZkJp~;VX6th>l_uk>_qS*Cd~&%oF_FD(9n34{o{ z7MdaQ%@PQ#jnALaeZuoszTUqhc1nUOkm8Wc*pik6#J(in<8{oBbl3&$9sOn#m=w0t zn%Lhrw46GaK*N4sMRj4$6pdrOd94m3=%jonQkcdh!bA4xNW4(Q->rxGiQb-uXE-n@7U{s;1j|H?{v|;_1wQs zIUu>+1~oZ}>Au>4aT3(GQLuYx*Uu%6#aXG?xjL*jH@>--xj(kZ=gUS~;G+@NI9M#) z!~w^ZVGQHoxi5#)T9!plW~=CA*lNaU2kvvxp#s?!fm|~~_i|npUr#pzZ?7W*#dP@u zum8IMKcys}Vg=k%!bo17_Mg0PLI6>Mu7hAUzPj=6S)cEDuXT=obiAsJC?YHuVmiX( zgBVN(?eDxNH<@Ochi1MEmPOG2FvU|JNPE9{jTF|8wHuVD@M`v9M-7?44(vW=N)*q9 zd|zO1t*wrosY&yj`?x@yg8y753R}&@+cH0lDDm2!$QY7M%e@*e|~; zGa6i+(RX zK`!lU%?s+k9-VHa;nGI#g^O)VRf`tki_ox-*NN}CFxl>%o-c=lLdra`jKvc}A(fjQ zQ&`r)wGA8DTrrG?QDtXcbJlrXnm3V)N&gYv>&32j$=%$&-^MW5i%B#TjYuT6Gf&X- z+t@AAW}S3YJEQo>`OM<0PCY~qJ@|04I=~~re5*)8Wo3%`seDwJXlCC@e)Q>QHn4)`@MWZkSU$d8y9)CcjGm7r@p5_rvP)Wv_2NA*i}lV*zQK{{SU__!FR%LPfg*4`HFf zm{8hH>{H4SvzKP(pYbw0pGZRvUYvSH8^#8>a zA4MOcy9J-5aZmPoH~==Pmc;#+QK2tql{BpviH5?1BaR4n#rKrE8nL!;E9Og`SSkg> zUTI?Eu!o?1Sj~TZYi%+uAFmkGb&HX@u(=vHbG0pl9z{=&)ngj8WR#y9Rn?30aEImP z^ikSr+861=iw?LAHV>TcGB3p3GCDj9diD72P2^C0=2C(wXVx`idb@bmtb`2J zQct+gd)uBi)e&EIyp9A0MaB)jlr7?9u9V_?ZVUd~ci;E5x*Epne;hE?m0hy7s&kxY z=qknWn$R8QO=Fpe-IzRI3{ zV8TMkuVsyTK`)Cb^kVWNAWsN9%~)kHJ;00Mr?AAE0cft@oDua_;;ookF^#3=6cDig}QURmh7>FbA~wjOQYn43jpf{@KRGr3?t9Ihz|=*uCO z=S)&?JRS=t#2|9)rWcTT1}bVKzF}>BhDqJw*e6}u8}xOzUDS@Wc(Ez|lDE9Eaoy#s z@$s^@?T>T6q!>z;L(-iFm2rP<>736Ksce{Hm1ha?18e>4G&@BCJ+PLZR}- zxvgCs8wE-CPLY!!#}MIEst>0=v!EHf2E8Hihl}q5d+jX4i7h}wN~d%hv?5IQfcf1_ z$NO!{)sSAV{c>pMgLL-qe};VZF+scxa(Z^tiASTx9i8geEsoY(|f74E7F47$}oCqy#v&$dIz zm2<(Iwj4O@5>FI5Z1nL}b#UbHCTUPpyKL z;J#llGPWbB1#=v(G#=={gs)S~w_yNHLarANm?J7-n73gvY+9y1&^-E2OSaaFy{t4) z#6f8;+nYv~2er?1C9 zm0ej#83c;fh$0q<`mnwpSX%sydX}Qi?Ec0{-xcl00ih6INH98W0Y9tSon|y1hgWL%#(I#~h_UF|Flu912)C_~6ge(Ay4*o8dEf;h8Rm$ZD=6oFjJ`w(ZQn+WaoQ zn92v3YCb#XRU4-aM{M+yV-ADe^LqWmLQHsV4|Gu9 zV*&Zre1Ms+wo|o9am6|j>Iz4EN&^ThXUZMZI)~-Rq&GF2;?sFq4#<{FEQE>ohGx_w zvE_W^sMp5N7~8VUP>}IoRz}Ahmw&BY#gi5wrGKrXASKle@ea;Z=?N*0xbBsG#`4(_ zN(Oww-mASw$+}>8w1=58<)H=_(vOG6Vw<;|OB&{pU=-MrVw^|k!lMrA)wN%!0EXX* zlRxdVB*3R_rWLB*mDFFbf=Np}dj=a_XLUQ+z8g<>>@Ys=7(R0hBY!(A$c4Xfygl2Z zn&ExHCrg%v54snG<;oHFz`Nb%8v zS)=qgnE_8j=9LPKvGo&oB>}pzTIqSCA#!DO4eX*$?Xgki#9z32Ou!BcgR4dN+F#xl zs`G4;T+~q^7A~`0AhC@kv)NI-rlh)3zIC_yt!BqRFMFbE)k8Ok>1eoQd8%VY6!Dye z?2RKdZa?P|56n{|t3MG|d9*huM6&%xKzHs-r7Isg66e84W%@7fGU3psQ0dJHO9KB2 z?CO>b2<8mGtv+mv!GpCrfqeGcOfjtLofw}?Q?^~AN(kqs6&&1iYcQ!%Kb!mfJ>25+ zz^xxWw?T~gcJ=6l(?IY9Q+Yi!a|g`Hya*0#3Tu+SI2x-6)3)2IITM$)4~`1qj?)TE zDFFnVUd(LOWjTevO5@%xPSL5OZd!BCXodVQFHR0U5802#z#IEG z5^Q;%sILlU{Nox%gamZqMV}@Xq&9x$ey`^^{5+mjsi?znm$DT?8p$z_NN`^4Dq>d( zM=p|+Z_iyQf-6DoI6SbMO-J%={q>6RTebaZ{CKUk*%aSHWs|uWodgPf-4dH}U-|1KZSdAqW`bdr)N!jL5v$ zUnV9ImW#9rJ&ju8bVIbSnt=XOcMV2JkQ_-ty?eH#o=p=yUVYFN2;Jq;ef~ALlnQ;Ch5_%g0V^N zX6kL$>J6VC143+B71(k8BjO(pJkBWjzSncY$1X1h+T_>mzq)U@)$yLI(3ReMFW`CB zU&}I%R+{ih#_zS?GCoGc1f8@O#Q_sk=8uL0v3i~Qaz`d82f{8Y>(33x1mJN8AD3mT zvD7}ImQ1K?4pvf7$_j`o@O7%rnX{G*lfOT(ifQ-^9 zaMgFP*iuXmM$tLf?<<;?lW@y{kdh*$sdXGS-tV4gPn_6;S{*m7zS8rHu1Oqt>0ae zS3nY%R}{pt2#*uLIF;yVMAELShK!a4W#9|+Q{$_~P;VI(S8k2!-$pi32 zLe}h}u$r9SvlaZ)OE*#)0zWqMaK*xDDr9OD_DTh#cJgp^sx>&BN`>`l5zQ&PJdM$N z64oL$E3@B5g{&7vrkmw%OUgcXO9)ry#kr}#q>$GT!~5-NV&QcI21hJNMS}{xgCB z-3_a{l3_*KbJ>};*R0?8QxDb($Mo>SV{>86`JEKEPwhv?@5Zs`IQ3e%=g>zZ zL^HH|oN46RJ#thRdk5O^>&GWtL5PbK{FdWTw^n2k|M<8UgX)FeNG}*2FdGF9P4QgK;O{I<~FG5US! zEuwiwO9G>0mIt~~_YXhrIaieZ zF@MD^w_u@7XT$$vP~t{=->V(7nxnCQ>`D*vXk)&7Ve}md)_7ecDaQaP=JF+HxpRB0 zJ}U|(aRD5=T$V)C>+ad(x@JL*;?d8?w9Ye9m=Du=`Ykh;^&*d}%8nveOdwK`YZA`y z>vu+#pWnr+E(CaZ9v1&C879egN&Th}!R%Mqm)2i$Fuee1c{@<>&2yh1Vo5+DArVI&HQv|CHF&kiQ{^aO4;|+xrSbYXV^}!L`>vJt(khR6QSP+G<~9ZIYv=(d6ZWq*YJU2Cw3o*EflS=pu~Y2Sc7o^?AtU})ctz|f8M&+cBW5lpmc^On9j z7a;x!)U5k>LPEc{cx=8z8S%i?_ewuMi^k}JL=LkUzr-sC;zEn+H>g}98?_`a>-3x{ z&uN3vLYZ^jUg~HO)z^GL_8S(Tw7yCu*^zqBu$8)2^tjj$1q$rF8Vj6w=6P{zGY&oV z^Rw8OpnA^Y8XTNix(6B)u3H~!V$twSH3Sr*Ty62L^o| zV|`o{nQjTw)?w2v{#kH|p^M}xzc!5>U90U$=Su8@_ajms!4gY3dr}}qiDu&^uLt!5 zYDDDuFyB%;h(^RG>W@eFP&*2D4EIPM>5Vc!Tqe1aAiDHW#c!sD6S#Uw>#Xn2b>NRK zQjU0k-R4H@%@->=PW{=DQk0V(oN*Mh2lrrfJw0!&IeB{>B$S#wu8Y|wd4DRIbaM`{ z>(x!Aukm!?3{k^x|MeE|7c)tU`G7*gkttmiy>IbZhyT4LD1H>ms!4cqT7j3JIxe%? z%nW&(HI~bdP+Tzx{+7CQY$Ph1zgcLP`fP&jmunliyt8J5piv98IB`WfuRzI zZB2vJa+O-|o^5<20Nft9Uo2<4Ovs`EVv~SqZ=4Du0^YdV>-8P`i1NLVd-*H>7Bw-? z;-A%6oA#6z{5a=l=giWT{B}45RM!V*O!a!0UeDbA?J+{uD#Mat*hpVA1z!uoF53to zrZvja#3+f3r?(vwSM{YVyK%|_1%ALj)C~5yBJy(jbD^+~QZb7j!ewB=x5>Ke+@UhJ z%@d(Q#r&tlEd7ZPw>7``^zJ>qTwBpulNDGH99VF_;Kvx81$=U!ov`Cdu4oqKbeTPj zI#ACHl=68rSNfBmZL~_t@WQ&Z^GIS2b=;6J_c1`J-O?UL{=hZ(FMp#q(wWeSOT^`~ zH!)qI@vUKTZS^U{YRtoTC@}JU?$o>?(YV}=an&3eB08LnBEz!o_x89})LHqxRk5q& z)Xm1yvuCA?3u8N#w*wiQ05YQmLD7v9?jh&%*1h$x-cmi2$yS|96!MbJ|1cTn*xQ)h zqlupScGoeX%NZ#iI<~--7-OvBhEnNbGpvQ^9(L5qj@P(5B=~gXu1ud;PvoHzW{=s_UAp z+`o>eoR?f9&W2C(rEGdliWy_hZ1z1TlepW*x$roJZwSm+W_SUjZ>_3 zIGO^_1JsY%A9qSo;|kH*dUaBn`BHSgRn|*BjfB3lmig{H;{fw{%9pBZIOIP*i87>G zl~ANfQGf_UQ;Fwzl7C7jy5jKc$qyz7F@=x8MTwo_u?hpUBB3`q-F;VSt4IGT1IK)M z-d1nSe}N?=LuzQYtGh<))louax?Oc;Y=#ZbLAtTGle>)Ckhs@WvOn8KKEXC2<}=~4 z$q|2iDJ~Oj5nF}4+FPafP1xe*^5xYl$!h;hYCm+&)ywlo0GX7eQ9@#l=bdP%#4 zUC@;v!xj~R{K)N!Nw{$MTZGE%divp|*{$X}phzwj^dd#Om1TTBb>X_A{!c+p@+>P!i>1ViGODT$ee}?Xi9bi|Xj5lLz_2=pjp7LvFrXY1sGYd>Px`vdfXS>+CXKTa_syOjt8yw+ z?R(Q+jZ%t$Imdu!EYz%3Z9tAwG$s0jJbB^NlhO9~^Sw$x*nQX#x=gGtyEGsbcT3Sh zeG5q$??idPGH|?BI&96R8B@-1_1oNmFHh|oDD7>}B(j_wV|HQ^O#fylEV8RA2~w|D z{kFtSu19nPJ*kb_wUepy&~)Zf=}}#;)Q!n1d!4+?|Bg4Vv5;XBBCCz;`nK(t=Rp_S zp$^uRUu9Mv@LM4Ahph(t)eLIGU`A_H{$@O44prQ5(hPF=mPGV;5d0>FJ%IFP%~mXe z-JrBS{Tsb)anIAXQ~USV=Dw@n%dgrWhSVX4Z+YUJI4&a&zKnU^0`@7HYf6%+Vx%`F z#n{mNJCsb6^|D`?P|3{qm4^b0)C_|K%M=mCE1j#=s8#g_?9&vo>N201RrFdMl)Wr2 z)A4xZmgs<%T)yXNt7EFeYmkGi^z$m+2~ouhHzHMrOzvjS0<{sp3G0jgvr-pZctrPb z0CC;{UyaiN&|fUdIyV<-E}$yPGkXylVQ)ixU)?7M*ew%ET0bBs6E z4WZ#DS1j1H*uo5ya2YemCDevN9EufH2COq=_%z1j#JKeQaG+TBOFcyuc#W`KpjwMK&F8MtG{ z$jEY8hyDDmQM2~F=Ie+#2E^Dj1pJt?Z-c%?%KAO^fLea8@CUbvJ0eota9FDt+Z8Cu z+oJk0C|q5w;Y>5**=>z#4cPi|nO^5Q%8+5MPNPt5h-Siqq@d*bTOea2r!)L_SCmxk6NC84=I4huQYfW$F@E;1mYP1+~Q*Z2d7GAU9HxZ z=#Rs3_2*AmimDt#f_^h3fK}R5Y3O1-*|GID`5oNBAey!@tB@`OtASawSDIV}qKAc^mu$^uCFoU6)>r za=!bZ&^M-CF)nfaKNf5KSPe9sL~qkJ*y7iL@$!_c)eSgDHI9gg!;mfTogFvIcAZKt zx3**FbW4(L;zdC%%+;(E@5B4_dPY@ql-1wR?$b+5C&BU%b)y41LOBaU;_D@hAz9b! zEgi=VWXNgvx72a=Qf4VwI8$BA^VGItbyE0Wqdb)Z>vM?P=fWTsa4zkNBl3k?hE6{mPzk8 z0gh1X=rh7mx$XM$eX|WcAdP%!sZlQ>iF zw}epQ-;(n##CyQ`1oCk|GR*}^G2P73LeNd$i4j0M;N1v1IAzX#0>q5=14NM9AsOy@Ib1#X;8{jMjL>qC`Szg_Q2w%J#14+r_t_wCwkW$99 zMNsbRAqh@>#cSk#7|AKgVAF=Z*#4&2M zmk99w6DISbcsGukM8>3T<>AY(p1iB<#Ks3nK#Q4BOW#%xUQV-5s}(e(`_e z3pfVf&+1dIt#Y%<^Xv2&7$i{Os~41Hjk{$<6!B+j&fAoNvE#tuIhAq^x%~BT6*>Tm z$-!-W1Fwy)mw5GU=o3NwyuW~RNnB7Bl3GJMwo@lHQhDEER%gRG*_!is&DNSEx#n4qQKK6nt=IY-yd(c&PGiX6fBV26g-zIIr#gAX|+ZwD6A-$x8u4SK` zi^?FXH-}9(2W$QProF6!tF##On$`W(Yh?SCN}KN`*Ts(-rO-6@r;SF?oBfWdaC^DVa2sV%vXggUD;2Kq{r_rw=p;fJJ$N4 zbgU3ViG+LA>`VCLL(u7?@#5*@PtIdYR*gOQm=c%SO}FfEe!iL4+brwg@ryV1H}&HM zG2Ux;A<4=B97D84ewxoA`LhUN5MbW^%HE`pr##Imv}>B-{zNvvneTonf!Lh%DrD=p z^E~Wnf=xn?qUudL$qp&&1Vx>t)wSM?)Bg!9HHb$~>>NnOFIfX{48BqPo{J7(rZFe- zG|Hqn*p?j*_j=RctZcz|ZQR$D&Q1Ip{ssEUfQ+&n+0Vr$Y3-)E;5a z&2W)FG=IAtFX8|PF5(6{%rQ@C@ISZe_ruh!Xx=*+;i3IEzJMRUr4#CumP$QD>xjvE|?Ce?!x7d#*dccZ~PY`Sw{)oL3~J!CeeR@#7@6^vn-R2Z$^Haz8Q`7e=;YJD;*bwnaLg zp)_}!-b52c!Ld<{!&)<>Y2H#@_qZ2D+0erAZZ-2HUwUDXLb%H{ocEL=$kxf_DmW}S zW24tHg+Kdd0qxIsIHIe9U8O3l=J6jrEc-dx-g;PsNL&A3E0%CYt}gz z*!!vd(%NL!Ltt3`$nAuNa;v9{BBE?ocpvco;qC0C(TuQg)UTY&)R=snqiKnUs9*X?M#6E%Nq{hFo}S4wyL{7l@(@^@ti}9ggX?d*0 zXPjX1?H8x@H6#P_M)&#jXNBD=N}J!T1k+-w@kKzmr~1p3=^nD`Fh}cE-BN>(j84V` zhqQ^=-mlVr8~kOwuY#Fv8wpJ<6p^-^*YS-7Mubsw(?Spl$bR))aet>9F*~0JcYZJ=#B34)tedd$(pG7$@7{B z;_*>K7_Xj#WWw&d-DGL?3@*t(F7c6np1 z8eaB9rJNmHsU0Gj!%5A_z)qWj-OuS!sYeZN`>l>9^@JGzpgw;@(zFvTd3V<|^@c}HkYomA1Sg9TmI>UBy3Y=LP;S;N1gohWfH(c1bY*HH z3KoM^K%;)i7w^;B8L+8H%oz;Qh4hTJCmx>1j_l=l{PR~gfG^Fp(02S0+h4Io%S~>r z-b+rI%yYPj6+wx2Z{t^3S{&sKZq1|yX`3gZCpk0wE90n=%A90#5#}{jBW+1K5zd(I z$NiGd|31N8FgiAd|-kq&};SSSyJ`7b=uM+sI!he2o!rT zCSlt;M`xHIsCVG`V{^CfnPSMdG+9)F|=5KlV-EE@my|Jg>IcT5c_?lunPB5W8`f<^HtbX}(vDc+Du zgiV}R6FphWEj@V-Jbu5xXL;hy=huxkMNK?&FjPM{zrC^T2@N5_;-l-?X_w}yO_u?L zGT^(5ifTVx>tL$?_-1O}#x~_ainPh_yOwk%E5XZP`;vOxx_&kUC(U`;$;dsPzXta! zgLBqvlNUi8}%3g!Zrj0y&W;op$y8uOb?N52vHl5?5q(TxRx@aQ; zjbNacU=xa`F2<3k#qF97Kdmi8U_V4iKAT}SXe6>II5L!G&f?Xe7M{1q%VR6rhl^Zv zqGhq4uT`*smQj|t`%5L@CR*v}H8jzjI8ia%gR}L4YDjP zA$S^iQ1k?J2wwf44`0|@fl#!FP)c0W^W~Q#W=tdWOoTsPDxW@?Q-I1Pl+tF zwwNbOMY``DdOS6U+xIZWDGTH!vOd*hc%o#oE~U^@W8zIW)God9>um=P9R~3Ar`^nQc;+zwW`hA3wAY_Cq!F7*V{gBQ#Cw2rp(p4=dBaWH^jypq z4FdwF#0@NlWO6>EPfYw%^XfNZO;TiG_;8gp-baBk{9SveB7`D^vDf#bd8!bS;mjmr zJJVJ1c{eFc7Uq2V{pWPM5-QFvi!Q9^R)}xj6%qeaosx?m=dIy}lHqC^KB+z<4_{3z zGcpVOZI>2*dMnb16M3r_nyqrNVL-snUl!5AhfNP0^G|4wUzqY$wA?7=cst3q26Y^n z=o=1<4`o|to;LY8-Qx_F($6^}wh#JvLfc*=uxzqbZ-W86`3kMeCdqLBg`;k6WY_N= zv~Ub8T(%u)|KDgoLmrE)(>M+Df3*wJ#mbE52bF}bDFC=FJzy*K=oW{x<*4rmFIdE= z0jmwj4$7x*pvz7?c>GqGFh%s!Py6p2brVm9NZKkn-GdV+j8OsESOGwe=~P73y&$eN zUSad-MTfktZ;cATU6-GBhYofWybG3r=rsf$m{g45fS6B6`!;_mJ?ZO{*Oad%*H|1m zL!v2%xsJNcudr$#`}+MNH{O%7D{Nn}zfoKBe6?MaY;;jfxOzU-y|INI%BryjbUS+& z_Y1fcA|<~~W#{W-<(fVjIP0w|FerdQpKAPS9*tf&U{-OfHG#PnV&-kW!&G`p!uP<> zcTK{F>t084L-ip3Maz$KTC9Wy1272N^c^4IT3B?hJOn?T^txaV^4rDjAVHVeUPDb= z`ZCjFJg`R-pJRKBsBIvWH{a1Fms2c<$ol~X9; zi{`?~HmAi^E`Ofsb}ei0Ja^$;=&YVsU)tx-jtgG=I4*QYdKf4Qh4=e9d>aolDC#TQ zot4sbNINDSPvK#nVtVf=neBaY>K}PEgwjx4Ckp;W#M&hr{J)Hf9VeZri*(&rc^Gfw z$5VEd=EKz2kOpdGG56rqv-=0Xpg+ZTI&L->N(~$es*TMhF;gFs(4$M)%^Sw85mm+v zT2?B)jGi&8MK_8B3VP~m6ER8Jxn}t#9POP1U3=eSGcI1gT@@Y(>ESwWBP$&q!thkl zO{FK{N%avp3n@ASX2fC=tc(|P)b{^mV~!ls2Bh}w)vMi0QibVBOlQ1-iVawKVjyY3 zqW-^xL(1OALB~=u49gE{ay`s?y8>c|Ua(oENPYW3&ZS;3u5qz+@62YKRb(}}b>h?` zDj9C>8XLKhreSYJB!Ro&@CueW9rqeZXj4X%DGSYwT>jmar{hPcyF22m|5MNRG|<3a zV#}cW9i)Cf6{(%mGd(*N?LMYGdqHc2*8sjZr(At@*IzK~t9@x9G#;BY%+`GsaVeD0 zo%UOhJjEo5;*d7UntF9+#co_LLAW>$s`sgR#1f7%tL19ssQ{yHNQ&apQss!DfBx^2 zgmh5g?R- zu|Kxxzbn|H)wC0d^bX0E%3a{OH>NNhdpax2|BPI>hyP`%>1}(M;aAxvh2>YMdzW~= z{1x(S=gD7Ca&ON#ALO%*hrw3eI6CRo0o`e$PALC?Xe6<4sSmKGlJiO2GB%v+MI4cI zsUt=3lI{_Z z7>1J0Z>~4r?v-9bY@uV1Q%%k!OZZI<#EijOw!Zt_vf@h9ZB(8f!D_65cJ zaR-ygl30)3IRh zWvSnE;1S^?HrU6H+q%!hlI);uDajBsDgs>-!f6x<3A#^#DIf`q@W?ieOUFksTS|tp%DH3O*)sObnAKln5fT3Ab($BrD zFTnN8!-51sIve!+U42_R``@y&`0CIh8)0@~^I5_sK7Xm6Ao^7Jow&0BjjyX z)H1@#kARn#YgM0WVqBjCcn|7te1F{r9}#uwUGyx4Qf~|Cc~u-O4Dfhywj-Ia__PDlIw-91 zHSCa^;&vM8vVi62m44P{Lu!oNe$4rO*nsu;)Q6a#`v^FaBxj5&I2wG0(<(7=E5l>;zo>*yQ~Z*Q1|` zv14QT;eAL=-V4q3h|YQ__8ISDbeThsru+bfJ%%+!F)qaL=61II*JaK{lT%xImmWUu zwc}<-8s{y$T&>?9nGHxyT~{SiC)ba-^8#wj0BhO=cE+n70lN2Cx>VI1P~}39kQtIi z8vExUweQIa_F<^|i4J}&Qkjj@VOfW`t)r5qcfeBkh|wK;VJNIv-3iUNbWMb6aRhhX z`b;Mdykf!M3{WV24KeVHiScEk#C;GJm>ZXa@r^&BA5$k8;otC2LzmU!4c1jxyeNyw zdAdfnQd%(d6in8gZOgxG`3pk-Q^OCMhI8j+f3M$u+SwKeLWF~EtuBBz#BNc%bCR;l zE?Vl3y3w=h=4(ey; z=(|8J*&1dg2qc%TuK0SPOf%DXkkaJrpAVf6=3D(1IYMH;xZ$cyRqQ2yk3~ecpYdK9 z5GCnnF9y;$5>}F1INwCGJvsvh<2>C}{K(rQ#e4gq>!6ER&zVnLGod)VgD8uQBXYT8)IGVy zC$E~!8cE{#?p!Hf#pkv3b{v)mQjT(FV2zX}-hQU8Wp}#XwSX54{@%21_dBOiKHlXS zlQ_lU^u-1thq?G~}NLxm+tKnJBJ>-ZuBKC|i0uiI#SP2 zwXtd#tT4Uk2#eFBN(eO@b5oYoAXkIF9RKXYJ&8>h!GYr!1=ei*x=Zf3Ys#e9;JeOW z(pbg|)sy+;7;9hDolGlJ8}@-qGSft(V_)|8h}GQqBa!=opPI?C0ahc=n@G5bS6pqN zL(25%8Y1{h&ZO#f*r#Bi2d){D=FE_geDa5EdU+x_!PyL-Tg15*{n51k`8m05SKD>8 z3q&w!6}(2BiSQ>r{T~X&2BbSf(NW!JI?8G~=4DJKN)NE3>%UZtKF`CtUqN~gWE)EI z@t0UcFoS~I_8)xei++&ZIFp8tn3*2(Yu^;Tg*Ax)L%{}0{C95vZeN_0`|x|>;aPMNeUjFF zs~(|aKV^W$K}wO}K5ZsSgKooi=(v8>tH!;!8(t>qD_pL7tmLBB!+*DZ)qEE0so0QQ z`y)q(fo_f2-2%y(g`vqUexv0jPT~w3brmd%ZCx*LU5za}l0Sr0yA6`>phU1ayB$83=I* z=$0B~M-QtU<_V(7ASP=O(ElM)k&N-l*%&2&;9=BcA)EOp%#Hk@_(OXT#hq5|B;M98 zhd}zX9y}f(YPQWVqaUtfviwjBt1W{mlGc3S! z4O~2Ma`9nW=*{|duDnQeo9sQS7v9sUt_5;!gCi!00d=)m6!rprFGF?Ww}2CZ#W|#- zV{!Nh(%);!6K4OUyAib^24E)s$Yy}HWQ!t87@iHx6rA>4JfVL(s$_n1O`S2f6GJtY zGX&sMeIg$5YvG4T+Oa$DgBj?dYeb6ZZ>d@5B2(cwQ(Ykr*Xo)MEYS@$1xNj&uhtbI z@a&zif7R8J7le=A6US)5>)cM;0h~zqSG~Ny@eDz-2ZnGxmp)Me!~v2vVaB0B#H~=V z$#>P4i`Cl)fnysV7t}*7hE6E&YySOV@Ude{^=}yX-$&>E`FB|U`xN1b>)+sC24Cy^ zhL``nN<)?wr@!|OPa%BSr2Lja{nxjjh`RS|jsI=NfG^rDqy5gBe*X6p{piObyZc}N zY9E|O z@P8LGMfNykl=k22j{pDqv76I>@Av;U_g^XH@;*S09?Jel7EFVnJ2?LJzpLMNybB{B z`;80#TVXNjCjRqR1l>Qj@waduk8yV_-u^4R7P3d>!2c2Ef3L!KGwJp}yZ?Wy-K4x5 z@A@BcnEwCmZrJ_LCoTVbTJWjTzZcUR@$(9I`@jFbhwL%O?%#*#MR2m5ujU^UWqtdeUr+CH z?#k)@ISSU~O;GH=swCBWV!6$hz^vhYzz3YLJjzyHS8$;Gax#rguFE_j=s#PP(6>rX zlz~0*@!vxiASWKON62$QdmF1|pBH}$mNpkrgVgenu_U<`^j#eOOzMekTaIg@%~_YR z$QGZ%AC#TrXca_l)a={*lWpU-aEvf9jCq8ode9S|VMtOfY-IPo6j=_KvZdBx-#SzoRQCNg* z^`<~O{kDxtwxD6>_aIn?@}RDC0(@v{gn%b-U*;j@Adi$eWzV!bY1LPZRD*ntBIxFv zC)TOOS-pfJ+)Qc~d8NnM`R%<*>p9SvEyW=sP$krK6*ld$av#`cTKd8~aae}79UR7Q zQTpK8;Z%5rNGfRB{2>Xp{7KVEq-FEy@#o`dP1PU3vVT0W?PLNa%TBtc@iEZv-e|GW4Nqu zwoEHbZnuh-m8A@4??+%y;-+PUqfC+!+1tm#T)KxQ9Q>7}Xbe;&CKW#)pXQd%n)Dm6 z%+`y~yLPzqRdKfk<=z0|gjUw8*G9D5LLENDY_D`)7Yj7v<=?9GAl>YKbt&x}zZ3uH zN`BVeXq?)FJ92OsDLS`ei-PNaqHAD0)y79c&Watn52IGtUeHvw?kQ~8Sb9-cZt;)m z9_#4P*-Nd^LWcE}@>2)JQ_!@VJ85j#AcMizxpemheVsXnu4hvZo`I{4kQPeYvCd0(4VM)^T|;&5S-ipgd>bfjOGb{Vmjll$i=4VSYZQb06JgD)ViKRn z2fKeC*Q}@GeOCBr1vE&{($gIrV}t?D05*Lz7e&RQm3_gz*BPq3iiGScXXQ1tbOAnL z5&+`&lOl23IF8*QA2aVmHISDI32d^`Cl@O&e(hq%f8a-+j*DvFS7{Z2IfBl40h%W2 zbtW%X&$LL??#8$oQp{u(*G`vrIbNpYwFQcpH)cL^OQSde1)q<)Bh{EEgQdp=_OneZ zbY?IKjq_GMw7Cz1HIX#f^lo<%`s{zwAuQGyr_Hsc$T1`)h5Ba^BuXUJereHvu!4ZI zI}h5RT-hecIf4hzwn#)?p?r~z-k1gQX+$jH4jM?V8KwSfQzyFL_wEkAq^we@{gv=N zRHHIXnU_X=Zp`shB@@qw{9Yz7U#!VuPeeo+j^!A?Ad6AXova)9iuE39Kn8Rd)?zEd zztg&uI0^E7AS~#`8s1<&5rXj6m3!mDj^=VT2NnVdQizAlEe716ex1gY}USkj7ew7w0)$SNx*iFN){k4 zxzXeH?uk#adibwjW}&K`$M3U4M&=%K^P)|snr?9}Zt;st-vqLV^(wjR?JLj{aOCdE?c5oSlCVk$es5Q&DH25S_qyA4&ErI$l5Jj9=T zbqjG;es{j?!$I6PY`LStJ@_?pkhoWE>q_aa@-dH^Y%Sc&sI!lm(Jc~bkL#(7CW)}L2GUkt85ve~7K`7X zLoh_*9m0n2sdCo0E!fF|2i24n*k}X@k~W42(S(SBQ)*5mPfuWsp31U&A3dt&w_9C8 zLR#AXcCFUXHnB1IA`t*cIFtN2Scn*Cd`bL*#4{-YShS$K`sqZNrJBqH&LXO?ZZ0mG z%488`^QUG2&ET*(a3X1w^1kFz@a1zHE2^X%<4|9zU`K!u8J3DU>oMvceQ&M9HkHb6 zLLK;lLJXg}@K7OeJm`G`s!D57AY!2ky^rnV3#4q{+>~|mzdFR-dM2=lD)uUBCxmJP zVhpEQ5p~y$TnJ7um}79d3tGRQKXjfSWC8XX4;S`}`g}+_`t}n-r~en3f#^aVI*9BU z@!pR6F3x8XDiJC(6s{*I4)&Y)xJnIcZn4Mo9Ly$A;~`+Mvwg_0xqRfO12n>3f>4og zlGGFv>_H~QKtc`WqfN@2!!F;jjR9%*_rU!Da%z|`_TSD!JK&=rlbd-t-vWx%acMge zWuiSjFpvT(@XF(bx8_IMeby=*DHM5P6o+GEA9X{KC)e*b3Xo}-+o`2f&;U*;JPOZy}bNr3WaKP=o9 zapQb)rYa12F*KjMM12%i_2V-&fJLC*wr)N(9>13W9te7#cS)bYi}b%&EJS!Yfcf57 zWZKOoVZ5ABBeac|$~>q|_+~tYW!`|2cCQa!Ndu9QIT#lNy|Ruipj;Sftu~f*5xLF{o^7A_6T<&sn~|MtMs`1(8-o z{74&z7MOvx#`L4_$n`lPvxj~gZ=1liis@E#DD)-#b_yY~GuL+Kb}d&ez0$@^ z9p3Aa(-D&)nn`e5sZZofVIEvpcrM1}NM_+zSWMcSzRI@3>-DlP zst!QH9TB74*04AprEbl2u#5X& z%g)NPPD;S4RQ+c37296m@fPNL^5Wur1oS{+U?2leuHW|vgyGj~&w3F6q$6Q825BQ| z315w7$Wcs8L04t`NE~u&KCbW?9+~J-*L{Xy&XrXc;@*>wZs_#xexAlnOX~1u^XJ}+ zuHKmqR?Up&4!jY`y?>U&|8NJdf-Q08;LKpJi9ar&$`IFU`?B<9quCh87>5TDZCdbm ziiK?73TYSJOliri*dep=P70cA{wZmGpL~!HznAo;f*mY zir}Cy^YH`-qmST`iA?^$0Cn_a&`iE=U_MQ2JhltxxLJ~+-=mO{iF6=u^#{#-I4~rc zm40f#@~-x2@NqEDLr3zz|3ZiDQR*0>1Q{174{t7{LJPz)h(YK#Ei)G9%_(n3em3K= z6Y71O`T`iphLD@pSB@LEHGw*y^gJDK7$LMl6c9H{KL8-d-$b}qL;b`r1SG&6+6rQ` zvtxj0i4fI?l-~h6?epvft^3u{5=)$=UfY|G@inE$D zZZR-k<1C!-m9CSdJe=&y2@Zj6yDgymj(Db(;TUHwR6l!JWF*)29xZR?M!P{A&&` zzo|YfT%Hn;4Nx~{za$sTCP8AbjEP*Mr^*fj40AO9!U)K`rgS5|Vhneg@hqV{51Z3x zDm{JSZTqiLi-{J+!b0HzvY%p!N=F-`;=@~$;>LuLz&TBVrwQNZ`^;mNHuND2*hH~I#HHbPbNBM zZ9v=0;29Y@o>&AGg;bUt5g#CaV{~@P5_-*nlRssj{(LZk80!6cO;l2i8~W| z+G`W{_Pj_m;I4$24XH=B=LsUYtSc}?@}_{u8hc}O&tQwblOrLzf6Q~ro>S|(laJC3 z9#%>K0yE7Mn&PcCwx6qn&2@0KaFuSj^x7}=|Bo{bg0`Q_dOYiEQZvnORe^?23TDS^ESwDZ zXb^LGG4uQ|nIrfgnLCUAyw_YRUAc*YjkQ2C%qv89?p6=V9>w@U_`~#PyDc!WH zGt6%r$Pi;L>@v83?8e??^!;RI1h4h!z4qwO4zSKGZ)3qgNS?!;&)*MpRZ!;fw$<5( zzKPFjSGSAmnYu4+tIY|8&Fp&vFi`|54ZHaCeNJwU_eqV&41G>QegXa4h4fWB>x5U0%czaKhsSR zDNK8-?d?r;L{f8EF4paM1de=(Z=9{3}C;-LS6|XMq-&%xk*3iaP8-qT?y8 zB-_DjI_PJu#6U8RuW>!mdZ-{>DQx+b;A{XF={ao<*Be9K?yQ6igQ$?{h{il85se6Z z+7m+>qw-`@TT1y2uQaxn$YmT)9Z%{=+6c`L{Bx!0&uR9nVYhX=GcIhXtG*z#guG9E z7p-iZ&<*olTg;3Aj5CvU25V!^Ao59Gi zQm{o5gvBD@4}BJ?9LRu*DW(*7u833XoLc%B&VILK`cbuDj9rX@YU5J_J>q)On{saY zJ96R=I_R+ZFw^nyj{KVnx8#^wEBH*WY_-@%&RGF&0_N-LzA~T2m=OXyqHHh<|JK5j zBi&}^b!{dtFYVO}IsUiGsk9~y@KFPIn&0s+BxIWC=6$>eK%j+(H@tR(HeHvuZBgEi z%Q|YzHs1B(V9rB+xq{yDTdiGrydb&)3U?Wt?bHyA^1DNJwa)T znhOdlLkI2D+_|nY;{j=h=s8NO+PCb%e9ya(b$pLErX+?2gW2IowC9?jE8w6yn}{+Z3=7a?Kt%HTv-%^oXBo<^?}MWztP5 zyCmgh^DqW!dpla&-YmE-+$+CcT(&?FZABikU6Rn}K`xh@3ACHnWBOE|nsE>+(8^%m z$~(^nuieP~nGscbD&JUs@y6m=VLNm8`lFNTc3bdVcPz+%3H9?*dkn2?(Y=X4_BZf3i^q zT}|rD;3;=V{@Q9-4yg?hqQq*>C!jlm=?#0#W49$;n3>yHEH;my>)M_uV?=)c(nM>{ z_{4e2w`An#c+WAgR5Mgq@8=ksmCDG##?$DDWk(h|>euFT7p^9u_bc-ROG6jTW`E?> zg|j>q{XD6rVuMo%s1K;jX8FJS54sGDB%>+siBaJQ*j5(ULz%(-!8 zoOcxZ&mYnX#!BWK3cC@#uE$mWq4Zm3z0u*Ebo-eCW~VqGmf1@}$$gfxw*8@YC4uY| zz!a-EEcJO_VLw%UttyB4PeCY&l3m(aQ{80S^-V8=u-M#`!#tPsI$-G&qdvOJ^4(AiL_Qz$f6g8#RCNWp&sBH`e@M9d+Yo>d@_AGbD(zV~94encg7W8gV)Aojr`5ub|1 z^SsgD5jq9?@1t7YSUFs!cP}$nz_wN)7D)3wKrfJ-R`mPNFX5T z$#Se}9GjpMu>c`L6hdNLuxCcHXK@DUM6%^Df{ccGX?i5a4Ovf=u7&iz)(Gbdqh({P z@~K_+3q1Aig=&KiAK+YCVKuY{It~nksVr~*M0-?0o*3%p+7iZ;DeWgl90+u~7FoY5 zZ^yY`JSk!%P8+@9+#+73@V)wxvOCFDcZ<$Z9mLXhOZ@Ohi`kP*hCenJJr{}cwcKo!F8;dp3@!cZxLEcbX}wc!w9sA^lv!q3G;#dKF)I9~lTx!) zaG9zu@`JGvoSfu`q1*XXt<4nn(iu`5G)m@lsSvCv(txF#tuU&39Gdk_dlKCyIMh!G z@b392cQvd0DQ}5ZX5$KrHlvg1)UCe(-j0Sxts)P6Mto6bQX_R z!rGJ)ekEN!SaZBnI>V43SrDW}n;}rvEUVVxJ5peIVla+4cMh^Q;?iG?v!0g+EuF6&QUg`&y~(K7uJq4&e{gPRP^=E1 zf6E`O1WouRi6CLG8l+fexCSddma!WBDoWCPE>c*R^GDE?p@ z?)B~S`NlVL{CwL+vki^NvekqcLQQ6j#*p~gioBQ4N__`Kg+NFF!3F9AklOH+m*zy_Cd z_2JvuL@Wu}ziEnq+JvHhsxfHsYsEG^i>lEUCG}m>jM}zBHLvd3SM8o6B)85*bAhN&tzp3PesK$F+TaHN$&tNlGQ4f@w?&s%0PoTR?D zxMObTJVtH35A8G~xf-zgj_chs(>SIJQ1>FOo^H_f)xUtA2>HxBn1RcXcdU>W{77~l z2GC6sK{MC~FJ3v2+8YIpqe8a~g`^1O7%>gl_|-|9`co3f$6$vO2>22U$vTF7UtII1 zl0rB!ce_-Tg2`t#xENa$6LvCaaTe5D+rKK2v0OU=9>xMdF5R3|N!{o+g->sV1`A$T*<7+;s@dRHbTthT5)Kyzk?zYrF!G`$jkBm&oJVTSVsHMLyX@WB z!b6ez`A%4uRWQ8wYYCm`Jtg9soKvF$c9Z=s(aYfd*|I(jnMJEW4tn|Kf=)U*Z+~OP z%mu1-++TTTeQ0`G85G%rH6}=#CT8hgBh<9Fhr`k5i^=!r#0%muO&{e&mYl%`y_uTN z_uWS5DbECExn(j_xZw2HgBPyHb0^37o`3I2MWMnPodh4Jc~ zt~j#M0|FZ-W20R5^IZ#YR1|N1W5A56JnSUr?H;XBN5$)$^Z+E^@tg5T1eE=s)?XrN z+s^&nv|%4tzu5LVvCWN6v|X)N&c2;6$}FuCZ$ga0_q+oJiF00p7tqPulU=h{jTu5y z6tkOMV@cx>jqBa{WwS_1bIZS4X53ZC9-%Q@JRB!y5>=TC?l1HG#g*2)+k9x@RH9Yi zu3rBls^U%UtCx!J{!$DMq$)2SjvpyD8&y6W;el?ZnVZQcKgU&NW}A5RX38o9p7}iH z%W;$iJ}0=Cawii!{M^*p%e22AGMrOeo2F{MLWq-K^YF#!9=NE=*PMe8v8+ix-%s$} zmpE^3a9fxCTn{GckLJUW>;E|kdwpa%DLmc=hd6ZlLm#cnkAbI$S#fPbeP^ByHd-!&LV|6fZU7dUMbJxdj?)Ccm z=j%mbDUyqCZ>vtuE^>?mMwbYy;%>$vPL)E(${Jw(r8?TV8V-GIR`gNKE9)+47HZi0 zEoM@?!8JEYf9zX4VXrc|3Aw@xj)Sz(Rwu0e`t`z*7VuJ`i&okz6>66Js|2{loU za(7+mpwMw{`RJ^FE`s&iCAF#Iu(AZ!3*LSB1i?19>Aa~P|I|>q#0-_1D~GbZF9-Ok z4rGNxY#9!;TJ_AzcUr%xXtrMH%zL$U+bv%PDc=@ZNtb0!jmPB$6xXOhmW5PseDJ&! z=Pr>qF08|0yAy#~pMQ~2ttT<)es5SdA(`D2xG-0c-TXWnv7>a+z-okkq98;XEr)g+z@y zl{u&c`lGbj{Zvd-1JtVl81a5}MNvA!ICTz;S|+#XqHWaPPHr)Yv`nb#QV;bvejD$H z_{_J>zz%c}Ms9Cnpa1SrK=NUBXW_y&>@P5S;6x(PGqMj>rGo`$E&2i9Qi!9`3+YO& ztC9J#tb2FTt^z(+8O?8f=duaPqHJD`l_R0g-^D~k-AkarbO?>NSDd!)J@gNuJ7N*5 zMlf&3+=A0HZ<7|W;&K}q)}?c~yH%qIv8P>ZeS!C+#(L8a!y1t2YWtQita48!YRSqV z;E$1w1q9BD2X7H6~Alu!J(m?Y)$vEJ!6gM)>Ex=yC(+L@h^T@wo(dSTnkPhR06HO66 zP$Yn+!Usa8Pw4s8#`h;V#fxBzuO~;|0X?6eeM42U2!3l|W4?481t;}PNw+jLjTm-U zI@1gLN=}=Z9W#7wH5%OQPd7x(rpyOrYgzM`;mQ>AER*4;-%Wxy)9`*YS@b~VwtDF| z52|34N_bNF>s?n6^J0sG0e@=h=-Lt1PNqt_HdG1G}MawM3k;mMKEwt9LdiDJ)_?X{s?M@zxz>RK?`u>4h z)-%p3T!xPR3-kOiKixLx2@W8M7x+Vfen#-*XxKVOrk(CM1ush$h|2kNCU*QrkfGEO zO^fMP5xBL8gb$woIV#z`#OMzpn*Of%;t6{g_iAOLxm(nwc=j%?MoNP?rHe zWm1i+ob3<%G;g$=qgFL^tN{z1ma2aYe-2ffbW@ukOx|e7M(=PxlK0g^7>uM9za*)-5*B zMPoq5V^6(CxbalE6^l&>vVn4>++#qm0Xp<_SceyWV&F{j2|YWWZdj+pqXmARU-@N> z{f32XAz5xsRI8e)00=}FGPz6C*@}B@PVsPqgMaZl95xNwEa`tq|3-&*~SjH6bN|X_`tuc3lMtD$46!&e;OdpJ4XWD z_8(edVJ>?e8F^nqSw7EvzV9WlrMaoBR+;Wx&anKwe{%5V@}fUtQ&@K}uubW@iT?llfj90L7`kAe7*76#GMfS7L^no7%}j zl21@RkQW8f*l101->@?kC~aF7_D{ZOT_vV2fPS_Q!Um6i(TKpN0rPzjP}2-7e{+yB z$Tw`qOtX;%N5ToJwKC5Qg-@=VTxrh@?g>S2g36=vMmL175d+3R^8} zT`6Xk(TH^07kb4FRNagis@jyEq<0&T6kqz4iFhlvWTdusL8N!=hNZHTITDUK!~ z&i*RuQ(|{(h(zJfcjuBtj5`?8*tojjgg#HJJ`voG)-B)^3$Dr)H7||JZIuXn*SSV4 z7PD@qi_EtQvYGY$xsCj+INo?~QftBZOTaI^6gVcB{b zbbemhFh?Y%ch|7vApQv@x&LRgzffqQuauE&6Zb2zt~nu7&pxqjk8E6!!sC`PIqus$>DsP01gO#acog&l{i zO)xXp2aci|sk9j~f{Jxq7>tLius{3Ix{4raJXiC@F*E$|gLN3{$gRNIXm&DNv5!je^l}TQGN_x*T0}vY8D`d(L?-eM#(WsXb zUZOe%YO@Fps8;2iuRiIVBq0(i7F%ov#vk0AzYMPx!4vejq&&C%{@^YpBL{^~YJrU` zYO*c>{JT%56Qz8v>+B508_x`wMm8%66HNpQd%2b5*2&tOySupHH06MpiQ$@-W5Y? z14`TME_k{=VVp{$Np0{Ti^Pxl=ZTE@t0W`?=8YhX`xllDeGloA^aBCLXz>FjE|bIw ztn{%k8&rd{D~v_w&ge9E2m9yGd{n<@(0spmv5Qc_*xy#~Rch(epr1;+Ry)JMm6pf3 zcF~Zs(_c>44^5qB6vCa`t|EGTC+I}h`=BB%<2t)w)*$}0U@g7Gb@r_btRpdPVs>4G6YIc{?)yE!j@CQ)L4pUu}XS&QLZMfRC-> z;}GCBj8kuEAjdlF${>|$WK(T27kuoJSM}b<&7GMl*39=>G3qh&QWkVnk&%82y7chN z+VBV48)kDtN#T5u?Gvj4N1NXIwN*s#v-V?lPI2zsz-43f$Ibta$(twkgf^F2XA3Qw+yvoquPENgpo`CiRSZ&HGXVro#`AFe1fWBbgfxE`8;m z_btV$$H*|+!Ib=JTxsiee^quG8`*xUR}RmExB(v{>T64Ux2@dWNsLMD`xCJ#18QPC zYHQ?Yyry65oo0Td!p$IX^dllI>o~%IE*uSB770mvhbb>Ve3nEI>Ez{#R`P8$A9oUf zH*h8TcPiZ&p0sIqG#HH-f?B`kLSv6^WapOYV*o;2k!_Qq2{>MB*8v+qWY&3oZri&3 z_)Q6^gx$8a72^FJGBQ$7*plS=kLD{=T5vZnbMT;ok6$_Vv4J&Xh+S^R!`-}jN`nKk zSu!)%rv8ZUWYH+0fm=;|Wf^KyE!=IdEkUgUBzS}E!>waR`(~k9w68lP9}=U(EW3n3 zLWRdXeb$)Q%hJo1HnUF}-7D@Jqo6Br-4%EZ&-*KdI&iS$PY}F8rsXM_m$?l@M1|9x z8*H}^DPyKzYeYKAnA2)hV&dOhkQ#gx-U*T3(d%kmxl%TYyONuFPE0~XC|$4Os~8PO zJ6x3|QgvMvs7Px9Vk#fLT4q6bwU!Ln@gE-%GF1Yw_iWE-^?=3 z7Ex-gnauC9ArIc*q~TEsJIWxhHDA8Z!J5df#&Z=$XNefU^wkl)FS)<@g@4#pM=KcZ z(vwmS?|X|uPf9@RWH|Y0O0!TG#!fMGZEO>b+&H<|eRKSQ*AkRCS2{9p(#^+F@p3~q zlSIAbJn#?(Tz9St`P#vBA2`*C56CqKLdv}v;J>ao@n&r`_x2l*}ZP&&8T>U-7u+@4d0u7o@wJx-u!GdQZ&fg=g_Ja`u~ zOsGXpOK{))bWj43g^uBN9A`c%BFF>p1!%SE{2NaKRXvN|UZOXqIV&Coq8W!bW#!MO z&MDEN)~a*iZ)Y;eIN7Sv0863xN1iW;{W;|GNr;724Y%hEs#TK1EtcmHV>E zu!7n*5zKAWz_57Z^}@4Wv+b0V&~j5>`s(kOmtrCAYL(9GX&b=T2e_~9S`v*!dD(>I?moI&De@%>tRn|7$BcI#vX;U zVwLC?sY9CG)dvv$lgJ~BziuESJuB+@2+6bY*pZsoTjTBS33G@>0Qx2cT!71F9yTI` zZX0GcL6RD@exDGBbM)XozI*g>X+#guV26jT7fORF;SN(rpBLa`uGk^)f;14keV6X` zd|tklg>+t*NviADb2vKN#K13ubfYT3;9Kq6!0|)5q8ZWthVEsqglfJ0=Z%J^a72K? zlP<@rtnGa+0TORr>gk$tf)`0bH9u&0AL=j_J$WFfU-iQ2b<&M*Y3x?% zS8PE@jFUQO>vLsxnZaRxs0v)>&o4w3YbP-Dv2FtGQCQM-lNakv7IQgq7tMjX*?6oR zc=^gyC?c3>f=`--5%NZWOKQ^lim|nuoUiBjMG1!yq!%HGxxS64qbC9w7q(fXjO5NA z;BUI*Ax|GP z+w!C~gUd%$!pmiZ+hxI({9xcpWo~o#A)^X)&9Wm>V;h1ujfla5&ABWFW6~X|aHTQ@ zUY)IyL*Z4Nm7htTrUu|A^IO(pCye<=9KLaA!(-d~`q|;y#PZP~ z*%W$R?`v*TlEK{(`tt}2|DeU!Oi;Ub``|6y_X=Z=nZG1&L5&`c^HsW-=jQR%vjtZ) z?7CJLwZg=fWsoQ9*91R2loaB*P?d`GSub;nP+ENCPDwbmqblpRenP zi^Gl^df?D#bki84O0!r$qI`I+sgnW+=C-|M?B_6JRIH2Mja@QVx9DKtCvb7$p%m>F|r=^nFnC9lR0-FR!(lfs8Kh3%}Sr zjdZyRNC=crf!RnAf{MTJnkQ75bL)H&-C4L-#oHQl8&1-3tmJ~rP_1ynAmYpedZvpr zA684Y!=;~f+KN4IC0kKPUWILdwi@T>9CYBjm2&^fVEb$eESOZPeN)MO?_&QR%^>us zG0$1=s=!&WX5|xVeN(I14UiSlu&H6og_I^DAz4-CHpDgN_L6cM)?@EhSnZR#6eN{& z?{3s?mz6ISSyPp&S7p8Q2S$*;n>K5Um|o)==<`%K0)6l_6rn0U9OrJRs!3=6t3Q{< z&-gIaJ)RHOCS`r}%UAi|(I;L*hARdF9^QU61p4IZ#tOAmN4Z>VI$(Er$4K(q%R`7X zWN9NSymRmOn`riFT9rP|so>Eq6l#8xTa;W%j=W?hySqKaM-#Zq`oL!#$S+q(^2CGl zkb%T4IuhQys6{n!Z_I6jnyvJqpA30$j-Iyh$PrrXCdZP>{cvYxN4YAklGYywYwhsP z-0VDUD7-gqftn@5U90025_-yvi1H8Ud$g6K-U>W4<0jto5v`~1ocL4(m%x?QDs%J0 zNm$KS(TTn|V|3C#8tLZ;F9x9sH_#L5oodgXru>1Do{N&i0FpE8MW41T2){SsjVEAU z)en{pq$2bdc{r&Ezzs(}x?i@1!0sY{bGo==CWbmPg^%;zZctNbV;#0Po zL1#(!G8wT!Oo|I3-Zr zp^zd$f;)U^pXWX2J=gX9;Ri|Po|$`Q&z`mSUdvlIbY(-n!+bbNX*q;X^zKohb)~3l zOM{twh@qnKIyQ-04&YQEi0*Waju}Z-^d0nW8y$O5%^(B`SYqjU*<*uQ#fJ7k64}ls zSPatyr@KZRmZz~{Dmk`nN58N^2Uj3CRm!d_!`4N=%{WCxq*cGnc~v#SXP!Mibg`nI zDT8e;&U4~VFp?k->b?c}-C9+}!v*hyzqIh=rqs1nDc6yVC%jHuXIf6~90Pd-+kiJy^66SCA$P-CY9UY2*o<1gyhdi+)2=a%ERI_k z0V!#3$plL!F5R;<+0*Y|rS%@kCo`$7cN?tzBBbY&LfkxG=pn!m@>1x-PT^2SSKwx1 z>^%(^AaD!T+quS)Ezv)-9gtI=T*VCpW+IlyFWv!DUy6gNCFJ>tIZD-h*xE49Qhhf# z-WXU=1Owh@-!_Z}m9$)Mwzei7=s{ogT>sj7@$-ry0_sUooa^eJ}L^!4WmZ-Xf0 zi5Wc6KwUNOo@Gc3LfvS!Q*9qBeNq)fNPEOk?H*t71W4V-VX*;;T!8o2BCUNO^9)_( znPrtE^XrZTZ!3#%3b8i|J}bIdPJ5CR z+8AKAQgA^jJ)2SVmop9=A z>G@^F!GY#1dcXW>w!DCzX2<4c5SguG$a$ya7i^c^>sFV>OY?V=!mzil^;K`nD9bEV zdc3AW0!BhU!ErsfkQ zk_psUO4i@fRqR3FYiL+cWardu>!fWH!#B!wnhsj6-6X3DS8zEnn4}2YUqzT}R!Dt7 z%KnX{$Kt26Kt;+rpItgyhaD1k-Q0C3bP{*Taw-FPIBl$vXyVrw*yhowofg(Y(AB3i zGk(3G6@M%#(WaDNr~?$7ID||sRr_i_YY|t+9$RKFrw2qmmNYD*TbMDNP5I~+XZP*s z7kxjtgbP(Q22M;QnJTDZ>HRqnk|*W?_7kNZJDzD{b;BFx!ZzS3e{G5m4?B^$J?2xjg5M%GxVeVUYMm&`-3hQ0+67O^F!V^g zA5}L_UzA`1-)m~OlAT1?w}UW`$V zyISX-ljqPs0m3#gvL21_EoFI|)85=R(|I#*ePO(JeXu9yga^w!voeiwFj@$TUm=q) zB8YY5F1W~_#SK|6#Z9C_=G}x-P|$_uCd86VEp|FfYRj9kH~VBSdtF^qu%e}fR38E3 zu2D;_b3oO`=Z67A?@ZVhF9lRJsP(XF8PzBJuMIHF-y8hpxHhuxh#R^(+d-=Dh}cUW zYP$mab9?f6y0!rdjLp?WZ0=!<{egtst_48dhXVvzu#+z`@*d+wh_;_su+&40scjXm zigBZxGnFBA{kud*S&2CUip}0iv*Q2U0#A)jT&u)PVcIp3j^_R782B(8M(SE!@5z_( zT1OUVq%2J6aSqSW*}_}hYMA-cf&B)P8SCqnXRU5Z4AtSS7e?UEl0Ubep74CDB1Yp$ zP16K3;vlPzRcfjhopffqa1A>axGD2<;{)-!0NH|8x@WZYU^dFMblRoCKTJhT5v{j3 zlK2mk<}@9~QY{GGNgf#g?aep!C2X)gW_zz9vLx@_;iVNf&(f97bu+wxEd`a5ZZNmK z7fsKagW(n;>>4f=&R1f;_S}0)M_E?wBhflp@9fa+d^kbD$2i?eB??u*;@MYIc|z{Y z%@wO&xT?tUt>vp6W%SUtpu-!UG8*~*`vbZ&67pcT@lae<$1JSa)>^&;a|l`=d3sAW zZbb%3lL1@Rp>D{`2YE7=Xa)bf{-Z}Wb#&KxKxY|k19O|t4rbNr325hz1N#vf`(L}i z-f^8(R^e!JQikQsY(L? zaf^~~zKWHec_g@|(Z6Bro-gk&mr?t3B*=Z_EHEDA(DkO_`&SgIvat=N@G5wlShH6L zTaMz}^(_L%kGc|IUO+{=Zgr$qvmMoea4EK>`c&RhD=H@}x`+I<*a`>kJ{xl=wPS_1 zE=EtWp&pG*(s%sSyz7GvS^87o2>1!@e8`K9x?i=NktD+~5q-jL+d+|# z6Z(r9AAe1x%|YInhiD(vk=clmtxuXn#XH`~*f%JXcWgRo5YqCl1DlDSw9tYQymA$x zobtWUx3tgYlOp7k8Y|yonx;!?CP}qeg+`>re-dM?c)|9PUaWhl_7(hfyu?}=r4rB*(aL9h?0z2u|=Z5|wvObN1* z!GXrzuTS^SVHEPQKNJo2V{M%y*aBG$Xa@W6A!K`Oy!-z8O-u8{6cf;u-_O$?2j#4J zr}-1K1%3P!5YOS#>l$E@%fI2iHED}9?t9Qs+)lPO|9S=GqFMS$QyCibjp#7PxD%_BmM^82J370tMdmf_`(aMc$In$z>44)oK?JFg0 zE9wT%)(Y)Vk>LGC*VrvQHtmffE`xo{t$+Mw=wjRcXoC&TNJ-fhs+ zop9#7TuPp7( zgkWCv`wk#JHqB-A*k)RNl%a+vwrQ2^;|sjW*7V7d&X>NQD{>Bo&pm+`fa(L~pPEQY zbfghV{D4gB6tfQ4S#?$yC~qkg6Q~;1hy0826I9dJn zJAk0swi`8!V9kw_ovi-F8fwo6m?n{?rt``q=?f}u?<5;^sX0SXMx3O2AcyM16YMZz zL3Vg{wW7UcT5A2#_bv{^r5`4oA||5dEQ@agpE@BgnS0B4LU|%cH8=6N3!R%V&K;IC zA;C{1!PDz2?{lJjt+UM) zZO|S^^&8}NmK7}V*+{@1RQt%8IEGU9nYoT(n~>9*iSqsK8bKJ&9Dc{G4SPa*yBSI{ zU-g{eFca5nmZ9{~L#G!W83}E-}x_{!wzAea_pGV(oSKbYnv>0PRcF{6$y5w)2of&CKY}1N$JMZUu)}{8T}?SK?CM za$isO104VE45T9`^S80ku&^FcED5|^SX+>-k$~RnwX2pzS=Gz;t0i23z1~;-7^&6bz_{5t zK6u*1-y`$qlJs{+rXhEv@6XYszN@vqY(Fg3u9@1Xr@r`r?7Q^`mB|PB;)lnO`^6uH z_nt33j&p29Yw<;rX1I82_EsLLJ;*7m&%@lw{%Py-^3MPY^3lkw9OKm}TR$cfh(v}a z_@j#$hsH(j&gJ7!u5E``879}q5GL!&2Xg+be%-nV<2m?cYrr5 zOM+dyBB9JNq0y|b*w})e|Lof9SPv;)?*iDZ++VqcuPa`aeGfp_W|i!6%=%BFk1Ci& zfLQBu3%VYXZP4}jK=P#z1XL`WaW7?RCd(x)+>nt(0dQVBh{tzlEC~z6I8#Hy1X=WD zZOz6=%Qb`RT{e5+a+l8GU&D$0bt6?Rm)X8zwkA{F41VHG#Yh7 z$lBwqF#J>`Dc)TwfeQTD>@4iC^>v!$1ip)31~##!du7POqB!GU8-Sc=_JM~$WTHWm zIMo66@=dM(w)x9|XV;ll<*&Q;R5vp<&RIQy=Y)$3)7LJ1-^hau?_w%j?r8-sf6*}k zf*G5U^{fX7V=qiuezMy&Iu=edG|s7V+?j$=7oBJ;oNyMS=n*3|PRXTZI@c9*=qVeR zVm7)BZicDUpTz?3MQA2npGs1q4*91lHc6w=Pyg0F*0#m>mxFfx%MNw<5t%{~Q@XS1 z^K1BP;6oaH%8wBvh}cBCzeO$aeSRXgy%zVCkr(T&0bLH|{m+B?yt2yCd767M;Ae)L zT{k)?pxr|nObzq^gP-|4+{l9BvOV*VD&ff>Nn!Kv8E_N+Ptj=|n!DyNS-=A(Wra5G$2 zL0iMn7+nD(gUHjq40g(247oa##Gst30eVL~3p%*zR zpR{(sx@XebAeQcA@3+47WNd*b>064+r`K#XeZNuLWWu|4cwn8VirQ?*(-uNKfSm1WX zH0`(I@+;7xj<)r-zCCg*__Quwh^aV!vFEXwTVZ-~N>K2~!a1o+;z~Y&+0)|1kdf23 znm5-iZnudJasSS*yX-)hbkB#2{Nheu3q&N6bpS&R5XI;l8u~7n-_w8?YBvtGlbD+T z#R`shf0g?-2noaOoIU~IoB~(X{eR1%K6?F5vgrwoG-w0zKyg4|D`Lg`h3J+NriQb` zTYBv5g*=ACZ)WCRXh)zB$MtW>o4tvCr~s z0I}=NEws_&xuO#%TZQQFiw$<_kD3!GC{w%};pdYC%j(sc!R=!|=`M}Ig8n7NUQ4zK&t#s?S8(T?7_%Jc!GaD4csEeW(%nnw%0Nd zVjE_@&|rx+BjGMBc#bL>1bXaM`Nlw7W$%AD=n?zu4M?~w`ii0z$PP-Lp*`~vyUh=tQAP4V zRhfFpy;&+mql5PfFUyCwqq4v0iNYOrl9UHA4nq?^059bOnhKK|8X0~rXf^2A*M^rV zJ-jKi9RICuTM6NmRloS7Vp^a921%UQDK z84%$6$32K0s}X}d1h?1MqO&tlJ4VuSP~wi8)v(Y%f~-O%u5IaBXWxjD1gPlefqfe7 z>0=|UIp6Ro<)86KaI%ZPo{Oto$^{yG9Y==MsXe(PY(g z)8SQ)sJZL=7T_J4VbD<$ddTJP&z^l+q!Q&+-W9UmQyJy0CH?Zqzm7oVab#f?X_?!O zj8V|z?6{mrc?qC{RQ)VG(tdF17Z7EGL$^6R>fs0zTCbBm)Wd-3ek%|>8yc%@kBqSX z9rl*0`(|CusMw+Wq!aI9-F{*j--4!#-Oj1rR2@1Df)raj(dq5K0pbpmJ-U(GED5!`#2W zeLbE;r539;rQh4cIKG zRpdwQV)AU08zpB;%k+sIrMY#kk}3$j6!`dMaxQSVMvSZAs?!DA%%tktki;TH_GZ8R z0^tt-*H4Oezl9>x6JtJ+(7joVziWKirJ0fo>h#`3=E=IMKd@qvn6*1nL&!NH!cvD3 zP=a;zRpOLeH9+e2Cl)%|Qh$x49neC4FuH-2nNOz5%&z;-!6E)OHtnYe$p@b3lu=r# z@Uhe?60b5or3SB6lW`IU@N}(geB0N7A7iD8-Ydzw`s{-JYTEe=cjHxe%-$2c1^Ps0 z;sb@_jk=Ys)}LmT776{Yew~A%mO0%066v%yp@p!hs*U5F{7T&^(NCbXwFIKor@z`% ze4}Fy`F9?@AJ&1qy^~T|q!8%r=wLIwfM%uNX@DAx?W+q<*hY%fwn?ZL`5{8V@ICv% zs)1Km_1sYM>YYc)dNe9<+YH&!w!g)qf8fJEN2czifm4A0D+xG~K$3l{h|2=isojxz zw9s<69FOD|6=8{&i616Usy*S?jx?8IG*rR@m$aHnRAOGw&{rCxIth&xo(wEQ_;KPi zGbj=_df49Y)@6VV*F=_kh(iuK z2)w$(bLQi-8+zs9(1hEaB2hj*yFFClET{~pe4jX;cPocg@8Mod{IHmOvnwI!OgLT| zTvaZM;Y*6JX8b)?Ynfz@Vk2OF5cYIIMb_;fKd4uIg9KCgNsL)WZjo<+2ITW2{1{a+ z_V8AxP!eJdT3?~Wkq2+)+@;J%ndeXDA-`yQQk^uf8_C{IzEE#y%V~Vm_H&_qv!rj= zFp_;qt)e)>AmifoJT?@&rL2~XQ5Z~{bXgkrkR}+yjb`R!2nRnis-FEBqzkJR8GVHp zXhXYK&KCI7ltl98t6O0324p|^)WBxLKbP--a{XiIwXSmDELeT3jj(S#%>)f=L37N= zZz^s6= z`e41^wJ9M@@{E0|pt0>1-j%k21IbR2q>&4UZWNQoHn!;( zw();U_NHhb8nt}4-tkvv;5zGNOiDifDPZXwP#cHq(HZa#j^WufQyZk6o|}_R8UP;6 z2_Z!=J@$foi#r+3RdJwIgI&crY76y-U%0()--IgDQdaLZ*4rwwcBd8B6IwjZaa9Cn zAPUbmE$9FVjDp9*#Ak1`7t>N|vOmr*Hl~Q=4&U`?B~sy*pu_kqikn!e`prZO1?>e( zO#RIqq_av2@EV5;h?Fjr!Xifuxaf^vHqxQ)mj+TJ#Fs`m4kQDGN%wM#5-C^f*lMc0 z%aS>1y75Huy#&X{L7#K+B*KZ3o~aXJ$R}~z-#7g(3@UtwuGGb1s47;|>L;(3#zrzwjbpUC~#+=L0CO z=sFVs?H+`UixC}0*xO`YUDSVmvpADXfM$WpNmsw-Y^BjGjh6e~r;1Z3P)Ic=$f#G# z)E`fJsEIDHQub~RQ~0tdK4R~K{tpZiZz@%Cy~3XAc@4ITTD(>cb>GDM_kH`A&loz3 z=YA^!2ns?mI|J_ONJHBCL4&JhEgx6aGgNuKjS+35`LLT|*Xr*ItvF)%q=_5oeN&Y# z+c{HlIS5{Y{{8L&UpfBlykppxZ$B~sNo$|@-1@`4+U_cIihqJWAUITfr{_`+J*-MM z*C*}dyeo#lYBOwN#eZ?V^T+yq8WFju#22PtEik6*Kx#G@X2Cw=UkhP<2}*be2L0|Ys+14OA5+&_DgCiTCpy-e%FDmx*zY(l-HEj|&wJ%|Mkjt^6 z`(LV=TD-Wl9yrMg<#lm5mzYxd5V z5vtD(rolIi>&DQVPOSZ@j%1(=n#W76x7-Nzx?6Y=UlGsWYQU36FAwK8Zq0jdGmevBgv^^F|FZU66l2t(yN4-GvKHb^qV%WexEgQlgPpCHIMJt$6F%^qw4(@D5@3~Ty|Ssa-7a%)od2oLxlB$bG3aQL)k9$dp74^ zQ`~z3GeO>No&v-;x83FaCX&Na)bKv42)_g0Mxruj0FoKydcU?AU5YT=FAa!}DjLzZ zqOwlMqDkN^aB9u_z3)r6kz*QmDVWZsSMWU;Rg^%|R*=e-49OIpR2b1maiehC(8Dw< zPdIqT)zv^&-_FWqjSpJ^uh6{{BZMcwtrj;NX3*1KGlod^EL z&IY~R&s8Zr$|S*38aB1b|A*}ynuY9c627?Hu6LeS`x?~G^!R{SDswuF;I@5h_soE8 z&}d^z29O@trcy;}u2cOD1s_Yg)frue@|}EJnX=h$gE4=+6lA2y#)E@Qos(1%n@P%> zkT5r*Z0J4{ZZ`k^u`?P29&f!qV}3YkGf6=>k#n8I>zduU8BriTqeCQ%8o%uS^}c&Ykht6h z<~rK4G&s7)mH2>sCuiUiKdF=DwVsd33>(pC?(;P??1!ht?2m69@KLGo+@}`(v6S)g z6ZZDG3jzz%vXiRk&hd)ml;!M>zBNv1-66rgn{J!LaBh~5wdnes<+Q{P3mMRRx$5v9 zLY2E`G?6E*9 z?CagUrf5Zk?xFn}U4!)op9n*lkh4_ua_Die-O28*yFuwg><@sUVBVtAOsw1e*W$Mt zbZeYnu3ulRzXJbyguOU{>BuJ`h#D}sPGYOyI&ZZnsOTXbvQiL;VkFFTg2<4El9zV^(ao2h(->{zm;5C*C zDeDfJVWKO2+4;g%IAvnI{ion*f`5-lUussdTKS%^;2*UnA`Q4h1qW+uTJ{n`+hL5V z^MZu=Rsh?yi@F!*pcGE4w?YiV@6Yj)>MQPfJYG*-HD)bTL;HMiWgMsEK{hs!I%kLS zR>!uvL&&Xih=0LXvgt@9ocb;t@hGfGn1%AKoO^_Sn#q=@dhY5Hy{m*6xEt%??C{5V z@sn{XN_lN`6r%YGP+^?p3qr4+@*C$E8TiL1iE2R=Wi~B|Hd3!E2ly(Z78aDT{M2;l zx$zv}t;aDNz#F*DI&I2q7BYrqGbx@1X=%_@A4>Cn44wWbPRj=s6w6odZTSvYs1?xU z()pqLk!Ybsqj4-_(^D$Rewn#ETUN)zDj$tjgi<%TCz0yWIvwj^Myg98zN1_|G$k-` zF&u-obtKxwcG)h}zno{|*XQ?q=TSC?zP`_>?&8lWoyxav2$-YC6}z&N8u0h>2@)n3>k$rXw;EAg*FY$X%4#6+*;`ZjpI+PMty zL6+KhInvq5)Fi}`RqfX+atyFK*2VcK7s;f_F!Cw+V^}Lwlf*zFe$*0!N83NeVoOjX zyo8DjD>DoAjMQA2$K?8BWu1a_7&C=ZawhA&=}^Xw&5(qNuEng@-~-(&d|}=&EQwjO zYJfa0x=h&*;yq3*>LN52JX8H%AZ>J4G7BL%XV&~js0z@l2_3IJ?vZM-1B=M^6C^6U zH9$?8`(4q{q6xfVm6q{|RO60o9KXd>5E0548BWmI7J-sH3{Tp%ab_@{-6+pYd07n( zUM#+wID87b^&@nqjiZ9?wuN(^MhEX@csob?&lysMvl~Qt|EhH^RorFk$jBY}$Fkla zkOii#C8xO1`87HU^Qu~6G?LHTB7)i}_eDsOvaeQFj~)sO!-=ZT`gqU?lbmDJyRe55 zf%tb96nAFk_gEict1usTuzYl_{f!5mNydk?-%32m!(!xEPf7Q>Tdg|Mg-kNc`$v0v zqdJh7hA;1BGtljBsyLjiEbEMJs(D7s_i}s=4(A3T_p$|2f${sJ_lu7u>jfk+4aPb4 z$`YruWqE#ek-jK<%g=O_youl(c=J!smDetFEWs?&iHBCvmK0~LUb}0N;K#m}nBn-G z8+D?jQ*uFA(!S9c-Y`ky-d28_HI!gP`{TjghG7ro{x^qf-vGLdJp+IjxxtvctTn<} z12h=LYpCAU=8TiAK|jDsSS3xS)jmVWmF@c#VRdM8|CXAOjSj?+3h zL0E>sHr3!&=ZC_ zgu4hSBZ|DfE{Wgwte%B*+PH^1U~(h$NYQC1N4ueVgdaWoHiYbgv6z8nY5P>oD5V$gR_H z1CrZY=v{xpvhI+LNy@|r}k+T-;Bqb*m4qk{o_zefqKeV$v?+D zfqs9CZtpDgNb9cnep&MV7G0KMeVH-&4i68Lkupv$>1!?EopuimuBA^*$8IaSAaX42 z`joue&2m_Rj8rAt5xEg)B}UF_HfnRVR8tkkpOK=As{OnG^qPwR6zSfw z-bLq{-NwD!*kM$S-_cHnlo}CCJ;jGcM(QqeX}ULANHIOT_T)`dy-Pje z1TUsfR1v%%@Y}s`m?9oR0_-8Is>ufHqrMcYhBK9nuT2?#FC}4b)N2WiGv03jtT$I;^632z<7?`T2Ib7Eb+2wlKZgdV93&Lw3|zxg;^0K^zR{RK^ZET(uM9W*7lwusp>$GIv;5JwUhL-y%Dbc$ zvo5cp2KF-yFm->VR4PO%ouv2Mw}Z-Jfn;qT}^^DX&xlvh{@LPRtRG@! z?^Z?J3R;@|BaEV|UjUhY?#7(R;P(5)YQ3&dA~>HQ!hB#)8B}?_o77`OX`imVOxe>vDm2oSk&r5oRGtG8tWy2Ap$&WH^m~mg*Ab zP1p7GgVbus*;~*<0mMh3(_d#DcAz~2WonUJ+Q%o?x;A0mX#8?$_IlfsG`nK0kA%-w z*sk^Dv}<6adcT@lI|TB8{ysgP2U-4xb$c5Y>eg&1Ig z0g+_pLHSQ^KxPSgL9(bl(m}*FkP2YHImuqYHV-01yPY>d? z^F{XpP}y}h#{bmKuN%%i^c(=;iwwHq=xFmwnN~~W`KU^dV`xFABf7jTTV(8@=tfYq zwaGcEExB?T!+Yl4#C(lux~6l)EF{5Na!F0{kKDiv5<_bKq2HX6;u57Khb) z-(Ln3B{hw$nDD&EmCWqRSk4*cZe}o%wTMKHAn&3%8O;8BUGrWjljlPKFyNtHYfj4t z8S!4n#R4*Jd)hz95Mh3d_ zInKU|GlBe8Fmhon(+{nz&lb@=>2VP*sMz%gv0Co;Xg+F$BYE6}^$&=O zjnikFK=8>|ne}`zlvs_K!%&$yLWt|^Z)yoH#cdLiqVUax?KTbqvV2e9do7p>io% zjK)2Bn2DpfUDD0NWf(A3Cw6J^wR`LBrDWO399C!7aPI)+)=`k2jYR)t{d)<6xg7B| zVS)zzNuQZdS0a@!2blkwyP&y;m4h5_%Oh2)w+hw_KFf|DfIW-c6;_o59^po1+IZVr zxr~s>&Zk(tkKC}p1oC~%sC>I1hJ)Cw3kR~XVt23+jU@;x(cTOtZGwFN(sAVUb7IwX z#A!sQH?xC0dOAm%R7*w54;i8}Rqksr0!?T09(H%oZI(V95?1a`>b0nQbrCcjf8n`2 zkWC@~+3-W%r*-ZGWfSCTzK8;{T=TDAyzeqAVPUku@5CCm7w=-RT0A_Ap3V@=JElTN zZ?tnWbl&iE^&ej(cBYIc-YA-Oq7z9&!ohlo_6i|0Sc?(Xd=1~6%E#VHD1UAW$m9HJlqk41&)@vM zi1#@WHuJO{k!O_q6d1cNg`dGCedCpUA+u(@UuMy7WRz!}t|VlVPeVJjTWd;&7Nl&R z7M4@gr!{`e;Rs`}zIp%HvZsgV*>EvuelY7>{aM>}6{`u*IClvmomh<$@UB?arO63* z6PW(P>(Bo0%^0gARMrrfrn!Q|TASnuJXeRWw};Krr=95^)#`#qg?_Z*8A{ib@3v|A zgguXyTy~AX`kgMlcSv@?n6OrsoI$F?`i@a$EtgRDYNITL+`yMdcluKkY*du=MUpGf zsGxpOA*>KylW+@K>L65T=G)DA8*C=`eVa$rH!`;`kz6TZwO0nuIs(@2k9L+?)cs1m z=c~d+Ia5;cVd7K$@8Zt4bivVu*Vg76+Jfu0DcL?E$YzjTH?w+ZgR0P8X*+VQt_-Xl zqaRCne!rlhDX!{2Nmtt2*Q8qY5;|ua*gp9`D#}sXehq}%O;qzRnEKjIcdLexxgW{DwOh9eVKnfZP&Ojgvy=I z&$SsT-JWGMJ6FbhG|Hi6OlsfWO7jxiRwI4KcCBi6M|hBdRaz{%NT1* z2eegKJaJS{mugU~{mI|8$sE8sy)%G<`_YGG7iqaMEV7u?Q6h{$VqM3GM4ZauvpoV6 zTt;%W1VSmsVBTJU+o!Nf31v%fu$kwuE@kN>c?>A_yejQc<9p^g!J(bMw@!2tkIfe! zU!he=%Hz~@d^-rfcm+!2QA3Q+LM(L|YZza7JU2=lEq}optS^I3919>69ftV^!3LYb z-yJSXeA(~< zPcdpDPyxJgcQ~=`1rDHAv}1DuTR=%axDUw@tB6R%k4zdM7Z@X@V{}%@EYVKC53kzw zy}Vvr{`QQl^WN?P=YAG47kxi7D|4e z&_9>VhU7>8q_@=g5CMH<68V@qUey}?*AR1(v3rf+hOkDP)PiQjA#QNJf6O~2n1<$U z`su5BOR{<~B~%Ad-CB*Ug8N!yjCJb5V&lP;TB?E}YiH zYxZoo8KXQujkW>kPV(CgM}SAbq4ARq(`S=m22YdH3jS$aZ_1CQ_Z=b{&ABE1ySgq@ zUe}>~vv<5XAu07@nw-W#?WtQuSuKTF-M;>bOz)>|G=#oF#^pZysf^6J2m*r6FyZv} z;uY`!puf~YRY8p%4HnGLnKqiOUQD=;7{Iz9N0*k+w1|G6YD_u>WO&^F$GHSF4c-?M zDfilcmx|BWBDwKPc7xK8qk@Pv811?h_BdmKr$^uH4}qgwC2_#*n!a8fo)SxQ523!` z)=Z;=3>40*+o?j7@ z9MZwm5p9$TYY#YB1|MM_(sb*$efT_k`^ivd^3G&E*hMB~&?(2FetF7(E~KhW;Si0k z(=Nnd<=$!!^_=1*)r79Q@SCOtt#NTY7Fe~k<-5%QjfZ{b2llfI*y%@>$IR{A3N-Bc zm>DO|^3PAE?L&>;A=1e&38i*D!~B|Mwx*eJWR)F9x`j#0@jnxNr5I0K6hYK={%(QR zUOF3g+mjHuE6G%`mVO*i&5x?+9y<$mlcO`6>c{lJ*td84XO1<#e?T}lOD*T9KjI5+ z5B+NVbCJGj^U}!wfWTbkahZ^#$a$~BC61n8X{ZwA@yBfM9q;*OC9Hi@+I1~a$CDlU0nZyvol47Y*{<4@YW-Lte?nCYjkSml~h5_fjvhp)T|`!n_QhL#;iC!U*7 z)St0H0}}>;^8u-}4Ur+J1ukC2{FyP9feC?ph-AG*w8(S1mj)+|S^?QMpb#}uDa3QBl_mm0@R<-YxZ=WXQ5ypH;n zHF@^m6;|RbelK`_vHj;|{J1Y}3mNv)xdeAJM~oy{XKk5_OgeoEEHtWui6IH{sGU%3 z%4MI*C}ZGq_M3iGqm|#r;6WwVH@|IZzcnq{rHFEWiUYpYp}@6`d&%IZo}*bnD^q0r zfnv~x2oHYL$}dkNv5*Lpy&IWX@ypxBU_c`W4c2*gIL;ySw^;7CEWrRJ;&&_!V%`ta z3O0<(`V(I0DQ`g@YKEm2!RjD!06n;n4Fq}x)s|JRU>2l z#-18}87)?4kL|+eJTneyO>OJ0CUp?_)^&XWg&;tB-U>sE(X@`)wZU+9GlMPsgi$#v zm0&`ZWm}ENh4@AFRXTMdWMNtCkC|a=e@28%jpb<9^%pUwuJmmYmcMohs_d8pRs6^v zN$V|wQHlPprD8GVTf}esX4yo;)jqe}#XGW9*FHzr`BO{6Mrc%t?n{{f-)S`>oXafM zrW-@nRdt(39^qMFx;=xM(2M0P;9E1^*Gnh>02nvhtjD%n;)y^g66Fd2Fo|r#MRVR) zo*iT`h*(DgIQ1FbB$KZDL(O5sWucXJi?>{VWkKa8O1Q=-PA-yfybsO z1`)OsHOy0-{_iS*` z!{73gnz!f!NLkvtJGWlIJ(82*ct(y z6B85rPLbaD4eEnvrCE@}H0EK#1Gfdv64HZQdWTGiCg?YR^s;j?r$E!taE8`TB-<7d z#Tlw3KzpZdKa;9!s@p@`aDedyON5Wi zyAIF~5OTx?(fSo)gg+-qJ*Hgq?N&g@1<=oyX_=XsOizdv$SCCa4o6qk2f4yyO8Lfv zspCZ2-+t=9R530=QPI-FQ+AE7j82(}5qh4Jtq5)BGv1egAeTB6B}hc9@ku_FjtUx~FHx{cuVg@mybO)9H%%qAo|S(_yuS2$@E=X!qed-WsbPg#JB z=*f*^HpTWAj#XJC?yma%KT3p1Nae}RYQq0W+%QGZ*!fleMI8S4?u5PjL>~W9)KdUF zd-;EUh}?dEzVqjg`{Z6o?ahEx5|WwW-+w++ulg@F+?Pnt?|(n~zwO+t4vYL(Q{Og+ z|GRtt=PAeq{O=P9d;f2fKkf(o7@hvpA41oUcZr|}!vB7#x@-A={kZPohq?HF(n^uT zW;a4k=f7QFFN*oE8To?r{{FY!&v$N{|D~eaZ2cDY-=DtwUxD3bhd*!V|KFtD1H7#Z zie~cn>hb3*hmm(Fm)_3mAATMO#s6q%w>sZ2&IWqM{a5P(guKzKeC>ygE)Shn9tmvM zUz&=&=_wv|$gMYDRt)S&w7mV#6!#K**YmLc;>qXz2~1@U7Fk=yl|g|Gmw4ph;$B>PY_v@ zjq}!WjNx0X-DZLTevhj{w<3ycf*WA$|I8Oq%5)`sr{hx-AK7$bB${Ahgh|nULd}U? zjIsys2kV*U4beNrEk?*~kRON)KYIE8QTY>elJgiNT;{FGjRP;KeR`hEu>p&|w&9&e z9^acP2fZ z)KOYz{?eo5(TKKRYr$9MW$9Y<=T=!CjwwN+PopH`bnqjhg`M961lS}XlVnM(u)1>7 zNMal<2wmpPMsd%EJAnyBy_EN)oWX6PcSF`x=IFMzEXm z8rfc#0AYlN^lg^&;(NO;&zAecDf4jyNB9Q4vk;244;#R%L=jo5>&?OZN1akp>$6zB zYv1H0S4Q6-t>;hEyc{85&?`A6O{bblv;7Tt>SKcMNAza=oz3v9@wR&Buyw|j*JlHw z(zb*xW%3%)QZRzwtYS2?_#ejzX=+Bz*<3b??H?9(1!oN=t6(H)6*SKYO>mhz`_Nmy zkQmxRNKu>dd-JmmciuOnowjgDD^`*0aAGx19*^Yb9N3r|zIbAi z>}CJFZR-`}C#}^l(l+O$rXnM|pwYq(9ltT)w-SzY&lMcUrtz#}-}Sjla+hX@{lWW> z$EL)F_x`wvp85~ejxKHuy?(PBh~T}4-vkdg&alU7%mOyG#P-9Lv@L?~$-D4nfVEEu znPz0$kCcnK)8sThYDLEgznMhYr4#Tgli4<^PE^kszbM_!Be=BfXOIBjmR7!9}KrORb$YtCDw>IFSsa@qnm$rQlCYs++kx<^Ri_O?!NP7%d>;vcS63; z@Svysp_8&NLxi$dzZ838hQ~jqh9P6bbBoVS0yk@arVjXh`^2Hk3AjkD>4!!riYHZX zIA#hLZs@zJi>mm!qNdJsNJ z%V#aj(Gftdu4Wlj1B`*OyuMTg_^iRS%CugbYej7HKiBOWpeA*#Gip{kHl&7$1(0%$wdDmTfB_g%2@=5egX(r`_pz)WdT+JU$#{tDK)sekc{T z-PKO{Dwpxc0gFEnj8PW%npI!tV~qtLW1?@4rEw|7!0sxKA5YwG2C)Pidmo;0{v~TY zf8gC7DZCB%=U_f?2v!04C{Zj6MhvIATgO(<@>S2cm2+or{PzVBGmusu|KY;@e)vZW z|G-t5jwO!Wa!irt@qzW`<0p$U_^tyy&k#Zg;TGZ7F5~%qm~X~#i9RP!$!A6Q?+DxU z;9nj&9kDeA@LbdFuD1l2p3`bE+g( zHMQnXX3Gg$x$ilW#x_dJQ#`kAO53a#zAO7*{sokT&ld|F7CpQO=K>sJMT-~|OdyuL zLU`C6E5L_6e)~%4ssq-Ay|0!T5A(62Ss&aXhS1hHWic7fNglTi>*t^I?fN}`&ey^V zgdeDp;~%`ap?84}A(r^h3mg6su`D9rrL56{hQti)Vb2|-1NO1@2@f(l^LW9>KGu6t?+M?Z$N4nq(+<7@(%OF=1H>8;!SOX-UlKwH zAv{m?y$j$y{ie%zUkLAy&uHHd{Iz{ZyAQ|nT;uhx9%ssLW34^o_h&nYPs^LediNPz z?`4~wDSJ3RGgn7=d*tT3Vh^IrWVXKK^`AS9;&_e;+n-@&3-{^a zTqqm&2+Ue#}x`#fFnR4aez2NE3pK1fW(8^I|N=` z)m+dV)6)euQl~{nDds44uufE1@Lh93j`+;zl2!r|vns2=@N9HlN{h5~A zHPD8s88Hj{$o;HD?>8@9!+nSq_`s&J5JyPAC)`KOY3!nWCaa9%5yT#fNDkW1aU3Co z)V@h1!G}!)e;?Ps?SX}17>(2z^>CZgzG(G*-^R%B3LI@#*5W;h0T~};V*Ut8z zt~|EwKa}k{WIOVkQsL9G|HYpl>xkn`#(}?hvn$Dkd9(U&LJMg+Tv&7QjQ$@xAB*!I zk2$E+bvKJ}4!4fq4ky+w=ynh)D%uJc!&jPv40?Wmb86sJz8Chqb*BSwzu7GOAD8`F zjRXiDv$hDDr{`AfZ6O{YAARy>ILuZ3j2_E)Ki9UXw;9Ld0``Fj>8g)zF^>D`1Hg8N zeRToB1d37B>$&P)KDA+A?7H%L2;8!yIdwoi+A4Ds-7!O-&(_6lPQKL%?fD6*tt!&? zrYbmYJ?w^>bH&{YH&kqoc^fcpPm23C>T0V=dlsF3>I0`k2qA`woF4pX8c-hDo7NA&o_CgsJ0tNC2#$sTCS#0RItIg@if$yT}6fEls+z*(F z@8Gqs!Kz&~)Qi3r%Le|e2f>2Bd5x=2@Z6CHh$Ahw3=u}{IRrM0i8&~P*5jk>^4M@L zn>m=S!_Wc+g&EAJEa#-Tq5XQR(71i(VjdU^b01gMbbAUvo)7m8`;Jig5Nmk*Px-x7 z$*|Rm8>rD3+sBPRa zQvqc@u6Pe?^M2_TAMYowYLO?~<8o6wU>iaRA%qY@2;upn+iJ$5^clg0FdZhx!umt^ zh5ad@OIY+d7VcVEt8Ov9rrR*oAuUJQ>< Date: Tue, 24 Sep 2024 00:02:18 -0400 Subject: [PATCH 3/7] Create BuildAndDeploy --- .github/workflows/BuildAndDeploy | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/BuildAndDeploy diff --git a/.github/workflows/BuildAndDeploy b/.github/workflows/BuildAndDeploy new file mode 100644 index 00000000..75bcf144 --- /dev/null +++ b/.github/workflows/BuildAndDeploy @@ -0,0 +1,38 @@ + +name: Build and Deploy +on: + push: + branches: + - master +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v2.3.1 + with: + persist-credentials: false + + - uses: actions/setup-node@v2-beta + with: + node-version: "15.x" + + - uses: actions/cache@v2 + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ hashFiles('**/package-lock.json') }} + + - name: Install and Build 🔧 + run: | + npm ci + export NODE_ENV=production + npm run-script build + touch dist/.nojekyll + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@3.6.2 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BRANCH: gh-pages + FOLDER: dist + CLEAN: false From a64d771dab9a36046cc504f8c7505606a4b1c8bc Mon Sep 17 00:00:00 2001 From: terskayl <97208428+terskayl@users.noreply.github.com> Date: Tue, 24 Sep 2024 00:02:35 -0400 Subject: [PATCH 4/7] Rename BuildAndDeploy to BuildAndDeploy.yml --- .github/workflows/{BuildAndDeploy => BuildAndDeploy.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{BuildAndDeploy => BuildAndDeploy.yml} (100%) diff --git a/.github/workflows/BuildAndDeploy b/.github/workflows/BuildAndDeploy.yml similarity index 100% rename from .github/workflows/BuildAndDeploy rename to .github/workflows/BuildAndDeploy.yml From 8768b28b7e7ab4a6982924fdf76038b4c1456476 Mon Sep 17 00:00:00 2001 From: terskayl <97208428+terskayl@users.noreply.github.com> Date: Tue, 24 Sep 2024 00:40:02 -0400 Subject: [PATCH 5/7] Update build-and-deploy.yml --- .github/workflows/build-and-deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 75bcf144..59d8768c 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -28,6 +28,7 @@ jobs: npm ci export NODE_ENV=production npm run-script build + npm install --save-dev @types/node@18.11.9 touch dist/.nojekyll - name: Deploy 🚀 uses: JamesIves/github-pages-deploy-action@3.6.2 From c59bcb2f1072b5c370596149fd15233912cb6f2c Mon Sep 17 00:00:00 2001 From: terskayl <97208428+terskayl@users.noreply.github.com> Date: Tue, 24 Sep 2024 00:44:12 -0400 Subject: [PATCH 6/7] Update package-lock.json --- package-lock.json | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b7cfd43..b3783d68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -195,13 +195,10 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.5.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", - "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true }, "node_modules/@types/node-forge": { "version": "1.3.11", From 40329f01d1263ceeed941c298d811aa48166177e Mon Sep 17 00:00:00 2001 From: terskayl <97208428+terskayl@users.noreply.github.com> Date: Tue, 24 Sep 2024 01:18:11 -0400 Subject: [PATCH 7/7] Added link to README --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d086802f..85ab5ab8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # [Project 1: Noise](https://github.com/CIS-566-Fall-2022/hw01-fireball-base) ## Fireball - +Link: https://terskayl.github.io/hw01-fireball/ This is my fireball: ![fireball](image.png) @@ -9,4 +9,6 @@ I pulled out a bunch of points on top using similarities to a dot product for ra I used fbm to create smaller noise. It also influences the color The color is also influenced by how far away a point is in both object space and screen space from the center of the fireball. -The background is made using two gradients mixed by fbm noise. \ No newline at end of file +The background is made using two gradients mixed by fbm noise. + + I used multidimensional linear interpolation, e.g. in interpolatedNoise() in lambert-vert line 55, sin and cos functions, e.g. lambert-vert line 115, bias, e.g. lambert-vert line 132, and smoothstep, e.g. flat-frag line 66