From 1c335dac42e829b7254e0a5c4d0b0a83fcde7fa9 Mon Sep 17 00:00:00 2001 From: mrhcjones <150591975+mrhcjones@users.noreply.github.com> Date: Sat, 9 Mar 2024 12:45:09 +0000 Subject: [PATCH] Added files before it got deleted --- .editorconfig | 5 + .github/ISSUE_TEMPLATE/bug_report.yml | 110 + .github/ISSUE_TEMPLATE/config.yml | 5 + .github/ISSUE_TEMPLATE/feature_request.yml | 46 + .github/workflows/ci.yml | 129 + .github/workflows/release.yml | 89 + .gitignore | 42 + .metadata | 10 + .vscode/settings.json | 12 + LICENSE | 7 + README.md | 58 + analysis_options.yaml | 29 + android/.gitignore | 11 + android/app/build.gradle | 105 + android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/debug/res/values/string.xml | 4 + android/app/src/main/AndroidManifest.xml | 302 ++ .../fritter/FritterApplication.java | 15 + .../com/jonjomckay/fritter/MainActivity.kt | 6 + android/app/src/main/play_store_512.png | Bin 0 -> 76159 bytes .../res/drawable-night/launch_background.xml | 12 + .../res/drawable/ic_launcher_monochrome.xml | 17 + .../src/main/res/drawable/ic_notification.xml | 9 + .../main/res/drawable/launch_background.xml | 12 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 6 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 7733 bytes .../mipmap-hdpi/ic_launcher_background.png | Bin 0 -> 20308 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 0 -> 4036 bytes .../mipmap-hdpi/ic_launcher_monochrome.png | Bin 0 -> 2535 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 4402 bytes .../mipmap-mdpi/ic_launcher_background.png | Bin 0 -> 12243 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 0 -> 2614 bytes .../mipmap-mdpi/ic_launcher_monochrome.png | Bin 0 -> 1603 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 11549 bytes .../mipmap-xhdpi/ic_launcher_background.png | Bin 0 -> 28580 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 0 -> 6098 bytes .../mipmap-xhdpi/ic_launcher_monochrome.png | Bin 0 -> 3612 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 19559 bytes .../mipmap-xxhdpi/ic_launcher_background.png | Bin 0 -> 46353 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 0 -> 10759 bytes .../mipmap-xxhdpi/ic_launcher_monochrome.png | Bin 0 -> 6270 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 28206 bytes .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 0 -> 65026 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 0 -> 16336 bytes .../mipmap-xxxhdpi/ic_launcher_monochrome.png | Bin 0 -> 9273 bytes android/app/src/main/res/raw/keep.xml | 3 + android/app/src/main/res/values/string.xml | 4 + android/app/src/main/res/values/styles.xml | 18 + android/app/src/profile/AndroidManifest.xml | 7 + android/app/src/profile/res/values/string.xml | 4 + android/build.gradle | 31 + android/fastlane/Appfile | 1 + android/fastlane/Fastfile | 38 + android/fastlane/README.md | 39 + .../metadata/android/en-GB/changelogs/1.txt | 1 + .../metadata/android/en-GB/changelogs/2.txt | 4 + .../metadata/android/en-GB/changelogs/3.txt | 5 + .../metadata/android/en-GB/changelogs/4.txt | 6 + .../metadata/android/en-GB/changelogs/5.txt | 5 + .../android/en-GB/changelogs/next.txt | 0 .../android/en-GB/full_description copy.txt | 5 + .../metadata/android/en-GB/images/icon.png | Bin 0 -> 28206 bytes .../en-GB/images/phoneScreenshots/1.jpg | Bin 0 -> 68920 bytes .../en-GB/images/phoneScreenshots/2.jpg | Bin 0 -> 34876 bytes .../en-GB/images/phoneScreenshots/3.jpg | Bin 0 -> 103797 bytes .../en-GB/images/phoneScreenshots/4.jpg | Bin 0 -> 93099 bytes .../en-GB/images/phoneScreenshots/5.jpg | Bin 0 -> 42524 bytes .../android/en-GB/short_description copy.txt | 1 + .../metadata/android/en-GB/title copy.txt | 1 + .../fastlane/metadata/android/en-GB/video.txt | 0 android/gradle.properties | 7 + .../gradle/wrapper/gradle-wrapper.properties | 6 + android/settings.gradle | 11 + android/settings_aar.gradle | 1 + build-play.sh | 6 + .../metadata/android/en-US/changelogs/1.txt | 1 + .../metadata/android/en-US/changelogs/2.txt | 4 + .../metadata/android/en-US/changelogs/3.txt | 5 + .../metadata/android/en-US/changelogs/4.txt | 6 + .../metadata/android/en-US/changelogs/5.txt | 5 + .../android/en-US/changelogs/next.txt | 0 .../android/en-US/full_description.txt | 5 + .../metadata/android/en-US/images/icon.png | Bin 0 -> 28206 bytes .../en-US/images/phoneScreenshots/1.jpg | Bin 0 -> 68920 bytes .../en-US/images/phoneScreenshots/2.jpg | Bin 0 -> 34876 bytes .../en-US/images/phoneScreenshots/3.jpg | Bin 0 -> 103797 bytes .../en-US/images/phoneScreenshots/4.jpg | Bin 0 -> 93099 bytes .../en-US/images/phoneScreenshots/5.jpg | Bin 0 -> 42524 bytes .../android/en-US/short_description.txt | 1 + fastlane/metadata/android/en-US/title.txt | 1 + .../app/src/main/res/values-ar/strings.xml | 4 + .../src/main/res/values-b+be+Latn/strings.xml | 4 + .../app/src/main/res/values-be/strings.xml | 4 + .../app/src/main/res/values-ca/strings.xml | 4 + .../app/src/main/res/values-cs/strings.xml | 4 + .../app/src/main/res/values-de/strings.xml | 4 + .../app/src/main/res/values-eo/strings.xml | 4 + .../app/src/main/res/values-es/strings.xml | 4 + .../app/src/main/res/values-et/strings.xml | 4 + .../app/src/main/res/values-eu/strings.xml | 4 + .../app/src/main/res/values-fr/strings.xml | 4 + .../app/src/main/res/values-hi/strings.xml | 4 + .../app/src/main/res/values-id/strings.xml | 4 + .../app/src/main/res/values-it/strings.xml | 4 + .../app/src/main/res/values-ja/strings.xml | 4 + .../app/src/main/res/values-ko/strings.xml | 4 + .../app/src/main/res/values-ml/strings.xml | 4 + .../src/main/res/values-nb-rNO/strings.xml | 4 + .../app/src/main/res/values-nl/strings.xml | 4 + .../app/src/main/res/values-or/strings.xml | 4 + .../app/src/main/res/values-pl/strings.xml | 4 + .../src/main/res/values-pt-rBR/strings.xml | 4 + .../app/src/main/res/values-pt/strings.xml | 4 + .../app/src/main/res/values-ro/strings.xml | 4 + .../app/src/main/res/values-ru/strings.xml | 4 + .../app/src/main/res/values-tr/strings.xml | 4 + .../app/src/main/res/values-uk/strings.xml | 4 + .../src/main/res/values-zh-rCN/strings.xml | 4 + .../ios/Runner/Base.lproj/ar/Main.storyboard | 1 + .../Runner/Base.lproj/be-Latn/Main.storyboard | 1 + .../ios/Runner/Base.lproj/be/Main.storyboard | 1 + .../ios/Runner/Base.lproj/ca/Main.storyboard | 1 + .../ios/Runner/Base.lproj/cs/Main.storyboard | 1 + .../ios/Runner/Base.lproj/de/Main.storyboard | 1 + .../ios/Runner/Base.lproj/eo/Main.storyboard | 1 + .../ios/Runner/Base.lproj/es/Main.storyboard | 1 + .../ios/Runner/Base.lproj/et/Main.storyboard | 1 + .../ios/Runner/Base.lproj/eu/Main.storyboard | 1 + .../ios/Runner/Base.lproj/fr/Main.storyboard | 1 + .../ios/Runner/Base.lproj/hi/Main.storyboard | 1 + .../ios/Runner/Base.lproj/id/Main.storyboard | 1 + .../ios/Runner/Base.lproj/it/Main.storyboard | 1 + .../ios/Runner/Base.lproj/ja/Main.storyboard | 1 + .../ios/Runner/Base.lproj/ko/Main.storyboard | 1 + .../ios/Runner/Base.lproj/ml/Main.storyboard | 1 + .../Runner/Base.lproj/nb-NO/Main.storyboard | 1 + .../ios/Runner/Base.lproj/nl/Main.storyboard | 1 + .../ios/Runner/Base.lproj/or/Main.storyboard | 1 + .../ios/Runner/Base.lproj/pl/Main.storyboard | 1 + .../Runner/Base.lproj/pt-BR/Main.storyboard | 1 + .../ios/Runner/Base.lproj/pt/Main.storyboard | 1 + .../ios/Runner/Base.lproj/ro/Main.storyboard | 1 + .../ios/Runner/Base.lproj/ru/Main.storyboard | 1 + .../ios/Runner/Base.lproj/tr/Main.storyboard | 1 + .../ios/Runner/Base.lproj/uk/Main.storyboard | 1 + .../Runner/Base.lproj/zh-Hans/Main.storyboard | 1 + ios/.gitignore | 32 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 2 + ios/Flutter/Release.xcconfig | 2 + ios/Podfile | 41 + ios/Podfile.lock | 131 + ios/Runner.xcodeproj/project.pbxproj | 582 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/AppIcon-20@2x.png | Bin 0 -> 3062 bytes .../AppIcon.appiconset/AppIcon-20@2x~ipad.png | Bin 0 -> 3062 bytes .../AppIcon.appiconset/AppIcon-20@3x.png | Bin 0 -> 5207 bytes .../AppIcon.appiconset/AppIcon-20~ipad.png | Bin 0 -> 1128 bytes .../AppIcon.appiconset/AppIcon-29.png | Bin 0 -> 1882 bytes .../AppIcon.appiconset/AppIcon-29@2x.png | Bin 0 -> 4967 bytes .../AppIcon.appiconset/AppIcon-29@2x~ipad.png | Bin 0 -> 4967 bytes .../AppIcon.appiconset/AppIcon-29@3x.png | Bin 0 -> 8451 bytes .../AppIcon.appiconset/AppIcon-29~ipad.png | Bin 0 -> 1882 bytes .../AppIcon.appiconset/AppIcon-40@2x.png | Bin 0 -> 7483 bytes .../AppIcon.appiconset/AppIcon-40@2x~ipad.png | Bin 0 -> 7483 bytes .../AppIcon.appiconset/AppIcon-40@3x.png | Bin 0 -> 12180 bytes .../AppIcon.appiconset/AppIcon-40~ipad.png | Bin 0 -> 3062 bytes .../AppIcon.appiconset/AppIcon-60@2x~car.png | Bin 0 -> 12180 bytes .../AppIcon.appiconset/AppIcon-60@3x~car.png | Bin 0 -> 20503 bytes .../AppIcon-83.5@2x~ipad.png | Bin 0 -> 18797 bytes .../AppIcon.appiconset/AppIcon@2x.png | Bin 0 -> 12180 bytes .../AppIcon.appiconset/AppIcon@2x~ipad.png | Bin 0 -> 16488 bytes .../AppIcon.appiconset/AppIcon@3x.png | Bin 0 -> 20503 bytes .../AppIcon~ios-marketing.png | Bin 0 -> 182266 bytes .../AppIcon.appiconset/AppIcon~ipad.png | Bin 0 -> 7061 bytes .../AppIcon.appiconset/Contents.json | 134 + .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 + ios/Runner/Base.lproj/Main.storyboard | 26 + .../Base.lproj/ar/LaunchScreen.storyboard | 1 + .../be-Latn/LaunchScreen.storyboard | 1 + .../Base.lproj/be/LaunchScreen.storyboard | 1 + .../Base.lproj/ca/LaunchScreen.storyboard | 1 + .../Base.lproj/cs/LaunchScreen.storyboard | 1 + .../Base.lproj/de/LaunchScreen.storyboard | 1 + .../Base.lproj/eo/LaunchScreen.storyboard | 1 + .../Base.lproj/es/LaunchScreen.storyboard | 1 + .../Base.lproj/et/LaunchScreen.storyboard | 1 + .../Base.lproj/eu/LaunchScreen.storyboard | 1 + .../Base.lproj/fr/LaunchScreen.storyboard | 1 + .../Base.lproj/hi/LaunchScreen.storyboard | 1 + .../Base.lproj/id/LaunchScreen.storyboard | 1 + .../Base.lproj/it/LaunchScreen.storyboard | 1 + .../Base.lproj/ja/LaunchScreen.storyboard | 1 + .../Base.lproj/ko/LaunchScreen.storyboard | 1 + .../Base.lproj/ml/LaunchScreen.storyboard | 1 + .../Base.lproj/nb-NO/LaunchScreen.storyboard | 1 + .../Base.lproj/nl/LaunchScreen.storyboard | 1 + .../Base.lproj/or/LaunchScreen.storyboard | 1 + .../Base.lproj/pl/LaunchScreen.storyboard | 1 + .../Base.lproj/pt-BR/LaunchScreen.storyboard | 1 + .../Base.lproj/pt/LaunchScreen.storyboard | 1 + .../Base.lproj/ro/LaunchScreen.storyboard | 1 + .../Base.lproj/ru/LaunchScreen.storyboard | 1 + .../Base.lproj/tr/LaunchScreen.storyboard | 1 + .../Base.lproj/uk/LaunchScreen.storyboard | 1 + .../zh-Hans/LaunchScreen.storyboard | 1 + ios/Runner/Info.plist | 59 + ios/Runner/Runner-Bridging-Header.h | 1 + ...68c5a5ddc4a08fc8a532b246d1332-desc.xcbuild | Bin 0 -> 606994 bytes ...a5ddc4a08fc8a532b246d1332-manifest.xcbuild | 105 + ...acheIndex-356b71b1a528c44b947f9456849ec4c1 | Bin 0 -> 78 bytes ios/build/XCBuildData/build.db | Bin 0 -> 172032 bytes ...31a7c171441a95488a75e7a2d9228-desc.xcbuild | Bin 0 -> 319594 bytes ...c171441a95488a75e7a2d9228-manifest.xcbuild | 96 + lib/client.dart | 1041 +++++ lib/constants.dart | 51 + lib/database/entities.dart | 212 + lib/database/repository.dart | 238 + lib/generated/intl/messages_all.dart | 175 + lib/generated/intl/messages_ar.dart | 479 ++ lib/generated/intl/messages_be.dart | 464 ++ lib/generated/intl/messages_be_Latn.dart | 139 + lib/generated/intl/messages_ca.dart | 464 ++ lib/generated/intl/messages_cs.dart | 487 +++ lib/generated/intl/messages_de.dart | 490 +++ lib/generated/intl/messages_en.dart | 484 +++ lib/generated/intl/messages_eo.dart | 479 ++ lib/generated/intl/messages_es.dart | 96 + lib/generated/intl/messages_et.dart | 494 +++ lib/generated/intl/messages_eu.dart | 465 ++ lib/generated/intl/messages_fr.dart | 493 +++ lib/generated/intl/messages_hi.dart | 25 + lib/generated/intl/messages_id.dart | 473 ++ lib/generated/intl/messages_it.dart | 491 +++ lib/generated/intl/messages_ja.dart | 387 ++ lib/generated/intl/messages_ko.dart | 96 + lib/generated/intl/messages_ml.dart | 25 + lib/generated/intl/messages_nb_NO.dart | 412 ++ lib/generated/intl/messages_nl.dart | 124 + lib/generated/intl/messages_or.dart | 41 + lib/generated/intl/messages_pl.dart | 485 +++ lib/generated/intl/messages_pt.dart | 486 +++ lib/generated/intl/messages_pt_BR.dart | 489 +++ lib/generated/intl/messages_ro.dart | 67 + lib/generated/intl/messages_ru.dart | 465 ++ lib/generated/intl/messages_tr.dart | 485 +++ lib/generated/intl/messages_uk.dart | 290 ++ lib/generated/intl/messages_zh_Hans.dart | 397 ++ lib/generated/l10n.dart | 2482 +++++++++++ lib/group/_feed.dart | 279 ++ lib/group/_settings.dart | 72 + lib/group/group_model.dart | 258 ++ lib/group/group_screen.dart | 143 + lib/home/_feed.dart | 30 + lib/home/_groups.dart | 52 + lib/home/_missing.dart | 26 + lib/home/_saved.dart | 147 + lib/home/home_model.dart | 96 + lib/home/home_screen.dart | 244 ++ lib/import_data_model.dart | 25 + lib/l10n/intl_ar.arb | 490 +++ lib/l10n/intl_be.arb | 462 ++ lib/l10n/intl_be_Latn.arb | 124 + lib/l10n/intl_ca.arb | 466 ++ lib/l10n/intl_cs.arb | 494 +++ lib/l10n/intl_de.arb | 496 +++ lib/l10n/intl_en.arb | 416 ++ lib/l10n/intl_eo.arb | 490 +++ lib/l10n/intl_es.arb | 74 + lib/l10n/intl_et.arb | 494 +++ lib/l10n/intl_eu.arb | 466 ++ lib/l10n/intl_fr.arb | 494 +++ lib/l10n/intl_hi.arb | 1 + lib/l10n/intl_id.arb | 478 ++ lib/l10n/intl_it.arb | 494 +++ lib/l10n/intl_ja.arb | 458 ++ lib/l10n/intl_ko.arb | 100 + lib/l10n/intl_ml.arb | 1 + lib/l10n/intl_nb_NO.arb | 422 ++ lib/l10n/intl_nl.arb | 106 + lib/l10n/intl_or.arb | 32 + lib/l10n/intl_pl.arb | 494 +++ lib/l10n/intl_pt.arb | 490 +++ lib/l10n/intl_pt_BR.arb | 494 +++ lib/l10n/intl_ro.arb | 48 + lib/l10n/intl_ru.arb | 466 ++ lib/l10n/intl_tr.arb | 494 +++ lib/l10n/intl_uk.arb | 304 ++ lib/l10n/intl_zh_Hans.arb | 492 +++ lib/loading.dart | 32 + lib/main.dart | 576 +++ lib/models.dart | 13 + lib/profile/_follows.dart | 105 + lib/profile/_saved.dart | 90 + lib/profile/_tweets.dart | 121 + lib/profile/profile.dart | 554 +++ lib/profile/profile_model.dart | 22 + lib/saved/saved_tweet_model.dart | 52 + lib/search/search.dart | 258 ++ lib/search/search_model.dart | 36 + lib/settings/_about.dart | 70 + lib/settings/_data.dart | 150 + lib/settings/_general.dart | 293 ++ lib/settings/_home.dart | 71 + lib/settings/_theme.dart | 52 + lib/settings/settings.dart | 70 + lib/settings/settings_export_screen.dart | 178 + lib/status.dart | 149 + lib/subscriptions/_groups.dart | 401 ++ lib/subscriptions/_import.dart | 211 + lib/subscriptions/_list.dart | 99 + lib/subscriptions/subscriptions.dart | 54 + lib/subscriptions/users_model.dart | 150 + lib/trends/_list.dart | 85 + lib/trends/_settings.dart | 88 + lib/trends/_tabs.dart | 140 + lib/trends/trends.dart | 34 + lib/trends/trends_model.dart | 126 + lib/tweet/_card.dart | 449 ++ lib/tweet/_entities.dart | 73 + lib/tweet/_media.dart | 334 ++ lib/tweet/_photo.dart | 77 + lib/tweet/_video.dart | 242 ++ lib/tweet/_video_controls.dart | 658 +++ lib/tweet/conversation.dart | 51 + lib/tweet/tweet.dart | 677 +++ lib/tweet/tweet_exceptions.dart | 11 + lib/ui/dates.dart | 57 + lib/ui/errors.dart | 303 ++ lib/ui/physics.dart | 19 + lib/user.dart | 243 ++ lib/utils/cache.dart | 23 + lib/utils/debounce.dart | 30 + lib/utils/downloads.dart | 94 + lib/utils/iterables.dart | 38 + lib/utils/misc.dart | 27 + lib/utils/notifiers.dart | 11 + lib/utils/translation.dart | 126 + lib/utils/urls.dart | 5 + pubspec.lock | 1399 ++++++ pubspec.yaml | 140 + release.sh | 145 + test/thread_test.dart | 267 ++ test/tweets-carmack-replies.json | 3433 +++++++++++++++ test/tweets-carmack.json | 3858 +++++++++++++++++ 357 files changed, 46156 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 .vscode/settings.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/debug/res/values/string.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/com/jonjomckay/fritter/FritterApplication.java create mode 100644 android/app/src/main/kotlin/com/jonjomckay/fritter/MainActivity.kt create mode 100644 android/app/src/main/play_store_512.png create mode 100644 android/app/src/main/res/drawable-night/launch_background.xml create mode 100644 android/app/src/main/res/drawable/ic_launcher_monochrome.xml create mode 100644 android/app/src/main/res/drawable/ic_notification.xml create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_background.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_background.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png create mode 100644 android/app/src/main/res/raw/keep.xml create mode 100644 android/app/src/main/res/values/string.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/app/src/profile/res/values/string.xml create mode 100644 android/build.gradle create mode 100644 android/fastlane/Appfile create mode 100644 android/fastlane/Fastfile create mode 100644 android/fastlane/README.md create mode 100644 android/fastlane/metadata/android/en-GB/changelogs/1.txt create mode 100644 android/fastlane/metadata/android/en-GB/changelogs/2.txt create mode 100644 android/fastlane/metadata/android/en-GB/changelogs/3.txt create mode 100644 android/fastlane/metadata/android/en-GB/changelogs/4.txt create mode 100644 android/fastlane/metadata/android/en-GB/changelogs/5.txt create mode 100644 android/fastlane/metadata/android/en-GB/changelogs/next.txt create mode 100644 android/fastlane/metadata/android/en-GB/full_description copy.txt create mode 100644 android/fastlane/metadata/android/en-GB/images/icon.png create mode 100644 android/fastlane/metadata/android/en-GB/images/phoneScreenshots/1.jpg create mode 100644 android/fastlane/metadata/android/en-GB/images/phoneScreenshots/2.jpg create mode 100644 android/fastlane/metadata/android/en-GB/images/phoneScreenshots/3.jpg create mode 100644 android/fastlane/metadata/android/en-GB/images/phoneScreenshots/4.jpg create mode 100644 android/fastlane/metadata/android/en-GB/images/phoneScreenshots/5.jpg create mode 100644 android/fastlane/metadata/android/en-GB/short_description copy.txt create mode 100644 android/fastlane/metadata/android/en-GB/title copy.txt create mode 100644 android/fastlane/metadata/android/en-GB/video.txt create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 android/settings_aar.gradle create mode 100755 build-play.sh create mode 100644 fastlane/metadata/android/en-US/changelogs/1.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/2.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/3.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/4.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/5.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/next.txt create mode 100644 fastlane/metadata/android/en-US/full_description.txt create mode 100644 fastlane/metadata/android/en-US/images/icon.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/1.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/2.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/3.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/4.jpg create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/5.jpg create mode 100644 fastlane/metadata/android/en-US/short_description.txt create mode 100644 fastlane/metadata/android/en-US/title.txt create mode 100644 fritter/android/app/src/main/res/values-ar/strings.xml create mode 100644 fritter/android/app/src/main/res/values-b+be+Latn/strings.xml create mode 100644 fritter/android/app/src/main/res/values-be/strings.xml create mode 100644 fritter/android/app/src/main/res/values-ca/strings.xml create mode 100644 fritter/android/app/src/main/res/values-cs/strings.xml create mode 100644 fritter/android/app/src/main/res/values-de/strings.xml create mode 100644 fritter/android/app/src/main/res/values-eo/strings.xml create mode 100644 fritter/android/app/src/main/res/values-es/strings.xml create mode 100644 fritter/android/app/src/main/res/values-et/strings.xml create mode 100644 fritter/android/app/src/main/res/values-eu/strings.xml create mode 100644 fritter/android/app/src/main/res/values-fr/strings.xml create mode 100644 fritter/android/app/src/main/res/values-hi/strings.xml create mode 100644 fritter/android/app/src/main/res/values-id/strings.xml create mode 100644 fritter/android/app/src/main/res/values-it/strings.xml create mode 100644 fritter/android/app/src/main/res/values-ja/strings.xml create mode 100644 fritter/android/app/src/main/res/values-ko/strings.xml create mode 100644 fritter/android/app/src/main/res/values-ml/strings.xml create mode 100644 fritter/android/app/src/main/res/values-nb-rNO/strings.xml create mode 100644 fritter/android/app/src/main/res/values-nl/strings.xml create mode 100644 fritter/android/app/src/main/res/values-or/strings.xml create mode 100644 fritter/android/app/src/main/res/values-pl/strings.xml create mode 100644 fritter/android/app/src/main/res/values-pt-rBR/strings.xml create mode 100644 fritter/android/app/src/main/res/values-pt/strings.xml create mode 100644 fritter/android/app/src/main/res/values-ro/strings.xml create mode 100644 fritter/android/app/src/main/res/values-ru/strings.xml create mode 100644 fritter/android/app/src/main/res/values-tr/strings.xml create mode 100644 fritter/android/app/src/main/res/values-uk/strings.xml create mode 100644 fritter/android/app/src/main/res/values-zh-rCN/strings.xml create mode 100644 fritter/ios/Runner/Base.lproj/ar/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/be-Latn/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/be/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/ca/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/cs/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/de/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/eo/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/es/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/et/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/eu/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/fr/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/hi/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/id/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/it/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/ja/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/ko/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/ml/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/nb-NO/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/nl/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/or/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/pl/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/pt-BR/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/pt/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/ro/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/ru/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/tr/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/uk/Main.storyboard create mode 100644 fritter/ios/Runner/Base.lproj/zh-Hans/Main.storyboard create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Podfile create mode 100644 ios/Podfile.lock create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner/AppDelegate.swift create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@2x~ipad.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-20~ipad.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@2x~ipad.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-29~ipad.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@2x~ipad.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-40~ipad.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@2x~car.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-60@3x~car.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon-83.5@2x~ipad.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@2x~ipad.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ios-marketing.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/AppIcon~ipad.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Base.lproj/ar/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/be-Latn/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/be/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/ca/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/cs/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/de/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/eo/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/es/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/et/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/eu/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/fr/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/hi/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/id/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/it/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/ja/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/ko/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/ml/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/nb-NO/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/nl/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/or/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/pl/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/pt-BR/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/pt/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/ro/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/ru/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/tr/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/uk/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/zh-Hans/LaunchScreen.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 ios/build/XCBuildData/45c68c5a5ddc4a08fc8a532b246d1332-desc.xcbuild create mode 100644 ios/build/XCBuildData/45c68c5a5ddc4a08fc8a532b246d1332-manifest.xcbuild create mode 100644 ios/build/XCBuildData/BuildDescriptionCacheIndex-356b71b1a528c44b947f9456849ec4c1 create mode 100644 ios/build/XCBuildData/build.db create mode 100644 ios/build/XCBuildData/f0d31a7c171441a95488a75e7a2d9228-desc.xcbuild create mode 100644 ios/build/XCBuildData/f0d31a7c171441a95488a75e7a2d9228-manifest.xcbuild create mode 100644 lib/client.dart create mode 100644 lib/constants.dart create mode 100644 lib/database/entities.dart create mode 100644 lib/database/repository.dart create mode 100644 lib/generated/intl/messages_all.dart create mode 100644 lib/generated/intl/messages_ar.dart create mode 100644 lib/generated/intl/messages_be.dart create mode 100644 lib/generated/intl/messages_be_Latn.dart create mode 100644 lib/generated/intl/messages_ca.dart create mode 100644 lib/generated/intl/messages_cs.dart create mode 100644 lib/generated/intl/messages_de.dart create mode 100644 lib/generated/intl/messages_en.dart create mode 100644 lib/generated/intl/messages_eo.dart create mode 100644 lib/generated/intl/messages_es.dart create mode 100644 lib/generated/intl/messages_et.dart create mode 100644 lib/generated/intl/messages_eu.dart create mode 100644 lib/generated/intl/messages_fr.dart create mode 100644 lib/generated/intl/messages_hi.dart create mode 100644 lib/generated/intl/messages_id.dart create mode 100644 lib/generated/intl/messages_it.dart create mode 100644 lib/generated/intl/messages_ja.dart create mode 100644 lib/generated/intl/messages_ko.dart create mode 100644 lib/generated/intl/messages_ml.dart create mode 100644 lib/generated/intl/messages_nb_NO.dart create mode 100644 lib/generated/intl/messages_nl.dart create mode 100644 lib/generated/intl/messages_or.dart create mode 100644 lib/generated/intl/messages_pl.dart create mode 100644 lib/generated/intl/messages_pt.dart create mode 100644 lib/generated/intl/messages_pt_BR.dart create mode 100644 lib/generated/intl/messages_ro.dart create mode 100644 lib/generated/intl/messages_ru.dart create mode 100644 lib/generated/intl/messages_tr.dart create mode 100644 lib/generated/intl/messages_uk.dart create mode 100644 lib/generated/intl/messages_zh_Hans.dart create mode 100644 lib/generated/l10n.dart create mode 100644 lib/group/_feed.dart create mode 100644 lib/group/_settings.dart create mode 100644 lib/group/group_model.dart create mode 100644 lib/group/group_screen.dart create mode 100644 lib/home/_feed.dart create mode 100644 lib/home/_groups.dart create mode 100644 lib/home/_missing.dart create mode 100644 lib/home/_saved.dart create mode 100644 lib/home/home_model.dart create mode 100644 lib/home/home_screen.dart create mode 100644 lib/import_data_model.dart create mode 100644 lib/l10n/intl_ar.arb create mode 100644 lib/l10n/intl_be.arb create mode 100644 lib/l10n/intl_be_Latn.arb create mode 100644 lib/l10n/intl_ca.arb create mode 100644 lib/l10n/intl_cs.arb create mode 100644 lib/l10n/intl_de.arb create mode 100644 lib/l10n/intl_en.arb create mode 100644 lib/l10n/intl_eo.arb create mode 100644 lib/l10n/intl_es.arb create mode 100644 lib/l10n/intl_et.arb create mode 100644 lib/l10n/intl_eu.arb create mode 100644 lib/l10n/intl_fr.arb create mode 100644 lib/l10n/intl_hi.arb create mode 100644 lib/l10n/intl_id.arb create mode 100644 lib/l10n/intl_it.arb create mode 100644 lib/l10n/intl_ja.arb create mode 100644 lib/l10n/intl_ko.arb create mode 100644 lib/l10n/intl_ml.arb create mode 100644 lib/l10n/intl_nb_NO.arb create mode 100644 lib/l10n/intl_nl.arb create mode 100644 lib/l10n/intl_or.arb create mode 100644 lib/l10n/intl_pl.arb create mode 100644 lib/l10n/intl_pt.arb create mode 100644 lib/l10n/intl_pt_BR.arb create mode 100644 lib/l10n/intl_ro.arb create mode 100644 lib/l10n/intl_ru.arb create mode 100644 lib/l10n/intl_tr.arb create mode 100644 lib/l10n/intl_uk.arb create mode 100644 lib/l10n/intl_zh_Hans.arb create mode 100644 lib/loading.dart create mode 100644 lib/main.dart create mode 100644 lib/models.dart create mode 100644 lib/profile/_follows.dart create mode 100644 lib/profile/_saved.dart create mode 100644 lib/profile/_tweets.dart create mode 100644 lib/profile/profile.dart create mode 100644 lib/profile/profile_model.dart create mode 100644 lib/saved/saved_tweet_model.dart create mode 100644 lib/search/search.dart create mode 100644 lib/search/search_model.dart create mode 100644 lib/settings/_about.dart create mode 100644 lib/settings/_data.dart create mode 100644 lib/settings/_general.dart create mode 100644 lib/settings/_home.dart create mode 100644 lib/settings/_theme.dart create mode 100644 lib/settings/settings.dart create mode 100644 lib/settings/settings_export_screen.dart create mode 100644 lib/status.dart create mode 100644 lib/subscriptions/_groups.dart create mode 100644 lib/subscriptions/_import.dart create mode 100644 lib/subscriptions/_list.dart create mode 100644 lib/subscriptions/subscriptions.dart create mode 100644 lib/subscriptions/users_model.dart create mode 100644 lib/trends/_list.dart create mode 100644 lib/trends/_settings.dart create mode 100644 lib/trends/_tabs.dart create mode 100644 lib/trends/trends.dart create mode 100644 lib/trends/trends_model.dart create mode 100644 lib/tweet/_card.dart create mode 100644 lib/tweet/_entities.dart create mode 100644 lib/tweet/_media.dart create mode 100644 lib/tweet/_photo.dart create mode 100644 lib/tweet/_video.dart create mode 100644 lib/tweet/_video_controls.dart create mode 100644 lib/tweet/conversation.dart create mode 100644 lib/tweet/tweet.dart create mode 100644 lib/tweet/tweet_exceptions.dart create mode 100644 lib/ui/dates.dart create mode 100644 lib/ui/errors.dart create mode 100644 lib/ui/physics.dart create mode 100644 lib/user.dart create mode 100644 lib/utils/cache.dart create mode 100644 lib/utils/debounce.dart create mode 100644 lib/utils/downloads.dart create mode 100644 lib/utils/iterables.dart create mode 100644 lib/utils/misc.dart create mode 100644 lib/utils/notifiers.dart create mode 100644 lib/utils/translation.dart create mode 100644 lib/utils/urls.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100755 release.sh create mode 100644 test/thread_test.dart create mode 100644 test/tweets-carmack-replies.json create mode 100644 test/tweets-carmack.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..863d5a9e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,5 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*.dart] +max_line_length = 120 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..25bf01c7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,110 @@ +name: Bug report +description: Create a bug report to help Quacker improve +labels: [bug] +body: + - type: markdown + attributes: + value: | + Thank you for helping to make Quacker better by reporting a bug. :hugs: + + Please fill in as much information as possible about your bug so that we don't have to play "information ping-pong" and can help you immediately. + + - type: checkboxes + id: checklist + attributes: + label: "Checklist" + options: + - label: "I am able to reproduce the bug with the [latest version](https://github.com/thehcj/quacker/releases)." + required: true + - label: "I made sure that there are *no existing issues* - [open](https://github.com/thehcj/quacker/issues) or [closed](https://github.com/thehcj/quacker/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." + required: true + - label: "I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise." + required: true + - label: "This issue contains only one bug." + required: true + + - type: input + id: app-version + attributes: + label: Affected version + description: "In which Quacker version did you encounter the bug?" + placeholder: "x.x.x+x - Can be seen in the app from the 'About' section in settings" + validations: + required: true + + - type: textarea + id: steps-to-reproduce + attributes: + label: Steps to reproduce the bug + description: | + What did you do for the bug to show up? + + If you can't cause the bug to show up again reliably (and hence don't have a proper set of steps to give us), please still try to give as many details as possible on how you think you encountered the bug. + placeholder: | + 1. Go to '...' + 2. Press on '....' + 3. Swipe down to '....' + validations: + required: true + + - type: textarea + id: expected-behavior + attributes: + label: Expected behavior + description: | + Tell us what you expect to happen. + + - type: textarea + id: actual-behavior + attributes: + label: Actual behavior + description: | + Tell us what happens with the steps given above. + + - type: textarea + id: screen-media + attributes: + label: Screenshots/Screen recordings + description: | + A picture or video is worth a thousand words. + + If applicable, add screenshots or a screen recording to help explain your problem. + GitHub supports uploading them directly in the text box. + If your file is too big for Github to accept, try to compress it (ZIP-file) or feel free to paste a link to an image/video hoster here instead. + + :heavy_exclamation_mark: DON'T POST SCREENSHOTS OF THE ERROR PAGE. + Instead, follow the instructions in the "Logs" section below. + + - type: textarea + id: logs + attributes: + label: Logs + description: | + If your bug includes a crash (where you're shown the Error Report page with a bunch of info), tap on "Copy formatted report" at the bottom and paste it here. + + - type: input + id: device-os-info + attributes: + label: Affected Android/Custom ROM version + description: | + With what operating system (+ version) did you encounter the bug? + placeholder: "Example: Android 12 / LineageOS 18.1" + + - type: input + id: device-model-info + attributes: + label: Affected device model + description: | + On what device did you encounter the bug? + placeholder: "Example: Huawei P20 lite (ANE-LX1) / Samsung Galaxy S20" + + - type: textarea + id: additional-information + attributes: + label: Additional information + description: | + Any other information you'd like to include, for instance that + * the affected device is foldable or a TV + * you have disabled all animations on your device + * your cat disabled your network connection + * ... diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..29158f1b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: ❓ Question + url: https://github.com/thehcj/quacker/discussions/new?category=q-a + about: Ask about anything Quacker-related diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..0592f258 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,46 @@ +name: Feature request +description: Suggest an idea for Quacker +labels: [enhancement] +body: + - type: markdown + attributes: + value: | + Thank you for helping to make Quacker better by suggesting a feature. :hugs: + + Your ideas are highly welcome! The app is made for you, the users, after all. + - type: checkboxes + id: checklist + attributes: + label: "Checklist" + options: + - label: "I made sure that there are *no existing issues* - [open](https://github.com/thehcj/Quacker/issues) or [closed](https://github.com/thehcj/Quacker/issues?q=is%3Aissue+is%3Aclosed) - which I could contribute my information to." + required: true + - label: "I have taken the time to fill in all the required details. I understand that the feature request will be dismissed otherwise." + required: true + - label: "This issue contains only one feature request." + required: true + + + - type: textarea + id: feature-description + attributes: + label: Feature description + description: | + Explain how you want the app's look or behavior to change to suit your needs. + validations: + required: true + + - type: textarea + id: why-is-the-feature-requested + attributes: + label: Why do you want this feature? + description: | + Describe any problem or limitation you come across while using the app which would be solved by this feature. + validations: + required: true + + - type: textarea + id: additional-information + attributes: + label: Additional information + description: Any other information you'd like to include, for instance sketches, mockups, pictures of cats, etc. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..08a1b6b7 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,129 @@ +name: ci + +on: + workflow_dispatch: + push: + branches: + - master + +jobs: + android: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, 'ci skip')" + steps: + - name: Clone the repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Install and set up Java + uses: actions/setup-java@v2 + with: + distribution: 'zulu' + java-version: '14.x' + + - name: Install and set up Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: '3.10.2' + cache: true + + - name: Set up signing key + run: echo $SIGNING_KEY | base64 -d > android/app/key.jks + env: + SIGNING_KEY: ${{ secrets.SIGNING_KEY }} + + - name: Cache build directory + uses: actions/cache@v3 + with: + path: build + key: ${{ runner.os }}-build-${{ hashFiles('**/build') }} + restore-keys: | + ${{ runner.os }}-build- + + - name: Build + run: | + flutter clean + flutter config --no-analytics + flutter pub get + flutter pub run flutter_oss_licenses:generate.dart + flutter pub run intl_utils:generate + + # Create a directory for our release APKs + mkdir -pv build/app/outputs/release + + # Build our big boy APK, and move it into the release APKs folder + flutter build apk --dart-define=app.flavor=github --release --no-tree-shake-icons + mv build/app/outputs/flutter-apk/*-release.apk build/app/outputs/release + + # Build our ABI-specific APKs and move them into the release APKs folder + flutter build apk --dart-define=app.flavor=github --release --no-tree-shake-icons --split-per-abi --target-platform=android-x64,android-arm,android-arm64 + mv build/app/outputs/flutter-apk/*-release.apk build/app/outputs/release + env: + KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + KEY_PATH: key.jks + + - name: Archive big APK + uses: actions/upload-artifact@v2 + with: + name: apk + path: build/app/outputs/release/app-release.apk + + - name: Archive arm APK + uses: actions/upload-artifact@v2 + with: + name: apk-arm + path: build/app/outputs/release/app-armeabi-v7a-release.apk + + - name: Archive arm64 APK + uses: actions/upload-artifact@v2 + with: + name: apk-arm64 + path: build/app/outputs/release/app-arm64-v8a-release.apk + + - name: Archive x86_64 APK + uses: actions/upload-artifact@v2 + with: + name: apk-x86_64 + path: build/app/outputs/release/app-x86_64-release.apk + +# ios: +# runs-on: macos-latest +# steps: +# - name: Clone the repository +# uses: actions/checkout@v2 +# with: +# fetch-depth: 0 +# +# - name: Install and set up Java +# uses: actions/setup-java@v1 +# with: +# java-version: '14.x' +# +# - name: Install and set up Flutter +# uses: subosito/flutter-action@v1 +# with: +# flutter-version: '2.2.1' +# +# - name: Build +# run: | +# flutter config --no-analytics +# flutter pub get +# flutter pub run flutter_oss_licenses:generate.dart +# flutter build ipa --debug +# flutter build ipa --release + +# - name: Archive debug APK +# uses: actions/upload-artifact@v2 +# with: +# name: apk-debug +# path: build/app/outputs/flutter-apk/app-debug.apk +# +# - name: Archive release APK +# uses: actions/upload-artifact@v2 +# with: +# name: apk-release +# path: build/app/outputs/flutter-ipa/iphoneos/app.ipa +# path: build/app/outputs/flutter-apk/app-release.apk diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..bd68da97 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,89 @@ +name: release + +on: + workflow_dispatch: + push: + tags: + - '*' + +jobs: + create_release: + runs-on: ubuntu-latest + steps: + - name: Clone the repository + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Install and set up Java + uses: actions/setup-java@v1 + with: + java-version: '14.x' + + - name: + run: echo $SIGNING_KEY | base64 -d > android/app/key.jks + env: + SIGNING_KEY: ${{ secrets.SIGNING_KEY }} + + - name: Install and set up Flutter + uses: subosito/flutter-action@v1 + with: + flutter-version: '3.10.2' + + - name: Set env + if: github.event_name == 'push' + run: | + APP_VERSION=$(echo ${{github.ref_name}} | sed 's/v//g') + echo "APPLICATION_VERSION=$APP_VERSION" >> $GITHUB_ENV + APP_BUILD_BASE=300000000 + COMMIT_NUMBER=$(git rev-list HEAD --count) + APP_BUILD_NUMBER=$((APP_BUILD_BASE+COMMIT_NUMBER)) + echo "APPLICATION_BUILD_NUMBER=$APP_BUILD_NUMBER" >> $GITHUB_ENV + + - name: Build APKs + run: | + flutter config --no-analytics + flutter pub get + flutter pub run flutter_oss_licenses:generate.dart + flutter pub run intl_utils:generate + + # Create a directory for our release APKs + mkdir -pv build/app/outputs/release + + # Build our big boy APK, and move it into the release APKs folder + if [[ ${{github.event_name}} == 'push' ]]; then + flutter build apk --dart-define=app.flavor=github --release --no-tree-shake-icons --build-name=${{env.APPLICATION_VERSION}} --build-number=${{env.APPLICATION_BUILD_NUMBER}} + else + flutter build apk --dart-define=app.flavor=github --release --no-tree-shake-icons + fi + mv build/app/outputs/apk/release/*.apk build/app/outputs/release + + # Build our ABI-specific APKs and move them into the release APKs folder + if [[ ${{github.event_name}} == 'push' ]]; then + flutter build apk --dart-define=app.flavor=github --release --no-tree-shake-icons --split-per-abi --target-platform=android-x64,android-arm,android-arm64 --build-name=${{env.APPLICATION_VERSION}} --build-number=${{env.APPLICATION_BUILD_NUMBER}} + else + flutter build apk --dart-define=app.flavor=github --release --no-tree-shake-icons --split-per-abi --target-platform=android-x64,android-arm,android-arm64 + fi + mv build/app/outputs/apk/release/*.apk build/app/outputs/release + env: + KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + KEY_PATH: key.jks + + - name: Create release + id: upload-release-assets + uses: softprops/action-gh-release@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + draft: true + prerelease: false + files: | + build/app/outputs/release/*.apk + + - name: Publish the release + uses: eregon/publish-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + release_id: ${{ steps.upload-release-assets.outputs.id }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3dd32178 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +# .vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ +/profile_files/ + +# Web related +lib/generated_plugin_registrant.dart + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json diff --git a/.metadata b/.metadata new file mode 100644 index 00000000..cd984dd0 --- /dev/null +++ b/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 9b2d32b605630f28625709ebd9d78ab3016b2bf6 + channel: stable + +project_type: app diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..847ad54f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,12 @@ +{ + "dart.lineLength": 120, + "editor.rulers": [ + 120 + ], + "[dart]": { + "editor.rulers": [ + 120 + ], + "editor.formatOnSave": true, + } +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..d8d5a063 --- /dev/null +++ b/LICENSE @@ -0,0 +1,7 @@ +Copyright 2021 Jonjo McKay + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..80181995 --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +
+ + + +
++ A better way to browse Twitter +
+ ++ + + +
+ + +## Features: +* Feed: View all your subscriptions in a chronological feed +* Material You: Looks and feels fluent +* Transfer: Easily transfer your data to another device +* Private: Doesn't use the official twitter api +* Updated: Constantly improving week by week + +## Screenshots + +| | | | | | + +## Contribute +If you'd like to help make Quacker even better, here are a just a few of the ways you can help! + +### Report a bug +If you've found a bug in Quacker, open a [new issue](https://github.com/thehcj/quacker/issues/new/choose), but please make sure to check that someone else hasn't reported it first. + +### Request a feature +If you feel like something is missing from Quacker, feel free to [open an issue](https://github.com/thehcj/quacker/issues/new/choose) about it, detailing exactly what you're looking for. We'll look it over, discuss it with the community, and see if it'll work! + +### Fix a bug +If you're looking for something to dip your toes into the codebase, check if there are any issues labelled good first issue. Otherwise, if you see another issue you'd like to tackle, go for it - just fork the repository, push to a branch, and create a PR detailing your changes. We'll review it and merge it in, once it meets all our checks and balances! + +### Translations +Quacker currently uses Fritter's [Weblate](https://hosted.weblate.org/engage/fritter/) for translations. + +#### Next steps: +* Mastodon support - for being able to browse both Twitter and Mastodon content +* Persistent timeline positions - allowing you to continue where you left off in a feed +* Desktop support - allowing you to browse Twitter privately on a full-blown computer +* UX/UI improvements - such as a compact view, and tweaks to improve usability +* Nitter support - adding Nitter support back in, and helping to develop a stable API for Nitter itself +* Notifications - getting notified when selected subscriptions or groups have new tweets +* Stability - continued updates to improving the stability and reliability of the app diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 00000000..61b6c4de --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 00000000..0a741cb4 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,11 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 00000000..9145a21f --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,105 @@ +import com.android.build.OutputFile + +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +def keystoreProperties = new Properties() +def keystorePropertiesFile = rootProject.file('key.properties') +if (keystorePropertiesFile.exists()) { + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) +} + +def keystoreFile = System.getenv('KEY_PATH') +if (keystoreFile != null && !keystoreFile.isEmpty()) { + keystoreProperties.setProperty('storePassword', System.getenv('KEY_STORE_PASSWORD')); + keystoreProperties.setProperty('keyPassword', System.getenv('KEY_PASSWORD')); + keystoreProperties.setProperty('keyAlias', System.getenv('KEY_ALIAS')); + keystoreProperties.setProperty('storeFile', System.getenv('KEY_PATH')); +} + +android { + compileSdkVersion 33 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + applicationId "com.thehcj.quacker" + minSdkVersion 21 + targetSdkVersion 33 + multiDexEnabled true + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null + storePassword keystoreProperties['storePassword'] + } + } + + buildTypes { + debug { + applicationIdSuffix ".debug" + } + + release { + signingConfig signingConfigs.release + + minifyEnabled = true + shrinkResources = true + + applicationVariants.all { variant -> + variant.outputs.all { output -> + def abiName = output.getFilter(OutputFile.ABI) + if (abiName == null) { + outputFileName = "quacker-v${defaultConfig.versionName}.apk" + } else { + outputFileName = "quacker-v${defaultConfig.versionName}_${abiName}.apk" + } + } + } + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "androidx.multidex:multidex:2.0.1" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..9d1483d0 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ +j)`^Egh*=8^YL!+?Pvx7dg#s@7Mr@!q`ls%_NOMj43x(e+spvH!B@0I_;T#|M2C zwnm=J$)5CVbP-=SDY-% ;%hhp0I?w$0jfAbQ?@!8{+H^EKe zU2=qJdMrf!)}u {tl^VzIYx*qbc<9dTe{Ew)WDN{FmH7RCC2)d!-Q zp#hX$veDG{*V$e7HU`eic%G4QZ4+J<2B1@-Yn$x|DvMPy+kZh~)1ds`H1<`QK=ZV> z_r5>PIsPAD1j5XM{bfTe&~G{*d;VEi4Ef*ZuEQ|^!}-pwilz_YxuW06) Lau2rX^ zO~7RJP~7dFo?g`o9j(fA_jVozU?Q{7^lmjSdlAbJ|BIs8pGJJ@Z8s8^x2{(;LG3lG z309LhJ!(b#X)A4 B z{XOnD1^`5+;rzooC@39AB8VB$zzl+g<;FHdRBv5;sEB#-)gMK&5cE!$)}I()TxS7U zm77Ifqm&6#Zj1Pv_u(txf{0~VRriWw9G(s#{&9eX6A~fjpKf!21~YT_NkhLONQ&xh zCsNeOiFNIE7-pas;I=FPvv5phcf+s;Fv;G(Z7!-+vstwV0Yo3I+^EFgl)>P>c$??4 zmtdH8x?}fapeSAzvw*D1&7!XD%0$^OD;K|PzrbAd0-!w}m-w4@p)Y~uRJSmO_-bG~ z_l>JnG3DOwG0@c8do)|FpA}chaXe*u%gFN_DaLJ4SkD52sZ$nj>XI^TD@nC$R@nRS z&7X7|0tO}v>xFi0>C}BD8`^B_U5RuUmvQP;-Sc`cE6*%eGl)$40SuwYvMuQSu)yeM z01xlV0wN9I7%49)YO8u;`~KO>745?%$tYzpbxYhOzbVWETd~~=5dU^kjihx?HxiP* zwS&(s 3Lv0n#|~iPL@*>Ru7ciEed}V+#+rWdVZ)M5pu~aL#nuk|H+? zvA3>Q6mE^XEuavzBdOVDlyRGm3PpKCm*rXMfal5;pF=fPvS~&5aD+4S_9pvo>LwT@ zCQ@9OJ`k~97_JbzVh@Y>uiIB%dEnQ!n_29=yKS#G2_BIiK`` zSi--5EsxK=EG-yb6)y}b2OcY#r$blqCbudDv4m& z{Sn7d48=(ed%S4@){-Ds{QwaE&95)}7TteZ7H2uFt$(tw#r8KmnX^kw9*IMt>Al %M91O3-Hf?(-cSY(A;F~{=6~*kL9fmEe4LgtlVCdw$a`tJ= zNN9$z{)m;%!0IP}5MK~G*Q62HkQ%TL9yK}{_+yKK{mdXK!^{F7U*iMBgb4SUdu3JJ zt>RtA0^xi=cO`xBmucBv>K6w Ti2>i?oApHc!ikE8=@0=v%dc zAIe}cfqUH(2Yq7O7%zZHVGKaLIdbg<<`TBn#)j7Pk?SzPx* 0GPZap8nFb9lYaU2j@B6 z1Z)A=28eM{%USnNzSTXjez(k_V!z!}caXuqYN6L8jeV zGCRCGHUmH-nW$UYBo0;aGn{>#Xc`a~U{G4sJ#KmJ@)JbFuP8Gt%4;?Nv2?!xs}mF( z(*hq19Q>)Na1I_3`9-nYPO`TKNB^eiCcJdCrk#qUt#203vkgG|VOZj}5$OpGPPa1f zaq+dXn(yl0)Q^?qE_30IRxm)khP(h}$umcy&97$8fpJIzFbp%Igg7Zml?_KroAjZs zrN{OeH&f5ZHAd8fi1nOQv>gF8jxlhKku?Wn8WQz5J{*6KIBMBJ`NjgYsBsLGcJ;1< zl8kN+l%RL_Qrc}X$FbEKBDNuw3Ie27*fGZ?jNY ER*_gDs2|ExP4W+ zdRW>!I#k!9Th3eUt!|dKbIynXV02n+w3_ji*Z%+G+2nI&(zc>IGUb~?yk)^4U_Q7i zQb${06q*Ss&-g`p%r<*g5Qzb3>}y087Hp|2m1kd;l|?rI#24b3l}9jd8|lC>g|sQr zu!cxQ-Gla)OC&OU0Q3tmnWtHi2jO8Bhb+F27e_5N_k)w}6$aHe%QT2QKQy*sg4hd& z*ylBQ+iDxqL?lJ@qhVsaWouFD0x1n*fuD#yW1aa CvIV4^9C5^ zFb06}$D-IK@i*;jNEq2>T+voY&$KeKxoh{>7OU*}r&*~|T~>ElIx~oik|~L-mxq`W zGpaBN4(~s8XjOlZaq15**lW?p+O^N`C!t;bDEIvVP9S^`58Kdd9vK;rtSY*ZK(*={ z^fvJN##|Ic{DYqDq mE_J}FlGS(^ApOg7 zWzIqcU8bxZ6SZXk2%BjGZiwO_9oY@Q1V}9JECDl*cCo_I`b0#_iarXkPy52*nwXB{ z^WjCQlZ`ylS|9IC{;|gPm7ghyS7LB(_9nB?t`2_N&P-*+|BhHSWYK?FVU#V1ZUiKU zQRkah^`{)$It5|xTd&))n+khFa5~#cL4ahy#-4vr+1@l9Ey04==r3=%-t(3W0Llnx zJ=*}x25mSfu~8SwU=JQ`=_~+3jV5&zKs1Zl+98ojgkhR=>ieFP-RG(@N*mkd$wC_A zFB3wY1u)Iq`bM&-U$2+RoPqLjF9Et0-5NuImHTrdc?_FtqTrc%^Wg3f>KLVfn0frn ze9XtKXHObPDM>|GIA@9LmS0v}rN4F!d@5T3VSD23p3UMuqV#jus#dj2`LIq;uf__@ z0w;Y`Bob^HEXsa33TBuuRm p&<>yV`=Fln9o;W-u! zmr@3<=>#73jb|%eOxq^J$~cU|oo?JO54{TJ%{(D&8#U`X1Tjf4q&D@4+O+|{C{ueI z3av@>#oCqMk^%6VBeW|h%KfEUHmk5G?+(fXQ9UCuyb&+j=v2M0FZS0-Mf5z+w!r8R zwarF45rl_Mr?FZZ6otuFdv0;-I5Dzyg;EzWVpfo4*;&=O7s_Sj-)&~Z?eM1e#&>uB zw~Hb)O3E++QNBCA9;B2kQu5Xx0jD;V7u)rrxnC)7pEGRuDlz3pJwB574JX9S`FWvJ zwxK0Ow&k+cR2p9b-3BP@plzANhrG8faK 4X zz_bbFW80>ortB<_y%eF7g$j`iiJ=juvjFkMK@IuPo64K`o4(3IN@&UsI}TO15-jK! z`~P_Zl6d+G2Fy0JlmKk!f6~3aTPI3Z-h2d;qSbo+ekqo}16HonJ>VlgUC(9zGz=KZ zUN*#BxYhJeR1I&8wnuaWFL^0LW#0?k^9II3uK|mIv d&)|L?Ezyu3&F>`->5j%!08BFVmEvs-Hg{Lbz>sJ6Ww`<>X&Ae;Q21d z`hvcdX)Q`sV&@s@QjPD}4e62xQ2Oe%)jx{AxL@w&xq#I^l7QiXE*S`(YU~|fPi>Cw zDX#4)3=rNly|5fjuiN{GwR7H0zu->?7vGOXpDr!X#+D2KrffDLZ#TS2>kik8XEZYa zn2>tac}h|obmBS0T! AW5mMpJA*tJgl|O=k7+wK&Mt((QCLh zCle{-uG<$lTWj50S1|Ad&1n~C$5yNM3B%!+>~&)GZ`xzt%|hw4Fad 4*rrSAdm2RzFD `P0d^>M*djZVS?3vmNvTW-rukH^RWA7VZ#J^C&uLI$2ZTTJH$9} zkUa)ikWLEW!$D4#fTcrFpCak$6a>9`(|mkQZ&R~XjgA1W)iEU}3_at#v8}VNh6lwz zg>374=gGDV0E2w5?1kXBJ}IzAnuP{q()zgPx*r4B@w4Am6MYP9Vds}j(3gS?=!X8q zh$vmf(ZL|^w0JPH<-Ql41y&0V>|($>LD?;Nvot107B?`Cw;q*a&2P+SJnL5y+brFk zWrYF4<<2gaG=a Hc>ZR?y*SrO3&G0}7b8yoYy&nQ4Z#C2D#k1^}eLbhM`9sK-&l;A3GG=agfjc8ANC zH3ncrVMs3~2ybob#C_Xb!T$00b9tYaAVrxHa)BZo+8p;x|G`_U*0X*3ab+#{f** zi$|~+DqD-j2aS4B; zbv1oI?vZWov&W(>R8hXm8`!4G3JUd42|E=NP}0Gz@7$u&d$UU-GGlV2Q_Q|BAF%_6 zfo{hD=ACz+lytc2FegNa-%w24FCU^C*ZK4)!JD#heM;>i8ZU|qa0mT?0Yc5+6ouii z?>DTKNT^u^#M#Qj9PjmatJWkBVRbX #>gik|lt821 zk3JD5=}4K9=%(SNGOq}gSeaz$UD7cC{qqgDmN*Rb6$Vhod-H0=sxAP2?NMrW(BBv^ z%sf6NAo3`4!pyhY W43fQV>q z0V3a{laBb?!e=*^gHk7c16b)}%Fgz*4dPFmA;`}is%0t}MC!;pvLybr#W4V2!GXho z!+=!`uu5V(h3ILI#fJznHCUC!1#~aM?6TvOh3FTHq&P~SamsgjcNPXP1;zby{1M$A zPn1d7d6=8JEr9m@;c_?(I1EI@0Q;~HWRDa-3&wxB_fcHuvMM9;rr#9Lo6moaqUH^W z5s}0+5GN_vcL#ZQ^S{SkI}F6Z01AkgB{)xPP5O|RK>Sb2%AZ&Sd4OX8^1!lthr>Xh zV}SkoD|gGWl=hh9j*3ZT)HoYU;)skuQSIDA8&pH^4~yr=C~l(7Gw$dx5ElbPjeYk{ zd@BV1d+^hL^3ZCo3aX9)@b`kdb{KFNh=l PnY6AqJ3k-F;Hlu_b~eU#*H|+#V7SrEGQOy+!31fL1-@ z?l}xN479`m#Q(Ao|1^NtKfJJ^w3P&yaO?GgH6^bkb#Tu(41fXrirjx%6u% B^?iheD%(!%i0f&K>7$88?TN0i%$-cb5V8r#Wh-bG>O@#jX zxNC=jv=|^(f$=M1oD^Y-h<_2Z{E0nbf}C+57su$uXem}s(ksURr0r$*yu-i_!~l+0 z-n=$oH7Xk}S&7r&z+s@DG4NofsIK2{9mfDh0TWnE7_)?Qvb!v6=F08~48Y~GCrkWk zTtXv`g_A|01v3@~vV;D^05RF=bDQvZuCcH0y!6?`sw=BoFo0?7yJ9i$NX%l}0TO`= z60q!$1Rg_CHY;!pKvtOT^Ku!W#8HQvZ3XzzX8_0Xx815dcdzppU?RKoIGdQgw;z=x z;8M1$p3Y;?)nF%L;D*F2h(i3mxZyivd(4I}3~#yS+%W(K6Ydxp195D!+2 j+__wX~etp*D6}u z+u=Sg_PQ%S3_w=E6h{D{i4psgT~>A83FV^Q4%5dLA1hLRS-Yw2C%m%fpA=BCCE8&Y z`Z39Cm9#Y(Jl9Sfy(&xqjDgqlF(E;Z>|0H2dXzyky1qyTA)c?2g4x$1z(wBnu1V|c zp4*NA`Y}t$y8JBb-cMyCjd?sP(e>sV#NXRCOgHhcI58?=vL(Qhlh}B%v-KQJ|9MS+ zwx-9q!ub^o+^9~oqL$s$3;>$Qcf|Pu`-X8%k)DYIk#l0g#NcI*+L<4<9x_Y@w=L}Z z!id2QvmM}|H!;9>mnCFfewKCbhq4!zi#ptGt5D3$w=*(_&McH=bt;Rg{bJ9)Yt2ao z0tNuICM_7r*q$-FlChp;01!uAkiF%!oE1uJPv a&I->t; z_hlc&5}-jI*B88{SG!^?V8DrfEg-Q=i$K2z20ad$VQ#s4udJm7rzPfsTTE^3TwD4w zw#xC=t|u7)L?JjJu_Y?3$^O>cHyZoXaRQWh5!r3$;7FTQiSh}Yycs-|lDJA0(H-tm z3ChA=UOPZ@)wapk&4*6gyB*%U^?ue9ylpXOx8kwe>V=XTu@;g7D_!R0myfwEJ}(Yg zK-mCW<#_9od_&h;N{;6s;o@z3#NSjM<(3P#%85djnlifKi1?H(k w}r(lR_9y*iwK=anO4h$eKwW$w1q=_pqFAjrktYHctz< zza=`JgG~(BVra8qywmsiW;+v|8R8Q)Xa~0Et@fr8Rbt~I2qjUS&WK;~UIa9CaUKyB zKkVb(5@rDflNSyLhfAe@2)JS!V2W8W>>ann9^0; lk41Lp%pt{mB9YW#PO++FD15 5gXwnTk z@0+%sn<#EuQ{5F9pg)&a`AC)aw76U=N}!R(cQPpEtPo1RnJiWX?RtQB?v+r!X)Hp* z-Z44hltaUClU4ei$K@?jLL2Wvny_bd#YJNjWRA;rE2htBwya?y_}-HMX1nNh%n9N5 zLv9QJ6Iv^ceK-?-_l5YH@Q8;bJfc@J5LY?H-`J?v4BowCy)}4mrj(3;dldan9^5MZ zXsq?3VlH03^$o?ucu)0rZdPOWL=o$@Ov;=G!zL3vF(OthlWW??MR4A1Qm6N>iqcm# zw)IV`+Av9?N$wy&3^2y-KC! %eT#rGC%{kAQ{cCI~F+0fv*e55PW3K>`k-HX5^cX03tnxyZ8sAx# z?QKJ^oIet=DS8>W3=Jp#TU+x~_HN&}Qc+h#gljB4w&uv@iq!~{noT%yV08<_Z?kMy zRxk$G`_F3J^wJy}j2(NaNR(mLlK@O{TvzIv=3c9|B>vQ8>ujH-c5R+vaJ?;>p$$ho zZ8H0AH$>A_JwRJ=F}}yFToUKJSKyW~R>_1z+go^BBne)?Y9K2J+UCjXUEN$R(lLUB zT#_HmXI!9%Fs*#!D&JY=pLDZ&1S&~7sWl7PIGNrXf0FZ;;jZIjAWN@~b7Fmzh30zv zR(8h|r>0i57uq +fRb?%hPGX~y?P%XEa+K9+2(@sz!bkQ9e*qO>OF{mG}@Kv zOz~Ju&} ULCk7^ )OE+`a9aPM~*O*C=C*YlaQuF=1k&}I!YZ} zo_H9jW;X `V&kX}zl ~IwyZDXd{bu*RxERo@ zP_h2W0$}(Mc{|7l14M3&3z;zh#=%eA3UyQdVj(?OmUVkrP1^=OTt7gtpP#O&bJr?r zRm4?E;kfMic4F@z5gQ&7F(*ZDf)#2-z85CIQE@;uB91nO2QuCe^&riL*`}wsz*Cqt zwi)7@5Cs @a4#FLj#=mqwdw? zUw11?eKTVK;)dsqQrW!o3}!%FZMOlUg{ht`ZCg0@u@L1vKBAY7) BxtkA4+ZY#gJm!~6a=+0lyToG`CO3$wvjmustXKc0{;Ucd17NV>j(!Y4 z6n6^~z?P9s;Cr7G-Jv`HLeKUjrrWLjXTS)cth#S}tAn{b>X^qnl2~-u?R8Hpldlmy zg>>)~Ldc$Gw*%W02X@=5XS sBJ+wE) zc}5&9+9cy6YOIDNW&5AW($3reE_dCV7{CM*f^8EHh!@waSKKi7gfAxW8OK({pSD3D zuZZ5wo7V<%H!HV^+n}<*MUrJpW)gsb05Nh<#k(~P<*8oTr$(dxp1AW&D+NF?3lo%f z0O3a`0PBDm;yP%tdQpqjk^Bq_r;S)0Q9q6>I>AUG4t(ck^uS1_&D0;KJjFsyhf6l; zHjj(4{g4+BOMuCt7xY>3!bz0(Fn&;8#1{xU4M^E~Wj=_~K5rhFdcJ2oP}%^tC2f0& z^w$ewe^COT!L-K(l+(}4+yLVfWxk7BelO*>)8hdxMvQz%#aBuQD5@h#d5N!VG!DXj z^3bX#cxlQ*{2j+TUn3|?BQOl_)m*3$n{JpW)5b=?Z}-UHN+wQ_)^oHjk?zp``b+uo z9BGDNN1w%uB8sk0<%bUtaAyGY!PM>=S(6|)5{xP1Z6fpDypCA;AT5ew!r7`$EDkU~ zjVc{%RaV$N=9vq(sydozSe_{9_~4*lry?wRqLkOkJTUms0i>RBAU^vPv2^xR%N9%< z% K# $J=m00@Ci&Wf^*?9YB*iD4Dj_i}3#=XV#e8(Q{p_VZ{jqA;H8 z7qAr@fz?nJzV+kukBvUb`+YX*oL3q2@#iF%QXIVxNF-59d9GiG2l!^y{(^XQJd!{s z0LB6Dc3Cf+kW$>S5ctfDFZ%Mb4y0vLdiOXX(y6$R83RB?*qg@bM_Ql^R;XIkEp8OE zglQT4d76XSZVPxiEB>YtQ?>)7G-r?3`f4AHm3vw-rWbE<2!r>zR_E19`@U)Qe4KkI zV!8eQV2t6a{DSNS#}%8J(oif#&!nH20LBW7EnLwOqoLh88 B#u{a@EPTJ zEd%FSNPzB0`0ZYYedD6H)~>^Rjm)&wTC8+PY{w-UVA78aqJK)tFq0T2O^CV?)!7Eb z=$MK0I O%v4F1WHEj+C3^h2l9eE z-<4OJY`lknN$7c`?FpX0c)P4uznIDP3t%!wjE19=XwQq;swmFk+l6_Yc6P$H9!6_E zBL&*KqC|aYPeTgQt9^+67P@O#L_~#582~B)F?!)J3Tp8KltBD>)~|4bs2h_Gn<0Xk zDA@xuj7C%hc5}Y19@%=Iv5A6f+wmJ}8K4a@Df%%{OcSHDxmBJ$V;MA{)eC#z9*poM zA=>TC#-cU_q6jnb($W0AE=H|m(tK
e0zst^rdFKHM=I43wiwzamv2E2a>$t9wt2+rEKFm5P{YT2=$yV3iTEy18V7p}YOa z@*vr$`Rzw#nY;Q=3Xn_3w0Vhf^V=p{s@qGlEz}Qygz=atbw{yc%8daqh-D9-A0Hx) zYY^qbtyG0UV8s$w1dn*?MOnQgzPT-m98nkn6ju)Ik?^IWG!gfGrXB9sofrs;W00n% z#0ba&@S%WJOO%f^$@@{9-RTh*gYbsqn5g2>pyykq;occ7^)RVrt7qN4)))}V&^m*K zyEb))EL0~|5h#Nb%jW96N=u!n+!+AVDhMx1Xtos58jQt?UQxkR7^M|H_KLJ}Ks2uh zD;$N 13_ST4NtEvSR>} z^^JSVE(X}z9vfOw*B_L%gR7v@JH`M6RmMgd+X$?Fx (Qkmo24 D;J%6Jj5f;-C z51u|LCbPY+$-LPE_Rsu!N4DQ!%d)_By?VVozC(yv+Ha&49&GrmX;pqF?-7@U-!U=k z t zF))#_MGM==I{}y%ao0?H9RsivdVB}Au_5|eO=Q{$;m_M0H2e0rV~%Ss3-fSNykp}1 zaYURvIcSZ6G)!UZk{fqzTcJdG=T6D9e>^#Z+zv-<_hs$IxLqAOao=qLbOP({ow;Cu z5Bg UGVX@P02e{G1$rL7fS&RO|>Vj3vnIr33M2D?9d&+om$4a zjoaLvxQdL6qcr)CO33o3^T}Py2fdrC?@q{8*(D2BKGc*gA@qfIDmWd0o!av|wB3ly z(GOsy#-6z&{yS?Ru(e||Ot}|(Q+szVA@SlN>vN=aHiEXX<#$@la9ITGRB#NyPVITu zZijiUBM 4miRO~MDsrw3(gEM3@ (+mTxT{vImSKP6gH z4jcv?2DV_pt1G|_qm<_~?zf<+r!P z>>O(`@^qaY}5B^d`}+2qB=^AquM$I dJUKhqU*rX={bb=5^)$V-7Y7J%2<|_|LN&fw~`D;Z%6JJ zPj@x3>~oBJ>n ~37GL%RuFN3H~~k*ez+4W3J5>Gy>C7& z>xi1I>P=7({2T0KWv5p7!6E=WKA4Ht|1g4tEGL?yn>$-!HvAsrm!NI9_Ql7=qWHRC zOJ+#?U}#?#BA9kT+rsf@>rUbJzaOr%m*T)-U?*bW&f}7v{F8 C%exE_`J=3}*N=AB>AGmJNb$#1Q#Lslmf%vZ|471RyKo4?%iIh(F^ZDNxT_ zkDULncKCzXuw{a;2#${Uw8L2I`!yN6=dM*k=Y%mcp-Y*7uro&dh%aoXiJq?S(f&sCZyRtiJ1PVtt8l#UiubeH z2Jwf *P0d^ zCwV@sUiAIUd|?aGPg6cPc;)ztV l;(2UO(!Y zuuwqI;-C{4V3q&Q&FBhUFaqZ#Kgu!Fd!0g8+&;Vcu%uQ6=j|XVafQLS@t~wb`?h;W z)cbs$Mr=>LlCJ!{??d| roh`uhFt!7GFgJB1t!z_Lzy{ z5iv_k21Nh2Ep0jR9b6R#+v%*?8((E?S#5d5vRAF0QxZ1FQ9{-FF# _mMd(nSV;!iDj_QA7;sFMD%0kg7tVj?$S>X(*qKbR>C1F)j&oVF}eH+SqT1{fzW zi%5)uU`d#OnT4(208AieqA&!ufo-uMsb
rw|4a~ z`8Wm @eu(z8vh!_0RMJ9FTN;F`D2`VetEr$ojwuMoJXRSHT%<~2);jbYN}(`= z2G8LoCcDF`|H7?GTf6#JrSn;^SC2d0=Vd;zAq_y{W@GI7>pd$<(hlrkpq!P)vYqPn zZz-%sjh26!R^q*mkBpUugK!M6DrZkLDg+V3sLzrQM>4$A1_50aJ|e6>Y0D2IT&AtO zH|;x2S^aVZCy2HYwYSBeG@2DFmL~_q2@|?IHdolVe}3zFC6ZoC6#SzvfVtjFM{B7a z@W3Et0W0F-*MS`jl- jo+NAug=Q(oKouxx=umt9n-6~ z4oSad%4qd$yZb@7>DM#}{>58W*+-8@+~_};2I5S-aM;ea9Sewyx2rO??P8m6g>qj$ zwvx&`+&eaH)-bDbZPu|@%8F(W)hn&(p?WSX*{ke=bLJF^Ofy-q8V>`LC+xmA-J91- zlnX+@%Y*w=b@+g)3{9$m(SxcyeL!gaQBl1 O9xDCgs7XT2V81<`6$*(|Ho zd%FFepNRSE+wQ(Uzq$55*C3e?#IhRR`?8ui{1s}~)R(D&v7@S7-K9#^QB|sp$m2Hp zSQv}pDK*CLz!#Y+3Bg}dYbAReo#BPt>!!f25w?{2le|_V1~+)x~B$PW+MrohFF{ zTj580{53Ug_7Z)Q#`6Ze_f1;A9ufJ+UHJ#$g8Ap&J7pb4IOu+qH1_JVP_Xm9oAUR{ zdkA`!1ejO#*h}(oi)RL%Q@~K{;7E>f%2rN0m>5~_e+Ga_>!FxsVgDVzC$*_mf<`of zUHE0`9Z^r5hLW`FsW$hibGHF_2jAEuV`rSTFZCee_ngHF4yt^orm6p1jVBr9o938r1dSouiZQRa3A2bzuxv)Xc5lRZp&eOqhZ{Rx9&& z)#}nCS>ZP}PR&rEeM|rb%uqD -*#frh(7wk6FD`)d zYoh#{2k@SWk(ES!%r`eOSl3=nZPpc!sGS6(+=wm$ZDek%%E~(K9AmQ$m`36wVLpbQ z6Js!+Q52)45R8W7ipEME5hczlv{_9|MYkDgAf|G0#ANIf<0|#ulcEmyN!ZUUCO8I7 z6fP|a>KJ_80PIPk-1t=V8;psWsTWMjnAq;_7LDkA<1km|PWt0EV(lxE`&!&3V~Oz< z2L5uuYOyq+#t(k6+I{Tn)ad?K)!?qvLiG2`o$zwP%FiRcSgHzh^40pcy7Ejd&0JOs zkKY#Qz;CO^SAR>b)n=O2IIw$ti|C(mZbp)~b>OAdH{iX`Iqr(lOh>|o0;3T-vLdwE z@6CqfaDugs!Huog5rTTpXnb#sFb?2058yq#FR8zgNzqN3i|BbXN_%MazMOrZuziTc z1--4O;*B#*c^f)~v;@WaVF_!T7qH^LB@5gn SH@++tF^C%zBv$v0=>75E;}mwZpyn)gy10>T7;?n*Xt=TnDj zYHv&_z+2a=iJXT8^+%L6;*ccuz6bGq<7zck8~|?}QFcClpdrojre|@^+|XWn9Q@|I zLK&l{aX*4{v*20^W8V!70K|ipdOMRE(}+n~l^+uV5~O58r!mpPvDtz_Sz$wD*)O#P zwkDM!aX9koiHtOXA~Y6!Ck?ARDV+TA1DhdqBfM@)7BBJUhX2}RHob-^)+HGm{(R;> zd-~&3U#|9^_y#TFZxH@`R$8X6c^pv~tUvy^sz3NuRe$uKRDI=PbA|6E>|4%5Dn=fd zc9_2)!tX7^TLdd5Ci1OT65br$bIuBjEyOGULJ`N02NJCRa!Hhxa)$SwT1mVJLK2Jn z^0dHMdG$n1OY_o})$VyDSOni9C|goM>WPO%wv)rYgQR8i91F;_TR|P)0!Y#bI36Sh zFC5-ZJXrbLB>o^8r5zk?ym%zOxQ^$80H+|VfLlpCf}ZoI9oe4`H|&3}xn|!91}+KQ zm* eDdGD?fGYaBigTQ6PEn#alDbNF_rtqPVtPXMB%YOQK3A-I8>W^9$ z+sTA7Mt|fvk@T2vDeCjB^35+bnC@12qTEY1b4MvTLY`ScG%JTBFeBce;LN?iq+&~~ z?k$&dK2$o>CLqN~vjT#FNUEW0qaA3RrV&3;2l^{6!xo45o9V(3qC 5NTL9Ly%;{R((+@ivxyvjq{9+ylLOdN*Kv)5@03G zHf$c-oUHt95Pxqwv8K3sFTDiBl*#vWSw#QlJ2dG@jvf2*XauW=G>t$j*GwL8YwU+) z2@oro7F&Q`!D-Fa#xD_l2*l@|0=8??il0o~AtX_^fBeK`+qD$Rm}>syggoX4(= uLWr&Rg1-%y2PKceczktWUzjtvfJ z7gC@563fDX$z!hl$FTbi$2!rs|NQ0VaUE878}HWRlz$N+>UR>cxX9VkzL(YSiG! &Kiyo1-De&^0k~Virs&q+M%MpXmhXRGr>|kaKkvDkxI|uS zDg7K3^FhSscq7b9qaF#bEz7JRJhMHGgdr{5d2Da7(y^~D%7h;UQHYO0Dg-GHz|In- z7WTDl0r~)EWuOyA7KSEFlb(-)J^yadpnmww?$BX8928&aVc;ho+pawintR@3VQ@;7 zWMx}C@GYuP+3U&ePJ=K|7
SSxh<;4Z(aoZcD`0Ot;i))+jWgnj{fob^+jmNrW5oWTW84%hAPV(66 z_u>gja@I5iDGE|kbk~vsd;e({&fa(1oyEN+w>W1KAXthGVAaQJB#NJR8}FkGL^(DY z0LtV8!^DMsGWOf}p?p{@Y`AWekHV%E0`E);e6%(PA@yK_HBN*4^)iH 6h`1@wU SJ)G~LWSBIZF@6YaLPvzii0W-38->6;f%h3AWBa{KrZ_!{$WUuk}l?v<&!@uc>IW3 z82U KuMB&haHq*IASRo8zC!K(q7SQsFMszI0&Yl>>5HK9P5*fB z`SZg7#?^}VmY3BztKTe?(9rwYH5_j%k%d6s#F+PW(*neHKf`#MF>Jf+pz@F=`Nw`x zzM!;Lo=k)Cw@d2?1CaOrPCFzdxzC=}PK7LD5AZ>>TV;7aQbSO-9O)1d^OuhOEme8- zU(2e$dtLVS>ewk(cB$vS{2!|4zv};#;72E$6B&J@fAX)@ ^TEs$>R z`H70T*F4G|bz#^0RQ0{Tr4`mh<{z&?E_VV96xHzV7u4Br{#7-3<~v1vvpFE>Fa7iM zq5lP@Z%w+nPO>64Wn_IMuuamSINrKp&BN+HDWEW%mj_VZW77g4X`8crF0GG)By}@Z zG;yD`y%p23nG%y98zQwM`#Zy(_WMWCZeZ>kPd N=})K=U-A!Bp)}fL+NgrR@BG#B_Os3}4+Kep{Lgjr z`h+;&O6t*$db8($=146yQH2qSt3MDIZ c>n2g(mjxhjmGT4Hq0V0dR zm3Km?0DIM)3 p;y;%K=;TiBj*hmyTpd?auY9j~Rs1;}MKP!k!z$>_i}gz KqsV5Nk#b+qh?mL(=#1o0H{7v z00Oim0f^5@@e~ChQp*#NT-fHs@~pp&cY%YXVL82%K6RlSzck47sL9K*c`nb?RaN%- z|DN_**Is?lMvGk;?J%(Kxo;FE;O9j-@L032c!s_-eHT=Qxwlu$?ErHfl($>bh{5sd z@fCGam;n|dVG}wU^hfrss@KH(9cH~Yi4BXW=cl)SJ85ymw@A6R#m#B!mDTf= JFfBGe 9r zMM79DuWw^)ZP$BbP~3vcmcoTwW&QrN fpxGq}Rcr%f z2zM6XHW7=RkX2wig+91!2+k|V@twapK=Ci_UqNQsDkHAW@*TZWHp)y<_X!O#H*K4o zSl61>-t-L`(IoujHN>CedSO(RpZ{r9n)+`Y@i&O Fy_Rl-(eX3c%E{067dHY6S4rw6HuT| zqwBI)=$$R8ccK0%i}Hk&SVS9>XnVw-#!eFVu F(#rmv+DQ1>V^bbxcxYL zE)K*Kpu)jc3=pA;(9U52nY@!Z6a6t^_z?Me)4c?O(z&O9p7Y8J|4@|=|25J48{Ap} zchz+mn7#jL_4dcULnHyWwyox2<^fjutcLiejDHFL%HMz8c+&k3!hntwFLU9u1%u(B zTwBw|WnRU^ai )TCY6|WCAe# ?K)#qVK=% z+9r2N#n_6#zI{O!QxFRlQ>3x-gyBL$F)WK2yb-2Zjdn?MQ&)q~@ VD^EcBWq}2eJ5;0|7_P4F-(F^w=>_`I$9gD&XtA6h!ZU{eZ z@e+TN&XII|l#|kt?^l)6KQ3GTBfZdkSH}$u)az^N!NrfLi=X@fRbN}wsb(A?%{y~s zwHfZ!%K(tk Z3#NG{J?z?~yQ9NES`47WfgW0x zfJF#O&o+StDOOZ|<~iy+vX^;8t%;?4_!d|a(bpr3k;M>`ofc~aFA=j;-M%fxKY5#m zdehB>Z_+sGpJZ;FOE~1cU!$t8d`O5#-wjoRk{xk8_|kW(rKj(x+RYECgQCTZ7@A3o ze)fJ>j0x{#w(Y(z|BgVOYh*4MU;&AgHw#@dME+R3dB?h~Mxhwb0`=OxvRK1;zn=DQ z=&LON(_AKvo3fu{qa!i-J2i!^EmM<&C>Q|$VPNi=EX`|4;GA@Q S5&cy(8&jm3{e=6I_ zwt%6FrCZY24{_?jHuxP;hHqyUk4_fWbA8DG7=)pSc2&3{6ky^4;%me!X-#Y5zPBIp z8=@Z67DME@XY%PZ2tH~2 ac@TeZT~Wwht`+5{v_zaR z!YF%sfBKv2CNn^918ki`Oo;b<>rq9tVcVBVham>S)veJ~Z~v6b;l+RHm%_4*CiMb+z{J<7!1D0foY*Zb&;Oz)$S4`eCb2PjI4Win1xr zcLpl!5^1zylkW{K)mJEVjmZTAkHob3S_{+Wc9p=v8T<2Lrt9sV&*OeyO91=`#8X#e z(%3vQNesz;B;kn-cjTXJ{N=do))+7Z-J8p#LHq%(%}-x@(uxQFvKn~#=bf!Ti0M ;*N1KfJl8&m`{8w82<`OB6UJaZ2T&)kVIh|pBB9WjsfVEp6Zc$ zdWk(%_Fj95zqz+14W+-&|BtFT{#uW;)>ShN2G-}^Qp
n{hS03LoDmSVZdRafr0Jpw8M RWpd9;{JAbo ze~&7To%Q8(m;H)?;^<4NeCB^w^};}NJIFgGX!op`HNAbKqH3~zXU0I$)nfy$w8lc X0A!o z>6P8$?B^H7)8CNJ>;CN|3=~xP=wDZBk3O#I%QtkxjY$8B5NlTcfJx(=G1KarJYj$$ z*Ck;p&K_G w0!-qv`Y#{;E;-3QlykE(?xf2wP*m09e^V7i`IE7M$RCY=|CsSt+T1tk z{%eySbi}mFNEd?cCrM+=;{1)O-nIxL{y}BJ fk{~QLPbo2)lD?kT390L;Tp>paU$fo3&dMq~n5K}KOR=nfK-1DdTuT4Jx5n_Aa zf~PlAE|vZ>Z)6NGVH;pl);~!w z=iDm{pH>6U{V-=-I@sYDDDD1YRoL}q;<>XS4f2i^gBsHO5R~T66Lf9f6Lc?5T4Uue zW{TpgAPvlm%kp<5oVi!&F->{yS%-mk7;p?gI}Ew|Ein)@`I !nDNS)BzoV z8?yb;Y0!>uR*E_(4uNqN<=kyibh=mUzrXV%&3>C)i8*1wOW1j(_u6}|?`_;CT~Fi# zM^t&=2f5|IVW5eD%H#*s@Z|f|?A_nftRdsYtL#U{ptNQIF;CFc9~smmGUk(w>_i-8 zA+#YgMp$t z^<{rwz5da!6K%jnoz8dxAUK=`lO~-d_P;c%T09fp5o>}h;JO5%dHGm`=w+5(j&Fp^ zcgk&<86*^QcPi5Ex;lB#SuZ3-KZO65#22_L4CKb}-cl5vE2s9Xs)G`gE=zOOY)0>v zrfk2!9(HkqQPb NI zm7ChQW3OXiWbcb=*VLD)r#Jt gtIuwpu%zP`Sy7Uv$T#d&^D8ppXuYH49c6-yO0JhoSjjO|l{!@Jec2){k5Iyfrz zb_|V;&MTD%)$U_otDfBWgrHPJ%~GftcZSIG9@4zm-gmdU=gpTU zudEtQFuctRKd%X*cm@&4F^Q=>F|xC{Or$1Hg;SpsT+Ye<9Fh~5q|u?eb|Qj9k*p^R zGYN tkiFs!aW*Rz-B|-txjDb?J@YP#53$ZS~~AW%cyoHMKDJaI*ov znw6_VYHZ@L+P(jnI(YQG>iN(61~qm3H6cpQr-2Vuu`l zLG&R$es+sIUWUMb9aM>=5dzKLZBUuE(q ljgrR=|j>zubx;om$8oQnZF@+|5*YA z^$SjCrw72ij1r>_V6U2x%MQXZkY>yjWuSlF$rbBc0hvkwY!0ydGvc{Rqynd>YCDDr zV3l!RBB4c zef^iz?4ye^uIj2-C<@_j#QCnskq-|g9Eb?#hVaA8uyR_LK3ZL?%TMY3;9HmfQ2oOH z_LU+H_(t{Gmw&f9e&+pKk>ai*W8nA~{E&KZ@uR|!2@w?Bn^i;@K{o|6&f4W6@18N~ zw1hzaXASi_jm`#`TW~&P3+_u<(|gxcS)`Jk0wfyCwW7peXvAT_G?T>;n)ThFSN0%< z<0 (EHT0+n;I@bjA_jCGezquNyg9|EEhQCz4O5ao^XvHo fgpUTSm*29waAlWK65|x9y*VUmtYaQ9HK;I$_u$3;$j5I}Td$ve;%(#0J z+e+~zU|W0jUN+(}n2H%$>GnHd3!K!gC` sl}(4BpTbg+9mpXle@+2W?w;8g#|S{SP;b~2~t!NNr3#A zh=YFIBhO&9pvHy^YC?83_6P$pKEldFnzy#3KJ&Z(QhodvzE#cKKi84=_WDcrKlcs7 zOtLMr$yCy&=GaQuK!|^uNPKzhcW3#I*_6a62<^{uo|j>~i5Q906Zg^WfO!$qyVu{X zs0SiZ&Kr1t8bHcu8_I|!9zCn7qq2Wvi+j5w#NQ@&>2LJqyC|Kk2p8wS6a5;cx>@l! zHZR;GoYnl2k_iE)AnO}HQL2;kEV=No+A^?jJxV8>L2=~avy$2`x)WJI&;+a}>5Ykc z+kH`t8$9s?SyUx*nd@sc_37XE0d?a|*;lSFsbN`^k4gmM5h3^$K{tI(h}L -HD&|s4b@k}l$JOtB_?y)if6FhaeMjCGxxOx=QsW1{K$Qpf zsI}#X%{~F&QTrzdhY VQL-tibl7k9snv<^`UrE2px)MtL }EKY30mNhiubqIJG$jUR8zfPD3##O{&59V`MDq8s^3Myd;&WjD^ z72y`M_+b2PGS^S%>=15D1+(DvO+EcM1V^Ol KmGG+ zL{|KJ#v7t~_WdE=&7TbY$q80=Li{yB7bQTs+3H6={gW2SX@hyt&msvZhzaYuNMQWaI42-LZ!+%b`_4>ANFwQq=@?s@p%f)UQ9fEfK!5G|^ zp@SX9ylu#1CCx(Zf~@>)NnUVy%z`fu*gcv~>a;rphHx9Thu9?*-?R50=0n;xf)V4) z#ITb^%nvcgk{~W%fq=t{ya2*&3v8AZR3|gB`tNDNFNqx2RauoLzECKn9mdB0u6Eb6 z58qLr{`J46DurjV$1f{4*`u$@H?IkQlh`*1Ia h+KPkmw!uzane9eu;Yj*vtQwmadTBj5l-imf=tHUeh-x zg!tPe+PlQ;7T@?;0Nb%y>HrK>>`NE2FhBO=7U}JhFI2QYPuy$fcccMX1MwX&Jxv0; z#Hx$!Y1^=^)euNbI+8#ff}Es$|1&toi2`to7sXjcQpSdNV1i-OY^GJc)6~;n?pivg z(_dV30`}hUPPCkxYjeI{7*v(rU*LTtxAXaD_tYQ!`|lItzo;fe*>7}cbHCpZY$N{H z41o}e146V}B|^mcne?C|_W{akFb$g$1MH$%74aNOfiNCpqIYoj!bjEZ3%}lY(EV?V zfx$hmsIzAd3;x#h*fJ#7j4ui>Y5u~<1Chom27MSaHvRdMUY`(u_+|_wEyMpDgmh|e zwhW?8GhtJIw$HKz6c^c|%>rO7;!2d`) 3NUpMgKy0EsmIM|=c`8p} zFDMFJzhAN<3MW8EmLhf276^tdfVgD={s~u4#v3m(=jNyej;hMosVu6|w#>Kx%SY9{ zYk#aY{k_Cr6MeyrA?ghR4iRsd|D8Ovs?8|5HjF~hQI{kAMLBev$#Z0XO?zfE@8Kh6 z%VF23NFPKJ@zy8*S0P5(PMB?x(=!>weDuKAi{JTG^}^v5Sw)4fguDbEGuYG9H62uk z=xSL2 4=ld7CrYNtzd +SrF(Je#KHp4wo!rcfTChn zCf$J;B~TCC5R+FNNFrX3Q@%ehw%6@|Z3$Z@A1Jw?oqtlexGaIyBKik5fU?qncS7}- z6Lim{d5@Jt-y)APl=B5v|9|@1KcgnZ)NfqO^t9OD5Ok@EA=cDNpKlzwE{Uf2nIkpX zA1sNrNH|06WrP}K)a3(T(~g+H0r$ iLQv$q1A#CE0C-sE(S6H zOj?M|i!nJwGwFvl+;+Nm@(nAS{hcWJ!k+i1KN1ntu}M6|*(`PITM(r!u7nevt+~Um zh!xOkwG{qj S&9%4Xn#gS=c<-BZj)PPGb-Pz(a{m(_`P-s>e_M?lloh1xc{1sF z3B6%(Argie;0SO)6pL5ICv$b}Xas^|+Nd*a zQ+{jjv*K*4WAUP%KfUodQaoADvT}t!?)t?Q`3(WLm%b^ zM8&I=C3Z m(#dCuCufrQ)9-7Z9R{GCyK6oCY9Nhb()j^VcVjJ$eG~U}2WVKZL*D zVb|!7yn1{^E8P>{1qKoihA^(|^%K_x*Y0LM3M(gVdLRQpp-Enx Ip=x z2U38Uc^t-UP`#)R#>jU-h=>h+0~FAb_K6`@rrQ2%lWvX%8{T}R)hh>8W&A~xEw|(S zn{TQsZ~nR(-th3Jz52<3(V}`ef)~b*J_cM g^5|NT0t4*Y1e5{Mhb?rMqdk_=} z1135}vGdh!-av-Ng)ki)_5Px~2c`o_1dfB2p3bP-=Rcx$9e73FB{v*|VxUmnt?C0u zRJ|q)faC(F^p6>DrmsQ^$oK~DN9Th{n^koj ~Vvj&x9}P68~1 zP6_j4nCT>CM0uv+1usg@ba`L`@?Zd{B{(CLawo$n2QmOml1Wy$xKPa#+U=7uIUqW+ z4RJp1B=2U`zJJ%cY+WQL3atJS%OwFbshVfK*G#^EH?5JfnZ`ZyD~x@fxt-&&t}dVZ zm?{^R^uD_m1 )-wQ*r$Fp~@+u6w0Y;zMwJTLNpeJx!{ zUbX}H@UajW9}y=(S3joKzT}5hxhi&o4ni?ds)|E}>a^VdQ=LcSojwbAf_tXVxb43V zc*I%~E4x=@Wrvd)V!1yPOQj&CUcOKE;rGdRZp$n&Nh6S=ym)j~Vvdw!TS%cp@WSC$ z&HN^LcbsR~;>iP6EL#}lQRg)82xI`X26O^^4{GI{4^BI56DZ;Td$1M=%OOXg-8?U&ENYy)WGFZnnUYXA>~51xKj z%|E#$QUJFN01m^TP^_xr$Z56qQ1 hB-hAw)-@?kuI-U2Ml^yj%tjrHr zu1J4aVd5>aTL8xPmE$#aLzL{IE;{y#!XI-~UhU`}Y;{Yo*{Me$1CUe^VwbFF)B`&e zi&9EEvlBB(L@6syo;)TPBrtH-Z(S=l#dAz1QQ)WqOTx@2YW}b?{m*+}@4rVG{ %{gY?R zp1)D1^)mtD-d=AZz{K8s;}?Vh_$T^Z?q4_tN@Fjn)r~=Da82KE?(ZW?A*<=j@KUqA zL%mpK^Xq1SkfYpua5t{ui`p(8akv*?q>*qy{Ijr0_rA-2zO^R)yY4zE2DUK(*vuyN zI0Pq&yThzS LP)7^33Gydn5BhLEkzwr?;4O&pLx-WSFMAO#?h(4#BACK(+A0J>U1W$Xndp%pZ~ zP2Vss=^xz(`ed^NlV>x NNkcII4=(z20oOoZr3nM`8ljU=k1RX(&R1H!tz$9OAE!`rJ71*<=j# zeaXYK&F6W>|C8q%_oWOuG3Dws@^W8V&b9YPK19Ox#p`Ni@lh_g>E)MH#-0;qels$l zCi>DKa|~*m`BJ@kyyrpBxU>ca7`HIbnt_({PC{N12c#T337QfBCL 5HVGxoiY=+g} zywBYCeh%F8-she_%{<4kUL5WS12FU8g5G0C^pE#A# kK>4ixxz9P9|BRfCQ=NtsfWSe^bGKD>D1T +x$DOGo= z!hlGW)^9g!OFz&*=GeT^<|J h$i*`kX(g$b#Z@Lq zP78dDI4@w*%L)ixjL-Hcz%~h=c(Xxv0Qo3?Z-qh==eeo(1?PC;vO@B2JfZdj90huFa(BeSvq $opQLd#On^T3 z $ z8Wb^C$zt-sJ*I81R_y1WI1t|rFXHn!OheEhK;HmnDGOY+nuN?`R+x}*y083-h-*Zv zz9`1%SyV(Ct_ipY0j6%I9^BeO f*A1P3E%orc)0FKfksvGr6o*e}yLvs=Jo&kH(BBxq zJU#6^9)=-YF!L?%G|05cC=}vu(gv_Sfp7MtopgLsl;}iko&+EaHuNKc-W@b?>B$Yk z>ZvYT?S(xbP{sHDfhxTGVWkdzkE#!y7UC;PQBtt2A9eJ;-+Qj_dG7nKbsgj%N1!+W z1CT$Aj}%)Ia;Xv~etx1%O$|Ygdff7i|M}*%N5=pTgLHl{0_Ip0F@S@%7$^-*Ydsim zM(=mxO?T)0hXJIyY=PPYXq1iZZ<}?>tE{FHU=}ZAf`hZdb` rYf0dI>rWCy^gnd+`_%BM9||iz)AY*l zq*{C8Be3$uO`^V)_*0oCA(j&}&LRyre G> z9GKj~7#lpceb8m-3k*OHo)`Zp=fppX4fAevsqmY!Qz26Zz#tX7^j*U%+P^)~^nzSt zn!M)7#CcFO{n7T1s_qys+)s za}#m;{Iff1U|p2jiW^;4kfRXV!tSqBCHbk^1GWD6cU1k!Cslpnyo3|HqUtO6 0J(s$4hIIM=zPrz#VwICMglhR>+-zORy)Eh4EH5JTb)!O-rPmBawrB(PFN zFR^W&d(%DVR9i0fGi{r&fd|7h==>mt0yu1(Yl(wkOuw6Sxo>b;C|1 Z7r%3}tUW9yZ5(uo#a$Njd(t}P{ah{# z0F464XwV~WS<*pO2zlEGu7YF$M-M33;ZB%UH|B^o&D*?)WdOZ!cwJm`7PQkMqA(HY zh4*Q@R}nFB%xW?*6Thj`wrg`kj^YW|#5MN07!+{X3R)xWv#eW7`dw6HN?@SyJ-MDd^j(&U=^ 9`J4A`G^FjJIx5V`@DXvsE^YLIZknW-BexBH_0f~x zpNCuCJ~7wi(}acuIX9rw -jr{&H7bTcxtuA3nqVec`6 z*PG9rW7@Vddsz+d|KhO6+oa3NSCsPjson42o|g!Bb@swg+7xYr!p5%$r_y41P*wJP zky^iZV=Hmrpy&_>P3$4g+cD9+$1N`t;Jr5e(j@*;kV!K|Qnu;S#`~lXBt@TZlwA;a z$)k<|Feqz#WDCsTnWMjdOaUg3xlca?^|i_Gj=hTkB)X@k*Y(!&%4$&}z&4`5BH_in zj~^0U{K1&<(7Ua*TXV+%*u`gPX=Xz5X9!CtpSfp_D>Lu-AGdeiB>47<>{LlajvJi( z3bk-w%qG=V1t0GO072lo`P;ZQ_4el_-AmB*^#&25k92+yr7>xwn?5vUnMWYUK3))YTO(l*iS`5mDN7!s*EUR9{~cqHn&4$d9><4g(GY0T^%$Kmbzm zN;319na<2L@Asdxa;z_1SF6in;O-z221ZYPzgQ@Kex$s)XA%X=(U*Tpl?Eqse|0av zaD8og%eN8K7VozcbbqI(VTQdZ!P;i#i)wzUsI8%PI!< 6j_350LUaxG&5~gtzqXZdSlaS(dYra>u*2G &$ean|m7b?H${{f&0d@3i|*gy6q%bwHiJSy6aE4I=*F zWOcou9zH9o%Xcg4^~+W5F*S
@y8~%7a>>!ZDx_aL#=%L?QgTujC J9 z1tI3;mflXong`*(`LLuO%oKHK_wiv#aL|_+a120~b!&r2Y*xy9jhV~(!WA`p?@!d& zfiK$3 CUFjQN9Q#}fujM<6nKb*xfet{%srm cEVxcU^zPlgrhRVttz)qbo>S-h1 zEs2Pq6@QZ0E8hC?{P`Odakf)ST_ `ToF;E_RQ4PKLlY}U2V$O?S3JSxh=?m|%)r(C&UFJriq*V@l zvl=@6Bds2F_u61!`Pt>>%Dzq3E#FVOyjk3*&u=^^tG9)S1`&V%JDC>|!M`KKJE`~` z=Qli`miU{xF?_E`om$0BF?rpw_b`yT1ON{A@oYiO3Ku*lA}}+sS FJR z`0wQ2u^Q^ABx42GaDAb591&nb<1QV}-dJYVN`7YR|C`^dnj_Y*SHHCO@EtU;9P1 zeBtk^`rMn1cL`pZGMo6;7tyL=p7Hlvv+GL3syh8$YVd`>C*GBZqZR6Mg QF!3#}}G(7Q+{UOXaxb}azk4MBX+HK>WyA`Dn0 z62aB!A%tNlU3w;?Wp=TsK6j-OO8kSW{AjlE47RB|2@C;g)n@V-0>d^yMa`+FH-4+t zBko=(1|;(2 a&xdwN7p6T=t+aD~Stq@P%6y z1q0Eq03q>1P@2hO2oKksGx=3z8(`+jzf)_qd6Uf@V_~46ii6W?@XSvMBk&(oapFrw zMnBpl@}?+F*yW Zg3;V=9xRo?r4A^tktq$$=N6JlWD=|vsI z4JNpo0m7YR{tIeTRHDv1^B|D7A64{t52|aFG`2V1x?Tx2M+_?i#^cSa6|FxOmdB;X z$ADEz%K*G6dqrlSKYn#Y%Ux#Mi?_ UOPtG^SehUVm8}|S2KeaclBGN}WuoW;aZN9VByB1{!0IP;1fIirz+Z8>> zCwU&-h6}Q| P}dY>k0Jc}$h|eXai0S7+7Q!{1bEcmIv5&-|e% z3oc7Xzzq;4nI4hJxWEKhl!Flcfy1h}|1YTWp>I>gk>?xt<-Y^_7+83GP9y+={?_!c z`QoVgnh#hw!NqPnf*toYGxG&8!}HGuo28&!-A UZS!sex&b`1jli-kSUC%B) zRrfCZiaPx2cS)9rv!b^!cfJh+Faza-e^LL``jV>Gp2+X9*sscQ^{JqFKozRH8<7Uf z9LJ>$7y<`bVqk4`QPpNIscOt&o;MS)+-9|&1V_ZU7nxM(qqDL%pC`a@#09n}!n_d1 zE=xQb;wypBzYfx2z#0Q^Ux>etR;8<%Jbmv;QJheu?_?BYiiLXDDG%}4M!{K79;^X| z2iDZXOaE3Kdg-sIQrYb@ryg+r0*Zq|?+@vp|CYPX7XzzHPt@Att;pZ7mn7!N1o# +Tpovkp2NWW!#7l6ZKgTln{U8>>~zC$=W81VD!skZ z&BCe+U4r@LqF&J1#`jJtFaBmu0CphK_J@7rMXTsuwE^Cb`QSy-FbyOA{vxO^jKF8b zUjf`?w*eCyV2+Ket=C8a&;?*+bnP=gFZu$#JyDo8x}(E@9|MoC{)QrCEuY24r{T}i zy!L-H%^NwK3=Pz+J2M*}ZauqZH~R)7tQc`YW}aRS2tRD@r8&mkib(UWetow4C|^uW zL;SHTO-jTK^FZXQPJ&*^_+~cWr7#0qQxJa*%C^SHU_sqE_aU`7bFGt2aPM{)$OHpx zwFNbM>*J~{@=D()kjeYf7CJd$j}hM`Tb1pk3VCm34pib{s5Sc%uPkrwx qit5U01(mB6 ~Aju9UW>tN7}~6sDv<%16g%RK@_|50HariPTI^o z)(qR d|xMB`TNVn0TBT& z(%Px|%Z+mFpR~M_n)jTt_?W!;xvmOFJ}MDX?!NVZt6S&(A4##_7gDGLhk@KNz_!-K z*FUPGV78hI{NG9L74^K31<{Fv>Fv}H?pcepAc62y+ANej)k}T4N8+}`fdL8XlLf?; zL?o#LtNb^wRdsmfhACrkDbNp;9r0iD*~{YQ_^!A)&cGxz`0dG4Taedyg~lBeQA*$4 zVxVE#cipn@YxD>1KCvPciPF5bdHjTa%e7E`GwErI0MP{)5{1AEzyD)u_Q6|i%XS$Y z26_Pl^D}qUook=b3jx1|z4v?Yx5a!LCLKmOPhdVo5|9+w_dg;E%29x}+T3<%^-dOL zaRc+j&EM+%<{r%8NQMz)*&4=c;d${q7$uamsTW7s9n9j 3H?FD#!;rDP@KMk+0|^+i*ujcb$*|&<- 1 zIa#`<-ue9>mpB0n=C(UJ4D>7p9^N^pY72M8eXLmS@G%JJ@1$|MO(Lf6Z`|wjfk=MS zd&B3ju=*iFetvqT+1{{x-gKCasMb>6=i;7E3sYkHA?mZ}G1!(+5Ir_46F~O#&&jHv z0Ci~q`a}>TEYrFH*vdfH?XBxo^`{pH)aN81Q@R# Gg2{ |ZOJDY%{9+(?mfa0kBToKn1IJu{)77LZ~maz$wpg2*lepS z%VEGK25w#aq$;e>HpctLm^bB{?}2N+1;CpYbgeVx_zyGVmyU{VQG_j0=1|<9KR;b- zx%C-TeRQRw=nDir8#QfAbPe{6#}ofkHhnUcfDsC-7kzzbPd0NKi@);{eK2UBKde6O z(r=3sB%6+q+PyF6K0*4}${?gOp{5O3Wlg4}Q`nP_D>5;aF-OEq#DETiEc|VI--V(F zJ_2k4AHfzSKHqiNyLgW7;#rQS9G$*#&*Wh%U|bXemuqY4)BpLy!VSEpUVH!d$TM~s zny|XMbcX?(7+70fR@cr+*yb|6KsHNmjD5a_#`j?Eklu~J9{t(lD>5$@CA@Dz&B+AJ zgv`D%3Vb7?R5vUP0wV1+tJ(vyXnHbRlD%mAh(Nk<@?cCCfS%5vZVyE)jxYbT05j2Q zahRt3D?%V`xh(e911Z4B;Q!Cwdw@xjT<3wWZ2RspJw2w!?Ci{}odrM;Gyo2SbUaby z;b=gS0`CKjXdsC^k>Y(iijt1x2Z1LZAkp(63M2uF6af$*NGxF%mb)-Z>@I-a#oC$O zu{}NA)6?FYviJVTd|6T1nN?X?nbp 9CAKjiKD4`z7pexlyM{P^ApIS2)$g95BwTMuAl;hu#I;JO zI7wp{`0wIlfn6CsnvyHg6QBNn>FNug(Yt2+1_QeW1DC$>AZ;v ZW(u41L3*C76 zQO@1?@6qV*XYv~iM1_H3F;8Fr+&k5+mpweE=tND%0N&+{3q%@VW~oef^A l5^qCL*9NoP97^*N}Ft95yaP!iac=bQd%B_4AF0YXF?^`;6 zI0M@;pyuCGd4lp?GXN&y?&EnSwP>auy(~@y+0u_>eg z;Qp59uh8H8w;!e-`ad3|W2e7GUSV8=fwsgzxm=`cFMN_R$xW69CU_315Hj_R^FR6S z(E&9!;9^XOE0M^cfnE;L?y#11S9@{4$vr3XN};*d{U~0Y#QcX-1yHn$V=e@P0%8tv z`{Z10g}Z%yxUVIcJp`}51dW?sjExjlH36$~XyP|>M6{|xpMZ4(WBv7g?7hZ^cyN#( z`#x(ScFhbt*uRexAadL(5WINe$tL(pArO-tXBIo)!VHLUEYt(#slh&r!B|;eqzC`# zE%ZPC@Nd#RuYNOk&u50*sg9fX8VuMN*jSyT@r$2gNn(Qc%ZqB&hwoX&2C~W5D{ aeQm{8a#0xQ4vIEhL`+_v!9w!Qh2e;J9 zdz0@Az-l$m+xyt=fr)c$CpW7z5ac(7S>GtN{_DMSfp5-@n*o4Pq9Brn*ckvfGNKrC zJz2{>c3dKxAszrb0hp+C)
%QlgDV63?X24*e%`ounqklrV)thwsM3D(nwfJAYaWq+t1I=xu8&bBBGP^Y| z`U;|s2LQr=xiiN~{aE3H;KohxYvB&k-$o?Bwdx9!hEo}>1iVicadEvDr%ZxCuv|fE zYH^;ZkLgMCF(BfwYAE%?bx%HCVZS(;0FiDzkOJ6#cA-fO21!0?^e3Cac7XMia*Oo% zr~fm3=7YaLD~l6ojsbw!y&4!cBVmk>669@(}&XcZ>!)-@E JdNkg5b-gD9X=q`v 1u-W@@sJi2CDZ>Q3gza(g|Qm zz`lWm+FzTUc!oaqzMr5kfBZKnpM&XOeFK7n1`GyThyiH*=Wacy7+Bb|(8oa4ch7B- zG!?Hg0(x_OqV+7sZ!pl27)S-Y9BS7x0Ql8#!a(-5n*9|qS-{vu99pln+9ng3o<}Aw zncVa|P8=6-{9GW(6dvUe2fN#&!xoDP!Y}#YPx0x1K0YEi)X$e`u$wIB=&?_|lRo&n zZ=#D&J;*f}CP4o!jK6gln0Vp+R9d@a9baWV7WtmxdVwDA A0T%`^FSZ(@ zF#1%h%`iF@1a>t8fDWEL2E#$k6D?Th!hTr0fc{Mi0e4Sw+vAy_b0)-(3>Elzr6t %y#>6|A5!=mU?}GLd;oS`G>jWqF&u$(%qAl9u|KUyQ58ZR=O1d|4?6 fjLw@hdXeLhEKkM&VAdzqW#BS!xL%kk4f5ZT!Vo|FfeuL V70cZXudi+hkF#Y%B^ibGq9yBBwNcL?s>yx+a|4`eqxv-6ypopUBS(8+wAT<4E_ z<*wA%v;@BiqeQ;Fhrbw12-&U4d5BbxS0Ql9<+vP9t7RR3LsuA%w*64Z$9?L ^ zJ-yAJVOrR>4_4AOU<=&eME!-*seB Hm%4WbHnklo+loMw){T{b_ld~|={ zFu?}Lkm<1;zn&YwbQcOLNC&o#AwldOkyS}YMQ#QA~I&&-)+-vvymKgARw*kxFb z_TRfEo8@t<{B4zBvbEV3degK;H9q0`%7#fH^pkJt4ikiEk!#30{x0XmJKgu7)&6Xa z+bHHaQ1JvREhbuR4;TZvj!GsHnems )crV9yS9T^GyTx0i0MWu)3nA1REWFtQ+`XReF=QNVHvgsSE)S6*Cw$KgG@Mc> z1UwMpLvQ?4fhU%s_@u*Eae^R=gcI(^j4|)It>yNR5%5iU`8FhR@Jfw4X{SGDt5!bk z6$F$_Af_s`7QMG<*{SW_?Q(fPqd#MSWP&PcXm^dBUxgpIK!&r4or&&33=-=KcJkES z6kO>g3BPVvC-o51w=nmt-ym2jZ1~Ohw&UYbk|%E1 z?ON8G{~2_io&dT5cV@2Pn_Q~y pqr7ail* W81JYX0fj zKbr{>q}2R-3R(m7pr+Jdo@+B3>Vn>jT}_UFIWGLsTmX*R(TDR*wb++u!(YBRUUGzx zyR(y-XApyP*;iHjv#kNtpzz;F+V~^{+>xlko?XZYv*Oqac$=Bw?*s#Sn!7%p4`s?d zZRTg5t`XId=Wmkgd dD(s-v}A~~^)Y>FwB7m0U2}HsO(yV!zRC@7 zb^ew!HB1rxyOw%4BkTBv{AU(KwYXpO%D>j{@(=q%zb&D?l$Q4G@4 6@x7@|cj**5;UzX1!qA?q56?WdGdZg5+>(FH;vXSC(VEavi= z@QDzqB4=YZl>%GWimLz%#!7m@m_%ecNEe@d@cmK(9DDWzf9bgpXedTM%%vNzu439X zD7y=Vzvf^8ez}KGGX0BirF^@7hkJ%wSBR8s43!0!MYJ19YhU~L+l Ffn(?LzWT03e%Aj@6pUq;^t-To|97NW`}(~EVUPqPJtp87wxPkbSFVlvIu9G==? z3J8BI`oJc?)n2zxr5F^2U`o%tIc7n~=1=qVaUB=sd(Bcc9^F$o7otl!UhD6u0-f>l zpkNo`W>p~&-4r?$)z`kM@o~2k(7`yUJmO#3q0#EO?g+)$N()0PH)*9)R8Xec_{T*H zZR<)hu$AggFa2Uu%>_{PBhMH;pGoCbx+}mQ1`H!oSr)};W18AxG7@rr_Y&4)nvB54 zBia!&LtNfzNkuFrK0yrXCrsz(Z5Z8Cr16oz_#2vfJjqhGF-pN$i20ppV5^@b*BIKc zd3H!%eD>U%!jff~@D(Hg0{-D^lT-<~;+W1#)yNODd1jjsjpM_G>A+1or~Uj5ttR{z z1OZ+VJ8mEa$YL_>Rc`>9u6clTxxzav3A^SvrF(_6{|}oWTO<9e1rqUgBBF-}2j5 zbWsA<*y@8P(A!@&>cce|2Fn9!^1NWu(j$!lXAblMW3m9a=%P@Xtt>l8a&vy&sKC33 zVGY$h<6k+xgs1Qi5beow-bg4Bg>Q0iiLO6&+@&)zd}=R_rx{|VAG5{Y^$!3wW)mRw zlOtzg61QBDaiR7qP&8JL(rOp& fVUth7j+M1Lit?~$<7>vfEWlp zyCTAW`FCGy9{N{j_A0-X|It61m{5(A8B#q`DJk((gs%%&@ueMWSHV1$=Ju??;Cl1| z)>$GEqC6;kyOZ&rrdV6;&Cp9WyzD2yJw^iozCnof3N5D6!_?-+@TXguzQki2wuhmb zx&NdK$R;H{KI`m5KxG5KCi!%Em&f2UkCeoLnkqW?{PL*)HhTv&S+eCax8{Hd{_5ZJ zXlw!7YS;R)mur#r!ZkHKK9K6gf{W%snhc=_!A|yy^M4_gJuVO7qL=iRzBhtrknEMn zpufE?KKo+ ZV!m?enj>MC H$;p39U?_vf7PTG*`#-l$;S91eu7*|l%PY+paDMjrubcvf6ef~Q6MjO4?2@a z)^Uj&p)@q;o(P#4#T MEm zyCyx(G2zNesAvJntu#&`s^r!PnE7iQW=uUX?}18DU;|V ~VZYOm%O#p$N!o{UP@(W0y2UlH=YV$zm6R^13(K z-s*1MQ~mf^g5c^e1FWToh45hTTLsNHm5b%{6yL3+z7M@C!1QSfU1>$ahkj|G>lBW3 z#CD~uLZzzp;fH=8yYDO3+aBYW)TPu~RjwY4t6Mmcpk#JY8g(VtweBc2SVbUqUvG6j zLAf`@s^e>xQqVBjn!W=O={QnLgSYFo4>sCgu&*|CUW4NvI_Km5Ui3S$x7UAZ#B>&S zdmAh9M^B-Csxa-&`06(vHZe?~q1#8FE`XiZ?dyj0VAExO+;@7^gkxoFJZZg5y*S@b z>#`I*>mYXUx^M6&q}fl{+!6p=Htk0jyucPxH}=@Irh-7d f=zkz Oy!%E?n#6D-T~v3fZHffI)q9u~XL zik J0CRM8M`?JPEw>klJz6Hy-a|Wa@7}IvP8m|;* z3zGkMIDUKKv6-cgI3TZw_qVBVbQJ!?Rz|ZpP0$|vh0A;mRi$fZwNUx44!XZ~2tsrk zR^gz3( By`|FAO9bnnf zg0ti6!VOlit?vz6ptQ;JvD0s_+7j@yn>EK~+* R8Yw$)=RV` zX;-I@jq>s3x-VC!k=kYcqJ!6nM2aiXfzT8N8Iupwg^{6#A-Jm#iqIg_Dc)uOvV^XY z=@@sP QN%UG*hPXZXjBmr6vD 8>|M3z zTkK|n+aL6qC(wd60Bspe0R90!uxq0>#e?Q4^(;`z9a-GkST3s-1cIm^n zx%u4myt G{EUt%9Jl1h_AePp)|Xedq+Nm(1^8V8-%{pOOqXy`8)ayrtT2 z9D7~UG?zB5;S_(axC%c*S&Nzr5uq_Q)O%K-ko;MenbiBQ{9?() 5xW#0P$`@ z5f3>60-MQ9YCcpdeKgEtvmUY@gFw+AT1Dtq)de6j7&F?VD}EX|z^M~yjn#jNT}1@s z v_ zNIfx9+>d(DHymf*>q-Uq7fKbrxk{I!!zJCsxITLroM+^L19 tiIpnct62cx#J=Oh3YpH&3RZ-o5gSCiP8hkEo*gvD3 z6?vI^ln9;{gAz#n9J*r>cR^R}=17?J y_epA)x7<|@^{Qvr7VBmoBz{p$#>K?UsS+rZ0I zO({1{- $3lqzwn3z0S_?6+K@xnb>eob2Q7ZmjUqmF$D0C(*Wz2= ziFvHCSJKwTw8_LUt!ekC;Dk%^*w{^2XZm&6=AYb^$tsxDV(xmHMb;8R2_NTA_6L|# zp$Z9lO|R3*ivlst*b{$+PLsn*sHi#zrFXVa)ugm=6-^ F}H2pkO3`trx{++;7w+*rtvT zfOMAj-FPyIZhAmA plXdbAAdb$HN3HzSD^1Si z509jY%LuBqWaDZ<_IolHyO?U}!_t&`t+Ud(SP!M}P$W=fu t@Do1anLV}Qj?@#Q Qp3%LdHJ8FA8LXB`7<81>D+Oh#l+B zP>r2(V<7O7#pF))GmY@m>f96&ejv^>Fa&aCVRW*z)_s#ndj7~V_od=2^7-O%apEvT z?Vi8gNOGss=o(QyC6tXtJ38Y#?QuY%J=)MDC5Yz5 zXUUnb>(X#k;g|B*Tr^ewYe}?3;}Sx*>pZ;sMtnHRr4!3v-o^cAlW_%QzEIN_zxnj( zvNb&alC-rY;k1Ts8xF;5{i-jS|41e-)(g7R{AtcN<(pW?UR4ulmygvXv)Y;e(M1Eg z2Hpvwx~9!$*RWc=LoCA@;k>W(`7!;@ZT54?{TdO;fWz?AoX8EY&y8#QFk>d)e4S_; zq1_I4Bs?%nNW9f(qp*I?PI^lXc5cQ)VY3_6P8w`{HW6m*FzOniZ 1+Q4n_8&Y8jy70J(j`aX}YoE+D_nP{FpMVN~-Iot ul=< zAVc)+pCxZ*nyGsMlr=a}82b4@Krblsr;&a)hlk?RiObiFUln#13WMD06j`D3_s742 zH<7xr_Cy#%P3iTKX8}&it6^x`Is5crzkN2;&Pc_9{enb^Wx3UGeSH*S%>0uWgwp1+ zicf!s*2y$&4$GQ8jIsiyzZ;nDb!JJa6B`OG1ied?l@^5-dG|Shfd|Kc*2Cu2qUd*o zu0xuG)vApEPq}-Adt_Ee#oq`&$=%N4U7Gw(h$=Z^G~(;Q=e~$Ne?P9is?>C{+I-x4 ztc@ylk{R3-#1s8Iepw2keLsFlyJ%!Qbm+x}C4L8&=t4G44u3F=sl4QtmF}}X`t*(8 zo2q^yraQt!O>2dNw-`Uk%Rhaj6Rx&0lWaAkkdE5HYQGHlhx|4u uu5bBt4Z{t3>|55;%9{t8K!)9Lva zl4j%}GfxULu9b1}wAvSuFHCiXjBAqsG?Gt62K0TNrlAE+wRn8VPLmfWKW$wO<@D16 z(r0(Gb?OjPeb=$!DX3tZ!V!jGOS_F;^meXa)FJ*xoP^ % zN;@(2Szg|cpGsKOPiC9WPt_AqpE^jy*$vNXRa0;7k~*(9D-m(p3@#_|=FvoioyQ^% z8>`b^Y6lq+ZMLb8W=tRN^+SJR7M}g$1~f<={`M~oZy6uzo$nFu-#>1&5F+)8F|7{9 z>=7r H(s|RaoW2&- z0Cv`4CfaX00@m(nYN=OiRHF}r=^^vv+Gm>&6zk~YI_|R>_-f&@2 n{I(Ax+Pe2wTy&i{HxZl$^(Fqc-T=XrSKqw?>p7_M zM@i9JoQ18s+_vWh@F_aSX85)+Brn$DySR-G-Sf8?g!y&fqv{pMV_>h*x@rYrBL?V< z(CyFUdT3RR+{SDZ&*6MvEzd>$cyH1FjgSe|P0gF)q*RN^KG$NYN8yWld8SUfVmjRu zZsQ3F>PBDBJ~DTZxmK7RXZ2+OS%3jgd=t7X;kWOui)t@#;JU92XQ~VFa;%osiUXVS zdOM81CDz;5WvTabdL**+Qx(hJ^1|9 9`XGn zFZSzV$#s`PXfI9??SA*vW3up8AWQ$Fkb2cxntx;Q5jV^(J5}K_K*|4P%_^YBU&!km z09Aw_$Qgh6NKVW)=>dp9J`?(U@K$nya^IjsER1R$m=HO^hAkpN@lPO-^(ViY^TCkN zeQtE31SN!|gF`Z`%fX5KOGM3DI5+D6CbNPR1 @dNLvY50tDSZ8 D$U3&9#*}>_0yc z?vbgHb!)Fv=&SUI4Wa_%W5tj9p3aZ|+MoqLuE?ay9ays%vmx}aZ9+NPq9hCDM`p3n zT-Z8(7n`-BVNALz9sX%tqQC$`pW_*J>$(6p`!1m0M8D8As!d37^l|z l|jHURR z2?4OjMm3V8`BjCi-NS_JY>lxHY^onf?&VYkn8WyBjE!Yc5mksffCWfwf@oe8Ag7VQ zJ^3MIJH*5RcuslQcG(`Q{zNiAMY7J3E4kL1xEUV%!i@jSqfMT==MYS4g_>PFxon-3 z2>qszZS&(y0Z&U8vF_+)@XCqc{udAFw&911Ss?rS(HMOl*SR4Bwm0A#QY%E`-GVPJ z0LfR?K6{=X_mAv@K9#*nP^xCR?Z%?@!DALSwUtQ%VYmiSd6Km-h7h%!)qrn6j<+ z(2SMc8qyQcbrO6Pc0~v6oo*pBwB3Hp_Wg1-L )5z}4etRgrPd0-p_XC~#kV1iglWUqgjGgD!nh=@l9>1bTct6X+DhR8>m r1@spk4B}FL<*zXh&KU|D=rk7Q1iA zNbzX}znRToomv?QDl5|}Wmd_%HPK%-_u*dYaL4Yw@SqR89%b2v%!E+GZ~}rLU@w~; z{Q0_qNM>$(`X>C+Z|O7GG*Z7yhvMgT@p L4870-x`wd!*|tMI4e` S4c31_03!jR-0Pn`EuD%s zL&y(DaEDbkOMB^qnnNbuIDZotk8m-(e?GkSar%8m;r`|UtDTl{)ijqEL`}0FC?@>= z!peNHgd})!`?2KxwfL&Y`Vxae28A9e)#;h)*T415jD(?CTQ#283}*Xmk-vzx=ftfM zov(;2yI7wNt{?8rO2D*_<$l{fF-dOSQ1^?{4yGJ-j9jzBh @--0UsUiuPIf`&xb{zzHoeImhZ>$CkVR08QNc$m6 TaAP$eY@!LJbL+MrqyOB{8MRXLpcmkP;OfnJ zlwrEW=NMs$0oc>{Me7g>oDoFFbOmO`AwYmy-zoD~n*(}rUReuM#q3FB&+&w_inceX zHuiG3f#>W=Rxim8*na;eN!K-yyIS%wsh5|!Jhmihq0|@Cv=`TtC#)G?&I53~Woc4- z9m}e+n88Mo_enOf{N{G_Sew`_6nm9fgd$imb`b@LvgZ2YPZO)UBmh6ZaYamX R*v(NgJe# z4&u~ZHe3DjO*=F0mMALB!S>Opq~FgBaCWRvzn{h?wDj!=ig}UWy=Q}j=g|nfBnl_d z!Q>Lm_(13hoU0MLhh_>Uh3**Zx^;kU6dTRx5US^=(yS?wBoFd>UeIzvMz+D^aibcp z4^u3iWi^${rjBEN_(R)?YZ$_KyzP@ h_2*=#z z-KWxTj_(7tHb6jbWpZ}yEMec!m|*aETX)f+m*BKbpyThi61sxSs-Jt}hqT$5^Xj2X z7#UnMzR@vnd)=vG_u@L^;lOQv>FdEfweN>7BD~5 oE*iH zq!$T0eU%ipeo^uJ5yR8B%}Zi~3^KJgy(i^WdGcmmd4aqGDz4vI5C`vi6v-Kz{Mk+t zx?YyPoGTw=GwQ3<(O+-)M9gsdgvn|Wh+@a+OK$nmDCP#mlWV=ifG*imT*Z{WG)WsA z)NSi{q}0|}9Urxv8xpj&Sc&&|)NWk?hPI%}2Q?%t9Qnu`?MGU^6Hz{Kw~cbi=ohQ} z_i=I=E(MB v<@KoK%s`~mC(!RC3I3+<(GOt5Ci*GzvDdDBR0hE4P58G+ z|CrH!sY}0o*;fC@&-#g{?4&!%!PILxED9q^A2^zNkzf^ZG5!VnyJ*NZa`aW#OoB|+ zi3^P^xS8D4)$Hd!+VId8Wr}y3Q=bYSzzut8rMuz`RIldewZW`ts6YaE52hjwkj&KT zaUo6Z4(0vKM`d6~{P<{w(?C2loerVLL|TQp0s?x_COqi@k#7&ZXHb}Z@05ITlZwZh zNr5fGs_CzS+7wUxNqeFr!yOzy`A*S{u)~wk_uct9KTpzG)W&~q8Ki$WV`@5+u(vRa zy)X%+8#}w!c`$njp&PTSaJJ6!-XnjxV|L?X6TE>%g4}1bo&}}uTAfi#rK+GFzgf|o zPOSBgu+T5&PqC%~t3BW2&vAot)1=dXpL|8AMgwppdg1s0x-O`Xar^}-hs7T5##GOM z?PH}AZ|*yr!6e{XFwif`>;s=fQAW!{E6n#P&q+(^^g+^O2YVbom>GH;Zxs(Ste>nZ zNaTN2E0S#Ffr+!WohK+JR;phwnsBzBHY UOW?d{v)Q zuyXXzT1mz}D_UczZXP>v!2*kX7IyJ6OlOS^>M4c)Xpedsgdn`TtOJd`c_#AzKIApK zHSQhCfaORlsA#meI{Nss@+O9Ss DQvb3`=mN0RtU7&358Fo z?L5k^(gM9VytbLIVf;=|r1FFzPvuvTY~BI_W(6bEv5dP%tM> 1eWBJx9j?he>sm^5?ejSzb>YpL3#=v^;WK zC<|ZFZ&`1qc4J*y9%2W`xDU9;9JS $6n0^YaK1=Xgb-sOn=`xN_(>b`Ox=#tPn zowu0BRE!A%;+jG05!8RaU^2+Ope0#}j)Z-ENgcG~oUJsx>9bU9l=&82-9*TfD!%%Y zxIBP(ZT`cRzI;~5{HvA^FYB)M4B>E-I^SVJT><5Rj+VHfD(6ahbfg^?P#STZ;^oHg z;P783?Nu;=FlGP`>G`V7&9b2G)f(MGv>jx8gTyp{!8Ki-DIodx+Kra{%42`BBvhqi zfJAKz2*4yiSgBt0gwAmB zj+J@`cYLXG&N`{=1@318^=Ld%2y_TGL?Oj3T~Oce&kn4=(A_uljsZ&M #mNTUaFEP83f+ZcHRj%Lcdy(VG-)hDY%$*fafsvjtrlWKeE sl3&;a$w4hW?) zefSf$WGGZv7amuYN?&}78sM1*7<6bxJ);t7EM(2>z5mEk`IgS-8z-GlXgvm{rNg5w z5x4@PQKP77xD}*bqGRDMkP15vSgp2}5b=}b`tT&&vibVfa=b*qqDGapp7Fv`?q2{~ zyYjwe8;-P?3Wj#`KSE*<7>Gk`C0J-o+A{e@I68>E$9S?=3)VuHO8Lw(NO3P7$y?P4 z?Gz&c)B7?vo?ZKe3?D5_nx;9Nj{S+hC$$Vty*u{*Fg6*qiPvn3dbhE3H;8P7gJ+*W zEj$n!5K&JC(hI~s{m$KkOeYn2ns96_ohxUTdE`2#Ch%+Ywn_K#mHH-?>U@mmDP0td zu9&v}-)q*s%OV%gVGm{2j~cT1Dr0@5_AVT1mHb pdocx10JujI#&I?$zR)WZKj6mS8%zQ@jTjdLZV_t4^%I zhwU+q-`2HCzGmr`{~3V+^u=x~k)1;T9r_@&5fC>_9#Ng7QZzTTUM19Z-u3y1;|Pku zy>F|Bx3KsYyReNX1T5D4`cZIM#J?k-#b^Gc-%IJulZkzZ= QRnb&WV zN28GY)RCD>xe~`O7%db773qJkUX|7&wc6FrJ0k?kHU}XN2A_aWR+>EemMP(!z#8Zr zwT`V3Q|VEg=sITWdFG#%?uP%Y*9-(^T&lnh*V1W%@s4xvJrIHQ#OjHhjyiXCwHzG- zBMUd#7?{BE{p!Vy`&LjfPGI=C0@7Ajq=xm&Yud!a+4)(w+n8xbOi;{1b%GV3MqYk@ zbje0n2g| ybC?MM0{U(Kg$YRK^)a)w=ND^+YxjP_9v6 z8d3d_uqgvOkZfcEt?iCM#P{qB#?vkhtL_!e@XqS&h&4AgJARj#Z%DXw#^d>ZaUhHO z#fFXqT0#>mQ1H3H43OWo{kBR5RN>aiR?**iCS=IWbMc(`;mSyT`G3dbiv+x!qb#%! z+XE!0AGwCQt+6RjJ}qa_zSyXw-aK4OY!2=0r=gcN>&?N_Z*%9A6wknOACmIdG6-t> zib)S!ppPi|^ZkNREb^3J2pr2wbE(ej=U*T6mw{IY{Ae5t+