From 4487127d5f43ae41c49227ac74e4f2f30f36ac48 Mon Sep 17 00:00:00 2001 From: arkohut <39525455+arkohut@users.noreply.github.com> Date: Wed, 16 Oct 2024 16:25:13 +0800 Subject: [PATCH] fix(web): icons related issues --- .gitignore | 4 +- web/package-lock.json | 615 ++++++++++++++++++++++- web/package.json | 4 +- web/scripts/generateStaticLogos.js | 55 ++ web/scripts/logoGenerator.js | 139 +++++ web/src/lib/components/Logo.svelte | 141 +----- web/src/lib/components/LucideIcon.svelte | 69 ++- web/src/lib/logoGenerator.ts | 139 +++++ web/src/routes/+page.svelte | 2 +- web/static/favicon.png | Bin 18932 -> 1718 bytes web/static/logos/memos_logo_1024.png | Bin 0 -> 100712 bytes web/static/logos/memos_logo_1024@2x.png | Bin 0 -> 214572 bytes web/static/logos/memos_logo_128.png | Bin 0 -> 1718 bytes web/static/logos/memos_logo_128@2x.png | Bin 0 -> 3212 bytes web/static/logos/memos_logo_16.png | Bin 0 -> 877 bytes web/static/logos/memos_logo_16@2x.png | Bin 0 -> 1234 bytes web/static/logos/memos_logo_256.png | Bin 0 -> 3212 bytes web/static/logos/memos_logo_256@2x.png | Bin 0 -> 41558 bytes web/static/logos/memos_logo_32.png | Bin 0 -> 1234 bytes web/static/logos/memos_logo_32@2x.png | Bin 0 -> 1389 bytes web/static/logos/memos_logo_512.png | Bin 0 -> 41558 bytes web/static/logos/memos_logo_512@2x.png | Bin 0 -> 100712 bytes web/static/logos/memos_logo_64.png | Bin 0 -> 1389 bytes web/static/logos/memos_logo_64@2x.png | Bin 0 -> 1718 bytes 24 files changed, 1016 insertions(+), 152 deletions(-) create mode 100644 web/scripts/generateStaticLogos.js create mode 100644 web/scripts/logoGenerator.js create mode 100644 web/src/lib/logoGenerator.ts create mode 100644 web/static/logos/memos_logo_1024.png create mode 100644 web/static/logos/memos_logo_1024@2x.png create mode 100644 web/static/logos/memos_logo_128.png create mode 100644 web/static/logos/memos_logo_128@2x.png create mode 100644 web/static/logos/memos_logo_16.png create mode 100644 web/static/logos/memos_logo_16@2x.png create mode 100644 web/static/logos/memos_logo_256.png create mode 100644 web/static/logos/memos_logo_256@2x.png create mode 100644 web/static/logos/memos_logo_32.png create mode 100644 web/static/logos/memos_logo_32@2x.png create mode 100644 web/static/logos/memos_logo_512.png create mode 100644 web/static/logos/memos_logo_512@2x.png create mode 100644 web/static/logos/memos_logo_64.png create mode 100644 web/static/logos/memos_logo_64@2x.png diff --git a/.gitignore b/.gitignore index d36e943..ccf27c9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,9 @@ dist/ memos.egg-info/ build/ *.pyc +.eggs/ +.vscode/ typesense-data/ test-data/ -static/ +memos/static/ db/ diff --git a/web/package-lock.json b/web/package-lock.json index c1d7582..8cb2a48 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -16,6 +16,7 @@ "lucide-svelte": "^0.417.0", "marked": "^13.0.2", "mode-watcher": "^0.4.1", + "sharp": "^0.33.5", "svelte-sonner": "^0.3.27", "tailwind-merge": "^2.4.0", "tailwind-variants": "^0.2.1", @@ -79,6 +80,39 @@ "node": ">=6.9.0" } }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", @@ -597,6 +631,348 @@ "deprecated": "Use @eslint/object-schema instead", "dev": true }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@internationalized/date": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.5.tgz", @@ -895,6 +1271,34 @@ "node": ">=4" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "optional": true, + "peer": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "optional": true, + "peer": true + }, "node_modules/@types/cookie": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz", @@ -912,6 +1316,16 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, "node_modules/@types/pug": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz", @@ -1140,6 +1554,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "optional": true, + "peer": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1499,6 +1926,18 @@ "periscopic": "^3.1.0" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1515,6 +1954,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1549,6 +1997,13 @@ "node": ">= 0.6" } }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "optional": true, + "peer": true + }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -1708,6 +2163,14 @@ "node": ">=8" } }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, "node_modules/devalue": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/devalue/-/devalue-4.3.3.tgz", @@ -1719,6 +2182,16 @@ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -2473,6 +2946,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2731,6 +3209,13 @@ "@jridgewell/sourcemap-codec": "^1.4.15" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "optional": true, + "peer": true + }, "node_modules/marked": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.2.tgz", @@ -3498,10 +3983,9 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -3515,6 +3999,44 @@ "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", "dev": true }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3545,6 +4067,14 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -4133,6 +4663,57 @@ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "optional": true, + "peer": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "optional": true, + "peer": true + }, "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", @@ -4166,7 +4747,7 @@ "version": "5.5.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4202,6 +4783,13 @@ "node": ">=14.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==", + "optional": true, + "peer": true + }, "node_modules/update-browserslist-db": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", @@ -4246,6 +4834,13 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "optional": true, + "peer": true + }, "node_modules/vite": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", @@ -4440,6 +5035,16 @@ "node": ">= 6" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/web/package.json b/web/package.json index e40a366..a8724d1 100644 --- a/web/package.json +++ b/web/package.json @@ -9,7 +9,8 @@ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "prettier --plugin-search-dir . --check . && eslint .", - "format": "prettier --plugin-search-dir . --write ." + "format": "prettier --plugin-search-dir . --write .", + "generate-logos": "node scripts/generateStaticLogos.js" }, "devDependencies": { "@sveltejs/adapter-auto": "^2.1.1", @@ -43,6 +44,7 @@ "lucide-svelte": "^0.417.0", "marked": "^13.0.2", "mode-watcher": "^0.4.1", + "sharp": "^0.33.5", "svelte-sonner": "^0.3.27", "tailwind-merge": "^2.4.0", "tailwind-variants": "^0.2.1", diff --git a/web/scripts/generateStaticLogos.js b/web/scripts/generateStaticLogos.js new file mode 100644 index 0000000..104161d --- /dev/null +++ b/web/scripts/generateStaticLogos.js @@ -0,0 +1,55 @@ +import fs from 'fs'; +import path from 'path'; +import sharp from 'sharp'; +import { fileURLToPath } from 'url'; +import { generateMemosLogo } from './logoGenerator.js'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + + +async function generatePNGLogo(size, outputFileName) { + let svgContent; + if (size <= 256) { + svgContent = generateMemosLogo(size, false, false); + } else { + svgContent = generateMemosLogo(size, true, true); + } + + // 确保 logos 目录存在 + const logosDir = path.join(__dirname, '..', 'static', 'logos'); + if (!fs.existsSync(logosDir)) { + fs.mkdirSync(logosDir, { recursive: true }); + } + + const outputPath = path.join(logosDir, outputFileName); + + await sharp(Buffer.from(svgContent)) + .png() + .toFile(outputPath); +} + +// Mac app icon sizes +const iconSizes = [16, 32, 64, 128, 256, 512, 1024]; + +// Generate logos for each size +(async () => { + for (const size of iconSizes) { + await generatePNGLogo(size, `memos_logo_${size}.png`); + // Generate @2x version for Retina displays + await generatePNGLogo(size * 2, `memos_logo_${size}@2x.png`); + } + console.log('PNG logos generated successfully in the static/logos directory!'); + + // Copy 128x128 logo to static/favicon.png + const sourceFile = path.join(__dirname, '..', 'static', 'logos', 'memos_logo_128.png'); + const destinationFile = path.join(__dirname, '..', 'static', 'favicon.png'); + + fs.copyFile(sourceFile, destinationFile, (err) => { + if (err) { + console.error('Error copying favicon:', err); + } else { + console.log('Favicon copied successfully to static/favicon.png'); + } + }); +})(); diff --git a/web/scripts/logoGenerator.js b/web/scripts/logoGenerator.js new file mode 100644 index 0000000..c14f105 --- /dev/null +++ b/web/scripts/logoGenerator.js @@ -0,0 +1,139 @@ +function seededRandom(seed) { + let x = Math.sin(seed++) * 10000; + return x - Math.floor(x); +} + +function prepareMatrixFromFixedIndexAndLittleRadom(withBorder) { + const bgColors = ['#f2f2f2', '#e9e9e9', '#d8d8d8'] + // const colors = ['#d0e8ff', '#F2295F', '#E0A0F2', '#F2B705']; + const colors = ['#d0e8ff', '#BF244E', '#8C2685', '#21A650']; + const mShape = withBorder + ? [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3, 0], + [0, 1, 1, 1, 2, 0, 0, 0, 2, 3, 3, 3, 0], + [0, 1, 1, 1, 2, 2, 0, 2, 2, 3, 3, 3, 0], + [0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 0], + [0, 1, 1, 1, 0, 2, 2, 2, 0, 3, 3, 3, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ] + : [ + [1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 3], + [1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3], + [1, 1, 1, 2, 0, 0, 0, 2, 3, 3, 3], + [1, 1, 1, 2, 2, 0, 2, 2, 3, 3, 3], + [1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3], + [1, 1, 1, 0, 2, 2, 2, 0, 3, 3, 3], + [1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3], + [1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3], + [1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3], + [1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3], + [1, 1, 1, 0, 0, 0, 0, 0, 3, 3, 3] + ]; + + const gridSize = withBorder ? 13 : 11; + let seed = 42; + const matrix = []; + + for (let row = 0; row < gridSize; row++) { + const rowColors = []; + const bgSize = bgColors.length; + for (let col = 0; col < gridSize; col++) { + if (mShape[row][col] === 0) { + rowColors.push(bgColors[Math.floor(seededRandom(seed++) * bgSize)]); + } else { + rowColors.push(colors[mShape[row][col]]); + } + } + matrix.push(rowColors); + } + + return matrix; +} + +function prepareMatrixFromRandomColors(withBorder) { + const colors = ['#d0e8ff', '#a1d2ff', '#64b5f6', '#1565c0', '#0d47a1']; + const mShape = withBorder + ? [ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0], + [0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0], + [0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ] + : [ + [1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1], + [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], + [1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1], + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], + [1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1], + [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], + [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], + [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], + [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1], + [1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1] + ]; + + const gridSize = withBorder ? 13 : 11; + let seed = 42; + const matrix = []; + + for (let row = 0; row < gridSize; row++) { + const rowColors = []; + for (let col = 0; col < gridSize; col++) { + let colorIndex; + if (mShape[row][col] === 1) { + colorIndex = Math.floor(seededRandom(seed++) * 2) + 3; + } else { + colorIndex = Math.floor(seededRandom(seed++) * 2); + } + rowColors.push(colors[colorIndex]); + } + matrix.push(rowColors); + } + + return matrix; +} + +function generateSvg(matrix, size, hasGap) { + const gridSize = matrix.length; + const cellSize = 1; + const rectSize = hasGap ? 0.85 : 1; + const offset = hasGap ? 0.075 : 0; + + let svgContent = ``; + return svgContent; +} + +export function generateMemosLogo(size, withBorder, hasGap) { + const matrix = prepareMatrixFromRandomColors(withBorder); + return generateSvg(matrix, size, hasGap); +} + diff --git a/web/src/lib/components/Logo.svelte b/web/src/lib/components/Logo.svelte index 578f461..4ab505c 100644 --- a/web/src/lib/components/Logo.svelte +++ b/web/src/lib/components/Logo.svelte @@ -1,147 +1,12 @@
LE6ln{0`%PM z2QCkQ{$eS5quzs*F6?K++dGce_s%u*e0nW~1&mIM}EH{apk;K^29OL;A{#s*& zPKei7>xho|ufinhv7FDM;JkbYLv(*>t`=H%_5>x!wh{mYN@6~dkRueCR i Nx06Faa_*D_b(w8_DKjtzGRgf0n7NAhcSS&4f+Zg0 ze! >4Wl_-Olw9Dc3I|+)JlAsArwDlhJx%(??MnU*+Oq;EXsuh-LSgaOd z+-VwoXUL8x9*b^-TfX2Yw-L{J?2FRfZ-_NvAJnA7#A$gn44*=8y(fdGBWOG`LHDOC zKoc(`muB^>hU$VYN{*06iXL;03pM{g;DE>|uv8>Eo~O)~yCgETHfzGLE?16rN;CKj zyPOr;fu-`%Mej_xqUETLlT1UC^YL`z-R(^9u})-BV(-{@818r2X3!CqG^X3HAw4Ar zgZrPK9HTxtvS2PxY03Z$LsE3E*#-U EN%XVhg&jK4Vr4` zv>UK>@6C;7OTX}8 F$aXs32q1K1>r`-y; zt?^A#G&vrr@S6gs%O RV1bC*V8d^ z`Tk5dK+#r$HlA{OIazGt@(l_%Pd#OM@c1RD&>!Rq$Uz+5`+4^Z@3d0%i${P5sbz zI=JkOXGR&@-F`~FfQYq%Vf%Kn8RN5w!)2D$sp~vkHQ1$CW${tU+2Z# *)&kZ0n0$77Rf7I;+TiPa(Z4K|Hn%BNLw45tZ< z^rwN8x#Ci!IJ1?<34b;tLn93^0FPg9nYf0yeqEi299~_CNHL-it+#S<1@h8uj%)I) zRcM75v?qu7q%)6>P5`U+=5%0 (Cp^TBE0m=WfR~xiGh5ws`z5I#=X49!q^w zq*n~I9IX>*Z7DYr1rFvr<}@_5FIh25m9ip;g&odINHYgF{d!>~s837g?!CSY;r3)T zg*9&}b6-Cdj!BO}(CbZf<~U;-H|`$D$iFF0rUxYYy*BA}WY6U7Ql(RNL@Tsm*yvcD zu_a?MOXb7!IABY3m1xRU9_O&*J(A>8Mt{JUTEODvCFZpyTm5pexs^E})B(_4fE~wp zy!fiev*>b`a)xt&THNx4fmbm^AbOFwPxrc)nxYzM(e;+>0(Dks^(|AYca`dZ5UIeS zLfcMu&NVXAX%Bj?$rk0Dwu3NJJWuk#`wCwy|I;|H8+!v`2HkVL)W%FQ{BLh@m0y&O zWo@khY`V8cp=b=ks9o>6EnF@=aDB9r#BM#*k0l^3 egrm_l&l zr)7vt?OvX`r|k-xvLVCWJEf;%ctKo@jvsWUs%g?`DeM2hSm$ItvdM&lK&XfaUv5NS zea7T&Kh%DEX^kA6c5dJGOVf_Wq|(UwY`YXjUy}Lh+z&ZgS*$q#PvEiUe%8hLSvqLn zXY*l$k-Y;nf(iT}mbN{NTWLqGo*B%qXjVUSBbQ*ojk>H=;f?qDn};?;QRcm6Wbfxb zDKrDJaz7VEmZ}@w@wERD^0a?rasOWfayK*xDf**Z&w)g*jBIjKk^nqVqsG(jCp=vN z1eixm)lT=d3N3NPj4Y9$TvMEGX`S{$1T~c#xnNg(z7MGHDTAacpu0650R*1a>(D%j ziLD`Y&6cbbNDXjZ@uw#|f_NmUG8d~(*a4)aAY^tflnS^fyt`nen$`XnyINKvsWrSY zA|B<_rO*3tKiXsOY5t&{F!W@O&UPP3Eyr7k8Wv!_VmNkp^P4=`gy2 `FJ6+7oX?lF}D0 DzboV}lyq&nO zOyN!f_f_fL<3;< fw#kHB0Kd#g)HVsEAR*}l`~ zSg!rG`?LM8wfmdr1<^tZth*>SJ7&9YXJpMan6 SDe7@f)0sU#nFV(-MWfymgU zpLD(S{?hj%sbgl~nH9LcxEcWwpQFBgtBW_YMGB?Eq796;3)81|ww*eQR}cKYq%92z z$aCVxbH=^4 kE`z9b`0SpGHxF6`D0+uQbxj2vy(T;KhἪR;EVn{rx~q* z%@@s={@kS`CjIDr)Goy)t?}EN=hvi_8wB9_-`L t8J@$`Jv1{mb$XuXu*mmVets z9Yt_x#n?FTJgC%*kDMOl*&^B0fwTLCi(Mb{!FE;FVplPa8*ux3w>Yf(=E213$bS&3HIZpD;QS);+; z1|ilIG`02tq4Ky?^Q^Oyfj$BV3VU+i`0>f E-KUTtemESrLtBy9 z`*f~~O%Tt{=q-hE b*l_WiCqT!Pimn1;9giba)ZqOUI1P zg?T7zxmAb*#J9rU|10^X_CND(|9>Rke5`U5Kul}j-_G_#S%E|G0?Un+vOD}Zm!MNi zzs^2BeD*_Re@BIU7Mcw%lqf)-dt~+N9_+CYygo+H9o%qt%uo0cDFb3XwxsELMv#;s z(-_p0v3+OEW0FofpsWq#Z>Uo0!MGQNb*ZLJZ@f08ER}_~uzm5vU7r|R&kW*0oM68c zbRWX;{X_+sEru<0!;nbgj`5dkBLQh!sOXqRnXc4e4qIr7x5IKh?@8=~B3Yd_QbIMY zy?~9wWAM(hW42~b!LS%rxJP0rb$A01&8iETKiPDjL+}1ZYY#pKk~-N!Y$kF%bgkQI z8fj-`*k|@U@q2g#nTFrvw)>P65l?YEf%;}}!zqTJ=+}Oa%%jJGl@+=+@dn16MYVM0 z$2o4dy=Gd+_|lj!36X!4nQ8i(Gjn)wWPJ_l&Hu1>ds<>|vWdr|tU(6#(4!fTy<#Ef2C6tPT)p8I z&|do@GgRqq*P~uEYp(ahk*-dSBDSyj#jQVWJj+|N@h^Fm0UaTqIxoKhRSAbgcKgry zQz|=owl;n>nleY$!i-9U|I8)e9=+aryXE+`!d7H#xdm3e!mkh4#?G2?s7OrBwTq#x z2f`_J82s$A2f8m+NSmq}mRk>s)Q<(&t(P9^?+W{cs0(TE(88YESfI%6WL(7z`-EOQ z0O;qJ?cz`ty7*pfmi{|~3EAaP?zNEm#uu1hznxT>VQ8+0{#CrSml)mSQYa`1WabHT z@skoXwH@`(&)D7g(ts#x$!LI&?GOG;;jn-_tBV?{ezgz6;02=zdRXr^5-@7Gu`>Tz z@1}kE005QLF({0)&)C3{8KU9e b-v}@#&W-ONYota4L!Z zaK}2-Qr%;VJ`G0&aPdFuTFgaMcYKu1pS^THrv<#bimi;4U^JHRzTAcT#@KGhnnMFZ z%XE1WV$@yAKxz%OO7%W`!S4=DAYQl*xgFNm))bODGe)J2mR1riG^fZG#={X0wr>L4 zx;-F$3uMyf$ZpI{(DKmlN+Z#)1&Ze1O~8~1Gpp0KQg;$Ybf)prA+7Nr5bHV+h!aK} z+(OX&K9$~f>jX@yI2a!H57jX9F)8m`95|c_vhV0Vi+Bn #wm zbuq@4SBf%^9U)StFG 5{9f1c&H=Tyhpv{!u73XT(+& z3goT(hN^d #_SSBu5S_;b`joChNoAE-?60cn-3}!JmNT3J)3yogB__Zg z>sNza1V5BS?oexHWzPx74@Y+ 6Xm0MnG z)7~V7>P4~sCaHI#3Vaw*6<1?GW6e*lrwDDdM^MnZHjUFq(}t#YG*dtZHa~cSg)@Hk zT0LnG30TI=_~Ev;2s>vNjqTyu9E@+1)ajB5nbuDMQ^dX_f_Mm9)KzHZ% q{naY!TE?+xU=O$5Dq+j19MZ|F6g#xJ@$mWk4_@yit7Btq^r^>zJ%S( zzuH23s7L%Q%%|vaQ#l8EERp0C{J ;n$khTo&BTh+511* z^H}T4!1FKOZ?){R2=Y&!d`gN^y82O;k}Cl-_RCk|sPz1Lg*w%veNsIVvs)@SP00 zgmk^Cx7YV}{xCgSTBYaxj{u1TcKh@wxXb!}(KZzCCQU&Zk2DdD9P*(zP;=POX5(xA zv5FjiBy7ABdNVeM7fH8Y#-jHhGI=~6antkuRX&m`4dED4lZxP1r{rKxty70^bR?%r zBp`3_6dhd4z@kLE%@=f`6T%mK( 9=YIJ0I2 z7J=xbdD|cpRA~@rGyVFMJl0GBzhNCK=5c8StFs5OvN&qgBh(yR(GBn7j_8KQJdRx< zk2PDsub4-k^L!tjRg9S1LMu2q=)TViIv1d&h(`b}mN)8byb))f@|UsbKyT#PIH{~M z$GT2(?5-oL7Eb@Xv+<&fFLB3Obn#zOoGfIHbx1xjqI&_%dj;Ovct;K=a4%7{cURBG zMGimb;@z_nNpGxq{GCMrc`WyG!o}h2oN#gFHoFR3a?ryJx_r%VVg6vfn}9_Z-)4{1 z#WuMLOuwz!V|BLORp5W;*MZw?e4d-Ih7Ip3uwi397f)VMWb()}$NKMm6<85KWJf3h zPy_%)0CMLP0Yq<#02BeZf#OaPK;*G10*F3dMF3C)@Lru$1Q5L`0#F3t28ugH0FlS4 z2q5}+6#+mIz ?z*jnN~30tQ$~k;mdj-Q72ao2SksY~0Sq>%o2=0Tl2$ zbF3N94^)ZCkCUo86Z_7%g8{kBkgJnda_~?Ei;9ejF4i&!>)rA0AHWGrtamnU#9nfB z91G8dr++w-WG^%EzE{CoH;9ii$GVm7oj0mxM6U5D6F?rznO{Xu|FGjl>@93;<|J%e zcU5J`$RW)nfVbqb;7kDzGso)Hcu=lItlaflzY9 GI?x>k`S3Z{@Jw}2^r6@aka={Yoz6R z4(&2lXAgD}Is7SN@(;CVah8wlK9(t9ZN#ttYSK*b`E^dz3f`iFM@GrBjeKeUtLWgm zl7pK9H5cC};f)#~S!k3h?}B0tw@avmwH_XkLea$)L9vPst}hMZjIl&KC>V fUB%kFah#FE zRfdh50<|1|+?GYlSmGkW#u>uK^+EAOH@-`PB=zt}{~+6kOM;G-TCM=yer>ciqx4hY q`yt}wI{Nb0(`HnrOxd{Y&;BnE@m*De7pc|&0000 TXAY%vJr2*l)qp>0?; zB_}*n;%eJ&){(^5a(@j<3fl{Bz*?1xNzZ8251dtK4^wHK{27T&&PflCI9G`x_z1S< zdqQoU0)IC@rp5dnCTC;D_4UCW^vCQM)jV%yzwPLGitYbPm5gj*AS1R=dE~Wa-H~P6 z9G&%&Qk%j9T`GM4)qgu_>2ue@Jd%lw`vbyjW^8*pS|d5&%W|VtIHf|!Y3+oZdQ9Lg zzVRC2vpt$OG^t8Xmnz?Ln8w~5i8%FD3hN}6b)i}KEQIoscwgaIhWnT` L$pme0rCbEsY9*5>)_nRzYltt9y_{wv7|TDaA+ z)4B!ra>K7XmWJ5fOFDaoUCkUIs1NBTvFhHj?xPknGi^Wosp;bi>RLLgo42f8bz%f2 zRmWe5UoPaDHshNbEaN2%lS~piaYO7_bN))3Wy7=9q|w(Md8zD0o}2>pq8Ev@UW;yH zn^vt)EAO?s3a=z*)!`J6Y8q*ezCWZ7Z4qFkN9;$g>b`Klo;|a4C5}HRnXvU!_sQG~ z`7X|&WWik3SmTX+Ou`A 2_kFt$1v%9 zNhhaCtZyB1|BXOL2iNmH)hDywDO7a-xQO_8CO1PYQsYFml44*%gy3m^Qy!-m!kg#Z zR`Q)c2qTqV$gljY>p0{c` DxL$Ny>9!VhBcFvUJr$3f?n^p=CX68W zKNb@%=~Sjjghr}K4JXnllhB+Vh6j1pp1z>pcx&FFxT8^)r?t=d*m^!Dl7}J7X>o~9 z_5k|u)}1_sz+j)1_-@j-5OFh%lFh6H_j~O-RFmuWvJr>+5>jb=5p@3#-NIA)YM1s@ z&xPE0`}6y-YmjD3ZG(d1ii;W)Ll2;CvqjcRc3{?R-{ZY0?ze0VoX>85rtw7u$l(f= zj`szf&7S+48dRci^BSs0XWOxHPf+&EgNel5=FsF1HR^qVJ*9kt3!|_H6CXGDgIB`Z z^c7cB8HX_g#FnHmF9+9~MsK-RkkBu2A>sjxqkEK9!|WVh9_(1AY)9FX-reS5APO2M zXwM3{mdH*4h%blQ>;1)37L5Yze2#PB=oPOq0sf}Ek#8I|!zfNr#g+7l<_#yp@@1W* z#?YmGr;%!>6jzQ>r=P=%FsHKK#Y!ss-R6V#Xj=^D#)P8oX3UIg;hyAB{D1OLo(OB% zBgsG5vY@E^ULM_vsdau*V<@8|M{N3DeCS(Dh +H(^%4-6sQs^7X>erRxLa(Oy~!>3i|TCAMj_LOVM z%I@J1LVq4cJaCq* C!KNup=O!q&CJb@XTV~Eb$$w8%$_mBr&Z)y(oWxA%bA?GZ|E`I z+j*86#x=%hH}IJDTO@33?=*EI?qpmp(6ADkg{oe=`tx%3%pBf5 21T`;9N-?C!l(_~mnFDAh8T0bC+lmEs`qdyTHf8gd2j@AT zl~C&RKrmm!*3@M4FH^qbT)#W0!Cd!I7e5wZB88;Js+KgvX$UMGb#b))q|PPH?m=uQ z!dh BNq(t=kF_(%_QTuvub(HsGq>i4c>JTTmiC!ts4eOF(#vn;j>bU!K{!?q}ca++l_- ze=MGT`YZ9!&HSvIV<(>ZSeCPsG#Gkbofe2}x`DGK`hr%CV?{d^wJ99awvq$$K8$|! z?L>?gPK`s%w@%ru5w+vCVHtr>bfNm$%XJ-0MI?Iab06+d9SX2y`=TG$rh1RM+*kym z=%}Gj< l1oMmMQ!kuX(c$u^#-MfF?8fqd)~^ww*eMTYR%Z1=*g z?voIsI~&jmboGlh_)JqVk-`QYf3}%CrP1PSHO}ca+z91s{~poWqn$h^<$2Ck28VG1 zJy}=Z2;Gw}!D#tqbOXT+e`P;b1otp-j5owZ!9J{qne(*TBQfWXsBXRvMsQ6JOwo>H z8W9UMp&2GT+t*Q;dew0^17B)Wzuq|%hNHuD|Jd9}l+INoW(ZRKvqC0we8&)JeUSZ1 z@?RNKl+tuObH!EV8ZE3t>P>rZtg9$0XhBJJGn=jv|Mp$jN7bO@X|EKuqx-*azA_7N zxt0Q>_-x_{lI)dvwsm=zNA&IP-VpCcEGVgOKHk!ZkLmQQM7UEIzb=9-Tv+&mUjxQ) zbNCxpMs>5?EI`O6>@IllIcw6vWQLOsGV6S2=)kz)=4CQHD#HG!c6nC4+|^jpukmD< zs}Vz5iU+LPu$Ip}t&Xg$Q3QM;RNo>}lW!gqB1#???$9c*oTuaaF5NXQ4hTMSp_$+d zjm*Bbix-fV+dVv&wW5NfaqR}VCAJ--4idhd`GhA-R#j2Q<+$n^n_XN8HI}8|zP$E^ zuCaumG4e!Cu6)CCo3CZ@xuc%~YlbW|e i3}P=?qgk} z_Fle*rpphh+80^Ri<-jU$~*k)B84_UEP}PLzU>O2&u6zN1lDY6h~6OmT1?p4&Y|Bs zDR$avzHZ2TE|3}xKYKxmxT;FWJ`om!FIINkXB8)*Q>d}A(T;b+M%w+|j6()W2`sV@ zf&|y0sBeQXJ5m=OXCgnY1ggTjeF?PY4L2Tctx(Uv3RaPMo2Kb>kNy*Q!eJhGC8*0p z^COUcH)l>qvMTb?PQc~4z@nW#(&=?SrFX7(@H1(2VMw%QO#$TbdA1|>*gFcKJdhK@ z5Nmlzw-w~Wt3S!;f0DI@A&<|o9myNN!n&~k92;psk~2p5PkuLf$hUv;8~&3l!2`Jj z?zW`-xv=*YWaURP`&php`BjA>cmB!$@}Fb@PRMI;w;cS>g?m &){-4;-KP%x06k241RFi1ZAAIYFnaqMUH|9@ORR&V`G z0387;epDDDMZEH-;X!+ViVOTnKJ-sA=rmSu{q6=G0WR$4fuzvnSq%?5YCmYG_&>>f z|0I92g0Olk(hYP3xUiQq#u)KuSb+Qw{uve^nd_fq&^z7#UH$ieNc~u&>wo_+iUDuK ze^3AYpHaX6zG>h;HH=tq!~bQ|+<&Tm|9#WIe`*-97LEU})A;|5_4| 6#N-&k7 gD?k@0thhphKeyE8DcjV2~PJqK`5m}OrPZ&^R+BJ zcjVKGd&bmHcFTcXPi}N)JP0w0RyEfB1nz--I5gC=+7yHvM^u|ocMd>7-1dDljjkoc zeuW12B-hoCn}Lf*KTXmoGF+eQQqo;Bdu}KZ3%TS -a{c8f^b#) zxa# P5r(v9O z^Dm7kevvm^j>F7_qpmAHMI3N(byoQ({b3Jm5L|g*r{>RYVpHAoC9qb~p6o|H1-&r~ zaCaY9{S=6%!{a-=;t)+C8Gi57*tP8L9(mp~1gglNJUTVM{}Nv%w@QB@=5>c=T_bca zU)1~{;Wom)H~=A59=PBKHhd!g^jJnqNXEf15NvVBc0Mz!>V9m7pzpi6PF4D4!c(r; zEZY~ q|9>Im5*P7>yoky--#+={g9mxm<#% zN}pDo*MnsDoNgSmxIHT|ePx;k5i_r8Gz*}wy6Y$Fsg3%DgbNd7Rm1LW!Q(p{ol?dC zT*BvyVbJQ+p40f+-?S4^oA?BCYu6k)+&4{Z(v{q#)MoA+s~2`YX#Q`y(-_Jhgo)k( z2yqB~#Al3V3c$GYNb5rLr*kiqwWO*wTF)O IVe0V68-9 D9 zaUwgf8l!L}F1Sw4zVxP+-5`O}p0tbJZMt?kiEPs12)&OJe7ky?$H`sJJC&BoZce4z zzbCPO{MIe|N%izs(V9d0iVJ>p^_ax^Mwhe!Vdb=t45$0tMV$WD2L8XAyopA-w!^U4 zXhBzodUN-!gAD9aAE}n@HdZ{Lv*h> 67iSK{1cIyt(D6 -xmNYkIexDIO~T<)eFp4=>FOJ{ z?ETaGzlS}v4?;M7sFdi)p&>rj|4dAP=Dif_9(hPTqTGf?HKP2N>pIdonx@-|zCD-k zisjfm+2I#Nqbsf=&9djZAyH;k6T-*AZJ5`@BT?^$NTP$#aYRoPA?(Q56_rifk81Qv zH*1pJ`t;zOa`$T^dR?Dh3o?%$un>;mtaOGZp&}!)Q0A+S=%&3{zXa$x%_}EQUE*~r z-*FVyD)@GYu{YA1RK>O}@=F-~z0gAD(@NfzI6t<_O)Y(t(oycvd`-qe<}it|2tAi_ ziD%o}O-+iJK%<=8M4ut`I_(krvU~}VwZhIg+1U}|IjP?XcS%rdMY+nHjdP?xw{w2@ zajGbP`m2QbW-3SSjnUXlNzM;ie$urwuJ6|VUhuWpxZHBc(vt5o1Y2UCJ=5}&i9+S+ zod`4oe={b7# iy5DQl<>aC<8s|Rkxj!NFK9cfL-HcG+~sK7(|Yuqen~rzP`RI>0Q|yfz8d^U zD__6N7o{>LI9k_{5xE>kBz$zM dcP*@;0;V8)t5+@MZ#CU@(YpRF13aCn{v8 zJyl%dw6VdlA$oWK3TaW7& ugy=p^Xn^D!koo5K6rrk>6Sxu?k^ z$}n2*-97XLGiT`9qr|uYzJLZxXh<1&(=G=8a--*WlkO82d)u>ai^^yDCNASY23nH{ zIT3GZQ*O%El%jl!=cl^pfcWN*N?|{?wB0hsgTFp%%5q;~m*Kh(3vaVQxGpQgX= g9<+TCSM=B23K$7@Jys4B;`+dDY%~4dZ9q8yyeK?Y&y1M7<1~CJ zd91%Od*`!!*Ks;6eERXx#M9eaeJh1egw2lUZKd@@MfF6 LzVZ@cuBM^TO}w z1l#W>7m4SN^zt&1$jPCozxyk1KNs76Qx#E*UYAtZOF)p4uWKe5ua{~vLSlDxoqYnW ztw|D?%oMn^g>cgu#jkHgci^eh3v%W(g(BF)R|68CXC;b^4n;|kGi{}@5)bZ_CkAg1 zKP1R^y>b^N?Y1rYj~oxPdOBCE)ipLJ;R_bXAzIgyRe79Xfka+{jqY^R>PveTB)1RF zIoC~smULFJaO0FND*5e%Ujt#+kl`3Hl68=+w#*}1_QXop>yEIzq)=>Dv;67J2y53c z7CTW!qaZ&CaXR~po-*T$@+rhbNDGW(M(Ar@@bqY;=+qkm%CglsyU+`Hn^#Nt$0WR9!7dX)^Ei-)lSbE zF{aD9sJC|B<$tdbrPZ|VY@(8PKPsIZpO`BG9-6*q%9_*o1qJ{sn3?&` z5Fq;B4p(FB5FjLw>06!D>iS&2aa`2sbnDF#nOqe(8?9= LF*9)Y+Bx z1;zI>@GNRWO41GEBpM(b8xv0G9#vRLZP#(;ZH@GcC3{5ooHsSq4n2Uppq+bwtaS ~U=&5Xinxpk`_4CF$|NSDA_@m~ed-6M zuK6_#^xM9mV(ng3EZZHfu&2+GBun4N^Nkb)Jo6oJiCa|N%JPaR7Rl4GP01rrr+Q>- zf}gqru5nEZ=NBaKOYKVX^hIrbwN%nyZB0KcdA2>RU3Ed2tM45CSZp#^-088!97@#r zJ|~f; ZU|MM3m$LN!f>vMP?d&$AZifJb1UNH$Pqi?TBgL-=5a0CDP4Y450}LRXm} z?Y_$MCxX4B6X`}vM(fkG{yc@GQTx)Q(V-R?@ly~*BXtgTB@X`7y^J05^Eayn2%b%4t!+ zUY2WlkB&0UV_7Qq!1wX|_LPuV`L6dt4 $k%qW^#7>^*hrxT!m{Vk#Qg}mf4JMq@8^jgRMcx; z8LsHdML}UDyc4xG9?Pb+JE-+$-;Cljc(Q%mm~O#g;#F~~sBKn7f_8*r5VC$^tEJ6j z(Fk!Rxv^VYgHuK6)ezXoiIcTxyh}A^nzVZr15%G8&iu&1o2+>!+0_r=Uq-ox?sWJC zlxX0k 2EV5C_Mg)1$ 2>?oMy%iyZE{52~u$D$Ii#Bq2k+s#KHG{@}?bw;vwq(ShV8UF4T zt>0X!wn{yu6axZQ-=}kzsi=Ipo0}7t?sA8eLKzQ@tX-)w*>deFaee!Qk+ohHldDWo zTXCvmX%aolRPu7+fK;W1L!&pdfi{G%E1uYGv{=_zlerx?G=h88Dn}mYHIiNJNESv6 z7@c}6Cq*?ZE)t8Bj@dxs6XP8FvyY{aZyQLaLcTkkDM#Iya`(@2Npv1gpyf+Ep&uD` z*SNS(YBB+;Q(~B}zx(SMU5m6sn=R!_NxI`C)Y1MGBjlINJQ;d~p7T2@nu1T@Yc$s0 zZ4&}JNTy_m>abcWyM0mCYNo~I2VjxoqJ-s$neW^$YTLBrf5UYf3vC;YJtgJ5liJx7 z)3$UD?pRpk5iZwKCeWx~%tS`Sx4{>?ZG;tK!mlJt`=l5I1zZov>-iNe+|c1e?KI{@ zTmCknPcxUdphI3n8biP~+&eO+?T7#=zm;ss{^itxA5Xj_r$jqQL&($Hqf-Mvo6|DI zv-MuO6UQRKV&$p$X%)GSI*SesE3ikTh2bd$NHG~o8U+4IJC8 H=iT#(lF;ikUPn_f|S z?mdn8ZULw(XNH@TIs5Rew8=*EfH0DPnBx!&vjxDzH9X8`#fPeDeDIjdYsF717pcs) zzsF4MCG$|sElse$QB+EGeq?_6)eG_MTQOw0JcWH~Zv~Y3NYPbss97UCfF0a9F#QLc z)Rm948(#6Qi_+)_o}D(s9 *F- z57p2(yn~StQqSzH3q=@s5u~4l*gK13VT`|>vVN~W5jAZ&oVlS5ja2oJj 6es)svPz}LvNf*sTSm}`4L=F{p)s^3_TlI_WbzV-}VQgE8%fw^{if?iJn9}`N# zEiE5M^puB~@>P!QP6P6@ROUl|&kIrCev|s^lU{9C2Vu9G)~^6=@x8N|WGKz%II;JX zE_9p>;$dG)lUU7SL5-uX)s4Q0bPvYOb+l2IkuUn&TFm)+t+959eUS+2{7*5u)8-c! zZdt^#aOIIogHf+zVY44Ab;@=O1Y?#c(2+jkt!t7U4ZhM<*vFAiydE#_PJ>l3h>TLg zsns*dM^#?9C-@?+$0B^0{UfSPiqkPf80byB`(m*5t&_d*S$tN`d4lCPZ-6hPdn|pf z?45Z3svh@T3zE-Q6*@)ruzN5nb^BZg$*XZbtYa$ltJDO% }(QnP_2euOFk!SW$$bvA@17lP3N4)AZTc)fYskIs-vlBP~ z(A1miYmH9AbC?6zDx20r3%6bRYmwVbr4Ia|RQ$ebsC`r5KJi(P#ZS<82dS~L`~6R8 z%c@@j6*{7_*$hyfG @Ru z g5@81gw?XZx*-<$ Wd1Y^+s(z5y8g1r9oKsj6FaI zB_LOl6#=$2;CCNJHI&_d06mSNge1m0R(;jCy8CM2&KCT3v&c@y)_sKh@a!>I3)q-A zAYbmg|3o4s_(@Jerv|9&9x!1xQ-XsYl6{#~9JAa?L_mH<1GaHb18)ZH09x8hTA@>g zzo MyM~dmRDM6Z6hOU*9VL^a+b- z+F>UPF|j*mf_77~^ 7mz0MWt&;g^Tp`@?GfKj<;(Kip+EU>;xpoAcjR`ger< z`*yJSbU>W{J2U({EB^0XJ0gxlo;3;%8CboGVec@8bem@YfyZu7sfq3lBoc^Zcw^+d zc0q{Ieh{Lq|C%Kd!vrpX6))hX&G>X75Y#+}07OWrjyblY0C6y p0}svc-{ o_TDi- z^0gllv}U@*ccs8u$}}9RhVv5R3=1cA0mau#H(_a{5}!3X{}_Zlor&fU^L%Ok^aeq6 z)Lk@#W@-{!#xCadOLa5XEC6gbQ-<`d&fORYWQb+ZKA9P3_<{hVYw!uVDMa*^77PSK zvGTZQHL4WwENc>CaqcoihKt<%3qG%P63<*_(XRMH3=0rz)D|0^*`GlhWX~JWw>x(f z1mBVy7?% YK{$TgUwZM6^%M0t5~6>wQ5r%jlg4_H ss zqli@G8$!1dE_#p3*L!E3?_73UfdR@80)li{1V{Dx?9M$a2KI6wc+a5ahlV``qOW%g z+ENRHFr6e#Z)pWX*XojQnOZngP{bpVgnCR}$LlSoE+mzGIcUMJ3bE~WrG8?nR9~7u z=3*}$+Z 8W)zCWveCrdPUC8lak3?U!&uOR}1^-?&ZX zkiEw-`e}dBtX+AgrfuSzU& ;hw-1{2M1q@p#b6nF!!u1-%a9Q*#U4H*OSuhz zC~>NGiGGE7;Q@HyLa*~LyR3?(GIW&Qz-=fm<_TZ_fRyL#{tuJ)h?iNmf|5=@JUZzl z*Af+`G)CL(OJlIdAl^8oSn!b8TdPDMt!hDW(*m1k5e% c*w*1)6X8i$E+#@ )*uDFFYOfXt%thBV41gxNMJud6oh6K{u ^mwOM*f$_c+kuE?TtvsjLj`A`Id1;9VimR>XmOOacNz!um#^97}(UpcW zlHiYPn*Ijy^3=X4en8@ -+S_dEh2N=ZEipe;42#wU|TkB)fwW^HZT#sUb>A4|i_@y*v?SZeSI z?u{CpqNqDPeI?n^#KEaCasLI1j dRssu{37- zvn1_`ce^Q_0^cLH*E=x`X(;ON`MjyCU!HJ-8-7Vr mzsE~Dh7SwhZS89VjOIn^bbbeOldd5^IpdXhuwVDC|BCoDt^8Ed zX<;@BciXY9^(%ji${{>}ae&PUJv+-=^^Sd-cCwd_;|jEB{nXev$nyojI%F^AGw0f- zfddB5!#pWlx*QuP&;Aj io3NH`ZYu<$grbu}y4$g}O3zIN$Gl{pOwpcZ-cLz{Qbp=W?;&xwe^}0jI6fJ_Fh3 zJ!`4#L-;wXlyO(-LYgfAJ!b$A&PEYxb4|KAgGHJF*5KkH3jvbm`opT0sM58(TaiL1 z>1*j6r!||^6~4-c${$M$b9j2=JcMz6tmdtIh-5e7!1D8M(pB^w_fsdTHJW(@X_te? zUk!RiN5tgr(fS;&N{K!IZLHLAG+;gUZpDbv(ztc}ot`~XlHWIT=vu-XalUiH>(+Aa z%gGb5XOSw4r`_kqTyGdB){X{;t#`sXzd{5`D^=E_Qc;v>&iT*=ZHkI*N{Zsx?BR9g zLCgikmOD|3QK6p5tne?vjaprY=#t;HbxSbUwszOC4iI%!t>|RS#V9wI)x{9RmAIV( ziRc%#45ws8dYcYIEEF)YLAKd*I@Ia$i bdyphWLsYj z5p&Yr`?YYE9OIfT;a_seYZ2qvFdcfTc56Q|S6B-bDFj~%K>+x@9smxXw4rjjzlFn= zP&q9n!S>IRr~tQ5$-3^T5Hme-P@I}XUyGNd_VV=a5v xi5!$?zrK|8_omY^(~~DO zj1TFLmB`8NUI+8^s&{NaZwa)PEBXUZE5S6`A1+#PzE^+b^qPs;&d&R+iLob9LY`sa zn#fvTU_yzb9{ah-Fpa;&Gnp#3eT4X^2vLh6#z)sw<8Mp4_|?6c?|bjN^un|j^)vri zbiKVMChNLb^~6IexnU$aIKKD{fobnuXK=eJy=8* DHT~qL<)K&2Z-w=$0onw*d~Lj-{w>xk zug u>IQ4a| zkV12=jdiQja|rV939}Nol4WCBq<&u@#p_|lgq%;rL>B5o)V%jYzU5@KNR1dJr<93) zyq`<@3};TnWHi!!`I-l(fH~h(o>-*wj#vnYi^K!guK%!nF(8~soqZIPoMNQiUfwR< zygDL}dno@t%fd0S(m96cNGU5Yi7hyQwtUUy!s}{)_Xi4~%l!J87IW2RRZmgR&u1UZ zY$UHNdfLYkmP^k#$}RQ><@|OkoQPPSof%QCae@B06-r;f3wnq2CA)P(|3r*Zc4iw_ zgy;7UaQj -g9En!bEHHI4Q26**JIDypbKo!mW7-a z6j9JifHC{>CXlo#OBr3FrIxLbhDqusu^T>!qa^q1u|^I1l*KsUlu!f+)9*Z;H3wEm zpFB0r$glnkAaGi5(PUuXGSwK^T4oo7eyq`bR7!!K$(ox(5hb15U|inB@j>BUh?#qm zS<7MtE*?0FGoq2~7~R&SGwE#ST{mUpU1w>PSEg;{*P!q0T^BFP-{@j1E;U^;M&uu{ z*Bk9i@*rQ@QLm~E9yq@G7w=M8?!eNNse;{?!wxz>vtK# $AEf zGHNU}u(YUzmB7dj6&DVLIl8SRwCfm)N#u#QDx6qZW^sMF>42ytX>~1vARjnUb68H) zxBxgR|FmwqP5nd^vT(qntXE^6J>7_4n?+3%QD%P6C6@cobb8YCZBz91Y*VVlN^zNo zFJz2&R)ut2vgaKBYSteX(kzAh9uZlw8$g59Z_+_0mHkZpk#4s)v=)d`?k99wrm;7^ z;Z)&nI-$Pl?6y+w4|JX2bH1*FDa%D*-z4UcJ^@!|=;76`{%}o=gge=D?m@{0K6!_s zMsYyMAzhEH$RbWK&3#tX8CV|I=v5E;_-|^raB?-yRuf~!pPM5d8SU{Xla~l+l@lvz zpbNhC0#T*cd_Hz!_iFt>3k+#7dbG0QjKh`CaNoR2J4DBa%JcO six?FJ)li|g7`zcDw{=NCCZc)kVUqWdSr9HtEM5u1(x zXm{q0VvA99;Nt8)ckjvH9EgeWzV8tsgI0R&el)nKi*03+ZspL(cTPGWxG$kxmq)*i zyE
uDhD>m1O(Sxnyh`I!(AKTtK=u zykVatwky*qk^759Tx0J9jb~d${l{jSJMvV3K|9`S#}2tWqAp%R0Mj KAzc=fuS h1Vdgn#o!iK&BLx4 zCjyk;;FD^FUhI#*=74 0QzG7K? z(J>y72a;*B@!8i8m0l#5Fe|6BPgTOKQkHTSm4GC55XdgYJ|I<9+e27twi+6rbGk@V z(AgF!c~C)hIAIEytY`V;E*xs$4BTC6*i(&N4ST8fc3gi^FXI+buSr$)n%$xmr6x~! z69&PSiEdAKpUK6S&`QCUa>R(y(wR9{PY@LMzp67r{Nlcg(EX^nHyBej-hA8mA=LHe z*d0ZE-?I^zdZ!d|Nz4+{Q&&bcbFZt!xkeMdhY8-4u_v>3=Ck{*#9_TGB_d4Y% <+OT*i8#YJZM9v zi%CqrD$3U2vjytGPrSN=jTlx04`L({YO`I+q391t WJ*-8b@S7&a#zjveW^ia&)s>AaAy0TT7dPBcLfYq7Agm? zwFMMTv}?!2Vm8h=;I{PXRR){Id|{5C%-pLGB2>oi7WRCs!)-X!>s##L6pN^} Vm;%T3ZGL{Z^stM2rjMytgAG4}Q-}m=Kz-2;CU!&22?IRM zKM%-pVeJ5KA;UERWE2;e--bh%+MM<1zSOZcyBzufIP&(I=)a4a9TRHvV`+ zeD+AUw+O=)agJ|8Y-#t$`U}tOnOeLM=T!h#cq7yj-+2j+o7#$3WWl4?#0T82!&ikF zyHB?|3K01p%s%&AP)P1C=W D-QP(Q&pr+u;=U2egy(Su0u?K)o o>28gb&$0?IfP$R zxcaOrDz~`lmOE5nWcDLue(%Zg&~lMsi-Q%TQA~6JcZTn35|F(nIfUfmCchnId!%Uv zwFG;8+evTV8X&p!pqkwMx#w2SYm8|@=!31Z73Kx&>L!TVvK{x1@Pc9tTlg|FPsr~{ zq}xEdakg-i5whCOqf3j_I&Nb}(q_Ajp_|YN#|=Sf a2Jj>plSFR}J{v0ax=J7Y0x6b2CUQGBB`uBO )s^TX714A4`8`PNR%Uz%xH9 zboncT&7#^EipIu`+L_^q+F&Nrd{%Kzm@N5~76_M5=pUK2lH$riD%B20(!jiE@deup zTgLVq^QZ0=z5(=_9_?S=7OEz($}MosHR2Ma0VvDuF>rgoI{jDrRXj0zDL&fKwWwkd zrZv)k|2xsV>@gf3ko&>&LVZzdEwwT(GS@EVXm=P1cY-M>sQ|Idy z@!ahZFXDZ8pZk%nt5S6GIOo{Lgy^tQ1|UiIK3!T3wTo*C@igEs)9ZT;RQ_wJK&@!+ zV<~X=NY}(&T=y^T1qjgJFlPpHVDcA1A>)o0^uw2wbj(p%U8IJ=hX*Zq@e} l|&KuP-a0g#ploZQ5dc)8!L^^|Jjb7$f={uYCx}(l4ps>b- zqWeHWX!`J#WL{W{V_oa|I|$bg6|cHoK<0wA^#T2e5Dy3%GHnp+n{q4+bIm1kG#6le zD?Ie*lul_0Br+BFZqEacC(u4ngB|5BXve|8Bw@s{320Zhl?yo9ZgE?$p=)4;S-?nR zqg1he9?yLvhA}X3_#TV*?caCql~am7KpXXTrGcY_b4>YWA!k&XexLA`3>SfdS0=zF zuWQqXbA|7nd)jRNu uCEXMk2MrFj^xyJ4h z?uGr;yhmFo!4txCK<8Us;>n(4mGeBF++bA=1Koug-HndFtH&jYIsEIr#qzu49Rh(M zWt_9Ihx*%A9`M4`O_X4`Qh}b_UQQ@36ueLuS&dMs`JTeh56E5qd#xSxY2m}bHeWBt z+4*?pbVg1k-U-!2he!g_{qsVl7-t8O3*+!D#J=1qMQIq6BGV 3kBGMg1-k{@^?g*bs5vicvVDe%d1|8ZLa 9p<7BIz;FIk4!|FBqwI0IAVefEwbC{K(na8?3S z=D&~sw{iX*Isd*^|4s^jjuZHI#so(k{JWg6PIdTyTWgU=Ax1W*MstPtbVp?5_^$>o z9mI2lu%Zn$RzNe?4|wQTR?a#tlO-63kXY6M8NUlx=YV=m)fLz6ngwDDAh<1q(VK4z zIllx#z{kSia1_8}2<{2==Vd3{H$yb|0>V_~^4#xaBCMjlm(3Ly38e=F1hBvaXQci? z5SuKqXQ2A}Zq1uh3mWQ@Rl(}EpuKvAzh+3*!S{YO@~SSi9h%ZfHxXcUdbPoG?8)8SJJ zT2LfBz;RXg8a@`wUIb#mxl62IktHsiTa9R;Goiw=8gm25#2pJHxVzRY0NFMtnpj7+ zd1d8Yhb0dZt@Lzkkrw;;02%}eo8J#kPSMgGW7&(x*dD1_;atlSDcL4ZZ *C<#-9pc8N66aUBiF1Bhqsv_&aeL zcZ($?-n&XJ7mh)F)A?sWmpe6iJ*tmJ%)T|9$?JjER`CKupJ6kWaR0?U8 zI9~@+H>AN)8l7IrG6AgBlWh&ZdSO47fZgtf@>l`3w4eVRsnAnPuf}~jqAUPt9xej7 zKb&QE#+9b1-Pcd(M3_}3+-beY+KG8yZqjq}wDGI6yej>A#M|#qn~<-XZHm%>^zGr_ z4Z#7*38MTX1&Uxxs|2`&7C4UgA;v=3;$0swV|i1lqq3?^Ge1Ai$WU(QOOU p0lvdUp* ez! zU0$g#N|RnZdW>?vdg~=I*nx2J^H?js2=l6N)ev;z5+qlq67l;Uu?=pYsIQ$Vmk{ qBWyMLv)4mU zBn`1VxXV;njh@Sz95vsJr}0Dr{&67q06Gs}bmVm#HR#uUUNEYTZ>^OByuZO IW!9q?Y*s%2WW1|uQfEyw6yVwBFx|))W?19 zENq*s)j0BQr}bf0IFIW(8=!d`Vs%W;;N_m`Jbo1sNr~YPX(aT24-?f~>l=4%<8h^K z-Ypy`h%Ec8>AKNP+TaLHl~?hfE}>Jwp<_jYlgNp?_q%C|9L-Y}amRE9h%XgM-YGRe z3juc0tLEdqQVfn!;&Q6*DrA~g`q_~IEIno1x1Bd6KfVAi;ASc8c5-v_ZtJV~CPkTD z%hR?gmVBhfU(3zASvWy)B6YTFB|Zp)tC1ee33|!8f4i@XB^~LJfXB+^+Y+Ez0;I zX6{K1@X=IwQ`uS>bqy>{H`RW>&Ik+$o&`td2*cd@O70b5%^F(|E!OQEG#b{d6m`rQ zi1pVPhscTTh+o|nS2b1d`#8L;(2LpFgU-9YFi=7(-y@b;FU)7xKvGUv{^IozOoRU7 zF}zGiozT_ju{0?9?c26a*^lRPHr5aIzwXfH7$kD04TZTDwUnLdLtd^QXt#}?8sQM9 z+L(Qo-J!`$&F$+4UH}Uu?JFu@@w>yXSc`QJ&PO{)^bsqHc@A(RxlESKTcdx2$!i$* zDqnL+yO0Z+q4T`P QTyC)xBV|eSl=+qS%w>h%2Ctcx z==7h1n=!8(vV8?F!ET0zFO mlphj@L8XafsV9-^GOswV>1 zB=ig?!Rq{=Eez1^qdEj!B6$UgID7zot56BJ7QZxae*$>KJ9%6?k#(Zsh*P>H{hBFH zWUV_QgeIa;GsrGo?|zrQOgW%Ap`3n6WQSpYy?Xnu9>6ItvFMU$fzfaZxm=-_{-jW; z+m!LjVbVI!IK(gNfamw)1G~f@{&p|R?U_lie5aJY>(`{iFBBnb$Kdpw&DS03Y>&)- zXmK?ba<-q*=3gzVW}c?khS}`_&M#d#+2e->wQ#t;FHnRWCGXb2&rx2`9-07T3dN%_ zno0C$J_YqHgI?+^Z)0e^7ULRHFUq}Hiupxf Yk$_U3a+m``yXog6 zwj7%~&ckkCd9bKi7J_3iEH=Vzr5UIT7STxVOW?FoK!k~o*Aj@mO6@{~t6q$DO*Fv< z?NSI%57gfv>zEue2?~2Ulij>>A!Y}h&nn%s6nIVZ+ZNHCsj0TaF18&pA3e&%mFdCr z6HaV9mVB;p2WP$Q0p~l?muX*B8Mtl|cFeE)JcdY|ouQ|d_0mtIdtj{cGQx-Oc7Aot zM*M9oc8hMep(L{#)mF6J*OxHgacpU|Kkk`PK;Vu?TQD8gJoH8AtzG_?*!8y*p`&2( zd)78HHZtYmvVNJjJhRzGs^i*7?Akq8^nw|^HonmLmPdZ-T+o2dFy$BuNKK+xGN1xJ z2EqQYsrYq`=HTxi=tID#cr?A|#rJe0WRpuVFc>)dRZaxV5c-x|RGJ%4>HMmD^{Vh# z{|V)!U7|n?>b#y0AE4nU-Z|7&?F_~mA?QNk^c wJRT zXmn~qZ&-*O={P;B)FgIBf0jR?lNY*sX&m08f9tVmn5kP}pikgU2 DEeDt^rW73hLxme3?N$U~P zAqYY3WVn=H9D)M>b4PM7{1I*8!Y1u{Y&cS*59J2b1$B6@w(H2s`3tq{FP@KGjUNly zK9NTK#C8mWZ+?< 1iGG*uT$?;ZK1GIyHBOZ$A`C~V}^VpI36Zt2v@7Q_9L*;j-!;63~} z&MU@Ad$zLuUF)u1xF{T(y|{n>nHi;om&GqnHEU8n2$)Pw2kRLAWq4;Qcp0@s-)Zk( z``wrqjD?YhwexgB7hn3MwOjcPG?tmSRO9pO^}0DnWRvW(ez}auwmo {kM$$=^k{Dz zEcDUj$7%E6t2*nh)8^BvJ{ge%^CE-J9~?G@U;HXNtRIapA-zWQe3En`2E^BE4+ng# zch;T#^@^H|5*Siyq D)Q9j_di5%m`ES*UQlm&6 zot@vCt_RyBO* A!;@u4aQcw2gm;QDwL*r7wc9N9%{-*s+(GVIGYtik~{sycvmZ5NmXx+JxeP0 z>}|K8GTY0-SA9xDKb0jW@~WCZuj9|ySJs|ikPj23x(ae4yuD|YR)&aSnl#hBt*ZAT zgT4koLv9;#L- 3BfnpJMfc%MQ>lajvcGmtIx?1KrTN(E+De&;RaNvO0BKa zwvRmo2E-I(;5`d^f<;lvs^c;bO;A p_blZL0RziI;fN4SZ1&Z*F)L;0Aebs z-Zb0%LVwxBE5nh`D%mm8;spwymw2NvS9JPUkWa_*=P0TYksFB=RaYm+Tyz@mLU4sw zWQ=3Arh0K&-m+m=_|ZS9#D5+r2?bl^hw+(wnUuf>D>V(C+#*KsA&dL-M=9sfBUyTt zS_GXg@sZcCctvu2;;5#V@<}UqUeU_aB#Hgo5S8zi)lnn+4 uJnh~m z%d;mIyDs;=ZgB{Js+T1QcS9om!JST*`8a~*bR7KCtTvealitvI;xZM?3+wayXI_`* zCu+F{kvf*pJ0ARRih_{Xio$A%;>tN0a#>xIB5_ToK8B5$oO vEvirNrKViQYT(kRUQUqhw#UnSCvs+hVP8Py{Mg_TID>z@ZCbE@b z0`H7FIMCKCBJx_R6>55VP(P!nQ^%~f)ukW`PP3(pZxH*}5<8Cc?d|riMReLPRbbEQ zxtIJzWQv E8q*U4Lz0&`au|LH`mnQ~z=nW8&NGS7LBO|cyvc~8 +=I^1I VHi(Y1Hb zEq;u`mqt2n 4ZCBx&ZG}W%{vo}gj zsy_472c}j(M?$6-^?EfPqY+(O%hiB%^xLi4R;x4269_y$L2AG*sjZA(XgZf+#uuh3 zE&I)b=Yr1qtez0xmz|nz6^%$%*L{BkLf}UC(!gn0Poh`67^%mlN4;DY1BUrav`a4! zKUb8j0b>kz-=1%;p!V?!g}Y{pT~Q^^-vzx^*yuf6b*8MrZvPL E{{LcpyK^)E`8DnDIzTtg7ua|o8Jt}83ia=P3H +*twzt>Yi2!I {Na+Dj2uyy#M;r05~e7%d_-ub^ex D~F1R2X*n_6qem7xv@Ek>76d zYBHqli}yTwUX%=ny9T9uN4) wu zwDbF1O9*MI9ESdHWDb2VRclv(V7+c(NLnFl1u&k%pV>s|w UMFuwM_KJ!3R>j1DMZQvveZc+%-gl z6P`O?;ow`-NTh^n3SUvZ#UCz`{DgYSk*Dw}`38Texknj9*Q%UTel1|7;XYHN6unj- z0r$w%Vm*_=sZmMZ^t)k_tEek05*_OHuJ3{&M#Bd5*Qj(>r{)pCEMt%c86r$uc~%%A z$|7lA$aYa>?A%AN0f#*bbkb=jB4?IW%Wi*l0BSj0D6OpRZ+%blkO5{uw7Pd>!L{ny zXU@MXbrTuq^TnPVbN>|RK)F70T9cNz&O|DVSX|%zrOEBswf!J>acI-{S#MwtPxef# zOzi+VcUC{POY74}w!Bq&AD8kS{}uC751JNBVJ5jAy4AIE{r`}6DS-i0dQ;Q@Nv0NW znUx_iHWSKodEQxO_*Z2-Zt}OxaCq`g!FFAyh}4-j)Nx|5LcW-)Y#v{@*y8q56j!Q? z> G!909g-5_e1UJgf>jQ*!QfdZb7Y3WtS)SO z+lmE9A=i~LYsY7iV0Q5=HTv%&8E?!?+=}n(>e`!W6LBciZT&9J*P$@W+DFa=#N=A2 z>9wIJT=?-{6Ok^tZqZ905#A^As^$(QMkC~Y+DMR$j^1|L|0#;~ETY#l9rnJEB%f`c zOF2ms1ocL^%gUpPIM|1jx08W6OfOxnz1oTgvuW9_vxio2jA~TSG^EAhT3#Pc$ z%)yk)q7JWhVQ?JThJdQvkQ$q5l-m?aq-06aU#{0> zO1vZ&&|u|-mH(WwwZ7H+z|uPw)|YsGvCX8HOZE_u0kKmzY98aq4vHw(rK-1q&z|S+ zF_FTEL)G<%o@9BaMu(6lA9@x^DB#{LNrsEyQB`F&feMQj?!BkU*DxIYmI&g|fWLp` z`ed0|b=iV)U=5S|X>A3UHC?k_A(>&;C^c>WH%l$ @*dOO7aZ%~ged?yU$7LH^YXA4-f6c~7pympstU$u$$ zO*q8!r7&YMj`*#6`w&*a(EnY6cBNI7_{h #p5vCK>RN9iNt`TL{>G9fwq?^!2G_~5Qp`bdWb@-(Z9?};SOMYP6Wo6IZV z+?uI W+KkOCEUiz*_`l4B~ItRJ~7AE|Qj#cqTY#s?-B-W_Nq~!7BphJ@ Ev>G01qN;>-^Z6$ g9z0#H+t_4f3$@9eS;+ zG`vBBGnI{~$X(yRYl?ivHQ_J$_h|fQRAaxD6v z=);||J#poAAYW)QNjsY;(@{+IJU8`-u#9GYOx$1Ih87j)#8 oT_1|M+pHv8(zlJ`!tmygJ zx~8KvJHFU0T5Ys-D+(^#@G31MQq>%zF}uDviPMlGKZ4iYIa~l0*u9DUT{Fyetk8LD z&0b1J%(@LPqtn0IfR{F{?uar>@9LB>{Y?wN=SQ3Ol4UclE)fZ@o31 G}l9KBQWg_4zK3)0eSe)WE1a?&U;0Oey)9n|cuXrcS>J^2BmH z?A@H=2i{5(YPC1Y95wBaXl# 6271|5l?)WMWU`Ylf+0i?yKpx>gJM!o-vFD z0mvCxC@O{5XQWjef(`q7fZU*FwP$m)_62gQ4fJ_s(xIv&aI!+Jb~xZJ&w_9yJ*MPy z)$z;oc(oo2KQQ;IUd83?PBxSKnq%+%D&O<7b6c9nZfGW$@e3iBLJW}uVuC%1@F6jB zoCnNLbkWGYcV3NiiE|9xEuvU=(e{pwUQ`}Dd*`r`sLe R~Xt^=S1 z;&*hTzfeZ%1&0mvnReCc)??>y8jM)EuT~GLQk|LcIg_aT-$|+bZ>DZ9c9f*eB_=pj zKK(In<**@uUHF6=#z(b|Swq)V1K*KiXQeH!Rl9$eMvaPgbQ}rnwy7Q&w>amcUboca z)}(M9H PyoayU_3gj$zHc^7s1RD*SMeaM 9nJXg)D?A>`s)`Q}VZ`HC08_GJPjB zNuEXOcH+E(Z8Ac^(06$m_>R=V1_Tuq+~rP>H4VG81JCNPk{QD(_c;@|z8JH6UsMd3 zxLdEa48-s| T~)r7bw6OcXnUE$q> P#3C-ycPx%=$ae=SCMA zPy>r~J*0igZ#>Q<6?5cO&JhPrlP=RftJY#hve5&U-nRLim3j7!67tK(`}XS6gEGYN z!W_nZk@wehGn$&L)NM{RQynyl20!u!;`T(kX3{;2Rz0)E6(Pyy{ckCucC^ ^G7Zn?m3p91Iq%I2O$ZFb#!?tD2ojL*t0p}Kh&Ws^}a)85fuT0YOSX{UL-a`SWw z#C_Cq9SC*%0DYz7B#X4n`X8 kn66H2aE1bhG<}1vLcz8m)*9GRcizeBraH z=yM4|%H+>uqs5l=@fB#K2HeD|1Kd@-@WH@J*GpMww92DW7(?@NS8d2Nkq($hQ{~PT zwA>diq}1o7y}?xg!m_n~p{{JqewL%pE1bcOF!zwhAI<(ft!cQi9n-QKritb{Ni!PX zqWOLWU+oFFT@}71U~7O0d-|yST7?8k*?;+SmqXxib0xq+aezi52qBYR$G9oy>PE6W zh81dIsfidE9GyG785M~-zj1WaJNSL6km&)I3@5X8arBw&ZXGgmOBXQxa=OxsD2H|t z$I5?G`;{(GNDE-zb;Yf|z(|G>$BSuZlpFA8_QGTpD~`#sVC$RLmwb5cLfkSOWYhUf zWVXf0L353b-flRc*+K)xSl9CO5m`!!?%BEeu{4O@BAfphM! UF?zBH>E20^qAO z0?_4KQlJ;5UZKc_i{GUo+T~uNWEJEo2z#Yh4?<@HXZiVS1uE6Bt0%w-;rU&ja!%)Z zb#GO~2+}}8b@oYGhDu9GeNM&gPxmBF9S#5c|JpwV{BEQ>{u;%)8AUh9vw+8%!Fvx^ zo;E_?bMH|Fa=r*Kgpope4LF2zG=aAmeqt??cxK?NJ3Ec?YhFr}#&S82NtS4b)OH z9hc-LH_bMSgVmJ1*CNDcI&}Mq?PdE&C8I?4s0IUNPG@@`2PLD0pJi&bD%bZ@djIGK zc#C5DDZDwx+7TA}eRB9<{x3625 *a zY{ghW`v-*t7M70LZ={MCsUNdPaUFXrJ9o#MamQ8~tp9L}{{fdC0Vj^{-Mafjb+F2> zY29N;)8i{HUtn1Jj8d>&Qi@djsxW{|21(PtdRrQb9fNZCR3o=REsLN@ThU-2*AK|0 zJ4oc?NH8E7rOYBbl7t}5Yfo&6L(hu^3!7f=%!TUh7a^vcmbJcj5B&@?rx^nH4&Fm$ z=L_+wHxz3jI{hADn)F8^XVv`&FU+sNq7W-X=?wZj(C+Sa38H=VmJoF7NT8*XDekKH zyyfBBzdb6w1`wLgj0NefV>XhJ(1t(+v_2emc)0T2{z%#dKBB^X#c~03PY_098ECmS z3UgOsxdGl`d1m*x{BJ4FDU&iY7T5y+R-9uM zVTtSsji{Sh?<3KZ^FZ9F^Kpf zmt3%}zU#X=$!UlcmR;S)8BE^1A9q_S*9IsVEpyrXM6Y|eL&`8WB299>dV3~9HLJns zDkm?#KB|dm6$`+fxtn`j!Y6M=)`qq&ffsKHc6Q!2s!<8{%q =lNqd^(|r<0{K^2-lgwvW0vaNp+(?T z?cpwoEIHRaU&C-Qpdt~!y0=4UyBbA^j2FYSPk;^+^4V2DHKwiT67JURMAmvv%(;b< z8C3AsBHq4~g`(gCcK^2Uzu2RD;)!;p7TUwt85Q)IXmRq#U`v!L8FQMHvAfKa=PW&=IGx!~6&XLsyp5FJOHbkVV z5>sGqV>je;+HA^(mxA1!5vC(Vc47HoM3#rp86ik1s%N+ss$@E=ORtLIUHCEjX{Ac- zfs}A|#>wV+g8V)vdSiGoC@)XIyA%{Iy_`NIizB5bigPcG-1 {Lw!Fm^(=+v0pD$YekeK0dt8PIjCR3-pAKZN3cJJGU%QqZer=}K0fMT z>22^?i#`-XX>2dJ-6)0A#t8eo?Z3O|MQL&OD+ks2NxCX&x*0j;RDFfW`g;3Jzv@yo z+NSD~GWN5r*wV|u_1%{ZcDClKSixb|CMuu&N iB 9b=-6{cuhYBdDK4e4t>LnmJ6tsGxf4> z%i9MfRW9}Gs)ivy3BdaiSe~jLr!K9xMx;I|+KpL0ZLzEO{qE>0Jt^B*J5dErJPTd@ zZJ1b_s{*Eo=!w&@i)Wjuvozm~d%=HH)n}fvXH C>egGp9^E+f33t3$^6(c<49@X0==a-o~7rAUc6dYa40D( zx4-(mh!EY(6nT5zhA|~oT}zk~_bjg<*0zY7m+z(QUIq7;*U|2vYmHLEzo)>L9c{|} zY!F&F`O!10uzJoyo@Rw=t-&Gk5f=xU-8t`jWqW75Z?W pHSm>sdm9Q@n4?5)Qh^4B4U(y)5g1Rn4F nZwE zXP=EQN14rPCQ5hBe0PLzBEkH0{e3S@D@9}wCwZ-4F#8BOAniK$tu=xF^#Tltxk8b4 zPC+&yYL{NC7Jb;#HLuXZEcQxSIi=Z<$Xnq<>*k4hsd~{Q(SUb(yg)yA8z?%YP)(-T z(>Tdh`n;FtpAkmIO0t#eH~rK}XHP?Hyem%!YWaKKV~8~Sdr EBa7gam6d~&8Kbd zV{v?5)xmCsICiYL&7wbE`k#)IWL=XJ92L(S6~JZF&LP5BD8?oP3WZ-PdsqL&nVWO{ z&ezm-e52QC#T@97vlnw&!)ZmS3@yhlh2C6=8}XgUAp!`QvH4p`e9=FS6zi-^<0@+) zY&_a!IAMsjU!M_y2(qD1fFtVecu0SnOg;K7(W-)B{D70&G){o0^ATZ@K37US+Z%y> zWCrbrw-Bv(W}1H+dbY{j#XIMSn`nvL#fvd$@6S~Q2JN+T>hwN}AWtpvAc;{M!8Mw` z!(#r)>-EJF{gzYSHRc~uw)D3?UbN*7@Cls0(y>~RO@tlmn2&Q9<|VbXCjXtO_WJ`- zgL-AvU52Aft$#7aSUa-1mM5>c1kIeMjJhAvqNw|M-rKLO(oGs;>2H6JBV}DaadbwE zw<~d3szoGnqt&WBm3P5`0VAz&^#YDFmaFjv_7l|PB8i`90Cz9w;FS|cDHeRav}_5M zC{OB9t$HmFUR*T*r}ZtOSUGtczGX?)?+CK*PZ_ixI5 4V`D;L}%S5|KDNBGt};?MDuQOm!|!5LH2{Y(DCSK|*UyE#NFmd5KI${U1FEBySK z8K=URF^|mLd&*dAs`(D3hU)`UO|TgTeJXtClCi93N68h^3 rX$7;YC>%IKoN(bDZN7fbDno5Xz;A7|BPi?ad}eL44VdgwFC z+eyJ35tgX?h~a!$o$6W%mNHM}i7R*4^rys4TE3Cx4f`^9<2}4IY6kLg#}`@{7jeii z5%kcbXQg+mDvJS&W%Sl6IJ?b`Y9tkdo!d4Ute!QIAP!LTG4i!9X57!Jyv~wuY|S%w zA&*M~b<>t$Dl<%0ra}FG6>~NYv5mkZ!orxgIRT0lJbfr6Ly(0DkXL|!Df>s6zp)yOJzS{0C%~L7N@Gff SprbG$L<2tHu#mXF#y6#XdWi313>!+{2|8Y-^Li& zyPJoJ#0tKCx#@4FKNVpI8v~3@vbn%ibAXi@sQml_*p&gN0Y}cfz=Yuh5IiEBX~G#? z2e2^!Jy_h|Oi%vh>VQ2f4Qd=T#-QJ~ZZmm f zwR7#a=S4uJB+@YR0hXm^5psh+%+4oCA8F(UB$K??2co2)A(-#=?OB7e;;>i!PX$Hi z?SB5(Tk%;ug}RB90%@u*Il$5=uX?T?c;qbh1$P?mA7caNW0~P$;NG0Mc#!N~c0qVW z{Mh0Zc6i-%^`Klj+C5{>vtW1=SeF?jS>jlJ7{i?BrXySDqmfh-H&X+!+70q?a@0X> zEDmgWLgxZXo@rm<&?r);#F1|O74#L9f{nNS+Pn(ba(|kPYW`I=r-k?!C1>tL3UCL8 zJ;!q1atrzuM=bgk6_~xNYs7KVCrck$DORsV9Wy;OFF-bs83u6#-8%HCm!*GI{&NK@ zWg`jt%;Pk3HE~ogx^+`Z+^ujO)S{v0hBcasaw^D7aLm8o&0T^q=+QL>HGdHX4NL%~ z9&}a@^!-F$Uxr?Z3A~5xe|o+Edd?6^rp-OxFG*?HLRB`AiIjFmjS6 Y@yj>(cru?AIa6! Gf6hsw3l#z@zF7=YQK{Wn!xs!U=A?(97MvXyS%rTXVX@F`G5Ch^8{L111{K@r}m zoEk;d9Y8a<$?%n$M#?q_gnx78-}N?0T~`7fzu?jfx2oW@_bGc8@&13o^5|(nj6ITP z0ozQJiNTC+qySREHyK}W@!gC##5r-MHL4oRkv)Sd0fe3U>3Q%KCU$ae&4JxHwf`gz zcf{DeM~qQZhw-g-{cADU4 |pw>=e9Jy z5IF$C-=<2Y+L2rQuJ-kxn)BS^p$QGGQGMBbX_NzY