From b6d02dbe78a3a5739e4bd71441be88a7dee5adde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomek=20W=C3=B3jcik?= Date: Mon, 8 Sep 2025 18:11:36 +0000 Subject: [PATCH] =?UTF-8?q?BTHLABS-50:=20Safari=20Web=20extension=20Co-aut?= =?UTF-8?q?hored-by:=20Tomek=20W=C3=B3jcik=20=20Co-co?= =?UTF-8?q?mmitted-by:=20Tomek=20W=C3=B3jcik=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yaml | 15 + docker-bake.json | 23 + docker-compose-ci.yaml | 1 + docker-compose.yaml | 1 + services/.dockerignore | 3 + services/apple/.gitignore | 92 ++ .../apple/HotPocket.xcodeproj/project.pbxproj | 897 +++++++++++++ .../contents.xcworkspacedata | 7 + .../AccentColor.colorset/Contents.json | 20 + .../AppIcon.appiconset/Contents.json | 93 ++ .../AppIcon.appiconset/icon-1024 1.png | Bin 0 -> 118140 bytes .../AppIcon.appiconset/icon-1024 2.png | Bin 0 -> 118140 bytes .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 118140 bytes .../AppIcon.appiconset/icon-16.png | Bin 0 -> 874 bytes .../AppIcon.appiconset/icon-32 1.png | Bin 0 -> 2197 bytes .../AppIcon.appiconset/icon-32.png | Bin 0 -> 2197 bytes .../AppIcon.appiconset/icon-64.png | Bin 0 -> 5796 bytes .../AppIcon.appiconset/icon-mac-1024.png | Bin 0 -> 119702 bytes .../BackgroundColor.colorset/Contents.json | 20 + .../Assets.xcassets/Contents.json | 6 + .../LargeIcon.imageset/Contents.json | 23 + .../LargeIcon.imageset/icon-large-128.png | Bin 0 -> 13817 bytes .../LargeIcon.imageset/icon-large-128@2x.png | Bin 0 -> 35660 bytes .../LargeIcon.imageset/icon-large-128@3x.png | Bin 0 -> 64749 bytes .../SecondaryColor.colorset/Contents.json | 20 + .../Resources/Base.lproj/Main.html | 20 + .../apple/Shared (App)/Resources/Script.js | 24 + .../apple/Shared (App)/Resources/Style.css | 63 + .../Shared (App)/Resources/icon-mac-384.png | Bin 0 -> 39117 bytes services/apple/Shared (App)/ViewController.h | 26 + services/apple/Shared (App)/ViewController.m | 76 ++ .../Shared (Extension)/Resources/.placeholder | 0 .../SafariWebExtensionHandler.h | 12 + .../SafariWebExtensionHandler.m | 43 + services/apple/iOS (App)/AppDelegate.h | 12 + services/apple/iOS (App)/AppDelegate.m | 21 + .../Base.lproj/LaunchScreen.storyboard | 41 + .../iOS (App)/Base.lproj/Main.storyboard | 46 + services/apple/iOS (App)/Info.plist | 25 + services/apple/iOS (App)/SceneDelegate.h | 14 + services/apple/iOS (App)/SceneDelegate.m | 12 + services/apple/iOS (App)/main.m | 18 + services/apple/iOS (Extension)/Info.plist | 13 + services/apple/macOS (App)/AppDelegate.h | 12 + services/apple/macOS (App)/AppDelegate.m | 20 + .../macOS (App)/Base.lproj/Main.storyboard | 124 ++ .../apple/macOS (App)/HotPocket.entitlements | 12 + services/apple/macOS (App)/main.m | 15 + .../macOS (Extension)/HotPocket.entitlements | 10 + services/apple/macOS (Extension)/Info.plist | 13 + services/backend/eslint.config.js | 6 + .../apps/accounts/admin/__init__.py | 1 + .../apps/accounts/admin/access_token.py | 17 + .../apps/accounts/backends.py | 36 + .../apps/accounts/middleware.py | 42 + .../accounts/migrations/0005_accesstoken.py | 31 + .../apps/accounts/models/__init__.py | 1 + .../apps/accounts/models/access_token.py | 40 + .../apps/accounts/services/__init__.py | 1 + .../apps/accounts/services/access_tokens.py | 81 ++ .../hotpocket_backend/apps/core/rpc.py | 51 + .../hotpocket_backend/apps/ui/constants.py | 6 + .../hotpocket_backend/apps/ui/dto/accounts.py | 8 + .../apps/ui/forms/accounts/__init__.py | 0 .../apps/ui/forms/accounts/apps.py | 46 + .../apps/ui/forms/accounts/auth.py | 30 + .../{accounts.py => accounts/settings.py} | 29 +- .../apps/ui/forms/associations.py | 9 +- .../hotpocket_backend/apps/ui/forms/base.py | 8 + .../apps/ui/rpc_methods/__init__.py | 2 + .../apps/ui/rpc_methods/accounts/__init__.py | 2 + .../ui/rpc_methods/accounts/access_tokens.py | 43 + .../apps/ui/rpc_methods/accounts/auth.py | 10 + .../apps/ui/rpc_methods/saves.py | 21 + .../apps/ui/services/__init__.py | 1 + .../apps/ui/services/access_tokens.py | 45 + .../ui/services/workflows/saves/create.py | 56 +- .../ui/static/ui/css/hotpocket-backend.css | 6 +- .../apps/ui/static/ui/img/icon-16.png | Bin 1025 -> 874 bytes .../apps/ui/static/ui/img/icon-180.png | Bin 14199 -> 17327 bytes .../apps/ui/static/ui/img/icon-192.png | Bin 15535 -> 17861 bytes .../apps/ui/static/ui/img/icon-32.png | Bin 2059 -> 2197 bytes .../apps/ui/static/ui/img/icon-48.png | Bin 0 -> 3616 bytes .../apps/ui/static/ui/img/icon-512.png | Bin 44994 -> 52639 bytes ...pocket-backend.ui.BrowseAccountAppsView.js | 63 + .../hotpocket-backend.ui.BrowseSavesView.js | 32 +- .../ui/templates/ui/accounts/apps/browse.html | 68 + .../ui/templates/ui/accounts/apps/delete.html | 17 + .../ui/accounts/partials/apps/apps.html | 44 + .../partials/apps/delete_confirmation.html | 7 + .../templates/ui/accounts/partials/nav.html | 15 +- .../partials/association_card.html | 8 +- .../extension/post_authenticate.html | 18 + .../apps/ui/templates/ui/page.html | 5 +- .../apps/ui/templatetags/ui.py | 59 +- .../backend/hotpocket_backend/apps/ui/urls.py | 48 +- .../apps/ui/views/accounts/__init__.py | 5 + .../apps/ui/views/accounts/apps.py | 167 +++ .../apps/ui/views/accounts/auth.py | 66 + .../apps/ui/views/accounts/browse.py | 11 + .../apps/ui/views/accounts/index.py | 13 + .../{accounts.py => accounts/settings.py} | 76 +- .../apps/ui/views/integrations/__init__.py | 1 + .../apps/ui/views/integrations/extension.py | 53 + .../hotpocket_backend/settings/base.py | 1 + .../hotpocket_backend/settings/webapp.py | 22 + services/backend/package.json | 2 +- services/backend/poetry.lock | 51 +- services/backend/pyproject.toml | 7 + services/backend/tasks.py | 10 +- .../factories/accounts/__init__.py | 2 + .../factories/accounts/access_token.py | 27 + .../{accounts.py => accounts/account.py} | 0 .../fixtures/accounts/__init__.py | 2 + .../fixtures/accounts/access_token.py | 122 ++ .../{accounts.py => accounts/account.py} | 0 .../services/accounts/__init__.py | 2 + .../services/accounts/access_tokens.py | 38 + .../services/{ => accounts}/accounts.py | 0 .../tests/ui/views/accounts/apps/__init__.py | 0 .../ui/views/accounts/apps/test_browse.py | 154 +++ .../ui/views/accounts/apps/test_delete.py | 172 +++ .../ui/views/accounts/apps/test_index.py | 60 + .../tests/ui/views/accounts/auth/__init__.py | 0 .../accounts/{ => auth}/test_post_login.py | 0 .../ui/views/accounts/settings/__init__.py | 0 .../accounts/{ => settings}/test_password.py | 0 .../accounts/{ => settings}/test_profile.py | 0 .../accounts/{ => settings}/test_settings.py | 0 .../{ => settings}/test_settings_settings.py | 0 .../views/integrations/extension/__init__.py | 0 .../extension/test_authenticate.py | 68 + .../extension/test_post_authenticate.py | 112 ++ .../backend/tests/ui/views/rpc/__init__.py | 0 .../tests/ui/views/rpc/accounts/__init__.py | 0 .../rpc/accounts/access_tokens/__init__.py | 0 .../rpc/accounts/access_tokens/test_create.py | 154 +++ .../ui/views/rpc/accounts/auth/__init__.py | 0 .../ui/views/rpc/accounts/auth/test_check.py | 157 +++ .../tests/ui/views/rpc/saves/__init__.py | 0 .../tests/ui/views/rpc/saves/test_create.py | 287 ++++ services/extension/.gitignore | 2 + services/extension/Dockerfile | 26 + services/extension/README.md | 3 + .../assets/_locales/en/messages.json | 30 + services/extension/assets/images/icon-128.png | Bin 0 -> 13817 bytes services/extension/assets/images/icon-256.png | Bin 0 -> 27244 bytes services/extension/assets/images/icon-48.png | Bin 0 -> 3910 bytes services/extension/assets/images/icon-512.png | Bin 0 -> 57707 bytes services/extension/assets/images/icon-64.png | Bin 0 -> 5796 bytes services/extension/assets/images/icon-96.png | Bin 0 -> 9900 bytes .../extension/assets/images/toolbar-icon.svg | 29 + services/extension/docker-compose-ci.yaml | 23 + services/extension/docker-compose.yaml | 29 + services/extension/eslint.config.js | 74 ++ services/extension/invoke.yaml | 3 + services/extension/package.json | 27 + services/extension/poetry.lock | 508 ++++++++ services/extension/pyproject.toml | 26 + services/extension/rollup.config.js | 125 ++ services/extension/setup.cfg | 16 + services/extension/src/background/main.js | 300 +++++ services/extension/src/background/safari.js | 6 + services/extension/src/common.js | 34 + services/extension/src/content/main.js | 118 ++ services/extension/src/content/safari.js | 6 + .../src/content/templates/popup.html | 64 + .../templates/popup_content_error.html | 5 + .../templates/popup_content_success.html | 5 + services/extension/src/manifest.js | 1 + services/extension/src/manifest/common.json | 34 + services/extension/src/manifest/safari.json | 9 + services/extension/tasks.py | 112 ++ services/extension/yarn.lock | 1157 +++++++++++++++++ .../hotpocket_common/constants/__init__.py | 1 + .../hotpocket_common/constants/accounts.py | 9 + .../packages/common/hotpocket_common/url.py | 4 + .../soa/hotpocket_soa/dto/accounts.py | 38 + .../packages/soa/hotpocket_soa/dto/base.py | 3 + .../soa/hotpocket_soa/services/__init__.py | 1 + .../hotpocket_soa/services/access_tokens.py | 100 ++ .../hotpocket_testing/fixtures/__init__.py | 1 + .../testing/hotpocket_testing/fixtures/rpc.py | 20 + tasks.py | 2 +- 184 files changed, 7536 insertions(+), 163 deletions(-) create mode 100644 services/apple/.gitignore create mode 100644 services/apple/HotPocket.xcodeproj/project.pbxproj create mode 100644 services/apple/HotPocket.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 services/apple/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/icon-1024 1.png create mode 100644 services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/icon-1024 2.png create mode 100644 services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/icon-16.png create mode 100644 services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/icon-32 1.png create mode 100644 services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/icon-32.png create mode 100644 services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/icon-64.png create mode 100644 services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/icon-mac-1024.png create mode 100644 services/apple/Shared (App)/Assets.xcassets/BackgroundColor.colorset/Contents.json create mode 100644 services/apple/Shared (App)/Assets.xcassets/Contents.json create mode 100644 services/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json create mode 100644 services/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/icon-large-128.png create mode 100644 services/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/icon-large-128@2x.png create mode 100644 services/apple/Shared (App)/Assets.xcassets/LargeIcon.imageset/icon-large-128@3x.png create mode 100644 services/apple/Shared (App)/Assets.xcassets/SecondaryColor.colorset/Contents.json create mode 100644 services/apple/Shared (App)/Resources/Base.lproj/Main.html create mode 100644 services/apple/Shared (App)/Resources/Script.js create mode 100644 services/apple/Shared (App)/Resources/Style.css create mode 100644 services/apple/Shared (App)/Resources/icon-mac-384.png create mode 100644 services/apple/Shared (App)/ViewController.h create mode 100644 services/apple/Shared (App)/ViewController.m create mode 100644 services/apple/Shared (Extension)/Resources/.placeholder create mode 100644 services/apple/Shared (Extension)/SafariWebExtensionHandler.h create mode 100644 services/apple/Shared (Extension)/SafariWebExtensionHandler.m create mode 100644 services/apple/iOS (App)/AppDelegate.h create mode 100644 services/apple/iOS (App)/AppDelegate.m create mode 100644 services/apple/iOS (App)/Base.lproj/LaunchScreen.storyboard create mode 100644 services/apple/iOS (App)/Base.lproj/Main.storyboard create mode 100644 services/apple/iOS (App)/Info.plist create mode 100644 services/apple/iOS (App)/SceneDelegate.h create mode 100644 services/apple/iOS (App)/SceneDelegate.m create mode 100644 services/apple/iOS (App)/main.m create mode 100644 services/apple/iOS (Extension)/Info.plist create mode 100644 services/apple/macOS (App)/AppDelegate.h create mode 100644 services/apple/macOS (App)/AppDelegate.m create mode 100644 services/apple/macOS (App)/Base.lproj/Main.storyboard create mode 100644 services/apple/macOS (App)/HotPocket.entitlements create mode 100644 services/apple/macOS (App)/main.m create mode 100644 services/apple/macOS (Extension)/HotPocket.entitlements create mode 100644 services/apple/macOS (Extension)/Info.plist create mode 100644 services/backend/hotpocket_backend/apps/accounts/admin/access_token.py create mode 100644 services/backend/hotpocket_backend/apps/accounts/backends.py create mode 100644 services/backend/hotpocket_backend/apps/accounts/middleware.py create mode 100644 services/backend/hotpocket_backend/apps/accounts/migrations/0005_accesstoken.py create mode 100644 services/backend/hotpocket_backend/apps/accounts/models/access_token.py create mode 100644 services/backend/hotpocket_backend/apps/accounts/services/__init__.py create mode 100644 services/backend/hotpocket_backend/apps/accounts/services/access_tokens.py create mode 100644 services/backend/hotpocket_backend/apps/core/rpc.py create mode 100644 services/backend/hotpocket_backend/apps/ui/dto/accounts.py create mode 100644 services/backend/hotpocket_backend/apps/ui/forms/accounts/__init__.py create mode 100644 services/backend/hotpocket_backend/apps/ui/forms/accounts/apps.py create mode 100644 services/backend/hotpocket_backend/apps/ui/forms/accounts/auth.py rename services/backend/hotpocket_backend/apps/ui/forms/{accounts.py => accounts/settings.py} (85%) create mode 100644 services/backend/hotpocket_backend/apps/ui/rpc_methods/__init__.py create mode 100644 services/backend/hotpocket_backend/apps/ui/rpc_methods/accounts/__init__.py create mode 100644 services/backend/hotpocket_backend/apps/ui/rpc_methods/accounts/access_tokens.py create mode 100644 services/backend/hotpocket_backend/apps/ui/rpc_methods/accounts/auth.py create mode 100644 services/backend/hotpocket_backend/apps/ui/rpc_methods/saves.py create mode 100644 services/backend/hotpocket_backend/apps/ui/services/access_tokens.py create mode 100644 services/backend/hotpocket_backend/apps/ui/static/ui/img/icon-48.png create mode 100644 services/backend/hotpocket_backend/apps/ui/static/ui/js/hotpocket-backend.ui.BrowseAccountAppsView.js create mode 100644 services/backend/hotpocket_backend/apps/ui/templates/ui/accounts/apps/browse.html create mode 100644 services/backend/hotpocket_backend/apps/ui/templates/ui/accounts/apps/delete.html create mode 100644 services/backend/hotpocket_backend/apps/ui/templates/ui/accounts/partials/apps/apps.html create mode 100644 services/backend/hotpocket_backend/apps/ui/templates/ui/accounts/partials/apps/delete_confirmation.html create mode 100644 services/backend/hotpocket_backend/apps/ui/templates/ui/integrations/extension/post_authenticate.html create mode 100644 services/backend/hotpocket_backend/apps/ui/views/accounts/__init__.py create mode 100644 services/backend/hotpocket_backend/apps/ui/views/accounts/apps.py create mode 100644 services/backend/hotpocket_backend/apps/ui/views/accounts/auth.py create mode 100644 services/backend/hotpocket_backend/apps/ui/views/accounts/browse.py create mode 100644 services/backend/hotpocket_backend/apps/ui/views/accounts/index.py rename services/backend/hotpocket_backend/apps/ui/views/{accounts.py => accounts/settings.py} (67%) create mode 100644 services/backend/hotpocket_backend/apps/ui/views/integrations/extension.py create mode 100644 services/backend/testing/hotpocket_backend_testing/factories/accounts/__init__.py create mode 100644 services/backend/testing/hotpocket_backend_testing/factories/accounts/access_token.py rename services/backend/testing/hotpocket_backend_testing/factories/{accounts.py => accounts/account.py} (100%) create mode 100644 services/backend/testing/hotpocket_backend_testing/fixtures/accounts/__init__.py create mode 100644 services/backend/testing/hotpocket_backend_testing/fixtures/accounts/access_token.py rename services/backend/testing/hotpocket_backend_testing/fixtures/{accounts.py => accounts/account.py} (100%) create mode 100644 services/backend/testing/hotpocket_backend_testing/services/accounts/__init__.py create mode 100644 services/backend/testing/hotpocket_backend_testing/services/accounts/access_tokens.py rename services/backend/testing/hotpocket_backend_testing/services/{ => accounts}/accounts.py (100%) create mode 100644 services/backend/tests/ui/views/accounts/apps/__init__.py create mode 100644 services/backend/tests/ui/views/accounts/apps/test_browse.py create mode 100644 services/backend/tests/ui/views/accounts/apps/test_delete.py create mode 100644 services/backend/tests/ui/views/accounts/apps/test_index.py create mode 100644 services/backend/tests/ui/views/accounts/auth/__init__.py rename services/backend/tests/ui/views/accounts/{ => auth}/test_post_login.py (100%) create mode 100644 services/backend/tests/ui/views/accounts/settings/__init__.py rename services/backend/tests/ui/views/accounts/{ => settings}/test_password.py (100%) rename services/backend/tests/ui/views/accounts/{ => settings}/test_profile.py (100%) rename services/backend/tests/ui/views/accounts/{ => settings}/test_settings.py (100%) rename services/backend/tests/ui/views/accounts/{ => settings}/test_settings_settings.py (100%) create mode 100644 services/backend/tests/ui/views/integrations/extension/__init__.py create mode 100644 services/backend/tests/ui/views/integrations/extension/test_authenticate.py create mode 100644 services/backend/tests/ui/views/integrations/extension/test_post_authenticate.py create mode 100644 services/backend/tests/ui/views/rpc/__init__.py create mode 100644 services/backend/tests/ui/views/rpc/accounts/__init__.py create mode 100644 services/backend/tests/ui/views/rpc/accounts/access_tokens/__init__.py create mode 100644 services/backend/tests/ui/views/rpc/accounts/access_tokens/test_create.py create mode 100644 services/backend/tests/ui/views/rpc/accounts/auth/__init__.py create mode 100644 services/backend/tests/ui/views/rpc/accounts/auth/test_check.py create mode 100644 services/backend/tests/ui/views/rpc/saves/__init__.py create mode 100644 services/backend/tests/ui/views/rpc/saves/test_create.py create mode 100644 services/extension/.gitignore create mode 100644 services/extension/Dockerfile create mode 100644 services/extension/README.md create mode 100644 services/extension/assets/_locales/en/messages.json create mode 100644 services/extension/assets/images/icon-128.png create mode 100644 services/extension/assets/images/icon-256.png create mode 100644 services/extension/assets/images/icon-48.png create mode 100644 services/extension/assets/images/icon-512.png create mode 100644 services/extension/assets/images/icon-64.png create mode 100644 services/extension/assets/images/icon-96.png create mode 100644 services/extension/assets/images/toolbar-icon.svg create mode 100644 services/extension/docker-compose-ci.yaml create mode 100644 services/extension/docker-compose.yaml create mode 100644 services/extension/eslint.config.js create mode 100644 services/extension/invoke.yaml create mode 100644 services/extension/package.json create mode 100644 services/extension/poetry.lock create mode 100644 services/extension/pyproject.toml create mode 100644 services/extension/rollup.config.js create mode 100644 services/extension/setup.cfg create mode 100644 services/extension/src/background/main.js create mode 100644 services/extension/src/background/safari.js create mode 100644 services/extension/src/common.js create mode 100644 services/extension/src/content/main.js create mode 100644 services/extension/src/content/safari.js create mode 100644 services/extension/src/content/templates/popup.html create mode 100644 services/extension/src/content/templates/popup_content_error.html create mode 100644 services/extension/src/content/templates/popup_content_success.html create mode 100644 services/extension/src/manifest.js create mode 100644 services/extension/src/manifest/common.json create mode 100644 services/extension/src/manifest/safari.json create mode 100644 services/extension/tasks.py create mode 100644 services/extension/yarn.lock create mode 100644 services/packages/common/hotpocket_common/constants/accounts.py create mode 100644 services/packages/soa/hotpocket_soa/dto/accounts.py create mode 100644 services/packages/soa/hotpocket_soa/services/access_tokens.py create mode 100644 services/packages/testing/hotpocket_testing/fixtures/rpc.py diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index bf34b9c..0287407 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -61,14 +61,29 @@ jobs: push: false load: true tags: "docker-hosted.nexus.bthlabs.pl/hotpocket/packages:ci-local" + - name: "Build `extension-ci` image" + uses: docker/build-push-action@v6 + with: + file: "services/extension/Dockerfile" + context: "services/" + target: "ci" + push: false + load: true + tags: "docker-hosted.nexus.bthlabs.pl/hotpocket/extension:ci-local" - name: "Run `backend` checks" run: | set -x docker compose -f docker-compose.yaml -f docker-compose-ci.yaml run --rm backend-ci inv ci - name: "Run `packages` checks" + if: always() run: | set -x docker compose -f docker-compose.yaml -f docker-compose-ci.yaml run --rm packages-ci inv ci + - name: "Run `extension` checks" + if: always() + run: | + set -x + docker compose -f docker-compose.yaml -f docker-compose-ci.yaml run --rm extension-ci inv ci - name: "Clean up" if: always() run: | diff --git a/docker-bake.json b/docker-bake.json index 7e99f73..51a16d5 100644 --- a/docker-bake.json +++ b/docker-bake.json @@ -4,6 +4,7 @@ "targets": [ "backend-management", "caddy", + "extension-management", "keycloak", "packages-management", "postgres", @@ -67,6 +68,28 @@ "type=docker,load=true,push=false" ] }, + "extension-management": { + "context": "services/", + "dockerfile": "extension/Dockerfile", + "tags": [ + "docker-hosted.nexus.bthlabs.pl/hotpocket/extension:local" + ], + "target": "development", + "output": [ + "type=docker,load=true,push=false" + ] + }, + "extension-ci": { + "context": "services/", + "dockerfile": "extension/Dockerfile", + "tags": [ + "docker-hosted.nexus.bthlabs.pl/hotpocket/extension:ci-local" + ], + "target": "ci", + "output": [ + "type=docker,load=true,push=false" + ] + }, "caddy": { "context": "services/", "dockerfile": "caddy/Dockerfile", diff --git a/docker-compose-ci.yaml b/docker-compose-ci.yaml index a89a36b..ea1dc20 100644 --- a/docker-compose-ci.yaml +++ b/docker-compose-ci.yaml @@ -13,3 +13,4 @@ services: include: - path: "./services/backend/docker-compose-ci.yaml" - path: "./services/packages/docker-compose-ci.yaml" + - path: "./services/extension/docker-compose-ci.yaml" diff --git a/docker-compose.yaml b/docker-compose.yaml index ddb80d1..f4e24c7 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -5,6 +5,7 @@ include: - path: "./docker-compose-cloud.yaml" - path: "./services/backend/docker-compose.yaml" - path: "./services/packages/docker-compose.yaml" + - path: "./services/extension/docker-compose.yaml" volumes: {} diff --git a/services/.dockerignore b/services/.dockerignore index 0ce45c8..68b7604 100644 --- a/services/.dockerignore +++ b/services/.dockerignore @@ -1,4 +1,5 @@ _tmp/ +apple/ backend/node_modules/ backend/ops/metal/ backend/hotpocket_backend/playground.py @@ -7,4 +8,6 @@ backend/hotpocket_backend/settings/docker/ backend/hotpocket_backend/secrets/metal/ backend/hotpocket_backend/settings/metal/ backend/hotpocket_backend/static/ +extension/node_modules/ +extension/dist/ .envrc* diff --git a/services/apple/.gitignore b/services/apple/.gitignore new file mode 100644 index 0000000..911edee --- /dev/null +++ b/services/apple/.gitignore @@ -0,0 +1,92 @@ +# Xcode + +## Build generated +build/ +DerivedData/ + +## Various settings +ExportOptions.plist +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ + +## Other +*.moved-aside +*.xccheckout +*.xcscmblueprint + +## We don't want any memgrap's to leak ;) +**.memgraph + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +# Pods/ +# +# Add this line if you want to avoid checking in source code from the Xcode workspace +# *.xcworkspace + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output +fastlane/*.env + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ + +# Extension stuff +Shared (Extension)/Resources/_locales/ +Shared (Extension)/Resources/images/ +Shared (Extension)/Resources/background-bundle.js +Shared (Extension)/Resources/content-bundle.js +Shared (Extension)/Resources/manifest.json diff --git a/services/apple/HotPocket.xcodeproj/project.pbxproj b/services/apple/HotPocket.xcodeproj/project.pbxproj new file mode 100644 index 0000000..18f8697 --- /dev/null +++ b/services/apple/HotPocket.xcodeproj/project.pbxproj @@ -0,0 +1,897 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 4CABCAD62E56F0C900D8A354 /* HotPocket Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 4CABCAD52E56F0C900D8A354 /* HotPocket Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 4CABCAE02E56F0C900D8A354 /* HotPocket Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 4CABCADF2E56F0C900D8A354 /* HotPocket Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 4CABCAD72E56F0C900D8A354 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4CABCA922E56F0C800D8A354 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4CABCAD42E56F0C900D8A354; + remoteInfo = "HotPocket Extension (iOS)"; + }; + 4CABCAE12E56F0C900D8A354 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4CABCA922E56F0C800D8A354 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4CABCADE2E56F0C900D8A354; + remoteInfo = "HotPocket Extension (macOS)"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 4CABCB092E56F0C900D8A354 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 4CABCAD62E56F0C900D8A354 /* HotPocket Extension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; + 4CABCB132E56F0C900D8A354 /* Embed Foundation Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 4CABCAE02E56F0C900D8A354 /* HotPocket Extension.appex in Embed Foundation Extensions */, + ); + name = "Embed Foundation Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 4CABCAB02E56F0C900D8A354 /* HotPocket.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HotPocket.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CABCAC62E56F0C900D8A354 /* HotPocket.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = HotPocket.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CABCAD52E56F0C900D8A354 /* HotPocket Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "HotPocket Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4CABCADF2E56F0C900D8A354 /* HotPocket Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "HotPocket Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 4CABCB042E56F0C900D8A354 /* Exceptions for "Shared (App)" folder in "HotPocket (iOS)" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + "/Localized: Resources/Main.html", + Assets.xcassets, + "Resources/icon-mac-384.png", + Resources/Script.js, + Resources/Style.css, + ViewController.m, + ); + target = 4CABCAAF2E56F0C900D8A354 /* HotPocket (iOS) */; + }; + 4CABCB082E56F0C900D8A354 /* Exceptions for "iOS (Extension)" folder in "HotPocket Extension (iOS)" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 4CABCAD42E56F0C900D8A354 /* HotPocket Extension (iOS) */; + }; + 4CABCB0D2E56F0C900D8A354 /* Exceptions for "iOS (App)" folder in "HotPocket (iOS)" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 4CABCAAF2E56F0C900D8A354 /* HotPocket (iOS) */; + }; + 4CABCB0E2E56F0C900D8A354 /* Exceptions for "Shared (App)" folder in "HotPocket (macOS)" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + "/Localized: Resources/Main.html", + Assets.xcassets, + "Resources/icon-mac-384.png", + Resources/Script.js, + Resources/Style.css, + ViewController.m, + ); + target = 4CABCAC52E56F0C900D8A354 /* HotPocket (macOS) */; + }; + 4CABCB122E56F0C900D8A354 /* Exceptions for "macOS (Extension)" folder in "HotPocket Extension (macOS)" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Info.plist, + ); + target = 4CABCADE2E56F0C900D8A354 /* HotPocket Extension (macOS) */; + }; + 4CABCB172E56F0C900D8A354 /* Exceptions for "Shared (Extension)" folder in "HotPocket Extension (iOS)" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Resources/_locales, + "Resources/background-bundle.js", + "Resources/content-bundle.js", + Resources/images, + Resources/manifest.json, + SafariWebExtensionHandler.m, + ); + target = 4CABCAD42E56F0C900D8A354 /* HotPocket Extension (iOS) */; + }; + 4CABCB182E56F0C900D8A354 /* Exceptions for "Shared (Extension)" folder in "HotPocket Extension (macOS)" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Resources/_locales, + "Resources/background-bundle.js", + "Resources/content-bundle.js", + Resources/images, + Resources/manifest.json, + SafariWebExtensionHandler.m, + ); + target = 4CABCADE2E56F0C900D8A354 /* HotPocket Extension (macOS) */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 4CABCA962E56F0C800D8A354 /* Shared (App) */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 4CABCB042E56F0C900D8A354 /* Exceptions for "Shared (App)" folder in "HotPocket (iOS)" target */, + 4CABCB0E2E56F0C900D8A354 /* Exceptions for "Shared (App)" folder in "HotPocket (macOS)" target */, + ); + path = "Shared (App)"; + sourceTree = ""; + }; + 4CABCAA02E56F0C900D8A354 /* Shared (Extension) */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 4CABCB172E56F0C900D8A354 /* Exceptions for "Shared (Extension)" folder in "HotPocket Extension (iOS)" target */, + 4CABCB182E56F0C900D8A354 /* Exceptions for "Shared (Extension)" folder in "HotPocket Extension (macOS)" target */, + ); + explicitFolders = ( + Resources/_locales, + Resources/images, + ); + path = "Shared (Extension)"; + sourceTree = ""; + }; + 4CABCAB22E56F0C900D8A354 /* iOS (App) */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 4CABCB0D2E56F0C900D8A354 /* Exceptions for "iOS (App)" folder in "HotPocket (iOS)" target */, + ); + path = "iOS (App)"; + sourceTree = ""; + }; + 4CABCAC72E56F0C900D8A354 /* macOS (App) */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = "macOS (App)"; + sourceTree = ""; + }; + 4CABCAD92E56F0C900D8A354 /* iOS (Extension) */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 4CABCB082E56F0C900D8A354 /* Exceptions for "iOS (Extension)" folder in "HotPocket Extension (iOS)" target */, + ); + path = "iOS (Extension)"; + sourceTree = ""; + }; + 4CABCAE32E56F0C900D8A354 /* macOS (Extension) */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 4CABCB122E56F0C900D8A354 /* Exceptions for "macOS (Extension)" folder in "HotPocket Extension (macOS)" target */, + ); + path = "macOS (Extension)"; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4CABCAAD2E56F0C900D8A354 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CABCAC32E56F0C900D8A354 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CABCAD22E56F0C900D8A354 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CABCADC2E56F0C900D8A354 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4CABCA912E56F0C800D8A354 = { + isa = PBXGroup; + children = ( + 4CABCA962E56F0C800D8A354 /* Shared (App) */, + 4CABCAA02E56F0C900D8A354 /* Shared (Extension) */, + 4CABCAB22E56F0C900D8A354 /* iOS (App) */, + 4CABCAC72E56F0C900D8A354 /* macOS (App) */, + 4CABCAD92E56F0C900D8A354 /* iOS (Extension) */, + 4CABCAE32E56F0C900D8A354 /* macOS (Extension) */, + 4CABCAB12E56F0C900D8A354 /* Products */, + ); + sourceTree = ""; + }; + 4CABCAB12E56F0C900D8A354 /* Products */ = { + isa = PBXGroup; + children = ( + 4CABCAB02E56F0C900D8A354 /* HotPocket.app */, + 4CABCAC62E56F0C900D8A354 /* HotPocket.app */, + 4CABCAD52E56F0C900D8A354 /* HotPocket Extension.appex */, + 4CABCADF2E56F0C900D8A354 /* HotPocket Extension.appex */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 4CABCAAF2E56F0C900D8A354 /* HotPocket (iOS) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4CABCB0A2E56F0C900D8A354 /* Build configuration list for PBXNativeTarget "HotPocket (iOS)" */; + buildPhases = ( + 4CABCAAC2E56F0C900D8A354 /* Sources */, + 4CABCAAD2E56F0C900D8A354 /* Frameworks */, + 4CABCAAE2E56F0C900D8A354 /* Resources */, + 4CABCB092E56F0C900D8A354 /* Embed Foundation Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 4CABCAD82E56F0C900D8A354 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 4CABCAB22E56F0C900D8A354 /* iOS (App) */, + ); + name = "HotPocket (iOS)"; + packageProductDependencies = ( + ); + productName = "HotPocket (iOS)"; + productReference = 4CABCAB02E56F0C900D8A354 /* HotPocket.app */; + productType = "com.apple.product-type.application"; + }; + 4CABCAC52E56F0C900D8A354 /* HotPocket (macOS) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4CABCB142E56F0C900D8A354 /* Build configuration list for PBXNativeTarget "HotPocket (macOS)" */; + buildPhases = ( + 4CABCAC22E56F0C900D8A354 /* Sources */, + 4CABCAC32E56F0C900D8A354 /* Frameworks */, + 4CABCAC42E56F0C900D8A354 /* Resources */, + 4CABCB132E56F0C900D8A354 /* Embed Foundation Extensions */, + ); + buildRules = ( + ); + dependencies = ( + 4CABCAE22E56F0C900D8A354 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 4CABCAC72E56F0C900D8A354 /* macOS (App) */, + ); + name = "HotPocket (macOS)"; + packageProductDependencies = ( + ); + productName = "HotPocket (macOS)"; + productReference = 4CABCAC62E56F0C900D8A354 /* HotPocket.app */; + productType = "com.apple.product-type.application"; + }; + 4CABCAD42E56F0C900D8A354 /* HotPocket Extension (iOS) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4CABCB052E56F0C900D8A354 /* Build configuration list for PBXNativeTarget "HotPocket Extension (iOS)" */; + buildPhases = ( + 4CABCAD12E56F0C900D8A354 /* Sources */, + 4CABCAD22E56F0C900D8A354 /* Frameworks */, + 4CABCAD32E56F0C900D8A354 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 4CABCAD92E56F0C900D8A354 /* iOS (Extension) */, + ); + name = "HotPocket Extension (iOS)"; + packageProductDependencies = ( + ); + productName = "HotPocket Extension (iOS)"; + productReference = 4CABCAD52E56F0C900D8A354 /* HotPocket Extension.appex */; + productType = "com.apple.product-type.app-extension"; + }; + 4CABCADE2E56F0C900D8A354 /* HotPocket Extension (macOS) */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4CABCB0F2E56F0C900D8A354 /* Build configuration list for PBXNativeTarget "HotPocket Extension (macOS)" */; + buildPhases = ( + 4CABCADB2E56F0C900D8A354 /* Sources */, + 4CABCADC2E56F0C900D8A354 /* Frameworks */, + 4CABCADD2E56F0C900D8A354 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 4CABCAE32E56F0C900D8A354 /* macOS (Extension) */, + ); + name = "HotPocket Extension (macOS)"; + packageProductDependencies = ( + ); + productName = "HotPocket Extension (macOS)"; + productReference = 4CABCADF2E56F0C900D8A354 /* HotPocket Extension.appex */; + productType = "com.apple.product-type.app-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4CABCA922E56F0C800D8A354 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastUpgradeCheck = 1640; + TargetAttributes = { + 4CABCAAF2E56F0C900D8A354 = { + CreatedOnToolsVersion = 16.4; + }; + 4CABCAC52E56F0C900D8A354 = { + CreatedOnToolsVersion = 16.4; + }; + 4CABCAD42E56F0C900D8A354 = { + CreatedOnToolsVersion = 16.4; + }; + 4CABCADE2E56F0C900D8A354 = { + CreatedOnToolsVersion = 16.4; + }; + }; + }; + buildConfigurationList = 4CABCA952E56F0C800D8A354 /* Build configuration list for PBXProject "HotPocket" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 4CABCA912E56F0C800D8A354; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 4CABCAB12E56F0C900D8A354 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4CABCAAF2E56F0C900D8A354 /* HotPocket (iOS) */, + 4CABCAC52E56F0C900D8A354 /* HotPocket (macOS) */, + 4CABCAD42E56F0C900D8A354 /* HotPocket Extension (iOS) */, + 4CABCADE2E56F0C900D8A354 /* HotPocket Extension (macOS) */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 4CABCAAE2E56F0C900D8A354 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CABCAC42E56F0C900D8A354 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CABCAD32E56F0C900D8A354 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CABCADD2E56F0C900D8A354 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 4CABCAAC2E56F0C900D8A354 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CABCAC22E56F0C900D8A354 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CABCAD12E56F0C900D8A354 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4CABCADB2E56F0C900D8A354 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 4CABCAD82E56F0C900D8A354 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4CABCAD42E56F0C900D8A354 /* HotPocket Extension (iOS) */; + targetProxy = 4CABCAD72E56F0C900D8A354 /* PBXContainerItemProxy */; + }; + 4CABCAE22E56F0C900D8A354 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4CABCADE2E56F0C900D8A354 /* HotPocket Extension (macOS) */; + targetProxy = 4CABCAE12E56F0C900D8A354 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 4CABCB062E56F0C900D8A354 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 648728X64K; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "iOS (Extension)/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = HotPocket; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0.0; + OTHER_LDFLAGS = ( + "-framework", + SafariServices, + ); + PRODUCT_BUNDLE_IDENTIFIER = pl.bthlabs.HotPocket.HotPocket.iOS.Extension; + PRODUCT_NAME = "HotPocket Extension"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 4CABCB072E56F0C900D8A354 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 648728X64K; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "iOS (Extension)/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = HotPocket; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + MARKETING_VERSION = 1.0.0; + OTHER_LDFLAGS = ( + "-framework", + SafariServices, + ); + PRODUCT_BUNDLE_IDENTIFIER = pl.bthlabs.HotPocket.HotPocket.iOS.Extension; + PRODUCT_NAME = "HotPocket Extension"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 4CABCB0B2E56F0C900D8A354 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 648728X64K; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "iOS (App)/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = HotPocket; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + OTHER_LDFLAGS = ( + "-framework", + SafariServices, + "-framework", + WebKit, + ); + PRODUCT_BUNDLE_IDENTIFIER = pl.bthlabs.HotPocket.iOS; + PRODUCT_NAME = HotPocket; + SDKROOT = iphoneos; + SWIFT_EMIT_LOC_STRINGS = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 4CABCB0C2E56F0C900D8A354 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 648728X64K; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "iOS (App)/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = HotPocket; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIMainStoryboardFile = Main; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0.0; + OTHER_LDFLAGS = ( + "-framework", + SafariServices, + "-framework", + WebKit, + ); + PRODUCT_BUNDLE_IDENTIFIER = pl.bthlabs.HotPocket.iOS; + PRODUCT_NAME = HotPocket; + SDKROOT = iphoneos; + SWIFT_EMIT_LOC_STRINGS = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 4CABCB102E56F0C900D8A354 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = "macOS (Extension)/HotPocket.entitlements"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 648728X64K; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "macOS (Extension)/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = HotPocket; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.14; + MARKETING_VERSION = 1.0.0; + OTHER_LDFLAGS = ( + "-framework", + SafariServices, + ); + PRODUCT_BUNDLE_IDENTIFIER = pl.bthlabs.HotPocket.HotPocket.Extension; + PRODUCT_NAME = "HotPocket Extension"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + }; + name = Debug; + }; + 4CABCB112E56F0C900D8A354 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_ENTITLEMENTS = "macOS (Extension)/HotPocket.entitlements"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 648728X64K; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "macOS (Extension)/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = HotPocket; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + "@executable_path/../../../../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.14; + MARKETING_VERSION = 1.0.0; + OTHER_LDFLAGS = ( + "-framework", + SafariServices, + ); + PRODUCT_BUNDLE_IDENTIFIER = pl.bthlabs.HotPocket.HotPocket.Extension; + PRODUCT_NAME = "HotPocket Extension"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + }; + name = Release; + }; + 4CABCB152E56F0C900D8A354 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "macOS (App)/HotPocket.entitlements"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 648728X64K; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = HotPocket; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_NSMainStoryboardFile = Main; + INFOPLIST_KEY_NSPrincipalClass = NSApplication; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = 1.0.0; + OTHER_LDFLAGS = ( + "-framework", + SafariServices, + "-framework", + WebKit, + ); + PRODUCT_BUNDLE_IDENTIFIER = pl.bthlabs.HotPocket.macOS; + PRODUCT_NAME = HotPocket; + REGISTER_APP_GROUPS = YES; + SDKROOT = macosx; + SWIFT_EMIT_LOC_STRINGS = YES; + }; + name = Debug; + }; + 4CABCB162E56F0C900D8A354 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "macOS (App)/HotPocket.entitlements"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 648728X64K; + ENABLE_HARDENED_RUNTIME = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = HotPocket; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_NSMainStoryboardFile = Main; + INFOPLIST_KEY_NSPrincipalClass = NSApplication; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = 1.0.0; + OTHER_LDFLAGS = ( + "-framework", + SafariServices, + "-framework", + WebKit, + ); + PRODUCT_BUNDLE_IDENTIFIER = pl.bthlabs.HotPocket.macOS; + PRODUCT_NAME = HotPocket; + REGISTER_APP_GROUPS = YES; + SDKROOT = macosx; + SWIFT_EMIT_LOC_STRINGS = YES; + }; + name = Release; + }; + 4CABCB192E56F0C900D8A354 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 648728X64K; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + }; + name = Debug; + }; + 4CABCB1A2E56F0C900D8A354 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 648728X64K; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4CABCA952E56F0C800D8A354 /* Build configuration list for PBXProject "HotPocket" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CABCB192E56F0C900D8A354 /* Debug */, + 4CABCB1A2E56F0C900D8A354 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4CABCB052E56F0C900D8A354 /* Build configuration list for PBXNativeTarget "HotPocket Extension (iOS)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CABCB062E56F0C900D8A354 /* Debug */, + 4CABCB072E56F0C900D8A354 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4CABCB0A2E56F0C900D8A354 /* Build configuration list for PBXNativeTarget "HotPocket (iOS)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CABCB0B2E56F0C900D8A354 /* Debug */, + 4CABCB0C2E56F0C900D8A354 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4CABCB0F2E56F0C900D8A354 /* Build configuration list for PBXNativeTarget "HotPocket Extension (macOS)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CABCB102E56F0C900D8A354 /* Debug */, + 4CABCB112E56F0C900D8A354 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4CABCB142E56F0C900D8A354 /* Build configuration list for PBXNativeTarget "HotPocket (macOS)" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4CABCB152E56F0C900D8A354 /* Debug */, + 4CABCB162E56F0C900D8A354 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 4CABCA922E56F0C800D8A354 /* Project object */; +} diff --git a/services/apple/HotPocket.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/services/apple/HotPocket.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/services/apple/HotPocket.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/services/apple/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json b/services/apple/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..43943b2 --- /dev/null +++ b/services/apple/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xED", + "green" : "0xBA", + "red" : "0x1C" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json b/services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..7ba1282 --- /dev/null +++ b/services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "filename" : "icon-1024.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "icon-1024 1.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "filename" : "icon-1024 2.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "filename" : "icon-16.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : "icon-32.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : "icon-32 1.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : "icon-64.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : "icon-mac-1024.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/icon-1024 1.png b/services/apple/Shared (App)/Assets.xcassets/AppIcon.appiconset/icon-1024 1.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef60f0ebb782466dc2e24f7396f3b8e426f25a0 GIT binary patch literal 118140 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
YVWM2gztxX5$ zu;Hm{jhVBs{;67TXiPBZiy6}D?Y1~2?zhXP0a6bq0}a1oc6RlZF(E9G5y%>x2+Mu~ z?C5b;H6Sg>WgsN+ePX{t_9ykDb0$|O=Gsw`#o3bq$Gz|ALU%~5o-iC6i&9t+_xE7; zZs;CQu;4fwE2rVKOq6>(CNWX))2*Wg?jt%s&j!eW#|F$ri9m(h(rp3)+=KIIX4=Gwti?7D6^kPnt;Fp^Y!}38#1&z zUMV9aqj^yOeBTY(&T19Baci=X(!^z)k0MS=gM=10Q~w2lLx#Z6M~03rlQNx5Wt->8 zUdO`JA12OR>GKe0f+EO=D6LR-zFHOfBN#Nx~aNoR=;|V__5C9Ik@b zP6F|>GeT26ulXQJ>n!dc&Nc(1xf8LXzHD^g%_L82hZVZoKN6U()N;X8zZj_JR9~Ws zOYkQ?B+5z$@yY+R&aW`iQHI}ZA=meQY$f5a9axa*ldRLcEtp#s8Ja(; zf9D6Xa<{K|)?i3h3Ambd>Uh0Mk)8OKLDOd7SCEA=ZBH}A3Gm&1`?0m^YH-p>?&B|K zRF1M(QvEe8&*K_cuDl9qEk5(;;?%IDcj0JkR}9|#^2=&8rCg6j7GUdSvNUS1&3Gn| zCQR0QAJlDkHaQn9vMB6&c>4TWw-7Vw!Ed>FGT_U(L9 z=?25@9Wu$&W4WZ!8t3ZSN=y9aP!5~iZ@uc7OF_c&oP+qZde{o4D?fKS?QPgBv6c&m z?2n-a1_*1n2;vxo)Mt5<@yhgH^$Xr|PsR%>MCXV;`lB0hie4S@1_A|XO4@81v zt+JZ7o+60H;~uuhVk(@(n}9F;7*ay2+i!7VAJnKBAwzu?yHC{9l4-IIx!qzteiq5F z*4&%UF_eii>555SmbGHB^7HiDnixP)ptuiUfju_;RDAbBMpUVtSzfc0K;FBEvqnii zP`H#G31{8_%PHY~{GIQQMk0}=`L7HWmZTWMgEzL&Yc|WnoWCX_gN^Micd=^W#G64z zU#yPN;uwhul436BHKGpHncEPAmC_WOUN|v<{#ecrQL@_f(zDV>fb3ZOUK{|gu5>8l z8YI2?Qh$t~)vORb*7vl`^pcMStWWr6W(VkZ*d5>1YHv?mp=+~R{VsxuwI2=4Nma&!#?K!1V!}s+*yg)D4_>%4U_QrJW zo$reIu$j~qlm0ll(gl?yF(p`UQ+}1?Y|l=T5SSVmQjZ&q_-NuzL#B}O#6e0D|H;{Z z(L>29Yi7W^<3PDMk-!$#(i3(S*|i_2*?V;aobG`4N>6ECw7;?K0q6BnGO>6nyh=4O z1|{hEKnyG25@(L{H+Y=p^__8I0--#ixk|>KTp2S5PYbLFQ%MQmozI%oLA2xVFQJcK z(rX+&a$G;K8|7@VxLmt4x&7)K71?&pR8dx+e?i1^ZA@O9!)db9hF=%n zsFK>%ZU&6;XU$pu&9auT^l1B3?O)~2Di}xh8$0*(5-U+38|*xBjza4=+O2V?`Z{u2 z^xCr|Q*Uzlfnz!K_e!&-pue64Alv!Mhe(@TzqInBgkHjIZMZ4({ilnN$IudX)9i?g{pqHc2Bku$>`LA;qw$F0iBcI2@N?>k46zXQ zbn$ttcC}NvHoq4vw?oH!)3)PYQ`+YFftdZxqyeC9qo4NPS0Xyu*dK_yIr&9b981W) z@pRgycsUpdf7rkO&fme9@VnL z2+Uek;mvPs6JWd*0VSSFMzwrdPW3X4L;j#AP)!9Pn-ej*VbuBVm|XuM=9U=LAB+DK z^jMlAMEgz2$De^Lq0%&NY$4Ls9Cnr!A+*oGZS-x5I!(GN7?kuBQxfjQaKrTPT4FD5 z3-gLt-nCndb0+o^d9#@*a~~9}XD@m`sm}g*LVSH=_lSg+fKq8v_t$24E&zqWM~!?_ zE4$f?{UE_V=NCIp+2~8 zy-qZB?(NP~C+b%#;{CXwmFpMB+gj4!mtCY3$>8ON@NfbMt$ZkE^l>hDfqvS;BTs>I z+snabcd)57A^e~_!T~NSDBft0chGE^vQaIjjN`EN-!0$XDpX_GJUj?HhkD|< zeBrvNOY$y!ibT(?S`+%V+C5TddcS9Qs=7QpnVplN-&Xl+zbQgUP}5@QkLl^xyLzE(hD6Xcb}R2G_V(QRw$m2~pE02`NE-%jejGmPN{s3IcLA$8yZ8Y$StL zE!4vFuWKbqrJE!iI@oSxXTFEo9F_Hoy)U*52_M+Q5-L5(hzM=u(7=N5y15m)Uk(8T-6qgkQ&H@R>&mg)^54=UYX`6T-$b`N{66C7RY#F&+l`{Oa3aCg3 z@J`W*$txfQqP%smehNqqdQ0Z?{aEl-+Ggiw9V*})R2VU<2R;+!zeA_O?@?0kGE^ge z@OWXKS3h|Dk_C69`OWTV9F+2FPf#43chHGsqi<2%ZYY$vmp_?0H@U%oRfX(W;9kS# zSW4O$&z=YDQwOd8_xX3A`j`qR+L3dj>|Kz@ZOxGRL(PVDGiY^Qo|Piqsu^9uY7rRU zc6|3hiJA41;`p-@B_)B14Ls`m8?LBH_vF;b=t!HyXA|mA8W>~p6;IP4o392dek908 z6ZGH1d}nwMu?>XH4-frStY`dICrx}5cmk>q)D%*!(PuX`_M}uxOLj}swHuIC7x^Y| zd#%q~K7s3%>xiECrytaR{%nA$r8FFf9gn+O76xt)v{ewtcW*O1tBi~)etu!qGrS|f zU)Y**dmJ^_tm2e7#|Pj@rF0dkTY%H@Y9imL&0v}EMbETqlAgp=*?_UzN-nSa`9ko{ z9k$gfyL%Je6ioY-bmr*GcvHCDG_e@8u$@4QX&bmL`1liI%7Nfmkx|VqrJV^xioGg! z{;jGIl=QTsmqW2BXs#IHqrlL_R!aV)KHhym_Fk5*w=E|>Xu7{E3^y;;>cP0zP*)!B zZj1A%hrGX6?n>+%>U*}+0W&O-Q99X^^FGpAs3Qfcoss&ZTQS~)ORh?e4h1HZ4JaIAafl*xHD89g% zh1D3P>o4hiq^nEZhhQc&0hy@dw)EF0f$EQW`pYHJp0u}H;pu&!H^lPW=XSp?#ulN* zpL{66#m-~zjQ<+)@~Hf9O;K1&jxAR&IYdE}AwJ*R$_u({`p2ot`ChOGqFM8`pk=}k zCE81gQic{{?Pp&+M&y@oA6_cH*#*XbB5-rXu2s+yWyJ`ROKP+%iSTR(;@5>qB4(3v!^Swcz&Bn2Y1h#*)o=@1kT?-O zi78A=#~T0U2$rQv6~IcOgL9MufnkgTYin`+T-H(wBSs{&r3qDzMMvt zlb@|o7R%YV8*AX|{#wc7;fHWT`x5`AH$h8Mt!1T68Kr0*5hqU+Ea<>)(PeT?EAtp8 zT`RE)N_}>i#bW7i^z)ZPuG=2D(CCW!n0&ZO;?I%WA#kVILpCeHS$@PT^T47F@eF@T z;dwIAvko#rD(g{5a@XjrJqa!nD==e<*2*KAO-Au8I$tY zNP5D4!V@WDxMkk#F=3Vry3~<_!^q`)uE{!6j7N}x5Cp-m+s0-bY&f&wPBy6TgS(9@ zRvK%+R?I_OtkhixhsXLAss~>D8k1V`Kr~*f&fT+XUsBJ-1kF?jALo}SP(Vm_HWGdT0&6n86gxy{C7@3@h1Npvc?#0d z-rb{;)*QsN4ORfW_-t7KBPMu#qkYwCf|K>`*q-Y`~C^SDP*&veVj8V}w zk=`S$Ii}G>X2g9zWbF#JRs*2`TR_S!=;FqmO)$P6;5?GphWi8+4Q7ct-KFE%K|o6HwvKNb{1*wnpTWlEePAYRSJOIq|DcGKz~_i}4)zoN7V z%l)iMT&p>2;G;0&L^!6xWv{Ay*$TY;o#MC>TW*$Uy4da{n|mn79luO!#fTR4#0+>y z#3+CF&?2|DI`J;J5NHx%6*yePT+QWa$@Fgc>3wIQz*`FG#`d$jQhxzDeaXz%#SY=R z4fq2$;b3BqeoA`6x52oWcZK0?lanyE_h}q)du|_lg)K?gPML53Dq`lgi!qt;$1f0- ziED|%;z^a&)o06?J(`Eo@eKX`W-Vq7*l3ibAc2yu7xe~qL<HFJz;g}WMi z2l=>RRVJFvG0?YgWUuJi($a`Kk1Q@ZpGd6Ps4``ZzE7CFQ|z`E=L_5WI_!&3IY*2@ zvi66}4fAJ-w2ZoN$E^znOEv1;M#S^b#ufYDdkAoJdemlGTIQS@C^VQxl!{O?N<#F% zfHSiYp2MZl%U`4r9y09;HhO2bZ{D&<;nQvsK3rfnE9O17-QR_%SocntQ9FOUJb#xz z9euucpm>^N^Wh{X(kH5Bf3uavHdi}6{r&I^oc~vNY^_Vd19p1<(f48)L{17h5jcLE zv0d|Cn`JwaI>dmD{U>Rm`yNb2sMajeuUIY=F?=+2Yh~uCY!0SiE`He~R(oTHc$=BV z`-t9vgS-*7(z*B5HNFfw*Om)%bcS@lf%F5R;b&oMfjF4zyM#3*-v1{$?BnF_K~FD= zd-LcfO8!@Q%x%j;`pD4N5nO3_be)Ha!^B+4yV4d`)#eMC}7kv?IJGnRTXxU@Y(V{6VEZe(m|W_3Fq30`OTJ@ zHgn3eZTS4SXV75|3==*iyK_D)~k^RnqK~myqYXI;ll>BTEH_L z{1|y=(jtxWVt}5iT&JJgz{7>NXXL6M@j|GDD zq9K*DwOhLio=tVTx1theMzleqb?xyPU}l;l31$-DxA$Sn=EgInfM*lWp#u!IJdZz(Nv?n zAc~)aGdDH!E<9sF>wuf9SN6E=$L>SFyuU^4uU1UMu~4>=v_C@d@l5^ZkeY-LR8` zDHIVCh;eZsw3SJ-nxnaIDSaX#bGcDW87p4HvQII%@_K*sXea-8?xkp%19${_s3{kc zPxo_8*2rQd>9nfP2RsfzL*MBhD;c9kK7{4FBWQHkriq$svZ2b$!P!d)Mic>_@Gz;C z%m;Cvzt%tTg39$fF+ryh2$p{RYTDv`RyCIDM1+OUr!X3Y6K+KgHuEamBT9V7B7&&Z zt*0_gPhj&rKyNN{JE&&Qf)dCE8_uLnac23W1#>a0HA|u-yD|4$klr!97RSQ6FRS)G zBGumXJRS!edCOD4*b47N51h^^aDjJK)AD(1;OYR-^}-QqV{t8t<{FEHgvTtM4iyi!>y$Igoc=wHYjQ*#L{H_$rr3J5=^6j>%eRpbr#7Q)1eC+`ZGSDU zTgj)v#o-agibDg#eXcy6%&m!}TYo&~IVW3|GB3~`WQgEw`mn-6?JFO*k~T}%CLZ;X z4f2{J=F{ak=Kn|5TX8r^gj<}LZQ-``+-qK8WpFJ+Jegr zF3HdiUrKy86?=* zy`OJJc!v@05ScNGTVuIe&xFT|b*P9dXGBhfRY(vn`h^B|yPEm$Q^2yiC7T1_gM3Gfc!!XxaB>L&#fqC}sS& zcrJ=-;O5w}i<^hdNTU|JkLI`S<9+`A8Shb!(?Xh~jvL_J4>Jz_I33mPvm8;W<;|6O;2=>8}DTC)3k0!KronwRz6Ue!K} zivu!+s4Jrx#F0ATmIJX4XeO3#^+RV{ui$|!#YgR z?8$FF?)p`fbm@f-iGz~(?Q+;k)&v*YXv8}N%87E;UC_D7_?w&mPPrS))^jOutIf$p z9+FAV{o)=LQc3p&PqXoeB*M8&{5}{Gq{gmPv>Cy=E<2k0aW-+l?Q*5-M#KHU3qGXbf3ZAhcICz1^=^{csti7Fa8QY zu75Clx#i0&S~$AX?fe^GDpP!V%!hKCC40P4V&NzGA%;CeRhGs*gNg%duKV#Jx&o zcBstn&@-Pw{1)bw=C5^mA&Kz45_9k>_fb6%^T_M{Et>=)%Ht}56yypX_dOgKdiD- z9n|M?G|WtqAq3>E(bZdD4)0Blu+w$l4A*C0uPnR1$Q|3n-kKU|Xa>gW5hvR4WEM#O zh&V@_fjOzz6J=(c4g(%}-XA4BIc%_|7^}*G$a9(>y%hS@nSum>|gQm;be95gN*O zpm|c=-OeFGw*=iYRzwf%UQYgzBqxxl!04eOi@@lW$Pujlpk?`U<~=Le5v_dxAv>_9 zE*(A0PhCJ*Y%ay9!ihy+G9$vU!AdVb;Z~;j4@P(`at?=HFPc9F&Iutj$F^LDq#m3e zj`XOJE#LW`4E)}fWKRo4dTWmb>YlgMi3@O~?eK~d--)|a&W^0ggjVj2Ozi~A$Y_h4 z#p*sxR4Phg1gQR*6c25$^NGb(p>J`uAEkDq8f9YyoiPh|hF=)lgCn6bi7?frnv!y| z_Z#{bz8xPpPhpev6pMRu;M#JqVGjR?_(90wvI$PKprJV@x4o&qEPq4ia24Tz1!udW zljVl9!95)u5XA6RUkA2bOA9WehBLM+jak3-dT+HGxi;W~TpMG@}irnGxi0f zf8WfgZ>8UuZ}Sizh2$YM0&WVflh3`-T* z0ld0)qYJiUaULcbhjPYoU>H5mU*07=clsLE-ZYjt-h+(Ots~bVT`?$xo44F&{81>? z9?O4jogtRme?cShc6srZgPmtGiDFc&T37NmN?Z73rQ=(ZDTM0Q%|ppH5a3|#S_btm zkMpNIari^QMC=Eg_IuNQ!;f31!v&RM&t1IWN)3Eum znL&$Y5}Y{=_c?wi$0(jA=IyNC3b`iIk6EiQV4z6bjX#|SCvfO9uP52Y&08keC))<} zNpoQNXTvgQ+s)>y@w#)1P=)@iPTb)g42Lt$j}7o;IytXKBv@l}1er_f^Cp5xV+d^SR|(>}YUZZ=`y$(xz8|bwgFzkRsE`vG zm>BJnj>-u7AGWjdyBp2#9DXYg)pECyKWR5^`}JlRt(z(}D6mS>)kZ!x7EwoE?%HAo zb{sGTitbm~Ppb<>L}N&XH8|9|Z6B^kmZMh6Vd1uscDUg>Zxr`%kHdhv=OC zY)|VaS;iVUGdXz*y$97-Ec_fR4J`t77$~?Yf=6djI-&R^C`T9Xt+>PJlM0joTFct= zjCRSLJ+8JlHc0qnz5lHw72#+gL_F^f3OjYqPg`5?3E*t^ zTWsKe$m(#sv^PGyG`y1dOGl%%?Yxfm_X?60^zy&-0L8t@))S}Gx}NYu1D{$fk^m)6 z&P{0`?Eh=1<_7hoDR8md-j$sqd;EUL;2+{>5iwqDjurwS$T1%c)7`sRi}4d4lh`ByVMs>?JZc ztV*8|gj9o9?SIj77w=|FPuQ>uSlnCyY6URmLKv|xT{a1hysV(S3XBSmJW}D1+PUEM zzaf*{=Q!W;pVVJn~W=oXw&EHCut z5EiKUjbFCt)POqFXelPh_j=LU!XGMr46O6Ed^}B@%Wuv1Z`=sfu*ob$KmN^nQs=@< z8&OS)zu=I;RmW|!r&l`lhgrU80Ai{EuhDIPFkpz=U{Rpjp7oEAbjCco0-c`cOy@`#@1I{v|hJr^8}6K24H?RB%c->-_U7Ap;aTKu>PHM(48xB51m z|KCv{vT9ozw{M{L53?M{tfd6xTtAxmFgS6tv}qeVgMJdvK!|oeUgosbzS zz>(n?z_WLi!2RwYfsb3VZ+-o%J;BbX?PF>E@CKz6qI!D%`Puu$a!@zo8?VgS?{`Clo!t`~Cl1q3LS6ITP(h&jVDfCaY5xWV z0_Ec%%<00bSgkm0XP$O$Y_al*iu%RQb?K)KES4aU62Ag%+T_n`lG-w28mycxu*X`@ z1BF&r3gn--V{rdDz4S9=cl>1T-R7Ww)AaeLXb`W?Ubv-fafxLMH)?e) z&W7S$5DUqn{+gu(`{t}9=4RUVIWMq9_kzd2{67Co+G>C6g=X-xalT{A9ceQDt6O0- z4@gruR-saB5zlk2J<^BYpdAMu*C9Iz9*Nxp6s!fC9&-n>M>2)u+30Js2G8N*HP^)- zJGVDCg|syGOd-49OeD#-h!y;3j-wqKuIK!1Br~`WD(*ggQBr2;mcHs6lOMgiKD@}^ z5lON;tk=}X3T|YA`@JStLt%2$zFbKU)gLWry=S-i%m3SqL2FWl$p@G!in^)YdBRov z`VbSgZPN+{tjNV;H?Bsp$*828|i& zwx_QpzjoVI`eo1=qWm_~T=>fW;g@yYh0Okq(PBl0-Y6Y#IJ`~v-rgGft?3W|zRu)Z zCWXQ>`y-I)G3eK(E zCUr=U{QwH+S%y+ypEsINa7B+cYJ3QOf>*< znr`*2aXPNm6@y3{i#aDUO~=0!z_)ALaY+*Bv|oDgj`!0P{o*|?iLp?D^g6#?9h+(1#D@ce!kpfX(}{vGrh#l)oqzGjd5g03}eE6 z;7JmwfQ0!ymj4Z|r64!|9oF%VKMPt#2jEHY?9b4<4Ul=-`ph<*L_)A5_G8UP=Evs~ z1TW2b6Mz4;1Exanp0~AqT%P$jgQ6bl^9Q!qx*&~%2)rW0(Wp(rsxrR1Nx<|ISgSpK)5**rEJaG- zMzFP))y)j?X`2nQTW&!r=#^Ob#sn;1J!fwo0DgbFUBeBmTXP$PsC;DJ@XG8hymyfR z&`HATV+eZ)$PDK*{Vc*=W2g`PN1lWHv~c?0Me(BABRS5DAV*4Y^kqxJ<%StognmMA ziD7oyS~Ypsyq~(p*787RBNWcedZ5xt*NJS~uzP&J2oQ_R9#Fze*v`LG6Z>2-z%79Yp26uD4(KM+FbsCh zt#iP;pfXsP+@AAmXp|1_rl=7#dY8IXQQbgyfhO_6JIr6;LFU|S?9v!Rsv*q8>$m(` z17CAVeSX|ZdU2cOxd=rREH_Uqu@?$&uroMW{4}4GebAH-j+Rp}qz9QYIglySHh${` z5_~Jr-|+6ZwU+`6<+a=trbg;UUOw#70q=M4k88;$a6WF51f_so;XcGjsrI z&X!xFOl1CD#d8(Hho0ImjlN@3vl%yXqWaw)(io5&5xa=HSg65t+0W@N1WFamfcv)U z$rz%SV&#TB=a7IHa^&!Q9@fuqfu2Dlavss^>rSPplx|$o{yJ)2zo;JPF8u}?`Y5dr zd~A;tiXTLSK(#qWDMtnTj?^ZNC_>luV|c<9KE%};pVME>>?5OkI+x!}!@kYVc{fcq z(vz(8RMc}jGnw7aY-f2{YwYyy}Od}m2y9L>yUv$)MVpPz4QSzB-zFs=cQ@GEmWMl@qYQ)^ZM?Drt|O^ za=nImP#ZsIZoAQIT z)|?hZFNyb8_C-;cDmRN&)7?3IopH$?7l8 zH%i@5M$TI>ssDKMQqf||lVBMs@dU-<`7`%1pj*>4TjhZ%I!V~kEz zalM*SQ+s_dXg109qR?Oa%gt0}M)#K45l0&{6gpRiC15UDi=?3yZ&=h+myO-s=FA{IsbX)jKyvo?r;-N0Br*frqkQr zbC{y^dn>)`-pbW(znT6#={M#@Y7bV*(f8z=eSI-=H-41x3lugw$>d(qp#8T{Sc`{* z^7N1Gp2vs`PP}6R$fQ=8L0o3QX}ygSH{x8?ZM%YL*_)gE+o@gRCuEhJ3hAFrP)&3u z`L$_`Pl|)h#fwN$HI%vq!P|6k}LojRJ@>TB>*_U)ai`N62mNTrx?R>Dbn@= zs3I$~@O5s%fYWlY1lEKb1q&cyC6a?*4&? zxidHVHdKve@UY#8qbc#~6?lVo@%1TeZT@*Ait);^KFT4QW=;TeB=h&+^an*Sr;P|L zuWYLy1PRb&29P{q=adowNk<+OD?$fWi`EEp6iXg3{$@;%Dtf$_!FC>VAZF#vc%J!k zBrmi$cKJf;6z5l41!tnFOOt`is~@;~>&`+;OzI)NvX9D)HKj3dM%%!5pEj)d!Nm)W z6s(DcHpyr`iE`C<(d&mR$90lt(idpI!=5f&hpGUoxsyYBBvx42F1SGUf`5@j%ktI# zI+6`QZ`=BF5WGf9<`^ZyZK}=L|1M@P%}R?}5Hjm*O79@$qfJ0+*7W^NV3iqo|7c&? zs1%RvtW@zf#4w!vwXXjpf~8vNd*O}8ejGks=45H{x`OImZ&Wx0Vz75S$J@ARp~5Yb z*}9+6m5lxBBX&v_Fv>1^`BdWTr-RgL1(fNX3KDoR#K$IgT11VO)3<> zLNzxcblOyRoMqg1%L^Bj-%nnF!l#NtX2033sU72`0Q!4ecRzv`LbG~L1>R>h?i+jt z^ENj_;?umfPTs?NSE2&-Rh<(YGCai*CYtar(Vz@cZ?HN(@8F$1CRhry{h(l%6?j&Nj8B==_Hg0ePW@f&4k9 z4)#7A4elYu8{L)%PQHhFi_rndxvAsF2+!z`a@a?6!*d$TGtbiP)@YHELB|l*9?!-7 zJoRu@I6Xi-C=#Bk_>3>cI+eRzmHF9h$feos_07$;vqbwo+y3<&*u;EqJD`-#sZz%l zEk(?(%rJzxr3#Wd#86Cl?yv-}BQaTyh|6&!a_td^kOXBFe4!+!RbeN#yTbFR zW2Mj0IWxDVNU36-;o4@i6s&Fh_YDn7*9nCX7BR|WyDV@t@{VEE7_joh@I{l=8UP^# z!iI_9kOJ@TS~_!B@Adgl(=J{}Jzzl(^54HA?dYRHqc=BQTo0BeX@2;Y>4wu6n07zJ zD6`H~MjI%M2;C4Wc@_;R#*>es^H&cH;a!)TOG+>Dy7HX7eOIZ8e9|h@vGzoF-SvJ@ zKWwYz&V0)i4}-_5?sG2l9?L&dUo(??Yk+s z&GZI~aou#Ouygp>abfF;zP)$GM8_IQDGkRb<*LN8kg&Tmp6fKJEV0%MGDP{;g8n?T z;NIT#=&w`(D>S4(1X*Qo_%E|(8uFh_W4`!7KV_#dei9U#L?(VCL+4D>+qFK#BKVc} z?rY}X^ZI5a=fZ`SeVV#pP^4BJ&&uYAp5xw^=saW$r&jkzNuPZ}Dc*Vc$?TsImE`%{9-z*N$Fj|ZXc_F;$bYj9tGOQ-E?!hH zSN#)3!IUT@LJCZ-*#A|Jn8k^^jZS_s3>@jjU6JN*T}=3@>v_D z3r-2@-*Fe`_L!;Zy+9c}@VE-|5qDji8D4$9`xhZuAQzr}9cH8LvJ%G6|6x&dAOQ1s zUl|TZ2LA^eW+7>^{s%9F1qm|woU?7C&F`H z{XMUI9*9zMMR$YN8fRZ0=+$kPsO-ESx~%$dMJg}3FGrO;R}dE^#XMF>iXHv!ycx1?a^@8^~`XY(b!CWBK<{}oWIUh$_y%HS!K znVe~`^U)NCfrB|gT>~GErsbn@A(2tyIruk?n zJb>*d^0CNz%#yNSbP8JI4Nrq;@i-)k%DuicJMQ;AEeb>Hc@Ya#32Vre4IB?_#8?o& zJ<{*rz`gJ_DwzKEwE1j8SA5TQ(QgDjoMfc>szm3oDvjSMR+f)cL%c_IP}`QrnIazD zZsavhJ>f~9|Ngeocm6L4E=jmvK5_7c6pmPco&!QbO?tbE;e-$|y@hu;is z^`aSMM;kd60=BIbf0F)0GE&iINhz$Rc4B!*3deWFwZnr2%w!j*mc=NFKb5?WUk~Jbt}0 z&FJom#QLVZaRqbO^!A0m%ix@SDS1>d^z*Hr*~-&aTIxd*4|L)w9Pd)(db`@DjDg<_ zX2DagOp~e7z`uhH8Q*9^$@Iu*oy7V1*lRy;9DNNy~>W{-ueN!QP0`i*UIunQlDfXiJZu zr}uyPwF!8D(?_gZxsYxM3OMB16;Mh6tYf{7PulYFfI*opRVBLnfswJM{6Wans7qV5 zh!Pc>SS4uxUgweR#>J#!Bk2xwvix-6Xrd*$sPlvRjVE7gP}4PRa_$kV~=-l)fZ&HSfu zu;6ooz82ew)p+ZFVtlN4tfF)LDentE&TDxgRm+Y+)8~voCxJ~_^JAbWWK8NbK7sp!rz-p6I$6=Zucnjc(aZ zSm4{nR8oq8*lqP#U@2b6#EqNleLma;QX)^uNtHKsh4r;Tmbw9=iwYZ#Diu#VZ~CQ9 znfbgghkaLOD`xQs*0Sn_!pvcXh(n`@NaN!ZPH@ajFVLv#1aX`BW)ql|w!Gm#S` zxfuovXkT}aee$A}_*BMb#W#zi@n?T$3w5Gl+F&DLv?QK2w&Wc>&)j#;^XYW?9 zGjU{~7=JpxjD>OKXt6A~@Sfp592F{!;+vfTY&2yI{*l>M{$j1p``<=yu}9^G&K}@8rG=vrTfabGs-Qrwl1~+LUl-kU-pe z-$UpR%GSzaO18a26}vWT)GQl0ivtf3B)t3hg88f$ciyv4%x@)cjtJ_^z8uidM?xQx zP3xrR#|6#U=GnF8pu?hqozG|yJc>Z*Dg zNEFQWu%1vEW{XL+{t(qo({ZRc-MXoPTH03qkmitVY4%}8EL}xSA|I$r`5Ydu9N`|s z)9NG}-b^+ozuBMTWN0JtEV8EjOu!5=^K9IbLuYfGBEEC|fPnxeCc{?moU>?Bg=Xm@ zP-~zW40=Q=z0x^WohasU5v_BY-IW~Ge6uZ zwmj=}c#KQUWV@+`e5V3*(yzE0+JxJl_IDi81kc;mAq{>i-;;+%^#8McrJUw;;36C*3|blw(PV`G zD6*GV`=!K7QbNA9zb&w3?Ok1S$7 zK&^iu;merLl2lji(vUflf?r7G%MlMv9Rl6=0h^ZF30PSm3aTeMrSi#I&h-7B>t4Pn z7}&DxL}4R49?dx8w)>wMF?2(pVb3m@iyGh%&l&rVUvp?^S{my=VoW%U466f3>@t_j zwwI+p=N;Zz_^ZxWoAmdCjMOO+q1`XxpRZW~CFtMwgayt@?Zdwl>)$%plAUle5}9yP z$-h-?q{{csH|U6Hrq#|580#$=S2f$BO>GFeTk(}AEn-vUWp)$vO$yFy+l>$ZrYa)Z z23D3OUKHq#1Z=ygbR%2|JuY1~edH{uth>*MDE`@W^mJ)EM+-z$U6+(wc zOK5E)YSPkJcbwOjiSHLl(Bd5q%svvo@1bgs6qQ4E^_m-7<^-!!NII_X@xXEfiLu15Jch>3r5A0Cx`?^F0Hr zJV1iBQW+e(ozTim8$V3M^A9mRMJ}TjX9p0A{B9!k@X3R>IM-e;d>H5cK$==Q?Ekh{ z@Wa;zH)m+a&dJAL{n{afI8YdU&|_pa&o7h%KgpF?Ggk^1xJzaO+#TU55PJ_H_={_w zH9iMfGWyTkJT~$tAcVQ6-5 zORsog3o~};k++FheSqIeqS8|7kPM2tKZwo@(*Q@k1N0mVq$1AYPg$>T)!M9XG5EWMOpgT*I)EmZdBvR^ z6~1AWSdB^obJ#U8G||B)x*pR?zR2zD<7)MK4H12SvqZ9jUlpq0on$OkGy^cnFd;>$nN|+%ydSAC%0lf( z!vvbbWVuavrMbYjSABeYoyF*G&=#FCuvC%tp)@<-p+b#mzGYPr#D{y7e&GiiWGb0O zg_d~SYA<_2a?ASAhSeu@<`uX30(r*kLFts=1&)N8$L%{v-?G_89N3TV0|QqTV}z8F z|CfdJpp%r0Nq`m~Y=o6S3!vSVad;Z##UG@%G0w+L_Ik5DHnZ2G4hy{~9+#q`GYx^f zGZMTL(|f+Bgc>%A-XQ`U%%gQs5*@cU`S0LCBjEzL?7f&Mne<>u#?nj_2U1P%)8Oj; zgZl6q68Hfo;rHOTjs-%~PMUwipsn{}dPzF(<{YOm@@zN73hxxS>G-o}jM?qT-ktfy zFGJ`#{fam)-f_BqAPpVIg>y``%GJN0PW(f;Nek%iX57lJyWRmP;3pmOqH4YGk7C4hNDvJvkqf`j3%AnTJ+W((Ste%#L-ge zEXpgoRf1UX_eAC>kYel0CKe2}#e&@@${dosvF#OpI84DM4g)Z4b3o%$9$N|!fX7=6 zB}vEt51`xkeTmkJ+rb`RXGG5>MgeiSBwLqrKr?peWo%5HLhKD^qi3O`}> zIN3R@I@_~oNtaTTol2OO2S%hrv?2_|10}bRsq$FB5*0>)%A<#K@)8rY6_XU`yqHP~ zVNoK$|2qqyP!&W;EFqyrU4YLl(9s99tr0f$q9qzG2a5gHbc+KLowPsqzEl3ng=&c! z`LMo`B%BN)!^}N3l$VN91y=K<@LZQDu^2$SBMU^nTk9=o>e_8%l)G%!jRP=oQ0RFm zL9&CT=!ayGeKt&%T0RC@z zJrF3njPyGEBxr=-<}kueP6(oH2^?sui9D2xHZD)_0V}qKh|#ZyJjDMD1gWASmfmw& ziO*g$zxuq~ZoufnuvO{=M5x8XJ|n#;V26o+lD|2SF}I+)04p-b)L!!+<%}9hA6GQ~ z4}|~oIu9=JvmP)hGAf>Zsi7^{zumw?BwwCOT-zjB#?TIDRVs&;i0``yzsutt0 z3U*L@bg@wA6S+{i+}~IVKjObh)1V1tlm4t_urlrxfxe^6n?Okr$ z8{y>tR@{>iNNWIomXEtin(=Hn^yMUA=}g@5K$otmi#&<^x^CFjO-=~93&m9Mj76`> zt%BAv`mf+wBpdaC=Oia&7L!o?j?pVX1c;v{IkCk8G~kSOTsg!eKUd;22%i<%cO;6v zKTT33_pp7}BSOaH5D`zgmAk~7g86BIjB4+p?9Q1OM(qv6o}||h(~>T6@dS8_nT~l7 z?qGu;Y<^3d2733;@$dkLt70u683&#Lxyr#DZMoc<6zmcW+ZR0ZbGK_{xm%`yd{6P} zMxj*5(^B2vT#K#z6V1=M;%1_uUS4J+Uj)d8^Q}0TV-64UKy1)UPCu4#n_8QR(W;xX zuM6@87_-ttQ9$GifQ#}iwmH&(5Xpf~8vRi&V?sR_H%IRPZRc>z>~MSmwm_H}9sQ*J zKB(uzx1jl;Q!yw<5`-ZF5L1pEZGiw~ofAaq4`ukMV^$J@oFT6|tBjOu$zl*QthyPI zjwXWHf`4(q!g>V)5}eqL4j=U6q(VobClrHZmPXIW6DN2=;Z%@DV&pcGDoF43v(edm z{S>|)PK|rhzXGr*ocb75Tect*X;e7JfYN<{5>%@KN01ugfdY&12Sy#R(A_I~*r^Cm z78yXaH}n>ngN{j;n9xk7wWXP~Lr5MB>N*>(52nxNZNf*L0Lw2o8myhOV>^3NztB5p zlfyD%uUgRxzV)|F?*&LowbL>++Ebw{WjhZh zC$XWxBooijFfb`lT5s}0Em1paioVOPom~_Jj*#r~_>>ma=) zC}4;Tg2wh3`$1R86@Y+NM!3N@t&^0{VRIW2w~7dxK&~fHMk^ofX#nCkVx#Gaf@;GYJA54HLi${sBRc``;{%g@5>SyuuJD ztb+_>JO7T8BtE8+zR<}_iY=5xT1e+(77&|bkgslL(#%}Nzwq>EdsyI!V*^ukrTO%| z9;DQ``9b(+y5CPG|NZ?9y?&CCA7ULK;z2eW~)-JR^q7RmHY=cbKg z+@^jq!pKI$f#1+|-78L|vDz1Be18>1{SIk!-!2$zT|~cjU&;Mr;`aFbP;dl~8ZRI>AyyC1_{ z&p_niU{a{39zB5iHx%yT6O#`7WntXdWr5UQSm1i3**$Mz@168Lo@MbDvw@Cgo0GY{ z(GemK1;b=j0_YMi5LiqgKovG z=TQM|HAqa)g#lg;LQ)brlrh;q2>9~c1v+OW~Xd^Bo!g{1y*Xl}nko+{#X z%ok^ohiL|gKMpJMo8Id_HAf$u9`%^6mGke!D4~4Xe&#H_PF2bj2i#F zk~u*G(I5u~5=AWsDP3@}Ago@2;iL$7o(mRR6A-}OVM);BZ^ho>)28oWKP#eo<(car z&Q{*cBsNs@nR)4EyW1V<@X{w;5rfx-zJN%WIO>mzhtt5J03aMRL=0!U!D0cZ4*9PxyQF4a;boe=B1zEzt&! zOcdKB;{X_s8Jo{X&{nkQ@q3`3s!@Supm+q->f8TYE6?{(m4-7iJE`F3 zZxHMTs-zN}ihj6k514C--WpUfK;_7o-d)ysIO1eMq35eN;^ObzM~D0XH1$$Laf)JS zmJpqs_@$5mCP_Pa!~XHOu(zU8^fQkIq3>nUDQHPgl0+r5I#T*MveBo16&^I&DgE^_ z*(<#$+-HiNw{_;25D(cWNUHs(MdZOe#dy^QE|&-gqx^s8wZ%k$6`5}kbENGey(Nlg z00#We0ocTG@cLWd`>qH=U^LF^ak0zC#qJ3K0Ce|;Sh7n>X4v#ifa**5%5G5aD(9dF zjUsG%PkHAJg-qxQR(iWlE0X4BWC=OOzbx~kSiz9X^QJQefvj-3@8L##{Oz3eQ(e{6 z+M8g^PI%zJ6nWf#gY4#)PBCOsM|<*Eu5`$P$W&!|yA0NIFw1mkH#gdenl{WFTeI=r zS$1=cLuF)XGi`!P6BQ1YlDCr-iOGI1z%?I6j>H3y>&HTUcTZhRCr)y*5Xe*T4>vmM za71WZ)QLk)^O@{(>h%L&bbvo{^`W6Ag`O010}k3xWXD#32uyeWL0QbOM;kKU9AJCE z9CQ;T%w`VyH_R+Ba;%Q2hnA45{$?1*p(tjXE=CGm+oSJ6m)nsJlVIcPf^IBX)p&T( z;m3E2oH2o`ctT;`P#jf|t0sv+2^)N@SN@sBqCZxY?_i9BI(}%5#@Hv5iyIZeh0hsg zOZlTEOJcMW>R?V(tZVS zf7?u-)TWm{()7{k`>Ya6@Pjpy4?enHavN7Wh&mIJ)QfX~mSf%bW=URW`e9#X=0V0= z+0&netvQ+=WcC01C2FtbQ>^N?oX3L!|63hE!`^WeQ;f$7jh~(; zgdNtQ1VKHE`9r#JNB(`IrY1%P>wS;gdF%7vY=Du5`{k!kNMa|`^6^oz%A!5quk)N9 z#>Lc$hsYNoV%f@A%3Z@2u!wp3+bIa1EBt*0crZceNk+{$d^lL&qsoCA3wVbB2+oh_ z_z%#>HEUT2**R;T!?!cdASm%DiM~UZNXzLihf+AGz>t1|wY-@am|X-E%G%V}ehL_* z6!6;ZshPyn|IrnM$keo2!vr31e>pqpUH)Z^MaPRKDv;MxnL)PX0GbjHdk6y^xWpYj z7Py@iU}#PJb|h~DBD7hmg99zm6u29Ag$zx@-`%z=41e)mB<$-K-S;LRT|u-f9~jO= zze$}OcxLry6H9Pd)xx;yBl^p$Z_pn#6#9g7{cJ zdQ(sXh-)X*Ds5#jgP>2u0MEt7r;IUqaIY&!-b+iGsoQUzro%zgre*!U1Rd#)=FDcT z9K7GtVVpi_lDW>D<)1z$8s-x`1fSPa{E#c5l9%pDoI8B1Q93ltq3bFn(@2MkOvh0U ztQ`r4SfHd@tKz5QE{BThmY4qw8Qs7cQzGMyTgV@S$3%VSF;x;(qV@#~^T^X}jCo|2+>4k^#Vat()UyD#8xI$8_PG1C01KQWUb+qoI{tXs zS9eaj0R`is1Vqcy7O%vXKj92=Rr9>#c|yv-Jn9++BhQ;_JOQt*pl)hNz}w}tqEC0; z0lW&#=l8!uznq;q_{pV;>+O{XS+`y;M~rP?LFPmmQRJ^Pn1QJ@zeuFmpL;biz|rY1 z{I|LVL88)fT} zf#X%{^PX7X?WYNOILoF*GRcL-{p)ABep2{ipZ};;=(8Cj#eRtRh(;1;yy_a`%X(P$hfzNK49LijfNf9z{%)*~g3S7q?H!!91WU4K54xwtE-= zO4vIC+5kQW!Oz=m*|g;HWPfumdqJPBuZ}Ch`Qy0|9}#%wp}%~3xtnPFdi@L5`HAL`CE&sg8gJ|GQoXJrW>Kpv!16cz%%u9iZ&-IyN|L zZ$bIw2Y$NgqwktoOy~v=oXnh6>#{ejRg{f9Gu=ThlZ?_OJ5ulEwpm z8iCPVFBYL|SH}B=Le+>$;~(;y?^H^+Be}IsWBr-6X|W{|;mH1!yXzG;%7<9RwK~V^ z!7zulTyc_7IVmeBEG-2&C4yBD7uAr92aE|vvJZ4~y;Y@8eEtakvX(JJ5R4`ulUSq$ zsI{Q0Fvs#Dl1PXiv3RpC-unW=FhP zeXc8VL+Wg3YfgBCaXj^vY99H^ChM9mUk{bh#_ZiOQ9a$m3nf69>>#TYEP0h9}(QKftL5^qt|+dkU8sZ*D3K6&qcdCE?-u)#<6 z(A(?-I*8cMk#M#be4%#lbo|juZkywOm~(00f06t&jzrAJO8qA|w3}K0UKD8~F+y`A zFIf$Ewxzgp9wjQnOY*;6W0kz3;#45(wP87C0MrF16n^ zUsL<-aG{WYI}!1qawXaRncGD0z&0J9YMQgWtPhnPFUsr1LrX%|8k*U2r+f`Eo(?IYNUF(X1m|F9 z&uCY@;(Sv7ojG(FKfWvx2r0UWiL<-2S}Hx|!rd%V|D>f))6e?7aF0*cGk zsZCe@3{pt?OSYQuViMMmIR)6uE~SCuL z#YWgm^qAUD&N@EBgu`>8gH#S+;P}qr1Q0U9abX*=ljLG{B!{4uyy^rNp(K3@A|3GabbA`qs8 zS)$=+{SwIgOLlan@XQOPS#%rP!7GDOQMvRc;M}2ipm5?&kf8RzL9l8}`SRc0a^X_7 z8mSH26av|kYnSbT_qz2k2jH25z}?SJkV2y?7~oU6h&s3cGn53U|D{(nVLSr5{^%#d z?DWT&E7c8i>$BD#6Zyn(_z7aP?Qqx@rpM$!<4LG~R@H^1cN>jH`2R!Idxkaje9^*5 z=%93^L+Blp-h=?sr3r%46_6%BkRnYCSO6)~L6D9}6X~E*LJ_1_rAY4xLNL@ol5h1Fg zR;V0xM0ddrhx~oAN2JU8|9FV1_VC!s0|m$5 z%7g?VzuzwBy-L}jUtlAY=x=v(5fEW}7+11<#K~}N1qc+IYsD``vHXmfyE_7VVf98= zB%2!c1bkLH_6d;z;ICB{hO3V~#zK^M3wW5zYR(n>9Kuz$0>*F>^uCVa8LbmB<{3qO znG$lBy!E3ZB!~{Nkv-j1O*l*Cfyhr+?JD-h0E!4!>YEJ2y{2aZ_xb_s^#kw}5pV`r z-K7Fio`_jC_!t+AdI>P{J3$-1w_&D+ppdd5fo?tuCHY+f8r;rJ`Ic)iqAqOWBU*!v~lQQSEznkCMueS}>r+}r>ALOHuLl@|Qsmy~kljl@ERM3;M z`YQc4fDvk@d<^sY5(9O5gx4st`M4)SNe)vM1V=Ve-{ZMILONV4LW8!$Hi3@Q<*}6pBAyX6aLCqA5OSa0n>kgRlEj9phDVC zEp<=@InoEmwlvELHm-MMj2K0-|8rS}#PIMnIr85cXsF~c&>Dt_R44g(h~?x{h{@w` zT7|rflweTW2B<~#ycP5+k?-2*m^`4Rd`a4MfIJ~&nktXlh<$nqHi^4x4C!05`GNf6 zv-WQ|Bhbd34D=9}{<#*>NReAMX+qAV*TB8cvtM7pSj$S1Z$%=eDU}+<$fVU>y575T z9vYt%;BZ9`IPx zN%`nfrO1};p*UYrM9m46A5WWXy7%)jEbnsbiNqIv63>p?8$6m5*xxt>n_rXw3mPaC zFMBeR?434|W%OLpkuAK>3fO`+pE0pf)5R)7sbI8{l1w!PP z$`0z0yl!*kVWh7F;MXD}06Pne#^v-W#BVCM6>EBTp$;$`e1VK@>j&HmGUwaoW*|-( z5ceabKhuFMk>a?E0H1Ig6(}DuI!D-&y5yGQQr}11SBE5!It?NY7Bu+RN!;Vaqztn= z4j^Q^%CLf3f`%RcWgm};^+{XxFv709Go&o%;o%8VI@?w9aubUL_>sbljcK6y%^w4H<+izmeThCIZO7~+jZY2?Z18mwk|{Daj4*l zxqIbJ0XqY_k^sn_sBuqMoM~fCPy1dR!ISJ^8H+mgG@O$EUTp!&K1++VauN)59&38D zMM2nHaDX&2gX%Mf1D_9I!c{u1;GyPcD@DPw9)nO!WEJ;Bf~!J z`L@x@2E0=6BsU`D{c<`^gyDbalUyN87^psTgr2+@?joNdJ#N-R+$O~aMzGKjuC6^< z3N|bxls2iRve=~oV;7G0H7~`!=chl-^_~J%2q_6QIZ2HSgi*5lRET$SkJ-SpOd*Ci zDN+MOyNNVmOzQu@3hR0bari7Af$~wsYMft~7(V}sScbqx%%ri^>N;=OAxe)06D{r} z6$o&3Q2VgL*a_0QkP(8T+67pjy+89e z9nkx}6cJ+l!yz^A;{<<(kl8fP*M$os$X!TCntRDG3;X>+32E| z)_ZxZaD!^wU^&{?`y`&sP#Cl`LOj8pI&PutS z3)*7{57b=)+@2H4KA8vuFw6umyCO0@2DL`qCEulG{CL=m_P`2|um{{U=z_u~>FG%j z3EhC6_2V;CPxL)tR9Dg-2H99z{q)=&^t=BL1NZSk|Ej;{jSzlc6cEDgb9tL$-KcB_ zi3_`G8?SKhRtIv&&AA_Nv8zZPco4~J6GU}$1!U74x4eM?w|hBwluz}dwIB>}Xwy;i zbD{RdFK`2B4ME59g0G8;=-`t~U~3rYODbp&rCIQ{f}cW_ky|l5@SO7KGzs`6t53*m z&)d!ZmhjIHnkc>7p`rbqEkRK^^YahTdr_@x&Du;GbqNWQ!rMej{p&omjGKstQUu_d zQz>+au1|s1kXiO5e%Ny!oSRJ?5e{h=>bu3i{iz8z*IK|K<>er<&6mq>ovecLaz+ zIG{K}+xi05w0}C09b;Tz^ISVsqW2f*>I-p1s} zyOX0&gvTyPxZ&M^^7K!@^o6&zpw zxOG&Mn?T8plI8SQ+gDO!?+5<;5w3jic@y%Z?CG0@S)i@aR6Ya{#N`|CQFm0VklqJ} zrUmJMj>uc!Lk3i=hZ8Ke1*h~=VIS;9#)p!OlQP$IE-DC&s)n+P!o`07c?ngC@Dug z7DOb^KLE7`W?&e#L6jYA+$2PnRstEF*B*(IXY*0Zp7wwdod4k6dX_%oS;$^H=3a#z zmn1=|@mqfY{w+t3#y^W+OZzL+jL(n_q#d5GdBN-_1Wc4&gE$HN^Tux|-6@--$ddFU zd_^Hh>3M>Dk)NoZz}OD~Dy6m-(coiIF6X)v$5TDJ%Vq{sadj5AB5nZSf2096*D|{S z>DsT?7Z2&)9sqq8i3iBa3z{zQ*T;iFu~R(RGmtfbM4nLI^s?$kHx?k|4eSJ&Y-keu zGho5tVf`rJAx+6EeGh@<8&6n5%txqB-gvGXuyeq&RCN*i8DEciI3T(qd&stH&CY?% zHp!s&lfc1A0L}PT01X|+Dy|btG^?>I;A#TMRK>vK?xTj<*Bc5s2POzdbXQ81ge&4` ztLY>UTb|CilfLy7?daAJ0`t5d11|p>mxPs=Q|Gm1rWd>KqI|;};#E0`N{lb2QRJ3i zO0SNhJnQN|hKz=-Xkvnu5+!{Y>cwb@phTa@>rRZDg76a2p#V$h7mKd6nsp9bRc=80 zJANRXBD0@+@0L4MvHE0q`$c1J*-;l@A;ILkz!_RHo%KPAdkdN@0 z8P9e<Q^SWNHg$eTdi4_E4;PD2-?iYDWP`^$A-2I0iK8WR-t+YLuaq(R`m z*I-3wgUX=D(7WQQL}916x^{`h;^JqSyQeQrTm*l!DTCD;?YzhLJhTvrY9l0Or(VpD z?6iN%Cz=go_L|vi{=Tp$J@aQ!BQT{pKEDj1O(~xJsWD~9Z*KVz4{VcJ+lrS^ZvL6M zx%g>#eJHDYje}gOQuW{Q-Xi)tgW6@|e;Dm$gcz_|vie#K2s!gc7q7%=$oyATA*+Vi z@3k)5|DsmdsJ0ujUCStF+}5bh0rPAX@33EbzsiOdShXWpLKIwq?Sl;BQhn;YvOmWF zDpYrc%bU!(edLaF#a}`uOLf7(>&lP+p#U7-cwF+4?nbS5>Fa6FczU83BaXC&v>@)l zTprw__=P%(OT8?ZWvQOSO$V0$aNCkX`kyznW z3#<5xPgp_rGgCk~48LV8`l97;iBO`MicmCrSH%}dQ3)ict<8=Ph(w#tn&6r5*SV6906fg&1>+P zRyZbiA!bXXI?j>+?eeWulu=K;bdHs}o0CS!#gm%F?%2fOs3E|kx^^S6sLWuZON1xl zCY02a5TBE`&=fSxBJPx@KodL^i}Dauw4yy zw)e}8Zdz!Rz~?lMr)N7-20v(tmp~F+eu1E!68Lz*=|}_c?NKF|>>vE5AMp8jl8R4C zn+3)}&E95YzeF_ZPLy?0yM6h@y=-0aO)o!(a^jbHsh11zZRl%u41mLk6&9+k)(-n8vgGZ0$f`4w6jVvByagTg5R@0PY(zb_Po22np zmX3#wQIfv~Nwo-Bj@X^q}z0|9gX>89zQeLwpMiPzPsL|ciu5OUD#zAwy#^MhBfjx;+RX%$Q%1qdYA zopomH9zF57!lD8wIuy#CM_C3sV*^DaUi#OA+RUA;b!I)A%}5$Qgi}E#^;hYyH{)L} zg7JUGi>cz*-c0mpR6jw(Z#;TVs>FgN)RZtUk>L3V_Y=AL?!3@vz9?4_@M(je#*RXTKc#89brd$ zoPxI%SAZ0*+{~no3yoyPXFfvLHu2TBe}9%OSLw;97@iI|c54Sf{K~=px$C-=?&8?k z+?`o7<$o}ms1H;qSYZTTws?B?+XSywEb1iFJ>aL#p8O}JA=|A4OpckFcA<|*3DY-S zW-ylONaup)wYS`m`YhH$8mw`oY`Spc11>Je@;ma$yZDSA&4SqrpiqhWR>LLqmy20S z74|p&vb{`I^sk5sHbfUOL}0xZ3;LLvG(@proU!j)!hhu z&oN1NHi;{qxj6`8p!b{FpqTyAR(j;D7vH!N*j~2vV-9x55Jhd>f`mih|`0;_2~iK>(5U$PS@@W zL9*L`jbhW1om#h{^}0`aYd4+=Cq7p2Gk8WL@%Xo=V}T!derMox^gKpsVCpgn29u%M zIGTKTA!>q1K;}|uIYSr$2Ck_gq@<p0CWTN93<(YQEx)WHjA#%)s_3}K{PXEI`}J3+>e2j=o7mC5+#9rNB192T57Bxa zZ)paA>%B_pKA~}fc-#b3>{={EBVX+Jvox4>9F>NVE7=#JfG2-d2F0~|3MkDQ9f9te8%6Z{g z0N%4lM5lta^CCZcWH+T?trf^QM)^%B+o!l}{`@++_+8a5ZAePQJk5w4jg}RDE(<<) zbvMC_C~++G3kCyAX`!;v%c+E1?0;gpfAct7?uPS(jw>0_KL zgl%^JtA|zT?FN*qcj>RkD>fvKXU!TDS z|7iS86+&zDhD=|O!a&IUjR=13J}$Zjf}dT=m%D`BM)o_KJX+mo)O7}iT^d@0_jcmc zSNJ2MI-+zVa^F?a(`W@`L^OwjmideE^8NALy%^@7S9KhIDx(LsXIX9^$E;OlE{5ap zVZxrgDg;3K@EAC+a|osUhw~_e!H}bqZ3X1RBAJ=Ss6?tSGRJ^UuV4D2xU1BNB@L(qQ z{!60<5MM)Y^D4jmmtM^xLiUF_zE?qyLroR`iZJc&^0UO!#Ba~Ttl%7{qc%I7hpA3= z42)pok7(vmhTJ}T{5HL>Gki%fzwL82z3~*G`$9uJFXZzKtD`cSTF>z^>QDuw5g&xt z=icz~D4G<(=05@`(5T}DawvFyHpJ9wT!*g;IH4h>Tr^=cYt+kBBl+|4PeJj9H$$_K zE;Wb@L&mL{eJ5$PP63 zB0dXcXm>qce-VKkZSHsOP81;cXEXC3$8VBAZD#qP{($^z>u4z~>rZ8^fs^jp=G^Bj zJXF&Jy%ivIt=>MM@1Nk}f6>SlQZ2Maf_BE>pLFTm)Alzp_A8{;;~CcXCV}Cr(K2ig z(-^5b9zAx+2i1}{$h`8ec@^EmW+u76h9%#RAR!eJ>^OD2cPd>7l(>F3^Z2Qgn)h(- z9RaVg{CI@H#CUCf{@_t6^FKZf^vv-?=k<9daG^wBIaRv%6$pcW6-5SmaB@{oAxecA}fB5u_0WZo)Agai`_M zN9C648+%kg1Dt9byAz8m_Q~M`$jz%z_ZQk6klHXb0un52L7Fq2&kqb+Yn8-w11tDZ zOF(G+Z7;rg;B+Z|0Iw(QWFHm{RGwr@zQJA#est3B9PquV}Z=f$rHiYe_W#Ma<`Xdxr}j zEg)n7PR)?UcPXi#a{ERiI{Xpm$G@y>p*&&0r0<_4143LS$Dp0lwxM>ZCQ;@wORSzz zIP#SQ{kJ`-R*!8fu;Hp_zVY%7S7vp+YQO+sP~KWep^x zN+|7>MRdiM<1`RGpwU8D!J{DrODhI;wVn&ddjYHocDUpKxnegKH$wEO23IbbD0m}Q zi6UY<0dtVdKm<{}WHS3pu-=sZFfohXd!xpAZlm@p6I#Q`2rbZky|2$0R`vX@49AaP zH!{vy!Q~szSVHh&#%CJhz$cc61ifwK6V>nx$yC)`(0P`0dbK0co_hoD`#bSV!daAF zDMrD7n=-X8h@cQQpt&YxR|NJS17|iOe3>fKc1Iqg7!*3W@HH zWk5I@Sj{BYrPpi&mbOm<^gM40+QYB?FeRgUoe>D&{FHExQ#k%J6is+?idb=uu)GOQ z(QmV*{At&0dD6T&8qfxtcE&C~PXgz93|bA`BwGZ;76q!LT7s%JNE?;iuKhlSDI4WY zIWexVsO$PJywnJ6ELV3hcAzwG=}vo@nlg-loCh@<4YemoI}B>QLZ{zDaP0G`-}=va ztlZNcx7(A9K&0(5-qhGf(+o5iB`}3aFKnEaE(Y6~d?4*DOj~+&KkE(subaM=J}Q-G(R}H zaeou2ed*qc;Q@It!;bkdE(RL!V{%F@uzUt?^iE zAJa$z=d*`TR+B>MfBvAFDC@QYA>9nv7r2t2wDkc}Z|84ZI9ItaDm}(6d-{X_8S=HZ znYYp{=8k*WG;r$VM$J!8T#^jbNvwJ|)|Bg@RFJt&cf35oe#z-o9|sK(6cP((@@JK* zLbv=!$*M!zAKo1NC(F_%&|LAGd!-4Q_b*|3_!n|^1C|BMt+Jl#IC#MK`Gh4$yK^4h zmI{{DATr3Nj>RQRR0pk7;(>i&n!K{HQrLKNlF79by~pI#V>wmw?idL4x&)ahNH$V` zuS+#d2G{y<0_xEO6eRLyOV(q{T{CGr7p%EUoz@0H_H?eWlRx`S-fl{o-_k}{_WWGM z8$IpmXN5-38yu?YeN?aHg+Ug9sqvm?I&v(r?Lh;O<;0Win-Ud@CsBn6`Wj-jQAQB` zH>0SCVs6Q3>K833F=+J*tdJw@>A?GYS*TM^YK&9Uwi8Q(%2Tocdk-Tr7h4J z94$_7(0(jYCJfir4D%&sgH4NIlHvI8>yLAt$9XU`x|&5}=AQ$JA;%{pxLFbDx={6L z=wU%JMaTVW{Iyz<2tglQ8g;s6p6|iS?A_;J{~mM&yCk>hv-FS)4b1ak@tE3%6>*>U z7*MQjSWQkdm;iZrk1XuGLZ1D`n!TkuhZo??No&Qt@hJQSb=?(qaWEM(b`#sIr9ye1 z11fJffVa{D=rr+6LY#Oxt?$dlnpZO@%clFgMX1I=cn{7=w3X(EW;SN?uYsqyyDnbe&+$% zYKGqLn9_FL_9^~T)e$$64GpVa5eZ@xsBh}1Iq{Y3dV{jKvj^ohm6442S=pj<#X6QovZ^2P2CM^_U8;3xlRUPzv-;z1K4yHbLS}2iFWb2TD=8G)?N) zcUQOm*qZ895%|S^M4f3~^{%|4?*7nTh1#9oU8JJ0E_5b2L1PxDeH_D7hF$}5#ke`3 zN@-SU-q#=8eJo;eHCp&w-r-ckx2LqsZ$8T^hMf0-z}S+uKl{qqpUZ)>`cx#Y@e%cR z(xfODU%-8^ihes}mTFrmmhxs8yWpqQ-Xs1{=T>ifkwKXd2O+R!NNO#^@>mt!WZhQ# z^<8~Pv)U~^wG+31zD0Sv|HfP>ZwDoL!{Kz40WZPVfU7g!@DaaL5m>1K$znd!M39yC zf*;Z;De?M`uUT!PuJ6Hp2i#8L?=n3gZSzO$`UTmVJyRly(6r>C+6-BROx*q>OZUa- zP;94E?Is$mc{gAB{w%dZZQPtc0>sbWr0ycX!y=8~@#ym4&O1}rUcmn{Q0||Te@QPg ziL&Q@A*4rT+Obv%6Lfur2=+<2ung&BWdFKJQ|_5nzj24!;hAMRa{Wt9^X^cNM8HrC zL&TO#(Z@Ijr;VLzvoTbo%R7?YX`R>8tngyGh$ z0DksynaFFG9H&}id$M*S&+f}#^8WoUXp;9GPeESlr{cmj>5>7Q>*Q5*2Dv+-snosS zD`;$fJp6q5_J$+3lgyV*5t4F>)LoD3O<28RC2JP0hk>w;es*i+9ZLt=13{aB?@Jc< zYoblBpWMAiGn=5@i@JsB8B{!a`$=BO#Q14EuDBKG+Yl@9Tg|2WMuYDuji>&B4wf!~T17Z+Kg1$E z@>CPPMua256vZJHOlI;%+zJ@Z71QTWSzQ<<7DJnFf7qyAGKsEgc@;}zHPMHWEmH{+ z{kh4hC2z91nQ-E#RmhzZUw3%&X-(3Vb8ToYiq;_k0_@$7?2P z-a#(>_nhNZAFBuhZEia4n`W+F5%(uBwr8glWqw1y|5_#adhFBCC8PE(-*#q643Ym9 zSCr-3Cem&UTj4ZdKI+Z6b#COydH>5Un@t0rs^a|6BY5_nrMipY9U3*^cl9yz6W2xu zPb{uAyxT-SdyN~2VP~|fZhF36K*nJI#R3zRysaTTbkV@l?DxT% z`}!)Kt=Mno2kC>%^M`xAp?*x5%RN5SHdC#Vr~Dyxdb$wvAM(m@Rg3x9@1vp$4pv`$ zf;9Aw?VmoB6HdLl{pBHHbLf7LW2R#5#Avb!rrrggn1(E;prBmO0=+`Wet5%z+O>5k zpDtwl%R016W4cvLSaU6!%=B46LetaC!=mWR`IU4f2Tw!pdIT4$y$`rO%;bfYivL?+ z@bG=Vgl5aj^y!{fQuxMq%IJm6MD_Hmi(yPxo_JfWG0+XU^wK9fcM7lFYc`XRD2Vhz zAxcu0^88}ykzz2AU9`L#&S4tW!y$Ak`cm7pN9+{6>p#LuR;lJN(X^3&l#c{IIKwmJ z(+a3e@xOSwA2uBd8P$}LuS3pGJqguQzdhQzA!G1s$P@d zbPc_6iW=&18HrNPI(CM@gox4TI$JUM9918QrYmzvZq+E}fRcwb8?R(Z&@uN^@8uTS zTyg25!T#FjBKncoZH1AFLDSl$IV^+@JTG)HNj(fDD}}#m{@KL- zA6C)#nB{gOxW>HtHDhXS?Bi~dk8=mHuN?P_>syfz0s^8C+6I||S@Uix(v{IBY>sKj zkY_p$kjcgglwWREToyW6Tld_4D`XoO34nXn=7DE96~sXLhdHvAf>uLh2iI|*KjLpv z6dn7T%;lcs*Dr?z&)z6s&x8EmUI2FC1uvKWCjGVydQCkS11Zo_xCCKnoe^54lms+X?Iy6UTntft9@Ri}zLWOa zM)F@TXH^+a3*IDK85&}WiC;{)6aYGbvWA_afX1wZ>`rgTwN^DwjVnTgxU`O5S#^8K zf$9d8{1jpP+#BbZ)*viWjwjVEyS3C*p<6`7u{~Ovpb12^kD{+>4GI(K!*#oZ{~V~c zNxsQB2z`G6Xf#mKeZgo;0YK2dmz{IF2;^-1n&U+%g;X~gth5~;$a z2YHZB^khfnJw~DaG9j{0g|dCNLo}a*d>9zKJMl5#Xkl7#%k|;n7pMU` zwd*P!&g8F9VQa6pAb#6m1NXCj46hLh`9{wy7Qe?)R`c5xbBY$Ic4NWbQ0*7ZEaIK( zfHy^|_=`%b#)^r*DW0Hmv%r3q#kMIY_#bGWPz7t8hhgG!cx~(MN58JQX8*^PB`9-aSJ?Eb#G!U!$`k!GEuNi z`^-%`5g4S0j6^6>Il;z_&r_$kenHAc28^X>xnHCgn@m|3x2Zi2q6q8b+Ml+g3_Ll) zIHciZQJX_Pto7_$Yti%czSC-2uL4cq-gGa*MbD*VQ#D-o*(4`tSCNOdM{jG;=2zGH z{R9dD!(+0zQuU#o{37nrYim z_Tep?VH@5)6rZrLJ8#rPC5sf-1M*S%&o6t$*T!Xjjj1*2RgJg5eDe&fLxzyDlLlNI z_WJyP|CrD(kW0}m=amH;F2O&q@$_?WO?U%#Cj`Yb;G5^oP7eWkK{9y*K&o_AITP$p zJ7UH|rh)yi`GwxuI&J&57LbgS3|yd!1X(K;VjN71(7gh#qMy-MH#)TnQt|>3OZgcr zqyS2y6HdW9e;L2^z3t@?-y;Q`8(AOAD1`7A0d-e|EWZYADfUS}&Z8MVA2qUR(iw9;Pz0Ssg zk^&Sw)8k&Y6?T*8^4?A?>wmd;HWXk;|HD~2GF|{*JRx$0&pGqvSNQ0wHfLI*4(P59 zD4neQO40>p9vZaZw>{~hW7P6F@9w}xDo2w590@zMcUPexjfxgf|7&Tl$;)m6Rr%j7 z*9i@emY~yS@EK5i_$M~Su8D?x8XPVHVM3(eQs3yxYQp_Vwe}pXLis2Vo1rY1J<}o4 z1eRxKfp?c(?4}n`!r7DFdnde+Ir& z>WUM&MB?^wGMkfwGh|ZMT!{c$z%oZmjS4cTDkW(%G8b34c-^P$yqrGF2E={OHRztk`+3^_ ze*8Xe2^EA3j;6Z(Rd%(|`4NMdABX0L3 z!~FJ)oWdoUf7x3KVo9dvOc^z}5M3DK9H%a1JMkju+g+ttSR^xj*|bQK*|z6v?ZS`+ zv8y><}!!3bA}in33c3P#>?nR`FgCEX#nd} zw~!B3N@U57iU2fMOPQ$kq)9<}Wvfk=+M6eAK7Vc-`Krv3m4mzV|Lb=`PX~Q{W+@8^ zQ(I^QQ}EhXO5R5j^A}h40S9gDsS8g)|4XSwTZ*9w|%K7-zP>8T>^U6xLpMJ zy6?!$_bkUtKmM7_#I%S$Cmr+-;q}hPGorTQGp62B1-th*Z6V>dE;+j`0W3CQZT&Ix zDiB!MzWjsO4Tb@XgI(V9k6)ti;Ps^h^S&PFwvUMXk1v9T&# zgeX6l0kfWvccCP8;NL?z5uvI*zx&A}d>85m3yYKx@JiBe9arYNsLkuaTmW%~%J44R0O)8Uvc=8s{1cJJeubia1YxY`G4!olrgCcY8>x0RO= zBmIWP0LgO7>E;=fkXRPYs!E_2M}rgTs%3^c;806SLLvUb=X4v9?1RW1oh4m48GIqnw`Z# zV1m=@YQW#92ZJbyV}Dg|^NsxG^Hh1Do5fD2J9BBw8FS)HKsF0n8fq;qxiC*ob;0%a#AIURF`Kv5V0{VEn3k zmZvEDq*!DWW^|SiJ=&52cIokqdj?W;fAZ~3A1gxi zNXzr6PiL051cRzsw-Q)HmrJC~Q;h0+1f>HzGms0r%s(!HrfNVm)jHd8u=Wi&!8P2bPr1iSNh37lqPn99&#^awzWRt-{cW-XAYU-J?fq?j>U!tEb#S)a$;DR~$Joj58I_>;pysBTbLsR?O%c zmw}YzzG4hfk#9p}o0@jvN?<~ck+QyEm)-m|jGm5B*ti=CD;KQsp}6wjMfP8u-dw@` z1*B(-tW@WBaUgSI>`s1M<@TqHHUBqpPKv^KnrZxQ268+&^FsBXtdrPU0nFTpn=pg3 zj7h@Ats+)=j~7F8a|rkaMzZ7Qhzrsg4)*yY4Ny)yb0PhD?5VsbIKzd$1=6+6qyjgs zG^Zhq<4^$%*@t2-dhT-1}q2N;kcM=Bkrhoph=z}7vF<7KK z8>s6Q&{i4c>bI@``ijw4jB-Y^1GQ1D<>O8-2DI)kt>`sMJdRZS@y2B5J#!JxKRnQ! z5K@WijMLE4MjIiUkeb`A1kNk_geG$WT};5rJEh(*VLkR8(2)M8w9+Lb;uiBAO&PEE zfovT{i7riF-0vz-eWsi5S{&2kC>-0tXPUX+yP$Iwd6%nhUkS$DBoJ}n4&e(>F*@1T zg1rA#eBw~?-lpH7H7EqjIigFJ`u$r=pBg+72jYn|qv2q7uY(k}mH~aVq)%%q1KJWh zrBb!J@vE@*Ny=Amv;YR`+^9t(L~j(vv6TJG4w~@1f#`-@3k`SS5{W1}d zK?p{T@AmkUQYEcU6#jZh-4&Y#+U%gZq#EQMTp_Nsh{u`fHW*Ppo8fbquK zNKDn)e=O_7XKgo+)q)`3FPK6IY;iOr)-SXZ(N;A<*Gm(ANZKn&;v}6~?`*L-7f=2n z4I&=;&wq`MTz}QK_7RwYNtSS_sMZcEARj==%tJa0e;oc^Djs0?KKjWl?$eX}Gf^_S zry6nrSoXgYth+G*wPmGnYH*S%Vv^;UTla!kzfMBLEz|?QU>FFt{`yc(x0V8SH<`jIPa+dyqq%f$j`S(+)4+ZsWl{J zI&yYV#{H2`xfg-q_r$UKzXCQavC-PIb9PCx$UjUm8PGoN2~I6Zwvrc_+{4dW#=Cwn z_=eb#SNhxmYua7iC4Pe%?&ZtI_Q(-kr!}nN94;X*nD#jQJgB_gxBpRW!;X#Hq|L|~ zu%*^J3+Jf8@YI~<^V`=9^;G=#{2F*&l!-~|H!2*)WRW;}UrTJJ2&5V*{l(T{*mQFI z_AZsuoPwFJxUiP9VBaCl`i_db!|7tYSx+;%-8LNK?Ng3MA9?q$apeJ0r}Py>H7`GSOEELM?y{6FZxIcb z5b2@`FeiS<6OumP#L`L+lO=BI_T%XF`Uy8JVCAy0HC?Yjl?VZo_+2x>$0pnw`6fyl z#cQjoeuOSveuo;Rl8RHC5*+9OQHEL^df1HM%x)w?P7IX(M+XzJL7ENjC?irZ(W$A(UEXXFZ^z#Sy5&*7;p$ahct-FlB# zWZV6SyLfS<_pq8AV&coT@5>uy^H0$SR_zjxF6eWy75KoAQf;rNT!v;-bolpkaKnSv zjHsq!iZqwuq@H)E+Yg1m0$(1Tx;5cwWC?MFJMhf4(OLLd-_d9uFj3T9w$-~-im9EQ z-82m=w-Ewt9X~jsr=l?ECiRcT0`*?fSn;ulBIN89!hFKc- zEUE?}Gn6%($sW?3JeqI=*rK;1s0YdH5^(3FzWhqWVBRX@M#gWHVX?UBheZw`qQWS# z=Jr(6tJQ6CU=z^k%m@@3c$HvZx4GmMOt^=S#w;l~*!@#WJtj)fXk&@Ww+?j}I~3jz zQU1bis*bnL?~;LBgo?5-emPyd^=fP1M?iD3aZE-k`AC`tFFki5FN3$PlzVz2_#>#> z$0B^OYp8Ll<&Z~oSHAlAWG*CwBGc~gHpTVTW39l~N=MKP^2;cwK(p03i@UM1r`M1qu!bj3mdwd9c>*nFN z>{{d7y?k*O%T>&3&scgxCFIO0i9k<)Sj4?PQ{)03)_;uP_gS#QyOqVRkd#aG6qErm z5%rHRUlBOUZ!35>jCx4`uXPcQpC&X~rO4=~T=i+S#9ghn{Bxe1Kj;)GgVaZj`?7%M zs}{ic`0g zc&TO*`mpIDwQ-E|geQ~$dcwBo(qxTG*vv5Fgj9_;-2UWy0FK9e<6y1yi%1*NFTXAG zvOSWC{p(#UU9S)L_4B;N_E*HsniWWDV{LeJ!em2y{m7yB$jyAfvKF=uC+ROfZMu!l zrar}Tb}*Q%0N4YFdI?8@5!X4188Lq)g291skULdL#t@-R5M0nVp2pL)9g@fe{Ee1< zcQz8TuP!!!4%C9xc7(pe(LoN*#c(p`8^z9?!{9pzwk!dyaOssh7y);rk>12so7#aD z_m?0Rux_4*#!hAV&yfUs1%*A~YEZA#!8TUAu=MfEhXTkj#x&<3F&(JTh(6ai7z87L zR%ZRhyqGuZ&1apCm63x2cn;fD*aqsxhtFVy2S$~e5F?0+CR-qQgaL^Numar{hWQWT zmH#JCqD*;`G-vgiIDpdYB;?+|8em0m5s1vH?^F=Uk{v^^Emckt-q16BOtwfKsX&=FxQ^fDNk(~DbRSAzGc?hvmG`Q1V3*II;KP7HXd3;m@^ zRt7b600v zE+P0JXM(Ag=;N(27)giR*g?+@MS$6zfWPO5gD%+W z@$G?BO zdxM5s9rocIS3uZ&A83E6<)tJij9Yt5Hi{fns%m!{+I1`y(+j!Oj<%2sJ<+imt*Dq!#-#VAOmr`AmGF+V)n zgO~d7{AA&IST#gHqz$W|8E3YcOR?);ms2&d>xvF%&dG&t9E$J*Y#yn}vF0k;1_!)XJUd)S5w z29*DR%bLWG2EH>80h*5Qsbb;}&kqSFFVHQKx=T;)sp^zq*iYR+bfVq7trU&PACMaQ zFji=8BJ3iYn@UBcDWTVvdj*LYWuZbxbVTFAos{SsNc05%Y&U8$Evy9 zUxWdt<-Vgq?1sr=!2K=_Hd8aa>KK)QHNzq>Y=b;G=kaI1>;QgiLdqc{VE9RzV`XyC z#k5H9rUUoZ{r}=RgcB3sLUX9MZNoQy&_?p=a8s6Pn&e2U2v%Cm=70CEvv3bsl&LtQ z32{)!Z#8_q<@!J0wesd8bg9-a=HI96>-N>;a3gjQW_#Y{F)KXw=eRuB-(xyCbBxfv zq*8?-GOk%%l#d$zcO>zqF+{GQ`3g?5m#EI>>>b}HNGv=~)gfyIWzQQh^ zj&;k7ApC|6mv=34jDbJjcm!o|k(q1MlGyq-ica~Bc;4c=jmXK^guUtH%A9qoBbWEn zH?^`xUExuy7TVx%{}FJ7)HuFFsrvtr_1^JRhyDNfImf|?)6W3$}A&f zN1>E)&LO+(>^MgD7O9LQ5kkkv&WN(J$KkB+``q{adHnwP{c|3V_h09_Ui0}{*ULDb zgJR&Z^2BQY(&MeOl>z^^x5~NZo$~|*&B^4mOn*)cx}swSRQ$ zcI2Zh`_PUTduUti`o!ugQ}f84o$>m#V?2Gw*JY5U-HVrm2lp?cJ!5}e;4M#o+1A?9 zsr)zX^D#1mj5?a5(NEd<%o>uMY%`ZrQ&DrI&YK?=MSUwkgC2fKT_z>vmMM?Nv$C5b z>zhBOR4ax5=_@I}m;852Z)8&{+V4%&oyNydjpqgsrtRUmjN|spq`70Hwx#RSr-51W zEXgvT-*>un-8iParfmCTA^f{9)eM9y*luHP$f&gLJX^jB;*Z^-kZ~Ft6v1@(X`82{ z4CSX{BxN^I{91^vWmDbFkHuXd)L*lA-R}F?{Dw_bQqOo>3Iy5OzLusx^0!qhJKG7yBi7YLZ_B$F2IEXa)pBKiSrttKZ3ETv%ZenY;Q6B_-z8GCP zB0!M{N!TV`Hfp}#a2k-V@`YwBE7yS?)pR7t0g(zTJt$Rac9TTIBfy!kh&%jdVD+_o z-TopljSUCzKWqvLr!aWR_@|xlz-nNda$+|zB9(q@Fs4wAc!VgH9nnih5uF)~071gW&MJ#4`d0S;5V7Xhwf?Mrd!yN~~l z)dj&@k1!Nw2AP3}zwUV_c!edplb%|@pNd&H8XVig|h*Aw59!4 z`K3m~DvxV|-urJ~i8k9p2hccCkS-j~qu4%u>42Osggy=*vYFe{TZ?=-V8q<7iFtRHw+-5^b-?=?V{Q zu#)LRr{9_Sj<(77l~z^Gl1B5pId6W|J&Zg9-MGH-SFe0=j*{s8TF>bSCrU9SJ~-kJ z*Lfq!&16~KblqOBW1w%q_sxpo@N^nI@t(!(&^G;tkk`-n@S>lUaDDIDnHub9Kf%28h7}FIc(`9?kG-sDug>LVZ%#^*rE1bP9d*l6!%+cSjV*<;CK;-1Yjqe@v=$5|yJ4yFIfbjU_{Jw=Eq!jgN4@vSH4t{Y>O ziw?)&FJji7?X(Q9lOvpUBAu`>-DyfLIN_>B5Qs&I&LN%rFT`9CB|UNKKx`L!E`7mJ zLqe`~jfQs6&+{usJ18C2HMzha5uUhmrDytgb4a?G0u#CVXOR96Bzd0XAIJBCsh@atH}LeM zJDKU^#9&~3dt6EpQzz)zBQ}%t;Z|LN| zrV7J(g%6e-Fqcb%RTsh$?t@W<9jw(pff47tgMNI?J$GFPOm5A}yj@!l;#S0v^7l<3Xx~{jGLYjBomQb(oROggCPr6;z4WiYL&N;ue>eBzeDtFw zLrlq<9M>8tZtR~Z+r3dasdlEfAB>-BeH5vYh8>A%UIBJHy(q|5AGMQ!sBpjENmz0D zJ)Nf3R6|I~Bs}30zZVfLDmwI;^=C8(7$cYu0bvv}IRissJBrSDY?iDj3$%{=ULgbm za?4L9KCWV`brL}3sdT|;cw`OHUzcduRdLm)7Qpf~dsN(I#D@0=@$C$c1 z(!)cL{5*>nL1CBPY|VD{`Pxt!-#si4#3`1PJw!8~-^+;ThZ5e)C6jZ}>3m6+u~@g9 zx+;cm{(|0kk$%2%YyI<_ppX6V5EqHARK0A8RO#py=sCYe zPW`-4J_LQuJD|GZrTUpUf=_y@)p_;U;KET5E8Qz;$a0Cq?4<3YrpM8VZbx>O0KtL$ zrc+g~;G|Ywl)|#aDBTr9DmapJjxd_ zfwG6C2!N)0-r)q1f z&_Z=cKuYS6XBB8MLM9>pa-ia6*St+>A((aMzROgjiI-M~(#|!V_Tv>7pp(tkR9iDp zh~&k7(Dd6DND;s(@`aN)J2E)C<;46=g~Xkq@$iYO{O1LHZsV0HHzIL-epR+YtTRGg zwkW$nA%2(_Pq%hH)W0ZY0Q@Spe7P9*mLAalxAc4@eHIgFcp};h|EM_iORaa-&!N+9 zn!CHB*l5e2YOjclyH?d@$3dL{r8UoRUHKH|`d|y=xwT{e!oXT+V@Q&nJb``pIA9!4 z@Hb?%Urdy~_j4W_Azfr6NxkI)Gu1vPJ{vK+42e@OfIt2P8oA8@VrN(^EY2}Z3Z1_p zP8`7j%Q9bCz9AJn&B7Kob?eLd#Ui3_>)b^Nl3QxI;!$R?s4Ha9-&_i zWAg|uepPcQJ6K1Z#hL{WZfh39pj4rJ7?cfcMPcT$!H=#lJ3}Wgoz75_6({-GgzXn) z+(`cR_6(gDpB(QzQJ^tD5b44cJ(1b`l;`SudP(HoXNdV=tA$Gtko6uyLH(@MbTmC%SJ89enke9SA@pVE zd?Z4CQPCw8wZt4R;Lfu)FDxDDB&A0TbYNVhNa%m?Ik{dPpD%In(VUJiWbPr@9Xs&jB~P}W)1Lz+01y<8E| z;i)g==gEke=Wn>vK0L8o#0B5HGfMp7<(?3Wx)IznT}h zF|w$AveI6iE^YrvTRH=voH%4o3xKb4UTo6Iz~>vF7_6PaDGA>6!ucW7I}v!Ci|{ly zlh7hMY)xkbDX1TJcuA_hFdw4&=?z}EfE6IF8f9a;l>%7;RzJxDLu#8#n10| z)O!9nMBZC@X@dPfmR$sdPb%@1y#=6g*E9vEOXD8;vg&w=vc7w+fBntT_=cuGrAOcfEGy;=O!$dhP30eBGIY9#gUgac~dW z+J&k2d@xcgO0oAfl*as*j5<^@KH`@+rsJJQ z_@DJALp8rnuM{N3JEA;U+bo|?5cmj({of!Um>a7?ynNv7g~rF-kKT;qdAK4blwP2{ zGl|h+uPt6lyHXw~oL~j~f?odTALBYa0ciw&MhU>h1x#SFk68AY*&fce#-hgp@29IX zCLYE1A-r^^WTxFoS@=pU>bC8Vv7@gMx=@f}Vzc+VDKDSW)j8fX6&oq+{Z?6`Z0tb? z%IwHfJpsbA64a}4hx@i~Eu`f0B5SiP7%Qm?fX-kU8lLK}E_w*?G%Q@m@lCpieuc50 z#uI!0Mfd!n_s1sqWZz__ls*IEUr${P^4K5L;7-knMh1R=?q-5d%j@L_%ltDR0tfrj zXJ5W7t#9RrkOWI;k2hoqCod1&49OS1q-PT|>~KR2|1l*dCRDd-@?7Bwm9}j32J`69m&~kA0gwB}y+AJO#7>5YSbs8(K~BiURDW zi62zm^Z85g`%GCe<>tOmWQnVgm~fx@m%bx&k$X{6(qF>!Z?J4LpOK1m{O^&J`M zNb2QZ%jOp3HL!|eZg+uESihvx?(v6z!s1W;yT|?@Oa^PyOsN;^@B%K@;U!)87x)Yd z7Zx~0{U*x-57`w2j7Ej8l%Ib~6Xx<(Gm#=WWlT!y6wqK@#f`;zvLE=P(^vXyJ|OxB z5aaDx%MTX$BNMS#mYQ{2>-h=~`{^Z!JJ_V$n7;>)c(gFF_1tf&( z%f|!&s4i%+rTad}cfPrKf4H>BouO?^NG|$XCU5hQ|KA=-2D5Jp(oCRsPu8ntD-MM<8$Iy)^H4~8D+i&Cv7(v zca0T3)T%xT-IIb=-N-AEW&E)0<~VFt-&IKa$3d8giOjO6vKF|hxHRBT#HGpEEmXtK z22K(#)6^ixg9MN#(%l1X#62Ef^lkY8Qex|sFSz@IWy7cMZRBCB^cv>Xl+#mP&b1p` z(h~Ynk}N~pm$i4JKcF^5F5k7`?{q^9h7vAH{R_l5Rkbt4qwXXjMw=CY_xg6$IQ~cA z5h{U49@O3huC1QTVl7XJ-bU@y=|A&&w;wLA;T@)F9D?b@ks>tVA12e%bmhL6kP8pp z_G)b@PamK-*P=}rJKwAxwKYEOi)U|Hy{xe7z}2zxT=62X#wTNYrqwUfw(%{^&9