From 9bf45e42ba60a59342363ddbd09ea4b917075049 Mon Sep 17 00:00:00 2001 From: Hank Grabowski Date: Mon, 17 Jan 2022 11:22:53 -0500 Subject: [PATCH] Initial port of Kyanite into Friendica Archive Browser naming --- LICENSE | 373 +++++++++++++ friendica_archive_browser/.metadata | 2 +- friendica_archive_browser/CHANGELOG.md | 33 ++ friendica_archive_browser/README.md | 51 +- friendica_archive_browser/lib/main.dart | 37 +- friendica_archive_browser/lib/src/app.dart | 79 ++- .../lib/src/components/barchart_panel.dart | 42 ++ .../components/heatmap/heatmap_component.dart | 223 ++++++++ .../src/components/heatmap/heatmap_tile.dart | 41 ++ .../components/heatmap/tile_color_map.dart | 30 + .../lib/src/components/heatmap_widget.dart | 74 +++ .../lib/src/components/timechart_widget.dart | 161 ++++++ .../src/components/word_frequency_widget.dart | 114 ++++ .../friendica/components/comment_card.dart | 78 +++ .../components/conversation_message_card.dart | 86 +++ .../src/friendica/components/event_card.dart | 101 ++++ ...cebook_conversation_history_component.dart | 50 ++ .../facebook_link_elements_component.dart | 138 +++++ .../facebook_media_timeline_component.dart | 68 +++ .../facebook_media_wrapper_component.dart | 186 +++++++ .../components/filter_control_component.dart | 380 +++++++++++++ .../components/geo/geo_extensions.dart | 15 + .../friendica/components/geo/map_bounds.dart | 82 +++ .../friendica/components/geo/marker_data.dart | 33 ++ .../src/friendica/components/post_card.dart | 98 ++++ .../src/friendica/models/facebook_album.dart | 63 +++ .../friendica/models/facebook_comment.dart | 209 +++++++ .../src/friendica/models/facebook_event.dart | 92 +++ .../src/friendica/models/facebook_friend.dart | 123 ++++ .../models/facebook_location_data.dart | 121 ++++ .../models/facebook_media_attachment.dart | 170 ++++++ .../facebook_messenger_conversation.dart | 95 ++++ .../models/facebook_messenger_message.dart | 179 ++++++ .../src/friendica/models/facebook_post.dart | 214 +++++++ .../friendica/models/facebook_saved_item.dart | 101 ++++ .../models/facebook_timeline_type.dart | 5 + .../lib/src/friendica/models/model_utils.dart | 35 ++ .../screens/facebook_comments_screen.dart | 115 ++++ .../facebook_conversations_screen.dart | 232 ++++++++ .../screens/facebook_events_screen.dart | 100 ++++ .../screens/facebook_friends_screen.dart | 122 ++++ .../screens/facebook_geospatial_screen.dart | 386 +++++++++++++ .../facebook_media_slideshow_screen.dart | 185 +++++++ .../facebook_photo_album_browser_screen.dart | 127 +++++ .../screens/facebook_photo_album_screen.dart | 137 +++++ .../screens/facebook_posts_screen.dart | 130 +++++ .../screens/facebook_saved_items_screen.dart | 136 +++++ .../screens/facebook_stats_screen.dart | 251 +++++++++ .../screens/facebook_videos_screen.dart | 104 ++++ .../services/facebook_archive_reader.dart | 524 ++++++++++++++++++ .../services/facebook_archive_service.dart | 497 +++++++++++++++++ .../services/facebook_file_reader.dart | 50 ++ .../services/path_mapping_service.dart | 121 ++++ friendica_archive_browser/lib/src/home.dart | 119 ++++ .../lib/src/localization/app_en.arb | 4 +- .../lib/src/models/stat_bin.dart | 29 + .../lib/src/models/time_element.dart | 18 + .../lib/src/sample_feature/sample_item.dart | 6 - .../sample_item_details_view.dart | 20 - .../sample_feature/sample_item_list_view.dart | 71 --- .../lib/src/screens/error_screen.dart | 38 ++ .../src/screens/loading_status_screen.dart | 24 + .../src/screens/standin_status_screen.dart | 34 ++ .../lib/src/settings/settings_controller.dart | 128 ++++- .../lib/src/settings/settings_service.dart | 125 ++++- .../lib/src/settings/settings_view.dart | 366 +++++++++++- .../src/settings/video_player_settings.dart | 64 +++ friendica_archive_browser/lib/src/themes.dart | 25 + .../lib/src/utils/clipboard_helper.dart | 11 + .../lib/src/utils/exec_error.dart | 23 + .../lib/src/utils/scrolling_behavior.dart | 11 + .../src/utils/snackbar_status_builder.dart | 15 + .../lib/src/utils/temp_file_builder.dart | 36 ++ .../lib/src/utils/time_stat_generator.dart | 78 +++ .../lib/src/utils/word_map_generator.dart | 139 +++++ .../linux/CMakeLists.txt | 2 +- .../flutter/generated_plugin_registrant.cc | 8 + .../linux/flutter/generated_plugins.cmake | 2 + .../linux/my_application.cc | 6 +- .../macos/Flutter/Flutter-Debug.xcconfig | 1 + .../macos/Flutter/Flutter-Release.xcconfig | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 8 + friendica_archive_browser/macos/Podfile | 40 ++ friendica_archive_browser/macos/Podfile.lock | 40 ++ .../macos/Runner.xcodeproj/project.pbxproj | 71 ++- .../xcshareddata/xcschemes/Runner.xcscheme | 10 +- .../contents.xcworkspacedata | 3 + .../AppIcon.appiconset/Contents.json | 20 +- .../AppIcon.appiconset/fba_app_icon_128.png | Bin 0 -> 2073 bytes .../AppIcon.appiconset/fba_app_icon_16.png | Bin 0 -> 479 bytes .../AppIcon.appiconset/fba_app_icon_256.png | Bin 0 -> 3392 bytes .../AppIcon.appiconset/fba_app_icon_32.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/fba_app_icon_512.png | Bin 0 -> 6636 bytes .../AppIcon.appiconset/fba_app_icon_64.png | Bin 0 -> 1312 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 15 +- .../macos/Runner/Configs/AppInfo.xcconfig | 4 +- .../macos/Runner/DebugProfile.entitlements | 10 +- .../macos/Runner/Release.entitlements | 12 + .../macos/Runner/RunnerDebug.entitlements | 24 + friendica_archive_browser/pubspec.lock | 383 ++++++++++++- friendica_archive_browser/pubspec.yaml | 24 +- .../test/additional_key_logger_test.dart | 72 +++ .../test/facebook_archive_reader_test.dart | 81 +++ .../test/facebook_reader_test.dart | 55 ++ .../test/time_stat_generator_test.dart | 167 ++++++ friendica_archive_browser/test/unit_test.dart | 15 - .../test/widget_test.dart | 31 -- .../test/word_map_generator_test.dart | 54 ++ .../test_assets/mangled.txt | 3 + .../comments_and_reactions/comments.json | 73 +++ .../events/event_invitations.json | 19 + .../events/your_event_responses.json | 40 ++ .../events/your_events.json | 33 ++ .../friend_requests_received.json | 12 + .../friend_requests_sent.json | 12 + .../friends_and_followers/friends.json | 17 + .../rejected_friend_requests.json | 16 + .../removed_friends.json | 16 + .../OWRkZTNlNjJhNmU4ODZjMDg0MGY3NjEy.jpg | Bin 0 -> 71584 bytes .../user1anduser2_dqxmmnhy/message_1.json | 63 +++ .../test_facebook_archive/posts/album/0.json | 21 + .../YzFiMzZmODdkOWNkNGI2YmQ1Zjg5NDI5.jpg | Bin 0 -> 23919 bytes .../OWRkMmRiMTVkOWU4ZGVhNGEzN2RiMDFk.jpg | Bin 0 -> 201323 bytes .../YjVkNjhiY2NiMjBjNzIwNDJhOTMyMTQx.jpg | Bin 0 -> 12619 bytes .../NWJlY2M0NWM5ZmUwZmI0NWM5ZjY4MDYx.mp4 | Bin 0 -> 293354 bytes .../OWRlZTdkNjgwZjI0MzExNjFjMmU2YTBj.jpg | Bin 0 -> 71584 bytes .../ZDkxMjdlMzk4Y2FmMDQzYTU5NDdiMmUw.jpg | Bin 0 -> 71584 bytes .../your_posts/emptyalbum.png | Bin 0 -> 1870 bytes .../posts/your_posts_1.json | 147 +++++ .../posts/your_videos.json | 36 ++ .../saved_items_and_collections.json | 75 +++ .../windows/CMakeLists.txt | 2 +- .../windows/flutter/CMakeLists.txt | 2 +- .../flutter/generated_plugin_registrant.cc | 6 + .../windows/flutter/generated_plugins.cmake | 2 + .../windows/runner/CMakeLists.txt | 2 +- .../windows/runner/Runner.rc | 14 +- .../windows/runner/main.cpp | 4 +- .../windows/runner/resources/fba_app_icon.ico | Bin 0 -> 165194 bytes 139 files changed, 10023 insertions(+), 334 deletions(-) create mode 100644 LICENSE create mode 100644 friendica_archive_browser/CHANGELOG.md create mode 100644 friendica_archive_browser/lib/src/components/barchart_panel.dart create mode 100644 friendica_archive_browser/lib/src/components/heatmap/heatmap_component.dart create mode 100644 friendica_archive_browser/lib/src/components/heatmap/heatmap_tile.dart create mode 100644 friendica_archive_browser/lib/src/components/heatmap/tile_color_map.dart create mode 100644 friendica_archive_browser/lib/src/components/heatmap_widget.dart create mode 100644 friendica_archive_browser/lib/src/components/timechart_widget.dart create mode 100644 friendica_archive_browser/lib/src/components/word_frequency_widget.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/comment_card.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/conversation_message_card.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/event_card.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/facebook_conversation_history_component.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/facebook_link_elements_component.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/facebook_media_timeline_component.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/facebook_media_wrapper_component.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/filter_control_component.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/geo/geo_extensions.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/geo/map_bounds.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/geo/marker_data.dart create mode 100644 friendica_archive_browser/lib/src/friendica/components/post_card.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/facebook_album.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/facebook_comment.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/facebook_event.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/facebook_friend.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/facebook_location_data.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/facebook_media_attachment.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/facebook_messenger_conversation.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/facebook_messenger_message.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/facebook_post.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/facebook_saved_item.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/facebook_timeline_type.dart create mode 100644 friendica_archive_browser/lib/src/friendica/models/model_utils.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_comments_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_conversations_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_events_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_friends_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_geospatial_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_media_slideshow_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_photo_album_browser_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_photo_album_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_posts_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_saved_items_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_stats_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/screens/facebook_videos_screen.dart create mode 100644 friendica_archive_browser/lib/src/friendica/services/facebook_archive_reader.dart create mode 100644 friendica_archive_browser/lib/src/friendica/services/facebook_archive_service.dart create mode 100644 friendica_archive_browser/lib/src/friendica/services/facebook_file_reader.dart create mode 100644 friendica_archive_browser/lib/src/friendica/services/path_mapping_service.dart create mode 100644 friendica_archive_browser/lib/src/home.dart create mode 100644 friendica_archive_browser/lib/src/models/stat_bin.dart create mode 100644 friendica_archive_browser/lib/src/models/time_element.dart delete mode 100644 friendica_archive_browser/lib/src/sample_feature/sample_item.dart delete mode 100644 friendica_archive_browser/lib/src/sample_feature/sample_item_details_view.dart delete mode 100644 friendica_archive_browser/lib/src/sample_feature/sample_item_list_view.dart create mode 100644 friendica_archive_browser/lib/src/screens/error_screen.dart create mode 100644 friendica_archive_browser/lib/src/screens/loading_status_screen.dart create mode 100644 friendica_archive_browser/lib/src/screens/standin_status_screen.dart create mode 100644 friendica_archive_browser/lib/src/settings/video_player_settings.dart create mode 100644 friendica_archive_browser/lib/src/themes.dart create mode 100644 friendica_archive_browser/lib/src/utils/clipboard_helper.dart create mode 100644 friendica_archive_browser/lib/src/utils/exec_error.dart create mode 100644 friendica_archive_browser/lib/src/utils/scrolling_behavior.dart create mode 100644 friendica_archive_browser/lib/src/utils/snackbar_status_builder.dart create mode 100644 friendica_archive_browser/lib/src/utils/temp_file_builder.dart create mode 100644 friendica_archive_browser/lib/src/utils/time_stat_generator.dart create mode 100644 friendica_archive_browser/lib/src/utils/word_map_generator.dart create mode 100644 friendica_archive_browser/macos/Podfile create mode 100644 friendica_archive_browser/macos/Podfile.lock create mode 100644 friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_128.png create mode 100644 friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_16.png create mode 100644 friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_256.png create mode 100644 friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_32.png create mode 100644 friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_512.png create mode 100644 friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_64.png create mode 100644 friendica_archive_browser/macos/Runner/RunnerDebug.entitlements create mode 100644 friendica_archive_browser/test/additional_key_logger_test.dart create mode 100644 friendica_archive_browser/test/facebook_archive_reader_test.dart create mode 100644 friendica_archive_browser/test/facebook_reader_test.dart create mode 100644 friendica_archive_browser/test/time_stat_generator_test.dart delete mode 100644 friendica_archive_browser/test/unit_test.dart delete mode 100644 friendica_archive_browser/test/widget_test.dart create mode 100644 friendica_archive_browser/test/word_map_generator_test.dart create mode 100644 friendica_archive_browser/test_assets/mangled.txt create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/comments_and_reactions/comments.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/events/event_invitations.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/events/your_event_responses.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/events/your_events.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friend_requests_received.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friend_requests_sent.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friends.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/rejected_friend_requests.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/removed_friends.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/messages/inbox/User1andUser2_DQxMmNhY/photos/OWRkZTNlNjJhNmU4ODZjMDg0MGY3NjEy.jpg create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/messages/inbox/user1anduser2_dqxmmnhy/message_1.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/posts/album/0.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/posts/photos_and_videos/Album1_OGFiZDdkOG/YzFiMzZmODdkOWNkNGI2YmQ1Zjg5NDI5.jpg create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/posts/photos_and_videos/TimelinePhotos_NzMwNzNlYzI0YT/OWRkMmRiMTVkOWU4ZGVhNGEzN2RiMDFk.jpg create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/posts/photos_and_videos/thumbnails/YjVkNjhiY2NiMjBjNzIwNDJhOTMyMTQx.jpg create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/posts/photos_and_videos/videos/NWJlY2M0NWM5ZmUwZmI0NWM5ZjY4MDYx.mp4 create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/posts/photos_and_videos/your_posts/OWRlZTdkNjgwZjI0MzExNjFjMmU2YTBj.jpg create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/posts/photos_and_videos/your_posts/ZDkxMjdlMzk4Y2FmMDQzYTU5NDdiMmUw.jpg create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/posts/photos_and_videos/your_posts/emptyalbum.png create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/posts/your_posts_1.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/posts/your_videos.json create mode 100755 friendica_archive_browser/test_assets/test_facebook_archive/saved_items_and_collections/saved_items_and_collections.json create mode 100644 friendica_archive_browser/windows/runner/resources/fba_app_icon.ico diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a612ad9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/friendica_archive_browser/.metadata b/friendica_archive_browser/.metadata index fd70cab..cb12308 100644 --- a/friendica_archive_browser/.metadata +++ b/friendica_archive_browser/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: 77d935af4db863f6abd0b9c31c7e6df2a13de57b + revision: 3595343e20a61ff16d14e8ecc25f364276bb1b8b channel: stable project_type: app diff --git a/friendica_archive_browser/CHANGELOG.md b/friendica_archive_browser/CHANGELOG.md new file mode 100644 index 0000000..3c1ef75 --- /dev/null +++ b/friendica_archive_browser/CHANGELOG.md @@ -0,0 +1,33 @@ +# Kyanite Changelog + +## Version 0.1.2 (2021-12-07) +### New Features +* Make Photo Details an image carousel on posts/albums with multiple images +* Let users navigate photo details carousel with arrow keys and go back to former screen with escape-key +* Added a "copy" button on posts, comments, conversations that copies all the textual data to the clipboard +* Adds a map view for posts/photos that have latitude/longitude data + +### Bug Fixes +* Fixes memory leak with images and posts +* Fixes error where default video player was set to empty string on initial startup +* Fix capitalization inconsistencies on buttons + +### Changes +* Change log file textbox on settings panel to be single line and overflow with ellipses + + +## Version 0.1.1 (2021-11-17) + +### Bug Fixes +* Add support for update Facebook archive format (versus original one from a year ago) + +## Version 0.1.0 (2021-11-14) ** [Initial Release] ** +### New Features +* Posts Browsing/filtering (including media and links) +* Comments Browsing/filtering (including media and links) +* Photo Albums Browsing/filtering (and photos attached to posts and comments) +* Video Album Browsing/filtering (and videos attached to posts and comments) +* Facebook Messenger Conversation Browsing/filtering (with media and links) +* Events Browsing/filtering +* Friends list and history browsing +* Ability to export photos from posts/comments/albums/etc. diff --git a/friendica_archive_browser/README.md b/friendica_archive_browser/README.md index 16e79e5..a19eeb1 100644 --- a/friendica_archive_browser/README.md +++ b/friendica_archive_browser/README.md @@ -1,30 +1,37 @@ -# friendica_archive_browser +# A Friendica Archive Viewer -A new Flutter project. +A Flutter-based cross platform desktop +application for viewing the Friendica account archive that a user can +generate with the command line tool in this same project -## Getting Started +## Installation -This project is a starting point for a Flutter application that follows the -[simple app state management -tutorial](https://flutter.dev/docs/development/data-and-backend/state-mgmt/simple). +To install Kyanite you simply have to download the latest release from +[the project release directory](https://gitlab.com/HankG/mysocialportal/-/releases) +for your given platform. Then unzip the folder and you are ready to run. On Mac +and Windows you will get a warning about an "unknown publisher" since this is beta +software that is not installed or signed through the respective app stores. App store +versions will come in the near future. -For help getting started with Flutter, view our -[online documentation](https://flutter.dev/docs), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +## Building +In order to build this application you will need to have installed [Flutter](https://flutter.dev). +Installation instructions for various platforms are [here](https://flutter.dev/docs/get-started/install). +Once you have that installed it is as easy as navigating to the respective directory on the command +line and executing: -## Assets +On Linux: +```bash +flutter run -d linux +``` -The `assets` directory houses images, fonts, and any other files you want to -include with your application. +On Mac: +```bash +flutter run -d macos +``` -The `assets/images` directory contains [resolution-aware -images](https://flutter.dev/docs/development/ui/assets-and-images#resolution-aware). +On Windows: +```bash +flutter run -d windows +``` -## Localization - -This project generates localized messages based on arb files found in -the `lib/src/localization` directory. - -To support additional languages, please visit the tutorial on -[Internationalizing Flutter -apps](https://flutter.dev/docs/development/accessibility-and-localization/internationalization) +Please report any bugs or feature requests [with our issue tracker](https://gitlab.com/HankG/mysocialportal/-/issues). diff --git a/friendica_archive_browser/lib/main.dart b/friendica_archive_browser/lib/main.dart index eb568f2..408ca0e 100644 --- a/friendica_archive_browser/lib/main.dart +++ b/friendica_archive_browser/lib/main.dart @@ -1,20 +1,33 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/utils/temp_file_builder.dart'; +import 'package:logging/logging.dart'; import 'src/app.dart'; import 'src/settings/settings_controller.dart'; -import 'src/settings/settings_service.dart'; void main() async { - // Set up the SettingsController, which will glue user settings to multiple - // Flutter Widgets. - final settingsController = SettingsController(SettingsService()); - - // Load the user's preferred theme while the splash screen is displayed. - // This prevents a sudden theme change when the app is first displayed. + WidgetsFlutterBinding.ensureInitialized(); + final logPath = await setupLogging(); + Logger.root.info('Starting Facebook Archive Viewer'); + final settingsController = SettingsController(logPath: logPath); await settingsController.loadSettings(); - - // Run the app and pass in the SettingsController. The app listens to the - // SettingsController for changes, then passes it further down to the - // SettingsView. - runApp(MyApp(settingsController: settingsController)); + runApp(FriendicaArchiveBrowser(settingsController: settingsController)); +} + +Future setupLogging() async { + final logFilePath = await getTempFile('friendica_archive_browser_', '.log'); + final logFile = File(logFilePath); + Logger.root.level = Level.ALL; + Logger.root.onRecord.listen((event) { + final logName = event.loggerName.isEmpty ? 'ROOT' : event.loggerName; + final msg = + '${event.level.name} - $logName @ ${event.time}: ${event.message}\n'; + final handle = logFile.openSync(mode: FileMode.append); + handle.writeStringSync(msg); + handle.closeSync(); + }); + + return logFilePath; } diff --git a/friendica_archive_browser/lib/src/app.dart b/friendica_archive_browser/lib/src/app.dart index 504429e..7b0b2ee 100644 --- a/friendica_archive_browser/lib/src/app.dart +++ b/friendica_archive_browser/lib/src/app.dart @@ -1,15 +1,21 @@ +import 'package:desktop_window/desktop_window.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:friendica_archive_browser/src/themes.dart'; +import 'package:friendica_archive_browser/src/utils/scrolling_behavior.dart'; +import 'package:provider/provider.dart'; -import 'sample_feature/sample_item_details_view.dart'; -import 'sample_feature/sample_item_list_view.dart'; +import 'friendica/services/facebook_archive_service.dart'; +import 'friendica/services/path_mapping_service.dart'; +import 'home.dart'; import 'settings/settings_controller.dart'; -import 'settings/settings_view.dart'; /// The Widget that configures your application. -class MyApp extends StatelessWidget { - const MyApp({ +class FriendicaArchiveBrowser extends StatelessWidget { + static const minAppSize = Size(915, 700); + + const FriendicaArchiveBrowser({ Key? key, required this.settingsController, }) : super(key: key); @@ -18,23 +24,20 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - // Glue the SettingsController to the MaterialApp. - // - // The AnimatedBuilder Widget listens to the SettingsController for changes. - // Whenever the user updates their settings, the MaterialApp is rebuilt. + DesktopWindow.setMinWindowSize(minAppSize); + final pathMappingService = PathMappingService(settingsController); + final archiveService = FacebookArchiveDataService( + pathMappingService: pathMappingService, + appDataDirectory: settingsController.appDataDirectory.path); + settingsController.addListener(() { + archiveService.clearCaches(); + pathMappingService.refresh(); + }); return AnimatedBuilder( animation: settingsController, builder: (BuildContext context, Widget? child) { return MaterialApp( - // Providing a restorationScopeId allows the Navigator built by the - // MaterialApp to restore the navigation stack when a user leaves and - // returns to the app after it has been killed while running in the - // background. restorationScopeId: 'app', - - // Provide the generated AppLocalizations to the MaterialApp. This - // allows descendant Widgets to display the correct translations - // depending on the user's locale. localizationsDelegates: const [ AppLocalizations.delegate, GlobalMaterialLocalizations.delegate, @@ -44,40 +47,20 @@ class MyApp extends StatelessWidget { supportedLocales: const [ Locale('en', ''), // English, no country code ], - - // Use AppLocalizations to configure the correct application title - // depending on the user's locale. - // - // The appTitle is defined in .arb files found in the localization - // directory. onGenerateTitle: (BuildContext context) => AppLocalizations.of(context)!.appTitle, - - // Define a light and dark color theme. Then, read the user's - // preferred ThemeMode (light, dark, or system default) from the - // SettingsController to display the correct theme. - theme: ThemeData(), - darkTheme: ThemeData.dark(), + theme: FriendicaArchiveBrowserTheme.light, + darkTheme: FriendicaArchiveBrowserTheme.dark, themeMode: settingsController.themeMode, - - // Define a function to handle named routes in order to support - // Flutter web url navigation and deep linking. - onGenerateRoute: (RouteSettings routeSettings) { - return MaterialPageRoute( - settings: routeSettings, - builder: (BuildContext context) { - switch (routeSettings.name) { - case SettingsView.routeName: - return SettingsView(controller: settingsController); - case SampleItemDetailsView.routeName: - return const SampleItemDetailsView(); - case SampleItemListView.routeName: - default: - return const SampleItemListView(); - } - }, - ); - }, + scrollBehavior: FacebookAppScrollingBehavior(), + home: MultiProvider( + providers: [ + ChangeNotifierProvider(create: (context) => settingsController), + ChangeNotifierProvider(create: (context) => archiveService), + Provider(create: (context) => pathMappingService), + ], + child: Home(settingsController: settingsController), + ), ); }, ); diff --git a/friendica_archive_browser/lib/src/components/barchart_panel.dart b/friendica_archive_browser/lib/src/components/barchart_panel.dart new file mode 100644 index 0000000..6bb0a36 --- /dev/null +++ b/friendica_archive_browser/lib/src/components/barchart_panel.dart @@ -0,0 +1,42 @@ +import 'package:charts_flutter/flutter.dart' as charts; +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/models/stat_bin.dart'; +import 'package:logging/logging.dart'; + +class BarChartComponent extends StatelessWidget { + static final _logger = Logger('$BarChartComponent'); + final List stats; + final String Function(int index) xLabelMaker; + + const BarChartComponent( + {Key? key, required this.stats, required this.xLabelMaker}) + : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.fine("Build BarChartComponent"); + final graphItems = charts.Series( + id: 'Stats', + domainFn: (bin, _) => xLabelMaker(bin.index), + measureFn: (bin, _) => bin.count, + data: stats, + labelAccessorFn: (bin, _) => bin.count.toString(), + ); + + return AspectRatio( + aspectRatio: 2, + child: Card( + elevation: 4, + shape: + RoundedRectangleBorder(borderRadius: BorderRadius.circular(6)), + color: Colors.white, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: charts.BarChart( + [graphItems], + animate: false, + barRendererDecorator: charts.BarLabelDecorator(), + domainAxis: const charts.OrdinalAxisSpec(), + )))); + } +} diff --git a/friendica_archive_browser/lib/src/components/heatmap/heatmap_component.dart b/friendica_archive_browser/lib/src/components/heatmap/heatmap_component.dart new file mode 100644 index 0000000..54a5c99 --- /dev/null +++ b/friendica_archive_browser/lib/src/components/heatmap/heatmap_component.dart @@ -0,0 +1,223 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/components/heatmap/heatmap_tile.dart'; +import 'package:friendica_archive_browser/src/components/heatmap/tile_color_map.dart'; +import 'package:friendica_archive_browser/src/models/stat_bin.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/time_stat_generator.dart'; +import 'package:provider/provider.dart'; + +class HeatMapComponent extends StatelessWidget { + static const gridStart = 40; + static final colorMapData = { + 1: Colors.green[100]!, + 5: Colors.green[300]!, + 10: Colors.green[500]!, + 20: Colors.green[700]! + }; + + final int year; + final List stats; + + const HeatMapComponent({Key? key, required this.year, required this.stats}) + : super(key: key); + + @override + Widget build(BuildContext context) { + final formatter = Provider.of(context).dateFormatter; + final zeroColor = Theme.of(context).cardColor; + final colorMap = TileColorMap(colorMapData, zeroValue: zeroColor); + + final statsByDay = {}; + for (final stat in stats) { + statsByDay[stat.binEpoch] = stat.count; + } + + final firstDayOfCalendar = _firstHeatMapDay(); + final weeks = List.generate( + 53, + (index) => + firstDayOfCalendar.add(Duration(days: 7 * index)).toDayOnly()) + .where((date) => date.year <= year) + .toList(); + final weekColumns = weeks + .map((week) => Column( + children: List.generate(7, (day) { + final currentDate = week.add(Duration(days: day)); + final value = statsByDay[currentDate] ?? 0; + if (currentDate.year != year) { + return HeatMapTile.blankTile(formatter.format(currentDate)); + } + return HeatMapTile( + formatter.format(currentDate), value, colorMap); + }))) + .toList(); + + final dayofWeekColumn = _buildDayOfWeekLabels(context); + + final monthsOfYearRow = SizedBox( + height: 20, + width: 800, + child: Stack( + children: _buildMonthLabels(weeks), + )); + + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + monthsOfYearRow, + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [dayofWeekColumn, ...weekColumns], + ), + _buildLegendWidget(context, colorMap), + ], + ); + } + + Widget _buildLegendWidget(BuildContext context, TileColorMap colorMap) { + final legend = [ + Row( + children: const [ + Text( + 'Legend', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ], + ), + const SizedBox( + height: 10, + ), + Row( + children: [ + HeatMapTile('hovered tile', 1, colorMap), + const SizedBox(width: 5), + const Text('1 to 5'), + ], + ), + Row( + children: [ + HeatMapTile('hovered tile', 5, colorMap), + const SizedBox(width: 5), + const Text('6 to 10'), + ], + ), + Row( + children: [ + HeatMapTile('hovered tile', 10, colorMap), + const SizedBox(width: 5), + const Text('11 to 19'), + ], + ), + Row( + children: [ + HeatMapTile('hovered tile', 20, colorMap), + const SizedBox(width: 5), + const Text('20 and above'), + ], + ), + ]; + return Padding( + padding: const EdgeInsets.all(8.0), + child: Card( + child: SizedBox( + width: 200, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: legend, + ), + ), + ), + ), + ); + } + + Widget _buildDayOfWeekLabels(BuildContext context) { + return SizedBox( + height: 7 * HeatMapTile.totalHeight, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: const [ + Text( + 'Mon', + style: TextStyle(fontSize: HeatMapTile.height), + ), + Text( + 'Wed', + style: TextStyle(fontSize: HeatMapTile.height), + ), + Text( + 'Sun', + style: TextStyle(fontSize: HeatMapTile.height), + ), + ], + )); + } + + List _buildMonthLabels(List weeks) { + final monthStartColumn = List.generate(12, (index) => -1); + for (var i = 0; i < weeks.length; i++) { + final week = weeks[i]; + final startMonth = week.month - 1; + final endMonth = week.add(const Duration(days: 7)).month - 1; + if (startMonth == 11 && endMonth == 0) { + monthStartColumn[0] = 0; + continue; + } + + if (monthStartColumn[startMonth] < 0) { + monthStartColumn[startMonth] = i; + } + + if (monthStartColumn[endMonth] < 0) { + monthStartColumn[endMonth] = i; + } + } + + final monthLabels = []; + for (var i = 0; i < monthStartColumn.length; i++) { + late String text; + if (i == 0) { + text = 'Jan'; + } else if (i == 1) { + text = 'Feb'; + } else if (i == 2) { + text = 'Mar'; + } else if (i == 3) { + text = 'Apr'; + } else if (i == 4) { + text = 'May'; + } else if (i == 5) { + text = 'Jun'; + } else if (i == 6) { + text = 'Jul'; + } else if (i == 7) { + text = 'Aug'; + } else if (i == 8) { + text = 'Sep'; + } else if (i == 9) { + text = 'Oct'; + } else if (i == 10) { + text = 'Nov'; + } else { + text = 'Dec'; + } + final label = Positioned( + left: gridStart + monthStartColumn[i] * HeatMapTile.totalWidth, + child: Text(text)); + monthLabels.add(label); + } + + return monthLabels; + } + + DateTime _firstHeatMapDay() { + final firstDayOfYear = DateTime(year).weekday; + final daysIntoPreviousCalendar = firstDayOfYear - 1; + return DateTime(year).subtract(Duration(days: daysIntoPreviousCalendar)); + } +} diff --git a/friendica_archive_browser/lib/src/components/heatmap/heatmap_tile.dart b/friendica_archive_browser/lib/src/components/heatmap/heatmap_tile.dart new file mode 100644 index 0000000..5084fee --- /dev/null +++ b/friendica_archive_browser/lib/src/components/heatmap/heatmap_tile.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/components/heatmap/tile_color_map.dart'; + +class HeatMapTile extends StatelessWidget { + static const width = 12.0; + static const height = 12.0; + static const margin = 1.0; + final String dateString; + final int value; + final TileColorMap colorMap; + + static double get totalHeight => height + (margin * 2); + + static double get totalWidth => width + (margin * 2); + + const HeatMapTile(this.dateString, this.value, this.colorMap, {Key? key}) + : super(key: key); + + @override + Widget build(BuildContext context) { + final colorResult = colorMap.getColor(value); + return colorResult.fold( + onSuccess: (color) => Tooltip( + message: '$value on $dateString', + child: Card( + margin: const EdgeInsets.all(margin), + color: color, + child: const SizedBox(width: width, height: width))), + onError: (error) => Tooltip( + message: dateString, + child: const Padding( + padding: EdgeInsets.all(margin), + child: SizedBox(width: width, height: height), + ))); + } + + HeatMapTile.blankTile(this.dateString, {Key? key}) + : value = 0, + colorMap = TileColorMap({}), + super(key: key); +} diff --git a/friendica_archive_browser/lib/src/components/heatmap/tile_color_map.dart b/friendica_archive_browser/lib/src/components/heatmap/tile_color_map.dart new file mode 100644 index 0000000..b1902c9 --- /dev/null +++ b/friendica_archive_browser/lib/src/components/heatmap/tile_color_map.dart @@ -0,0 +1,30 @@ +import 'dart:ui'; + +import 'package:result_monad/result_monad.dart'; + +class TileColorMap { + final Map thresholds; + final Color? zeroValue; + final thresholdValues = []; + + TileColorMap(this.thresholds, {this.zeroValue}) { + thresholdValues.addAll(thresholds.keys); + thresholdValues.sort(); + } + + Result getColor(int value) { + if (thresholdValues.isEmpty) { + return Result.error(0); + } + + if (zeroValue != null && value == 0) { + return Result.ok(zeroValue!); + } + + int thresholdIndex = thresholdValues + .where((element) => element <= value) + .lastWhere((element) => element <= value, + orElse: () => thresholdValues.first); + return Result.ok(thresholds[thresholdIndex]!); + } +} diff --git a/friendica_archive_browser/lib/src/components/heatmap_widget.dart b/friendica_archive_browser/lib/src/components/heatmap_widget.dart new file mode 100644 index 0000000..0f450dd --- /dev/null +++ b/friendica_archive_browser/lib/src/components/heatmap_widget.dart @@ -0,0 +1,74 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/models/time_element.dart'; +import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; +import 'package:friendica_archive_browser/src/utils/time_stat_generator.dart'; + +import 'heatmap/heatmap_component.dart'; + +class HeatMapWidget extends StatefulWidget { + final List timeElements; + + const HeatMapWidget({Key? key, required this.timeElements}) : super(key: key); + + @override + State createState() => _HeatMapWidgetState(); +} + +class _HeatMapWidgetState extends State { + int year = 2024; + final years = []; + + @override + void initState() { + years.clear(); + final newYears = widget.timeElements.map((e) => e.timestamp.year).toSet(); + if (newYears.isEmpty) { + years.add(DateTime.now().year); + } + years.addAll(newYears); + years.sort(); + year = years.last; + super.initState(); + } + + @override + Widget build(BuildContext context) { + if (widget.timeElements.isEmpty) { + return const StandInStatusScreen(title: 'No items for heat map'); + } + + final statBins = TimeStatGenerator(widget.timeElements + .where((element) => element.timestamp.year == year)) + .calculateDailyStats(); + + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + 'Heat Map for $year', + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline6, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + const Text('Year:'), + const SizedBox(width: 5), + DropdownButton( + value: year, + items: years + .map((y) => DropdownMenuItem(value: y, child: Text('$y'))) + .toList(), + onChanged: (newYear) => setState(() { + year = newYear!; + })), + ], + ), + HeatMapComponent(year: year, stats: statBins), + ], + ), + ); + } +} diff --git a/friendica_archive_browser/lib/src/components/timechart_widget.dart b/friendica_archive_browser/lib/src/components/timechart_widget.dart new file mode 100644 index 0000000..fe61f7b --- /dev/null +++ b/friendica_archive_browser/lib/src/components/timechart_widget.dart @@ -0,0 +1,161 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/components/barchart_panel.dart'; +import 'package:friendica_archive_browser/src/models/stat_bin.dart'; +import 'package:friendica_archive_browser/src/models/time_element.dart'; +import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; +import 'package:friendica_archive_browser/src/utils/time_stat_generator.dart'; +import 'package:logging/logging.dart'; + +class TimeChartWidget extends StatefulWidget { + final List timeElements; + + const TimeChartWidget({Key? key, required this.timeElements}) + : super(key: key); + + @override + State createState() => _TimeChartWidgetState(); +} + +class _TimeChartWidgetState extends State { + static final _logger = Logger('$_TimeChartWidgetState'); + _TimeType _timeType = _TimeType.year; + + @override + Widget build(BuildContext context) { + _logger.fine('Build TimeChartWidget'); + if (widget.timeElements.isEmpty) { + return const StandInStatusScreen(title: 'No items for statistics'); + } + + final statBins = []; + final generator = TimeStatGenerator(widget.timeElements); + late final String Function(int index) xAxisStringFunction; + + switch (_timeType) { + case _TimeType.day: + xAxisStringFunction = (index) => _dayStringFromIndex(index); + statBins.addAll(generator.calculateByDayOfWeekStats()); + break; + case _TimeType.month: + xAxisStringFunction = (index) => _monthStringFromIndex(index); + statBins.addAll(generator.calculateByMonthStats()); + break; + case _TimeType.year: + statBins.addAll(generator.calculateStatsByYear()); + xAxisStringFunction = (int index) => index.toString(); + break; + } + + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + '${_timeType.toAdjectiveName()} Statistics', + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline6, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + const Text('Date Grouping Type:'), + const SizedBox(width: 5), + DropdownButton<_TimeType>( + value: _timeType, + items: _TimeType.values + .map((e) => + DropdownMenuItem(value: e, child: Text(e.toName()))) + .toList(), + onChanged: (timeType) => setState(() { + _timeType = timeType!; + })), + ], + ), + BarChartComponent(stats: statBins, xLabelMaker: xAxisStringFunction) + ], + ), + ); + } + + String _dayStringFromIndex(int index) { + switch (index) { + case 1: + return 'Monday'; + case 2: + return 'Tuesday'; + case 3: + return 'Wednesday'; + case 4: + return 'Thursday'; + case 5: + return 'Friday'; + case 6: + return 'Saturday'; + case 7: + return 'Sunday'; + default: + _logger.severe(['Invalid date index: $index', 'index']); + return '$index'; + } + } + + String _monthStringFromIndex(int index) { + switch (index) { + case 1: + return 'January'; + case 2: + return 'February'; + case 3: + return 'March'; + case 4: + return 'April'; + case 5: + return 'May'; + case 6: + return 'June'; + case 7: + return 'July'; + case 8: + return 'August'; + case 9: + return 'September'; + case 10: + return 'October'; + case 11: + return 'November'; + case 12: + return 'December'; + default: + _logger.severe(['Invalid date index: $index', 'index']); + return '$index'; + } + } +} + +enum _TimeType { day, month, year } + +extension _TimeTypeStringUtils on _TimeType { + String toAdjectiveName() { + switch (this) { + case _TimeType.day: + return 'Daily'; + case _TimeType.month: + return 'Monthly'; + case _TimeType.year: + return 'Yearly'; + } + } + + String toName() { + switch (this) { + case _TimeType.day: + return 'Day'; + case _TimeType.month: + return 'Month'; + case _TimeType.year: + return 'Year'; + } + } +} diff --git a/friendica_archive_browser/lib/src/components/word_frequency_widget.dart b/friendica_archive_browser/lib/src/components/word_frequency_widget.dart new file mode 100644 index 0000000..95df3b0 --- /dev/null +++ b/friendica_archive_browser/lib/src/components/word_frequency_widget.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/models/time_element.dart'; +import 'package:friendica_archive_browser/src/utils/word_map_generator.dart'; +import 'package:logging/logging.dart'; + +class WordFrequencyWidget extends StatefulWidget { + final List elements; + + const WordFrequencyWidget(this.elements, {Key? key}) : super(key: key); + + @override + State createState() => _WordFrequencyWidgetState(); +} + +class _WordFrequencyWidgetState extends State { + static final _logger = Logger('$WordFrequencyWidget'); + int _currentThreshold = 10; + final _thresholds = [10, 20, 50, 100]; + final topElements = []; + final generator = WordMapGenerator.withCommonWordsFilter(minimumWordSize: 3); + + @override + void initState() { + super.initState(); + } + + // TODO: Put in Isolate if jank goes for too long in practice + void _generateWordMap() { + _logger.finer('Filling list'); + generator.clear(); + for (final item in widget.elements) { + generator.processEntry(item.text); + } + _logger.finer('List filled'); + _calcTopList(false); + } + + Future _calcTopList(bool updateState) async { + final newTopElements = generator.getTopList(_currentThreshold); + topElements.clear(); + topElements.addAll(newTopElements); + if (updateState) { + setState(() {}); + } + + _logger.finer('List filled with ${topElements.length} elements'); + } + + @override + Widget build(BuildContext context) { + _logger.fine('Rebuilding WordFrequencyWidget'); + _generateWordMap(); + + _logger.finer('Top elements count: ${topElements.length}'); + final rowElements = []; + + for (var i = 0; i < topElements.length; i++) { + final element = topElements[i]; + final background = i % 2 == 0 ? null : Theme.of(context).dividerColor; + final row = Container( + color: background, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [Text(element.word), Text('${element.count}')], + )); + rowElements.add(row); + } + + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + Text( + 'Top', + textAlign: TextAlign.left, + style: Theme.of(context).textTheme.headline6, + ), + Padding( + padding: const EdgeInsets.only(left: 5.0, right: 5.0), + child: DropdownButton( + value: _currentThreshold, + items: _thresholds + .map((t) => + DropdownMenuItem(value: t, child: Text('$t'))) + .toList(), + onChanged: (newValue) async { + _currentThreshold = newValue ?? _thresholds.first; + _calcTopList(true); + }), + ), + Text( + 'Words', + textAlign: TextAlign.right, + style: Theme.of(context).textTheme.headline6, + ), + ], + ), + const SizedBox(height: 10.0), + SizedBox( + width: 200, + child: Column( + children: rowElements, + ), + ), + ], + ), + ); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/components/comment_card.dart b/friendica_archive_browser/lib/src/friendica/components/comment_card.dart new file mode 100644 index 0000000..8b5cea7 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/comment_card.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_comment.dart'; +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/clipboard_helper.dart'; +import 'package:provider/provider.dart'; + +import 'facebook_link_elements_component.dart'; +import 'facebook_media_timeline_component.dart'; + +class CommentCard extends StatelessWidget { + final FacebookComment comment; + + const CommentCard({Key? key, required this.comment}) : super(key: key); + + @override + Widget build(BuildContext context) { + if (Scrollable.recommendDeferredLoadingForContext(context)) { + return const SizedBox(); + } + + const double spacingHeight = 5.0; + final formatter = context.read().dateTimeFormatter; + final title = comment.title.isEmpty ? 'Comment' : comment.title; + final mapper = Provider.of(context); + final dateStamp = ' At ' + + formatter.format(DateTime.fromMillisecondsSinceEpoch( + comment.creationTimestamp * 1000) + .toLocal()); + + return Padding( + padding: const EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Wrap( + direction: Axis.horizontal, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + title, + style: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + Text(dateStamp, + style: const TextStyle( + fontStyle: FontStyle.italic, + )), + Tooltip( + message: 'Copy text version of comment to clipboard', + child: IconButton( + onPressed: () async => await copyToClipboard( + context: context, + text: comment.toHumanString(mapper, formatter), + snackbarMessage: 'Copied Comment to clipboard'), + icon: const Icon(Icons.copy)), + ), + ]), + if (comment.comment.isNotEmpty) ...[ + const SizedBox(height: spacingHeight), + Text(comment.comment) + ], + if (comment.links.isNotEmpty) ...[ + const SizedBox(height: spacingHeight), + FacebookLinkElementsComponent(links: comment.links) + ], + if (comment.mediaAttachments.isNotEmpty) ...[ + const SizedBox(height: spacingHeight), + FacebookMediaTimelineComponent( + mediaAttachments: comment.mediaAttachments) + ], + ], + ), + ); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/components/conversation_message_card.dart b/friendica_archive_browser/lib/src/friendica/components/conversation_message_card.dart new file mode 100644 index 0000000..b35da23 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/conversation_message_card.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_messenger_message.dart'; +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/clipboard_helper.dart'; +import 'package:provider/provider.dart'; + +import 'facebook_link_elements_component.dart'; +import 'facebook_media_timeline_component.dart'; +import 'facebook_media_wrapper_component.dart'; + +class ConversationMessageCard extends StatelessWidget { + final FacebookMessengerMessage message; + + const ConversationMessageCard({Key? key, required this.message}) + : super(key: key); + + @override + Widget build(BuildContext context) { + if (Scrollable.recommendDeferredLoadingForContext(context)) { + return const SizedBox(); + } + + const double spacingHeight = 5.0; + const double stickerSize = 64.0; + final settings = Provider.of(context); + final formatter = settings.dateTimeFormatter; + final mapper = Provider.of(context); + + return Padding( + padding: const EdgeInsets.all(8.0), + child: Tooltip( + message: formatter + .format(DateTime.fromMillisecondsSinceEpoch(message.timestampMS)), + child: Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Tooltip( + message: 'Copy text version of line to clipboard', + child: IconButton( + onPressed: () async => await copyToClipboard( + context: context, + text: message.toHumanString(mapper, formatter), + snackbarMessage: + 'Copied Messenger line to clipboard'), + icon: const Icon(Icons.copy)), + ), + Text('${message.from}: ', + style: const TextStyle(fontWeight: FontWeight.bold)), + Expanded( + child: Text( + message.message, + )), + ]), + if (message.media.isNotEmpty) ...[ + const SizedBox(height: spacingHeight), + FacebookMediaTimelineComponent(mediaAttachments: message.media) + ], + if (message.stickers.isNotEmpty) ...[ + const SizedBox(height: spacingHeight), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: message.stickers + .map((s) => FacebookMediaWrapperComponent( + mediaAttachment: s, + preferredWidth: stickerSize, + preferredHeight: stickerSize, + )) + .toList(), + ) + ], + if (message.links.isNotEmpty) ...[ + const SizedBox(height: spacingHeight), + FacebookLinkElementsComponent(links: message.links) + ], + ], + ), + ), + ); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/components/event_card.dart b/friendica_archive_browser/lib/src/friendica/components/event_card.dart new file mode 100644 index 0000000..d467f42 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/event_card.dart @@ -0,0 +1,101 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_event.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_location_data.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/clipboard_helper.dart'; +import 'package:provider/provider.dart'; + +class EventCard extends StatelessWidget { + final FacebookEvent event; + + const EventCard({Key? key, required this.event}) : super(key: key); + + @override + Widget build(BuildContext context) { + const double spacingHeight = 5.0; + final formatter = + Provider.of(context).dateTimeFormatter; + final copyButton = Tooltip( + message: 'Copy text version of event to clipboard', + child: IconButton( + onPressed: () async => await copyToClipboard( + context: context, + text: event.toHumanString(formatter), + snackbarMessage: 'Copied Event to clipboard'), + icon: const Icon(Icons.copy))); + + return Padding( + padding: const EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Wrap( + direction: Axis.horizontal, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + event.name, + style: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + copyButton, + ], + ), + if (event.description.isNotEmpty) ...[ + const SizedBox(height: spacingHeight), + Text(event.description) + ], + _buildStatusLine('You are:', _eventStatusToString(event.eventStatus)), + const SizedBox(height: spacingHeight), + _buildStatusLine( + 'Starts: ', + formatter.format(DateTime.fromMillisecondsSinceEpoch( + event.startTimestamp * 1000))), + if (event.endTimestamp != 0) ...[ + const SizedBox(height: spacingHeight), + _buildStatusLine( + 'Stops: ', + formatter.format(DateTime.fromMillisecondsSinceEpoch( + event.endTimestamp * 1000))), + ], + const SizedBox(height: spacingHeight), + if (event.location.hasData()) event.location.toWidget(spacingHeight), + ], + ), + ); + } + + Widget _buildStatusLine(String label, String status) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + const SizedBox(width: 2), + Text(status), + ], + ); + } + + String _eventStatusToString(FacebookEventStatus status) { + switch (status) { + case FacebookEventStatus.declined: + return 'Declined'; + case FacebookEventStatus.interested: + return 'Interested'; + case FacebookEventStatus.invited: + return 'Invited'; + case FacebookEventStatus.joined: + return 'Joined'; + case FacebookEventStatus.owner: + return 'Owner'; + case FacebookEventStatus.unknown: + return 'Unknown'; + } + } +} diff --git a/friendica_archive_browser/lib/src/friendica/components/facebook_conversation_history_component.dart b/friendica_archive_browser/lib/src/friendica/components/facebook_conversation_history_component.dart new file mode 100644 index 0000000..323d1bf --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/facebook_conversation_history_component.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_messenger_conversation.dart'; +import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; + +class FacebookConversationHistoryComponent extends StatefulWidget { + static final FacebookMessengerConversation noConversationSelected = + FacebookMessengerConversation.empty(); + + final FacebookMessengerConversation conversation; + + const FacebookConversationHistoryComponent( + {Key? key, required this.conversation}) + : super(key: key); + + @override + State createState() => + _FacebookConversationHistoryComponentState(); +} + +class _FacebookConversationHistoryComponentState + extends State { + @override + Widget build(BuildContext context) { + if (widget.conversation == + FacebookConversationHistoryComponent.noConversationSelected) { + return const StandInStatusScreen( + title: 'No conversation selected', + subTitle: 'Select a conversation to display here', + ); + } + + return ListView.separated( + primary: false, + restorationId: 'facebookConversationPane', + itemCount: widget.conversation.messages.length, + itemBuilder: (context, index) { + final message = widget.conversation.messages[index]; + return Text( + '${message.from}: ${message.message}', + softWrap: true, + ); + }, + separatorBuilder: (context, index) { + return const Divider( + color: Colors.black, + thickness: 0.2, + ); + }); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/components/facebook_link_elements_component.dart b/friendica_archive_browser/lib/src/friendica/components/facebook_link_elements_component.dart new file mode 100644 index 0000000..acd29e4 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/facebook_link_elements_component.dart @@ -0,0 +1,138 @@ +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'package:logging/logging.dart'; +import 'package:metadata_fetch/metadata_fetch.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class FacebookLinkElementsComponent extends StatefulWidget { + static final _logger = Logger('$FacebookLinkElementsComponent'); + final List links; + + const FacebookLinkElementsComponent({Key? key, required this.links}) + : super(key: key); + + @override + State createState() => + _FacebookLinkElementsComponentState(); +} + +class _FacebookLinkElementsComponentState + extends State { + final previewWidth = 500.0; + final previewHeight = 165.0; + static final _logger = Logger('$_FacebookLinkElementsComponentState'); + final _linkPreviewData = []; + + @override + void initState() { + super.initState(); + makeLinkPreview(); + } + + Future makeLinkPreview() async { + try { + for (final url in widget.links) { + if (!url.scheme.startsWith('http')) { + _logger.finest('Attempted to create preview from non-HTTP url: $url'); + continue; + } + // Makes a call + var response = await http.get(url); + var document = MetadataFetch.responseToDocument(response); + if (document == null) { + _logger.finest( + 'Link provided for preview did not return a viable document, may be broken: $url'); + continue; + } + + var ogData = MetadataParser.openGraph(document); + ogData.url ??= url.toString(); + _linkPreviewData.add(ogData); + } + + setState(() {}); + } catch (e) { + _logger.warning('Error getting preview for ${widget.links.first}'); + } + } + + @override + Widget build(BuildContext context) { + if (widget.links.isEmpty) { + return const SizedBox(height: 0, width: 0); + } + + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text('Links: ', style: TextStyle(fontWeight: FontWeight.bold)), + const SizedBox( + height: 5, + ), + ..._linkPreviewData.map((l) => TextButton( + onPressed: () async { + await canLaunch(l.url!) + ? await launch(l.url!) + : FacebookLinkElementsComponent._logger + .info('Failed to launch ${l.url}'); + }, + child: _buildLinkPreview(context, l))), + ], + ); + } + + Widget _buildLinkPreview(BuildContext context, Metadata previewData) { + const bufferWidth = 5.0; + const bufferHeight = 6.0; + if ((previewData.title?.isEmpty ?? true) && + (previewData.description?.isEmpty ?? true) && + (previewData.image?.isEmpty ?? true)) { + return Text(previewData.url ?? 'No Link Provided', + maxLines: 5, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontStyle: FontStyle.italic)); + } + + return Card( + child: SizedBox( + width: previewWidth, + height: previewHeight, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + Image.network(previewData.image ?? '', + width: previewHeight, + height: previewHeight, + fit: BoxFit.cover), + const SizedBox(width: bufferWidth), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(previewData.title ?? '', + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: + const TextStyle(fontWeight: FontWeight.bold)), + const SizedBox(height: bufferHeight), + Text( + previewData.url ?? '', + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: const TextStyle(fontStyle: FontStyle.italic), + ), + const SizedBox(height: bufferHeight), + Text( + previewData.description ?? '', + maxLines: 3, + overflow: TextOverflow.ellipsis, + ) + ], + ), + ), + ], + )))); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/components/facebook_media_timeline_component.dart b/friendica_archive_browser/lib/src/friendica/components/facebook_media_timeline_component.dart new file mode 100644 index 0000000..885e2d7 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/facebook_media_timeline_component.dart @@ -0,0 +1,68 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_media_attachment.dart'; +import 'package:friendica_archive_browser/src/friendica/screens/facebook_media_slideshow_screen.dart'; +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:provider/provider.dart'; + +import 'facebook_media_wrapper_component.dart'; + +class FacebookMediaTimelineComponent extends StatelessWidget { + static const double _maxHeightWidth = 400.0; + + final List mediaAttachments; + + const FacebookMediaTimelineComponent( + {Key? key, required this.mediaAttachments}) + : super(key: key); + + @override + Widget build(BuildContext context) { + if (mediaAttachments.isEmpty) { + return const SizedBox(width: 0, height: 0); + } + + final bool isSingle = mediaAttachments.length == 1; + final double singleWidth = MediaQuery.of(context).size.width / 2.0; + final double threeAcrossWidth = MediaQuery.of(context).size.width / 3.0; + final double preferredMultiWidth = min(threeAcrossWidth, _maxHeightWidth); + final pathMapper = Provider.of(context); + final settingsController = Provider.of(context); + + return Container( + constraints: const BoxConstraints( + maxHeight: _maxHeightWidth, + ), + child: ListView.separated( + // shrinkWrap: true, + // primary: true, + scrollDirection: Axis.horizontal, + itemCount: mediaAttachments.length, + itemBuilder: (context, index) { + return InkWell( + onTap: () async { + Navigator.push(context, MaterialPageRoute(builder: (context) { + return MultiProvider( + providers: [ + ChangeNotifierProvider.value(value: settingsController), + Provider.value(value: pathMapper) + ], + child: FacebookMediaSlideshowScreen( + mediaAttachments: mediaAttachments, + initialIndex: index)); + })); + }, + child: FacebookMediaWrapperComponent( + mediaAttachment: mediaAttachments[index], + preferredWidth: isSingle ? singleWidth : preferredMultiWidth, + ), + ); + }, + separatorBuilder: (context, index) { + return const SizedBox(width: 10); + }), + ); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/components/facebook_media_wrapper_component.dart b/friendica_archive_browser/lib/src/friendica/components/facebook_media_wrapper_component.dart new file mode 100644 index 0000000..eea74c7 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/facebook_media_wrapper_component.dart @@ -0,0 +1,186 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_media_attachment.dart'; +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; + +class FacebookMediaWrapperComponent extends StatelessWidget { + static final _logger = Logger('$FacebookMediaWrapperComponent'); + + static const double _noPreferredValue = -1.0; + final FacebookMediaAttachment mediaAttachment; + final double preferredWidth; + final double preferredHeight; + + const FacebookMediaWrapperComponent( + {Key? key, + required this.mediaAttachment, + this.preferredWidth = _noPreferredValue, + this.preferredHeight = _noPreferredValue}) + : super(key: key); + + @override + Widget build(BuildContext context) { + final settingsController = Provider.of(context); + final pathMapper = Provider.of(context); + final videoPlayerCommand = settingsController.videoPlayerCommand; + final path = mediaAttachment.uri.scheme.startsWith('http') + ? mediaAttachment.uri.toString() + : pathMapper.toFullPath(mediaAttachment.uri.path); + final width = + preferredWidth > 0 ? preferredWidth : MediaQuery.of(context).size.width; + final height = preferredHeight > 0 + ? preferredHeight + : MediaQuery.of(context).size.height; + + if (mediaAttachment.estimatedType() == + FacebookAttachmentMediaType.unknown) { + return Text('Unable to resolve type for ${mediaAttachment.uri.path}'); + } + + if (mediaAttachment.estimatedType() == FacebookAttachmentMediaType.video) { + final title = "Video (click to play): " + mediaAttachment.title; + final thumbnailImageResult = _uriToImage( + mediaAttachment.thumbnailUri, pathMapper, + imageTypeName: 'thumbnail image'); + if (thumbnailImageResult.image != null) { + return _createFinalWidget( + baseContext: context, + imageAndPath: thumbnailImageResult, + width: width, + height: height, + noImageText: 'No Thumbnail', + noImageOnTapText: + 'Click to launch video in external player (No Thumbnail)', + onTap: () async => + await _attemptToPlay(context, videoPlayerCommand, path)); + } + + return TextButton( + onPressed: () async { + await _attemptToPlay(context, videoPlayerCommand, path); + }, + child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Text( + title, + style: const TextStyle(fontWeight: FontWeight.bold), + ), + Text(mediaAttachment.description) + ]), + ); + } + + if (mediaAttachment.estimatedType() == FacebookAttachmentMediaType.image) { + final imageResult = _uriToImage(mediaAttachment.uri, pathMapper); + if (imageResult.image == null) { + final errorPath = imageResult.path.isNotEmpty + ? imageResult.path + : mediaAttachment.uri.toString(); + return SizedBox( + width: width * .8, + child: Text('Image could not be loaded: $errorPath', softWrap: true), + ); + } + + return _createFinalWidget( + baseContext: context, + imageAndPath: imageResult, + width: width, + height: height, + noImageText: 'No Image', + onTap: null); + } + + return const Text('Error creating image widget'); + } + + Future _attemptToPlay( + BuildContext context, String command, String path) async { + _logger.fine('Attempting to launch video with $command for $path'); + try { + await Process.run(command, [path]); + } catch (e) { + _logger + .severe('Exception thrown trying to use $command to play $path: $e'); + SnackBarStatusBuilder.buildSnackbar( + context, 'Error using $command to play video $path'); + } + } + + _ImageAndPathResult _uriToImage(Uri uri, PathMappingService mapper, + {String imageTypeName = 'image'}) { + if (uri.toString().startsWith('https://interncache')) { + return _ImageAndPathResult.none(); + } + + if (uri.scheme.startsWith('http')) { + final networkUrl = uri.toString(); + try { + return _ImageAndPathResult(Image.network(networkUrl), networkUrl); + } catch (e) { + _logger.info( + 'Error trying to create network $imageTypeName: $networkUrl. $e'); + } + return _ImageAndPathResult.none(); + } + + if (uri.path.endsWith('mp4')) { + return _ImageAndPathResult.none(); + } + + final fullPath = mapper.toFullPath(uri.toString()); + final imageFile = File(fullPath); + if (imageFile.existsSync()) { + return _ImageAndPathResult(Image.file(imageFile), fullPath); + } + + return _ImageAndPathResult.none(); + } + + Widget _createFinalWidget( + {required BuildContext baseContext, + required _ImageAndPathResult imageAndPath, + required double width, + required double height, + String noImageText = 'No Image', + String noImageOnTapText = 'No Image', + required Future Function()? onTap}) { + final noImage = imageAndPath.image == null; + final errorText = onTap != null ? noImageOnTapText : noImageText; + + final imageWidget = noImage + ? Text(errorText, + style: Theme.of(baseContext) + .textTheme + .bodyText2 + ?.copyWith(fontWeight: FontWeight.bold)) + : SizedBox( + width: width, + height: height, + child: + Image(image: imageAndPath.image!.image, fit: BoxFit.scaleDown), + ); + + if (onTap == null) { + return imageWidget; + } + + return InkWell(onTap: onTap, child: imageWidget); + } +} + +class _ImageAndPathResult { + final Image? image; + final String path; + + _ImageAndPathResult(this.image, this.path); + + _ImageAndPathResult.none() + : image = null, + path = ''; +} diff --git a/friendica_archive_browser/lib/src/friendica/components/filter_control_component.dart b/friendica_archive_browser/lib/src/friendica/components/filter_control_component.dart new file mode 100644 index 0000000..e5012ba --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/filter_control_component.dart @@ -0,0 +1,380 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; + +class FilterControl extends StatefulWidget { + final List allItems; + final List filteredItems = []; + final bool Function(T1)? imagesOnlyFilterFunction; + final bool Function(T1)? videosOnlyFilterFunction; + final bool Function(T1, String)? textSearchFilterFunction; + final DateTime Function(T1) itemToDateTimeFunction; + final bool Function(T1, DateTime, DateTime) dateRangeFilterFunction; + final T1 Function(T1)? copyPrimary; + final List Function(T1)? getSecondary; + final bool Function(T2)? secondaryImagesOnlyFilterFunction; + final bool Function(T2)? secondaryVideosOnlyFilterFunction; + final bool Function(T2, String)? secondaryTextSearchFilterFunction; + final DateTime Function(T2)? secondaryItemToDateTimeFunction; + final bool Function(T2, DateTime, DateTime)? secondaryDateRangeFilterFunction; + final Widget Function(BuildContext, List) builder; + final bool hasSecondaryFunctions; + + FilterControl( + {Key? key, + required this.allItems, + this.imagesOnlyFilterFunction, + this.textSearchFilterFunction, + this.videosOnlyFilterFunction, + required this.itemToDateTimeFunction, + required this.dateRangeFilterFunction, + required this.builder, + this.copyPrimary, + this.getSecondary, + this.secondaryImagesOnlyFilterFunction, + this.secondaryVideosOnlyFilterFunction, + this.secondaryTextSearchFilterFunction, + this.secondaryItemToDateTimeFunction, + this.secondaryDateRangeFilterFunction}) + : hasSecondaryFunctions = getSecondary != null || + secondaryDateRangeFilterFunction != null || + secondaryImagesOnlyFilterFunction != null || + secondaryItemToDateTimeFunction != null || + secondaryTextSearchFilterFunction != null || + secondaryVideosOnlyFilterFunction != null, + super(key: key) { + if (hasSecondaryFunctions && getSecondary == null) { + throw Exception( + 'Secondary filtering functions defined but "getSecondary" method is not.'); + } + + if (hasSecondaryFunctions && copyPrimary == null) { + throw Exception( + 'Primary copy method not defined even though secondary filtering is occurring.'); + } + } + + @override + State> createState() => _FilterControlState(); +} + +class _FilterControlState extends State> { + static final _logger = Logger('$_FilterControlState'); + bool _withImagesOnly = false; + bool _withVideosOnly = false; + bool _withDateFilter = false; + bool _withTextFilter = false; + DateTime _filterStartDate = DateTime.now(); + DateTime _filterEndDate = DateTime.now(); + DateTime _earliestPossibleDate = DateTime.now(); + DateTime _latestPossibleDate = DateTime.now(); + final _searchText = TextEditingController(); + bool _showSearch = false; + + @override + void initState() { + _logger.fine('Init state'); + final times = + widget.allItems.map((e) => widget.itemToDateTimeFunction(e)).toList(); + if (times.isNotEmpty) { + times.sort((t1, t2) => t1.compareTo(t2)); + _earliestPossibleDate = times.first; + _latestPossibleDate = times.last; + _filterStartDate = _earliestPossibleDate; + _filterEndDate = _latestPossibleDate; + } + + _searchText.text = ''; + _searchText.addListener(_updateFilter); + _updateFilter(); + super.initState(); + } + + void _updateFilter() { + _logger.fine('Update Filter'); + final bool testForText = _withTextFilter && _searchText.text.length > 2; + final String searchTerm = _searchText.text.trim(); + + final times = + widget.allItems.map((e) => widget.itemToDateTimeFunction(e)).toList(); + if (times.isNotEmpty) { + times.sort((t1, t2) => t1.compareTo(t2)); + _earliestPossibleDate = times.first; + _latestPossibleDate = times.last; + } + + var currentFilteredItems = widget.allItems.where((p) { + bool passes = true; + if (_withImagesOnly && widget.imagesOnlyFilterFunction != null) { + passes &= widget.imagesOnlyFilterFunction!(p); + } + + if (passes && + _withVideosOnly && + widget.videosOnlyFilterFunction != null) { + passes &= widget.videosOnlyFilterFunction!(p); + } + + if (passes && _withDateFilter) { + passes &= + widget.dateRangeFilterFunction(p, _filterStartDate, _filterEndDate); + } + + if (passes && testForText && widget.textSearchFilterFunction != null) { + passes &= widget.textSearchFilterFunction!(p, searchTerm); + } + return passes; + }); + + if (widget.hasSecondaryFunctions) { + final finalFilteredItems = []; + for (var item in currentFilteredItems) { + final subList = widget.getSecondary!(item); + final filteredSubList = subList.where((i) { + bool passes = true; + if (_withImagesOnly && + widget.secondaryImagesOnlyFilterFunction != null) { + passes &= widget.secondaryImagesOnlyFilterFunction!(i); + } + + if (passes && + _withVideosOnly && + widget.secondaryVideosOnlyFilterFunction != null) { + passes &= widget.secondaryVideosOnlyFilterFunction!(i); + } + + if (passes && + _withDateFilter && + widget.secondaryDateRangeFilterFunction != null) { + passes &= widget.secondaryDateRangeFilterFunction!( + i, _filterStartDate, _filterEndDate); + } + + if (passes && + testForText && + widget.secondaryTextSearchFilterFunction != null) { + passes &= widget.secondaryTextSearchFilterFunction!(i, searchTerm); + } + return passes; + }); + if (subList.length != filteredSubList.length) { + final finalItem = widget.copyPrimary!(item); + final finalSublist = widget.getSecondary!(finalItem); + finalSublist.clear(); + finalSublist.addAll(filteredSubList); + finalFilteredItems.add(finalItem); + } else { + finalFilteredItems.add(item); + } + } + setState(() { + widget.filteredItems.clear(); + widget.filteredItems.addAll(finalFilteredItems); + }); + } else { + setState(() { + widget.filteredItems.clear(); + widget.filteredItems.addAll(currentFilteredItems); + }); + } + } + + @override + Widget build(BuildContext context) { + _logger.fine('Redrawing'); + _updateFilter(); + + return Scaffold( + body: Column(children: [ + if (_showSearch) ...[ + _buildFilterBox(context), + const Divider(), + ], + Expanded(child: widget.builder(context, widget.filteredItems)), + ]), + floatingActionButton: FloatingActionButton( + heroTag: null, + child: const Icon(Icons.search), + tooltip: 'Toggle filter dialog visibility', + onPressed: () { + setState(() { + _logger.fine('Toggling show search'); + _showSearch = !_showSearch; + }); + }, + ), + ); + } + + Widget _buildFilterBox(BuildContext context) { + return Column(children: [ + if (widget.textSearchFilterFunction != null) _buildTextFilter(context), + _buildDateFilter(context), + if (widget.imagesOnlyFilterFunction != null) _buildImagesOnly(context), + if (widget.videosOnlyFilterFunction != null) _buildVideosOnly(context), + _buildStatusLine(), + ]); + } + + Widget _buildStatusLine() { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + '${widget.filteredItems.length} of ${widget.allItems.length} items visible'), + ); + } + + Widget _buildVideosOnly(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row(children: [ + Checkbox( + value: _withVideosOnly, + onChanged: (value) => setState(() { + _withVideosOnly = value ?? false; + _updateFilter(); + })), + const SizedBox(width: 1), + const Text('Only with videos'), + ]), + ); + } + + Widget _buildImagesOnly(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row(children: [ + Checkbox( + value: _withImagesOnly, + onChanged: (value) => setState(() { + _withImagesOnly = value ?? false; + _updateFilter(); + })), + const SizedBox(width: 1), + const Text('Only with images'), + ]), + ); + } + + Widget _buildTextFilter(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row(children: [ + Checkbox( + value: _withTextFilter, + onChanged: (value) => setState(() { + _withTextFilter = value ?? false; + _updateFilter(); + })), + const Text( + 'Search Text:', + ), + const SizedBox(width: 5), + TextField( + enabled: _withTextFilter, + readOnly: !_withTextFilter, + controller: _searchText, + decoration: const InputDecoration( + constraints: BoxConstraints(maxWidth: 500.0), + hintText: 'Limit posts to only those with this exact text', + )), + ]), + ); + } + + Widget _buildDateFilter(BuildContext context) { + final formatter = Provider.of(context).dateFormatter; + + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row(children: [ + Checkbox( + value: _withDateFilter, + onChanged: (value) => setState(() { + _withDateFilter = value ?? false; + _updateFilter(); + })), + const Text( + 'Only between dates:', + ), + const SizedBox(width: 5), + SizedBox( + width: 150, + child: TextField( + enabled: _withDateFilter, + readOnly: true, + controller: TextEditingController( + text: formatter.format(_filterStartDate)), + textAlign: TextAlign.center, + decoration: const InputDecoration( + hintText: 'Earliest', + ), + )), + const SizedBox(width: 5), + ElevatedButton( + onPressed: !_withDateFilter + ? null + : () async { + final selectedDate = await showDatePicker( + context: context, + initialDate: _filterStartDate, + firstDate: _earliestPossibleDate, + lastDate: _filterEndDate, + currentDate: DateTime.now(), + helpText: 'Select starting date filter', + ); + if (selectedDate != null) { + setState(() { + _filterStartDate = selectedDate; + }); + } + }, + child: const Text('Set Start')), + const SizedBox(width: 5), + const Text('to'), + const SizedBox(width: 5), + SizedBox( + width: 150, + child: TextField( + enabled: _withDateFilter, + readOnly: true, + controller: + TextEditingController(text: formatter.format(_filterEndDate)), + textAlign: TextAlign.center, + )), + const SizedBox(width: 5), + ElevatedButton( + onPressed: !_withDateFilter + ? null + : () async { + final selectedDate = await showDatePicker( + context: context, + initialDate: _filterEndDate, + firstDate: _filterStartDate, + lastDate: _latestPossibleDate, + currentDate: DateTime.now(), + helpText: 'Select ending date filter', + ); + if (selectedDate != null) { + setState(() { + _filterEndDate = selectedDate; + }); + } + }, + child: const Text('Set Stop')), + const SizedBox(width: 5), + ElevatedButton( + onPressed: !_withDateFilter + ? null + : () { + setState(() { + _filterStartDate = _earliestPossibleDate; + _filterEndDate = _latestPossibleDate; + }); + }, + child: const Text('Reset')), + ]), + ); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/components/geo/geo_extensions.dart b/friendica_archive_browser/lib/src/friendica/components/geo/geo_extensions.dart new file mode 100644 index 0000000..9c1ee6b --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/geo/geo_extensions.dart @@ -0,0 +1,15 @@ +import 'dart:ui'; + +import 'package:friendica_archive_browser/src/friendica/models/facebook_post.dart'; +import 'package:latlng/latlng.dart'; +import 'package:map/map.dart'; + +import 'marker_data.dart'; + +extension GeoSpatialPostExtensions on FacebookPost { + MarkerData toMarkerData(MapTransformer transformer, Color color) { + final latLon = LatLng(locationData.latitude, locationData.longitude); + final offset = transformer.fromLatLngToXYCoords(latLon); + return MarkerData(this, offset, color); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/components/geo/map_bounds.dart b/friendica_archive_browser/lib/src/friendica/components/geo/map_bounds.dart new file mode 100644 index 0000000..f39554f --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/geo/map_bounds.dart @@ -0,0 +1,82 @@ +import 'dart:math'; +import 'dart:ui'; + +import 'package:latlng/latlng.dart'; +import 'package:map/map.dart'; + +class MapBounds { + static final globe = MapBounds( + upperLeft: LatLng(85.0, -180.0), + lowerRight: LatLng(-85, 180.0), + idealCenterPoint: LatLng(0.0, 0.0)); + final LatLng upperLeft; + final LatLng lowerRight; + final LatLng idealCenterPoint; + + MapBounds( + {required this.upperLeft, + required this.lowerRight, + required this.idealCenterPoint}); + + static MapBounds computed(MapTransformer transformer) { + final mapSize = transformer.constraints.biggest; + final upperLeft = transformer.fromXYCoordsToLatLng(Offset.zero); + final lowerRight = + transformer.fromXYCoordsToLatLng(Offset(mapSize.width, mapSize.height)); + final idealLeftLongitude = max(-180.0, upperLeft.longitude); + final idealRightLongitude = min(180.0, lowerRight.longitude); + final idealUpperLatitude = min(85.0, upperLeft.latitude); + final idealLowerLatitude = max(-85.0, lowerRight.latitude); + final idealCenterLatLon = LatLng( + (idealUpperLatitude + idealLowerLatitude) / 2.0, + (idealRightLongitude + idealLeftLongitude) / 2.0); + + return MapBounds( + upperLeft: upperLeft, + lowerRight: lowerRight, + idealCenterPoint: idealCenterLatLon); + } + + bool pointInBounds(double latitude, double longitude) { + if (latitude > upperLeft.latitude || latitude < lowerRight.latitude) { + return false; + } + + if (longitude < upperLeft.longitude || longitude > lowerRight.longitude) { + return false; + } + + return true; + } + + bool isOverflowedUpperLeft() { + if (upperLeft.longitude < -180.0) { + return true; + } + + if (upperLeft.latitude > 85.0) { + return true; + } + + return false; + } + + bool isOverflowedLowerRight() { + if (lowerRight.latitude < -85.0) { + return true; + } + + if (lowerRight.longitude > 180.0) { + return true; + } + + return false; + } + + bool isOverflowed() => isOverflowedUpperLeft() || isOverflowedLowerRight(); + + @override + String toString() { + return 'UpperLeft: (${upperLeft.latitude},${upperLeft.longitude}); LowerRight: (${lowerRight.latitude},${lowerRight.longitude}); overflowed: ${isOverflowed()}'; + } +} diff --git a/friendica_archive_browser/lib/src/friendica/components/geo/marker_data.dart b/friendica_archive_browser/lib/src/friendica/components/geo/marker_data.dart new file mode 100644 index 0000000..6dde6a0 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/geo/marker_data.dart @@ -0,0 +1,33 @@ +import 'dart:ui'; + +import 'package:friendica_archive_browser/src/friendica/models/facebook_post.dart'; + +class MarkerData { + final List posts; + final Offset pos; + final Color color; + + MarkerData(post, this.pos, this.color) : posts = [post]; + + String toLabel() { + if (posts.isEmpty) { + return 'No Posts'; + } + + if (posts.length == 1) { + return '1 Post'; + } + return '${posts.length} posts'; + } + + String subLabel() { + final mediaCount = posts + .map((p) => p.mediaAttachments.length) + .reduce((value, element) => value + element); + if (mediaCount == 0) { + return ''; + } + + return '$mediaCount images/videos'; + } +} diff --git a/friendica_archive_browser/lib/src/friendica/components/post_card.dart b/friendica_archive_browser/lib/src/friendica/components/post_card.dart new file mode 100644 index 0000000..a58654a --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/components/post_card.dart @@ -0,0 +1,98 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_location_data.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_post.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_timeline_type.dart'; +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/clipboard_helper.dart'; +import 'package:provider/provider.dart'; + +import 'facebook_link_elements_component.dart'; +import 'facebook_media_timeline_component.dart'; + +class PostCard extends StatelessWidget { + final FacebookPost post; + + const PostCard({Key? key, required this.post}) : super(key: key); + + @override + Widget build(BuildContext context) { + if (Scrollable.recommendDeferredLoadingForContext(context)) { + return const SizedBox(); + } + + const double spacingHeight = 5.0; + final formatter = + Provider.of(context).dateTimeFormatter; + final mapper = Provider.of(context); + + final title = post.title.isEmpty ? 'Post' : post.title; + final dateStamp = ' At ' + + formatter.format( + DateTime.fromMillisecondsSinceEpoch(post.creationTimestamp * 1000) + .toLocal()); + + return Padding( + padding: const EdgeInsets.all(20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Wrap( + direction: Axis.horizontal, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text( + title, + style: const TextStyle( + fontWeight: FontWeight.bold, + ), + ), + Text(dateStamp, + style: const TextStyle( + fontStyle: FontStyle.italic, + )), + if (post.timelineType != FacebookTimelineType.active) + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: Tooltip( + message: + 'Post is in ${post.timelineType == FacebookTimelineType.trash ? 'Trash' : 'Archive'}', + child: Icon( + post.timelineType == FacebookTimelineType.trash + ? Icons.delete_outline + : Icons.archive_outlined, + color: Theme.of(context).disabledColor, + )), + ), + Tooltip( + message: 'Copy text version of post to clipboard', + child: IconButton( + onPressed: () async => await copyToClipboard( + context: context, + text: post.toHumanString(mapper, formatter), + snackbarMessage: 'Copied Post to clipboard'), + icon: const Icon(Icons.copy)), + ), + ]), + if (post.post.isNotEmpty) ...[ + const SizedBox(height: spacingHeight), + Text(post.post) + ], + if (post.locationData.hasData()) + post.locationData.toWidget(spacingHeight), + if (post.links.isNotEmpty) ...[ + const SizedBox(height: spacingHeight), + FacebookLinkElementsComponent(links: post.links) + ], + if (post.mediaAttachments.isNotEmpty) ...[ + const SizedBox(height: spacingHeight), + FacebookMediaTimelineComponent( + mediaAttachments: post.mediaAttachments) + ] + ], + ), + ); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/models/facebook_album.dart b/friendica_archive_browser/lib/src/friendica/models/facebook_album.dart new file mode 100644 index 0000000..e4e8634 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/facebook_album.dart @@ -0,0 +1,63 @@ +import 'package:logging/logging.dart'; + +import 'facebook_comment.dart'; +import 'facebook_media_attachment.dart'; +import 'model_utils.dart'; + +class FacebookAlbum { + static final _logger = Logger('$FacebookAlbum'); + + final String name; + final String description; + final int lastModifiedTimestamp; + final FacebookMediaAttachment coverPhoto; + final List photos; + final List comments; + + FacebookAlbum( + {required this.name, + required this.description, + required this.lastModifiedTimestamp, + required this.coverPhoto, + required this.photos, + required this.comments}); + + static FacebookAlbum fromJson(Map json) { + final knownAlbumKeys = [ + 'name', + 'photos', + 'cover_photo', + 'last_modified_timestamp', + 'comments', + 'description' + ]; + + logAdditionalKeys(knownAlbumKeys, json.keys, _logger, Level.WARNING, + 'Unknown top level album keys'); + + String name = json['name'] ?? ''; + String description = json['description'] ?? ''; + int lastModifiedTimestamp = json['last_modified_timestamp'] ?? 0; + FacebookMediaAttachment coverPhoto = json.containsKey('cover_photo') + ? FacebookMediaAttachment.fromFacebookJson(json['cover_photo']) + : FacebookMediaAttachment.blank(); + + final photos = []; + for (Map photoJson in json['photos'] ?? []) { + photos.add(FacebookMediaAttachment.fromFacebookJson(photoJson)); + } + + final comments = []; + for (Map commentsJson in json['comments'] ?? []) { + comments.add(FacebookComment.fromInnerCommentJson(commentsJson)); + } + + return FacebookAlbum( + name: name, + description: description, + lastModifiedTimestamp: lastModifiedTimestamp, + coverPhoto: coverPhoto, + photos: photos, + comments: comments); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/models/facebook_comment.dart b/friendica_archive_browser/lib/src/friendica/models/facebook_comment.dart new file mode 100644 index 0000000..78aa620 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/facebook_comment.dart @@ -0,0 +1,209 @@ +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:intl/intl.dart'; +import 'package:logging/logging.dart'; + +import 'facebook_media_attachment.dart'; +import 'model_utils.dart'; + +class FacebookComment { + static final _logger = Logger('$FacebookComment'); + + final int creationTimestamp; + + final String author; + + final String comment; + + final String group; + + final String title; + + final List mediaAttachments; + + final List links; + + FacebookComment( + {this.creationTimestamp = 0, + this.author = '', + this.comment = '', + this.group = '', + this.title = '', + List? mediaAttachments, + List? links}) + : mediaAttachments = mediaAttachments ?? [], + links = links ?? []; + + FacebookComment.randomBuilt() + : creationTimestamp = DateTime.now().millisecondsSinceEpoch, + author = 'Random Author ${randomId()}', + comment = 'Random comment text ${randomId()}', + group = 'Random Group ${randomId()}', + title = 'Random title ${randomId()}', + links = [ + Uri.parse('http://localhost/${randomId()}'), + Uri.parse('http://localhost/${randomId()}') + ], + mediaAttachments = [ + FacebookMediaAttachment.randomBuilt(), + FacebookMediaAttachment.randomBuilt() + ]; + + FacebookComment copy( + {int? creationTimestamp, + String? author, + String? comment, + String? group, + String? title, + List? mediaAttachments, + List? links}) { + return FacebookComment( + creationTimestamp: creationTimestamp ?? this.creationTimestamp, + author: author ?? this.author, + comment: comment ?? this.comment, + group: group ?? this.group, + title: title ?? this.title, + mediaAttachments: mediaAttachments ?? this.mediaAttachments, + links: links ?? this.links); + } + + @override + String toString() { + return 'FacebookPost{creationTimestamp: $creationTimestamp, comment: $comment, author, $author, group: $group, title: $title, mediaAttachments: $mediaAttachments, links: $links}'; + } + + String toHumanString(PathMappingService mapper, DateFormat formatter) { + final creationDateString = formatter.format( + DateTime.fromMillisecondsSinceEpoch(creationTimestamp * 1000) + .toLocal()); + return [ + 'Title: $title', + 'Creation At: $creationDateString', + if (group.isNotEmpty) 'Group: $group', + 'Text:', + comment, + '', + if (links.isNotEmpty) 'Links:', + ...links.map((e) => e.toString()), + '', + if (mediaAttachments.isNotEmpty) 'Photos and Videos:', + ...mediaAttachments.map((e) => e.toHumanString(mapper)), + ].join('\n'); + } + + FacebookComment.fromJson(Map json) + : creationTimestamp = json['creationTimeStamp'] ?? 0, + author = json['author'] ?? '', + comment = json['comment'] ?? '', + group = json['group'] ?? '', + title = json['title'] ?? '', + mediaAttachments = (json['mediaAttachments'] as List? ?? []) + .map((j) => FacebookMediaAttachment.fromJson(j)) + .toList(), + links = (json['links'] as List? ?? []) + .map((j) => Uri.parse(j)) + .toList(); + + Map toJson() => { + 'creationTimestamp': creationTimestamp, + 'author': author, + 'comment': comment, + 'group': group, + 'title': title, + 'mediaAttachments': mediaAttachments.map((m) => m.toJson()).toList(), + 'links': links.map((e) => e.path).toList(), + }; + + bool hasImages() => mediaAttachments + .where((element) => + element.estimatedType() == FacebookAttachmentMediaType.image) + .isNotEmpty; + + bool hasVideos() => mediaAttachments + .where((element) => + element.estimatedType() == FacebookAttachmentMediaType.video) + .isNotEmpty; + + static FacebookComment fromInnerCommentJson( + Map commentSubData) { + final knownCommentKeys = ['comment', 'timestamp', 'group', 'author']; + if (_logger.isLoggable(Level.WARNING)) { + logAdditionalKeys(knownCommentKeys, commentSubData.keys, _logger, + Level.WARNING, 'Unknown comment level comment keys'); + } + final comment = commentSubData['comment'] ?? ''; + final group = commentSubData['group'] ?? ''; + final author = commentSubData['author'] ?? ''; + final timestamp = commentSubData['timestamp'] ?? 0; + + return FacebookComment( + creationTimestamp: timestamp, + author: author, + group: group, + comment: comment, + ); + } + + static FacebookComment fromFacebookJson(Map json) { + final knownTopLevelKeys = ['timestamp', 'data', 'title', 'attachments']; + final knownExternalContextKeys = ['external_context', 'media', 'name']; + int timestamp = json['timestamp'] ?? 0; + + logAdditionalKeys(knownTopLevelKeys, json.keys, _logger, Level.WARNING, + 'Unknown top level comment keys'); + + FacebookComment basicCommentData = FacebookComment(); + if (json.containsKey('data')) { + final data = json['data']; + for (var dataItem in data) { + if (dataItem.containsKey('comment')) { + basicCommentData = + FacebookComment.fromInnerCommentJson(dataItem['comment']); + } else { + _logger.warning( + "No comment or update key sequence in post @$timestamp: ${dataItem.keys}"); + } + } + } + + final String title = json['title'] ?? ''; + final links = []; + final mediaAttachments = []; + + if (json.containsKey('attachments')) { + for (Map attachment in json['attachments']) { + if (!attachment.containsKey('data')) { + continue; + } + + for (var dataItem in attachment['data']) { + if (_logger.isLoggable(Level.WARNING)) { + logAdditionalKeys( + knownExternalContextKeys, + dataItem.keys, + _logger, + Level.WARNING, + 'Unknown comment external context key level keys in attachment data'); + } + if (dataItem.containsKey('external_context')) { + final String linkText = dataItem['external_context']['url'] ?? ''; + if (linkText.isNotEmpty) { + links.add(Uri.parse(linkText)); + } + } else if (dataItem.containsKey('media')) { + mediaAttachments.add( + FacebookMediaAttachment.fromFacebookJson(dataItem['media'])); + } + } + } + } + + return FacebookComment( + creationTimestamp: timestamp, + author: basicCommentData.author, + comment: basicCommentData.comment, + group: basicCommentData.group, + title: title, + links: links, + mediaAttachments: mediaAttachments); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/models/facebook_event.dart b/friendica_archive_browser/lib/src/friendica/models/facebook_event.dart new file mode 100644 index 0000000..2062bc6 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/facebook_event.dart @@ -0,0 +1,92 @@ +import 'package:intl/intl.dart'; +import 'package:logging/logging.dart'; + +import 'facebook_location_data.dart'; +import 'model_utils.dart'; + +enum FacebookEventStatus { + declined, + interested, + invited, + joined, + owner, + unknown, +} + +class FacebookEvent { + static final _logger = Logger('$FacebookEvent'); + + final String name; + final String description; + final int creationTimestamp; + final int startTimestamp; + final int endTimestamp; + final FacebookLocationData location; + final FacebookEventStatus eventStatus; + + FacebookEvent( + {required this.name, + required this.description, + required this.creationTimestamp, + required this.startTimestamp, + required this.endTimestamp, + required this.location, + required this.eventStatus}); + + @override + String toString() { + return 'FacebookEvent{name: $name, description: $description, creationTimestamp: $creationTimestamp, startTimestamp: $startTimestamp, endTimestamp: $endTimestamp, location: $location, eventStatus: $eventStatus}'; + } + + String toHumanString(DateFormat formatter) { + final creationDateString = formatter.format( + DateTime.fromMillisecondsSinceEpoch(creationTimestamp * 1000) + .toLocal()); + final startTimeString = formatter.format( + DateTime.fromMillisecondsSinceEpoch(startTimestamp * 1000).toLocal()); + final endTimeString = formatter.format( + DateTime.fromMillisecondsSinceEpoch(endTimestamp * 1000).toLocal()); + return [ + if (name.isNotEmpty) 'Name: $name', + if (description.isNotEmpty) 'Description:\n$description', + 'Creation At: $creationDateString', + if (startTimestamp != 0) 'Start Time: $startTimeString', + if (endTimestamp != 0) 'End Time: $endTimeString', + 'Your Status: $eventStatus', + if (location.hasPosition) location.toHumanString(), + ].join('\n'); + } + + static FacebookEvent fromJson(Map json, + {FacebookEventStatus statusType = FacebookEventStatus.unknown}) { + final knownTopLevelKeys = [ + 'name', + 'start_timestamp', + 'end_timestamp', + 'place', + 'description', + 'create_timestamp' + ]; + + logAdditionalKeys(knownTopLevelKeys, json.keys, _logger, Level.WARNING, + 'Unknown top level event keys'); + + final name = json['name'] ?? ''; + final description = json['description'] ?? ''; + final int creationTimestamp = json['create_timestamp'] ?? 0; + final int startTimestamp = json['start_timestamp'] ?? 0; + final int endTimestamp = json['end_timestamp'] ?? 0; + final FacebookLocationData location = json.containsKey('place') + ? FacebookLocationData.fromJson(json['place']) + : const FacebookLocationData(); + + return FacebookEvent( + name: name, + description: description, + creationTimestamp: creationTimestamp, + startTimestamp: startTimestamp, + endTimestamp: endTimestamp, + location: location, + eventStatus: statusType); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/models/facebook_friend.dart b/friendica_archive_browser/lib/src/friendica/models/facebook_friend.dart new file mode 100644 index 0000000..64006e1 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/facebook_friend.dart @@ -0,0 +1,123 @@ +import 'package:logging/logging.dart'; + +import 'model_utils.dart'; + +class FacebookFriend { + static final _logger = Logger('$FacebookFriend'); + + final FriendStatus status; + final String name; + final String contactInfo; + final int friendSinceTimestamp; + final int receivedTimestamp; + final int rejectedTimestamp; + final int removeTimestamp; + final int sentTimestamp; + final bool markedAsSpam; + + FacebookFriend( + {this.status = FriendStatus.unknown, + required this.name, + this.contactInfo = '', + this.friendSinceTimestamp = 0, + this.receivedTimestamp = 0, + this.rejectedTimestamp = 0, + this.removeTimestamp = 0, + this.sentTimestamp = 0, + this.markedAsSpam = false}); + + @override + String toString() { + return 'FacebookFriend{status: $status, name: $name, contactInfo: $contactInfo, friendSinceTimestamp: $friendSinceTimestamp, receivedTimestamp: $receivedTimestamp, rejectedTimestamp: $rejectedTimestamp, removeTimestamp: $removeTimestamp, sentTimestamp: $sentTimestamp, markedAsSpam: $markedAsSpam}'; + } + + static FacebookFriend fromJson( + Map json, FriendStatus status) { + final knownTopLevelKeys = [ + 'timestamp', + 'name', + 'contact_info', + 'marked_as_spam' + ]; + int timestamp = json['timestamp'] ?? 0; + final name = json['name'] ?? ''; + final contactInfo = json['contact_info'] ?? ''; + final markedAsSpam = json['marked_as_spam'] ?? false; + + logAdditionalKeys(knownTopLevelKeys, json.keys, _logger, Level.WARNING, + 'Unknown top level friend keys'); + + switch (status) { + case FriendStatus.friends: + return FacebookFriend( + name: name, + status: status, + contactInfo: contactInfo, + markedAsSpam: markedAsSpam, + friendSinceTimestamp: timestamp); + case FriendStatus.requestReceived: + return FacebookFriend( + name: name, + status: status, + contactInfo: contactInfo, + markedAsSpam: markedAsSpam, + receivedTimestamp: timestamp); + case FriendStatus.rejectedRequest: + return FacebookFriend( + name: name, + status: status, + contactInfo: contactInfo, + markedAsSpam: markedAsSpam, + rejectedTimestamp: timestamp); + case FriendStatus.removed: + return FacebookFriend( + name: name, + status: status, + contactInfo: contactInfo, + markedAsSpam: markedAsSpam, + removeTimestamp: timestamp); + case FriendStatus.sentFriendRequest: + return FacebookFriend( + name: name, + status: status, + contactInfo: contactInfo, + markedAsSpam: markedAsSpam, + sentTimestamp: timestamp); + case FriendStatus.unknown: + return FacebookFriend( + name: name, + status: status, + contactInfo: contactInfo, + markedAsSpam: markedAsSpam, + ); + } + } +} + +enum FriendStatus { + friends, + requestReceived, + rejectedRequest, + removed, + sentFriendRequest, + unknown, +} + +extension FriendStatusWriter on FriendStatus { + String name() { + switch (this) { + case FriendStatus.friends: + return "Friends"; + case FriendStatus.requestReceived: + return "Requested"; + case FriendStatus.rejectedRequest: + return "Rejected"; + case FriendStatus.removed: + return "Removed"; + case FriendStatus.sentFriendRequest: + return "Sent Request"; + case FriendStatus.unknown: + return "Unknown"; + } + } +} diff --git a/friendica_archive_browser/lib/src/friendica/models/facebook_location_data.dart b/friendica_archive_browser/lib/src/friendica/models/facebook_location_data.dart new file mode 100644 index 0000000..8b146be --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/facebook_location_data.dart @@ -0,0 +1,121 @@ +import 'dart:math'; + +import 'package:flutter/widgets.dart'; +import 'package:friendica_archive_browser/src/friendica/components/facebook_link_elements_component.dart'; + +import 'model_utils.dart'; + +class FacebookLocationData { + final String name; + + final double latitude; + + final double longitude; + + final double altitude; + + final bool hasPosition; + + final String address; + + final String url; + + const FacebookLocationData( + {this.name = '', + this.latitude = 0.0, + this.longitude = 0.0, + this.altitude = 0.0, + this.hasPosition = false, + this.address = '', + this.url = ''}); + + FacebookLocationData.randomBuilt() + : name = 'Location name ${randomId()}', + latitude = Random().nextDouble(), + longitude = Random().nextDouble(), + altitude = Random().nextDouble(), + hasPosition = true, + address = 'Address ${randomId()}', + url = 'http://localhost/${randomId()}'; + + @override + String toString() { + return 'FacebookLocationData{name: $name, latitude: $latitude, longitude: $longitude, altitude: $altitude, hasPosition: $hasPosition, address: $address, url: $url}'; + } + + String toHumanString() { + if (!hasPosition) { + return ''; + } + + return [ + if (name.isNotEmpty) 'Name: $name', + if (address.isNotEmpty) 'Address: $address', + 'Latitude: $latitude', + 'Longitude: $longitude', + ].join('\n'); + } + + bool hasData() => + name.isNotEmpty || address.isNotEmpty || url.isNotEmpty || hasPosition; + + static FacebookLocationData fromJson(Map json) { + final name = json['name'] ?? ''; + final address = json['address'] ?? ''; + final url = json['url'] ?? ''; + var latitude = 0.0; + var longitude = 0.0; + var altitude = 0.0; + var hasPosition = json.containsKey('coordinate'); + if (hasPosition) { + final position = json['coordinate']; + latitude = position['latitude'] ?? 0.0; + longitude = position['longitude'] ?? 0.0; + altitude = position['altitude'] ?? 0.0; + } + + return FacebookLocationData( + name: name, + address: address, + url: url, + hasPosition: hasPosition, + latitude: latitude, + longitude: longitude, + altitude: altitude); + } +} + +extension WidgetExtensions on FacebookLocationData { + Widget toWidget(double spacingHeight) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'At: ', + style: TextStyle(fontWeight: FontWeight.bold), + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (name.isNotEmpty) ...[Text(name)], + if (address.isNotEmpty) ...[ + SizedBox(height: spacingHeight), + Text(address) + ], + if (name.isEmpty && hasPosition) ...[ + SizedBox(height: spacingHeight), + Text('Latitude: $latitude, Longitude: $longitude') + ], + if (url.isNotEmpty) ...[ + SizedBox(height: spacingHeight), + FacebookLinkElementsComponent( + links: [Uri.parse(url)], + ), + ], + ], + ), + ]); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/models/facebook_media_attachment.dart b/friendica_archive_browser/lib/src/friendica/models/facebook_media_attachment.dart new file mode 100644 index 0000000..d4b8368 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/facebook_media_attachment.dart @@ -0,0 +1,170 @@ +import 'dart:io'; + +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:logging/logging.dart'; + +import 'facebook_comment.dart'; +import 'model_utils.dart'; + +enum FacebookAttachmentMediaType { unknown, image, video } + +class FacebookMediaAttachment { + static final _logger = Logger('$FacebookMediaAttachment'); + static final _graphicsExtensions = ['jpg', 'png', 'gif', 'tif']; + static final _movieExtensions = ['avi', 'mp4', 'mpg', 'wmv']; + + final Uri uri; + + final int creationTimestamp; + + final Map metadata; + + final List comments; + + final Uri thumbnailUri; + + final String title; + + final String description; + + FacebookMediaAttachment( + {required this.uri, + required this.creationTimestamp, + required this.metadata, + required this.thumbnailUri, + required this.title, + required this.description, + required this.comments}); + + FacebookMediaAttachment.randomBuilt() + : uri = Uri.parse('http://localhost/${randomId()}'), + creationTimestamp = DateTime.now().millisecondsSinceEpoch, + title = 'Random title ${randomId()}', + thumbnailUri = Uri.parse('${randomId()}.jpg'), + description = 'Random description ${randomId()}', + comments = [ + FacebookComment.randomBuilt(), + FacebookComment.randomBuilt() + ], + metadata = {'value1': randomId(), 'value2': randomId()}; + + FacebookMediaAttachment.fromUriOnly(this.uri) + : creationTimestamp = 0, + thumbnailUri = Uri.file(''), + title = '', + description = '', + comments = [], + metadata = {}; + + FacebookMediaAttachment.fromUriAndTime(this.uri, this.creationTimestamp) + : thumbnailUri = Uri.file(''), + title = '', + description = '', + comments = [], + metadata = {}; + + FacebookMediaAttachment.blank() + : uri = Uri(), + creationTimestamp = 0, + thumbnailUri = Uri.file(''), + title = '', + description = '', + comments = [], + metadata = {}; + + @override + String toString() { + return 'FacebookMediaAttachment{uri: $uri, creationTimestamp: $creationTimestamp, metadata: $metadata, title: $title, description: $description, comments: $comments}'; + } + + String toHumanString(PathMappingService mapper) { + if (uri.scheme.startsWith('http')) { + return uri.toString(); + } + + return mapper.toFullPath(uri.toString()); + } + + FacebookAttachmentMediaType estimatedType() => mediaTypeFromString(uri.path); + + FacebookMediaAttachment.fromJson(Map json) + : uri = Uri.parse(json['uri']), + creationTimestamp = json['creationTimestamp'], + metadata = (json['metadata'] as Map? ?? {}) + .map((key, value) => MapEntry(key, value.toString())), + comments = (json['comments'] as List? ?? []) + .map((j) => FacebookComment.fromJson(j)) + .toList(), + thumbnailUri = Uri.parse(json['thumbnailUri'] ?? ''), + title = json['title'] ?? '', + description = json['description'] ?? ''; + + Map toJson() => { + 'uri': uri.toString(), + 'creationTimestamp': creationTimestamp, + 'metadata': metadata, + 'comments': comments.map((c) => c.toJson()).toList(), + 'thumbnailUri': thumbnailUri.toString(), + 'title': title, + 'description': description, + }; + + static FacebookMediaAttachment fromFacebookJson(Map json) { + final Uri uri = Uri.parse(json['uri']); + final int timestamp = json['creation_timestamp'] ?? 0; + final String title = json['title'] ?? ''; + final String description = json['description'] ?? ''; + final metadata = {}; + final thumbnailUrlString = json['thumbnail']?['uri'] ?? ''; + final thumbnailUri = thumbnailUrlString.startsWith('http') + ? Uri.parse(thumbnailUrlString) + : Uri.file(thumbnailUrlString); + json['media_metadata']?.forEach((key, value) { + if (key == 'photo_metadata' || key == 'video_metadata') { + final exifData = value['exif_data'] ?? []; + for (final exif in exifData) { + exif.forEach((k2, v2) => metadata[k2] = v2.toString()); + } + } else { + _logger.fine("Unknown media key $key"); + metadata[key] = value; + } + }); + final comments = []; + for (Map commentJson in json['comments'] ?? {}) { + final comment = FacebookComment.fromInnerCommentJson(commentJson); + comments.add(comment); + } + + return FacebookMediaAttachment( + uri: uri, + creationTimestamp: timestamp, + metadata: metadata, + thumbnailUri: thumbnailUri, + title: title, + comments: comments, + description: description); + } + + static FacebookAttachmentMediaType mediaTypeFromString(String path) { + final separator = Platform.isWindows ? '\\' : '/'; + final lastSlash = path.lastIndexOf(separator) + 1; + final filename = path.substring(lastSlash); + final lastPeriod = filename.lastIndexOf('.') + 1; + if (lastPeriod == 0) { + return FacebookAttachmentMediaType.unknown; + } + + final extension = filename.substring(lastPeriod).toLowerCase(); + + if (_graphicsExtensions.contains(extension)) { + return FacebookAttachmentMediaType.image; + } + + if (_movieExtensions.contains(extension)) { + return FacebookAttachmentMediaType.video; + } + + return FacebookAttachmentMediaType.unknown; + } +} diff --git a/friendica_archive_browser/lib/src/friendica/models/facebook_messenger_conversation.dart b/friendica_archive_browser/lib/src/friendica/models/facebook_messenger_conversation.dart new file mode 100644 index 0000000..c64cd41 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/facebook_messenger_conversation.dart @@ -0,0 +1,95 @@ +import 'package:logging/logging.dart'; +import 'package:uuid/uuid.dart'; + +import 'facebook_messenger_message.dart'; +import 'model_utils.dart'; + +class Copy { + T? copy() => null; +} + +class FacebookMessengerConversation with Copy { + static final _logger = Logger('$FacebookMessengerConversation'); + + final String id; + final Set participants; + final List messages; + final String title; + + FacebookMessengerConversation( + {required this.id, + required this.participants, + required this.messages, + required this.title}); + + factory FacebookMessengerConversation.empty() => + FacebookMessengerConversation( + id: '', participants: {}, messages: [], title: ''); + + @override + FacebookMessengerConversation copy() => FacebookMessengerConversation( + id: id, + participants: {...participants}, + messages: [...messages], + title: title); + + @override + String toString() { + return 'FacebookMessengerConversation{participants: $participants, messages: $messages, title: $title}'; + } + + int earliestTimestampMS() => messages.isEmpty ? 0 : messages.last.timestampMS; + + int latestTimestampMS() => messages.isEmpty ? 0 : messages.first.timestampMS; + + bool hasImages() => messages.where((m) => m.hasImages()).isNotEmpty; + + bool hasVideos() => messages.where((m) => m.hasVideos()).isNotEmpty; + + FacebookMessengerConversation.fromJson(Map json) + : id = json['id'] ?? '', + participants = {...json['participants'] as List? ?? []}, + messages = (json['messages'] as List? ?? []) + .map((j) => FacebookMessengerMessage.fromJson(j)) + .toList(), + title = json['title'] ?? ''; + + Map toJson() => { + 'id': id, + 'participants': participants.toList(), + 'messages': messages.map((m) => m.toJson()).toList(), + 'title': title, + }; + + static FacebookMessengerConversation fromFacebookJson( + Map json) { + final id = json['thread_path'] ?? const Uuid().v4(); + const knownTopLevelKeys = [ + 'participants', + 'messages', + 'title', + 'is_still_participant', + 'thread_type', + 'thread_path', + 'magic_words', + ]; + + logAdditionalKeys(knownTopLevelKeys, json.keys, _logger, Level.WARNING, + 'Unknown top level conversation keys: '); + + final title = json['title'] ?? ''; + final participants = {}; + final messages = []; + + for (Map p in json['messages'] ?? {}) { + messages.add(FacebookMessengerMessage.fromFacebookJson(p)); + } + + for (Map p in json['participants'] ?? {}) { + participants.add(p['name'] ?? ''); + } + + return FacebookMessengerConversation( + id: id, participants: participants, messages: messages, title: title); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/models/facebook_messenger_message.dart b/friendica_archive_browser/lib/src/friendica/models/facebook_messenger_message.dart new file mode 100644 index 0000000..b4761e8 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/facebook_messenger_message.dart @@ -0,0 +1,179 @@ +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:intl/intl.dart'; +import 'package:logging/logging.dart'; + +import 'facebook_media_attachment.dart'; +import 'model_utils.dart'; + +class FacebookMessengerMessage { + static final _logger = Logger('$FacebookMessengerMessage'); + + final String from; + final String message; + final int timestampMS; + final List media; + final List stickers; + final List links; + final Map reactions; + + FacebookMessengerMessage( + {required this.from, + required this.message, + required this.timestampMS, + this.media = const [], + this.stickers = const [], + this.links = const [], + this.reactions = const {}}); + + @override + String toString() { + return 'FacebookMessengerMessage{from: $from, message: $message, timestampMS: $timestampMS, media: $media, stickers: $stickers, links: $links, reactions: $reactions}'; + } + + String toHumanString(PathMappingService mapper, DateFormat formatter) { + final creationDateString = formatter + .format(DateTime.fromMillisecondsSinceEpoch(timestampMS).toLocal()); + return [ + 'Creation At: $creationDateString', + if (message.isNotEmpty) 'Message: $message', + '', + if (links.isNotEmpty) 'Links:', + ...links.map((e) => e.toString()), + '', + if (stickers.isNotEmpty) 'Stickers:', + ...stickers.map((e) => e.toHumanString(mapper)), + if (media.isNotEmpty) 'Media:', + ...media.map((e) => e.toHumanString(mapper)), + ].join('\n'); + } + + FacebookMessengerMessage copy( + {String? from, + String? message, + int? timestampMS, + List? media, + List? stickers, + List? links, + Map? reactions}) { + return FacebookMessengerMessage( + from: from ?? this.from, + message: message ?? this.message, + timestampMS: timestampMS ?? this.timestampMS, + media: media ?? this.media, + stickers: stickers ?? this.stickers, + links: links ?? this.links, + reactions: reactions ?? this.reactions, + ); + } + + FacebookMessengerMessage.fromJson(Map json) + : from = json['from'] ?? '', + message = json['message'] ?? '', + timestampMS = json['timestampMS'] ?? '', + media = (json['media'] as List? ?? []) + .map((j) => FacebookMediaAttachment.fromJson(j)) + .toList(), + stickers = (json['stickers'] as List? ?? []) + .map((j) => FacebookMediaAttachment.fromJson(j)) + .toList(), + links = (json['links'] as List? ?? []) + .map((j) => Uri.parse(j)) + .toList(), + reactions = (json['reactions'] as Map? ?? {}) + .map((key, value) => MapEntry(key, value.toString())); + + Map toJson() => { + 'from': from, + 'message': message, + 'timestampMS': timestampMS, + 'media': media.map((m) => m.toJson()).toList(), + 'stickers': stickers.map((m) => m.toJson()).toList(), + 'links': links.map((e) => e.toString()).toList(), + 'reactions': reactions, + }; + + bool hasImages() => media + .where((element) => + element.estimatedType() == FacebookAttachmentMediaType.image) + .isNotEmpty; + + bool hasVideos() => media + .where((element) => + element.estimatedType() == FacebookAttachmentMediaType.video) + .isNotEmpty; + + static FacebookMessengerMessage fromFacebookJson(Map json) { + const knownTopLevelKeys = [ + 'sender_name', + 'timestamp_ms', + 'photos', + 'reactions', + 'gifs', + 'content', + 'type', + 'share', + 'videos', + 'users', + 'sticker', + 'files', + 'call_duration', + 'missed', + 'audio_files', + 'is_unsent', + 'ip', + ]; + + logAdditionalKeys(knownTopLevelKeys, json.keys, _logger, Level.WARNING, + 'Unknown top level message keys: '); + + final from = json['sender_name'] ?? ''; + final timestamp = json['timestamp_ms'] ?? 0; + final message = json['content'] ?? ''; + final type = json['Generic'] ?? 'Generic'; + if (!['Generic', 'Share'].contains(type)) { + _logger.severe("New message type: $type"); + } + + final links = []; + final String linkString = json['share']?['link'] ?? ''; + if (linkString.isNotEmpty) { + links.add(Uri.parse(linkString)); + } + + // TODO Add Reactions + List mediaAttachments = []; + for (Map photo in json['photos'] ?? []) { + final media = FacebookMediaAttachment.fromFacebookJson(photo); + mediaAttachments.add(media); + } + + for (Map video in json['videos'] ?? []) { + final media = FacebookMediaAttachment.fromFacebookJson(video); + mediaAttachments.add(media); + } + + for (Map audioFile in json['audio_files'] ?? []) { + final path = audioFile['uri']; + links.add(Uri.file(path)); + } + + for (Map gif in json['gifs'] ?? []) { + final media = FacebookMediaAttachment.fromFacebookJson(gif); + mediaAttachments.add(media); + } + + final stickers = []; + final String path = json['sticker']?['uri'] ?? ''; + if (path.isNotEmpty) { + stickers.add(FacebookMediaAttachment.fromUriOnly(Uri.file(path))); + } + + return FacebookMessengerMessage( + from: from, + message: message, + timestampMS: timestamp, + media: mediaAttachments, + stickers: stickers, + links: links); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/models/facebook_post.dart b/friendica_archive_browser/lib/src/friendica/models/facebook_post.dart new file mode 100644 index 0000000..3e0a0ad --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/facebook_post.dart @@ -0,0 +1,214 @@ +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:intl/intl.dart'; +import 'package:logging/logging.dart'; + +import 'facebook_location_data.dart'; +import 'facebook_media_attachment.dart'; +import 'facebook_timeline_type.dart'; +import 'model_utils.dart'; + +class FacebookPost { + static final _logger = Logger('$FacebookPost'); + + final int creationTimestamp; + + final int backdatedTimestamp; + + final int modificationTimestamp; + + final String post; + + final String title; + + final List mediaAttachments; + + final FacebookLocationData locationData; + + final List links; + + final FacebookTimelineType timelineType; + + FacebookPost( + {this.creationTimestamp = 0, + this.backdatedTimestamp = 0, + this.modificationTimestamp = 0, + this.post = '', + this.title = '', + this.locationData = const FacebookLocationData(), + required this.timelineType, + List? mediaAttachments, + List? links}) + : mediaAttachments = mediaAttachments ?? [], + links = links ?? []; + + FacebookPost.randomBuilt() + : creationTimestamp = DateTime.now().millisecondsSinceEpoch, + backdatedTimestamp = DateTime.now().millisecondsSinceEpoch, + modificationTimestamp = DateTime.now().millisecondsSinceEpoch, + post = 'Random post text ${randomId()}', + title = 'Random title ${randomId()}', + locationData = FacebookLocationData.randomBuilt(), + timelineType = FacebookTimelineType.active, + links = [ + Uri.parse('http://localhost/${randomId()}'), + Uri.parse('http://localhost/${randomId()}') + ], + mediaAttachments = [ + FacebookMediaAttachment.randomBuilt(), + FacebookMediaAttachment.randomBuilt() + ]; + + FacebookPost copy( + {int? creationTimestamp, + int? backdatedTimestamp, + int? modificationTimestamp, + String? post, + String? title, + FacebookLocationData? locationData, + List? mediaAttachments, + FacebookTimelineType? timelineType, + List? links}) { + return FacebookPost( + creationTimestamp: creationTimestamp ?? this.creationTimestamp, + backdatedTimestamp: backdatedTimestamp ?? this.backdatedTimestamp, + modificationTimestamp: + modificationTimestamp ?? this.modificationTimestamp, + post: post ?? this.post, + title: title ?? this.title, + locationData: locationData ?? this.locationData, + mediaAttachments: mediaAttachments ?? this.mediaAttachments, + timelineType: timelineType ?? this.timelineType, + links: links ?? this.links); + } + + @override + String toString() { + return 'FacebookPost{creationTimestamp: $creationTimestamp, modificationTimestamp: $modificationTimestamp, backdatedTimeStamp: $backdatedTimestamp, timelineType: $timelineType, post: $post, title: $title, mediaAttachments: $mediaAttachments, links: $links}'; + } + + String toHumanString(PathMappingService mapper, DateFormat formatter) { + final creationDateString = formatter.format( + DateTime.fromMillisecondsSinceEpoch(creationTimestamp * 1000) + .toLocal()); + return [ + 'Title: $title', + 'Creation At: $creationDateString', + 'Text:', + post, + '', + if (links.isNotEmpty) 'Links:', + ...links.map((e) => e.toString()), + '', + if (mediaAttachments.isNotEmpty) 'Photos and Videos:', + ...mediaAttachments.map((e) => e.toHumanString(mapper)), + if (locationData.hasPosition) locationData.toHumanString(), + ].join('\n'); + } + + bool hasImages() => mediaAttachments + .where((element) => + element.estimatedType() == FacebookAttachmentMediaType.image) + .isNotEmpty; + + bool hasVideos() => mediaAttachments + .where((element) => + element.estimatedType() == FacebookAttachmentMediaType.video) + .isNotEmpty; + + static FacebookPost fromJson( + Map json, FacebookTimelineType timelineType) { + final int timestamp = json['timestamp'] ?? 0; + var modificationTimestamp = timestamp; + var backdatedTimestamp = timestamp; + var locationData = const FacebookLocationData(); + String post = ''; + if (json.containsKey('data')) { + final data = json['data']; + for (var dataItem in data) { + if (dataItem.containsKey('post')) { + post = dataItem['post']; + } else if (dataItem.containsKey('update_timestamp')) { + modificationTimestamp = dataItem['update_timestamp']; + } else if (dataItem.containsKey('backdated_timestamp')) { + backdatedTimestamp = dataItem['backdated_timestamp']; + } else { + _logger.fine( + "No post or update key sequence in post @$timestamp: ${dataItem.keys}"); + } + } + } + + final String title = json['title'] ?? ''; + final links = []; + final mediaAttachments = []; + + if (json.containsKey('attachments')) { + for (Map attachment in json['attachments']) { + if (!attachment.containsKey('data')) { + continue; + } + + for (var dataItem in attachment['data']) { + if (dataItem.containsKey('external_context')) { + final String linkText = dataItem['external_context']['url'] ?? ''; + if (linkText.isNotEmpty) { + links.add(Uri.parse(linkText)); + } + } else if (dataItem.containsKey('media')) { + mediaAttachments.add( + FacebookMediaAttachment.fromFacebookJson(dataItem['media'])); + } else if (dataItem.containsKey('place')) { + locationData = FacebookLocationData.fromJson(dataItem['place']); + } else { + //TODO Add Facebook Post Poll Processing + if (dataItem.containsKey('poll')) continue; + //TODO Add Facebook Post attachment text processing + if (dataItem.containsKey('text')) continue; + //TODO Add Facebook Post external context detailed link processing (not just the URL) + if (dataItem.containsKey('name')) continue; + //TODO Add Facebook Post event processing + if (dataItem.containsKey('event')) continue; + + _logger.fine('Unknown post key type: ${dataItem.keys}'); + } + } + } + } + + late final FacebookLocationData actualLocationData; + if (locationData.hasPosition) { + actualLocationData = locationData; + } else { + final mediaWithPosition = mediaAttachments.where((m) => + m.metadata.containsKey('latitude') && + m.metadata.containsKey('longitude')); + if (mediaWithPosition.isNotEmpty) { + final metadata = mediaWithPosition.first.metadata; + final latitude = double.tryParse(metadata['latitude'] ?? '') ?? 0.0; + final longitude = double.tryParse(metadata['longitude'] ?? '') ?? 0.0; + actualLocationData = FacebookLocationData( + latitude: latitude, longitude: longitude, hasPosition: true); + } else { + actualLocationData = locationData; + } + } + + final String actualTitle = title.isNotEmpty + ? title + : mediaAttachments + .map((m) => m.title) + .firstWhere((t) => t.isNotEmpty, orElse: () => ''); + + return FacebookPost( + creationTimestamp: timestamp, + modificationTimestamp: modificationTimestamp, + backdatedTimestamp: backdatedTimestamp, + locationData: actualLocationData, + post: post, + title: actualTitle, + links: links, + mediaAttachments: mediaAttachments, + timelineType: timelineType, + ); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/models/facebook_saved_item.dart b/friendica_archive_browser/lib/src/friendica/models/facebook_saved_item.dart new file mode 100644 index 0000000..2e0db7c --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/facebook_saved_item.dart @@ -0,0 +1,101 @@ +import 'package:logging/logging.dart'; + +import 'model_utils.dart'; + +class FacebookSavedItem { + static final _logger = Logger('$FacebookSavedItem'); + final String externalName; + final int timestamp; + final String title; + final String text; + final Uri uri; + + FacebookSavedItem( + {this.externalName = '', + this.timestamp = 0, + this.title = '', + this.text = '', + required this.uri}); + + FacebookSavedItem copy( + {String? externalName, + int? timestamp, + String? title, + String? text, + Uri? uri}) { + return FacebookSavedItem( + externalName: externalName ?? this.externalName, + timestamp: timestamp ?? this.timestamp, + title: title ?? this.title, + text: text ?? this.text, + uri: uri ?? this.uri, + ); + } + + static FacebookSavedItem fromFacebookJson(Map json) { + final knownTopLevelKeys = ['attachments', 'title', 'timestamp']; + final knownExternalContextKeys = ['name', 'source', 'url']; + int timestamp = json['timestamp'] ?? 0; + + logAdditionalKeys(knownTopLevelKeys, json.keys, _logger, Level.WARNING, + 'Unknown root key'); + + final title = json['title'] ?? ''; + var name = ''; + var linkUri = Uri.parse(''); + var externalName = ''; + + if (json.containsKey('attachments')) { + final attachments = json['attachments'] ?? >[]; + if (attachments.length > 1) { + _logger.severe( + 'Saved item has multiple attachment items, will only use first: ${attachments.length}'); + } + var found = false; + for (Map attachment in attachments) { + final dataItem = attachment['data'] ?? >[]; + if (dataItem.length > 1) { + _logger.severe( + 'Attachment has multiple data items, will only use first: ${dataItem.length}'); + } + for (Map externalItem in dataItem) { + logAdditionalKeys(['external_context'], externalItem.keys, _logger, + Level.WARNING, 'Unknown external data item key'); + final externalData = + externalItem['external_context'] ?? {}; + logAdditionalKeys(knownExternalContextKeys, externalData.keys, + _logger, Level.WARNING, 'Unknown external context key'); + + name = externalData['name'] ?? ''; + final source = externalData['source'] ?? ''; + final url = externalData['url'] ?? ''; + + final sourceUri = Uri.parse(source); + final urlUri = Uri.parse(url); + + if (sourceUri.scheme.startsWith('http')) { + linkUri = sourceUri; + externalName = url; + } else { + linkUri = urlUri; + externalName = source; + } + + found = true; + break; + } + + if (found) { + break; + } + } + } + + return FacebookSavedItem( + timestamp: timestamp, + externalName: externalName, + title: title, + text: name, + uri: linkUri); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/models/facebook_timeline_type.dart b/friendica_archive_browser/lib/src/friendica/models/facebook_timeline_type.dart new file mode 100644 index 0000000..0c7bc04 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/facebook_timeline_type.dart @@ -0,0 +1,5 @@ +enum FacebookTimelineType { + active, + archive, + trash, +} diff --git a/friendica_archive_browser/lib/src/friendica/models/model_utils.dart b/friendica_archive_browser/lib/src/friendica/models/model_utils.dart new file mode 100644 index 0000000..bcff493 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/models/model_utils.dart @@ -0,0 +1,35 @@ +import 'package:logging/logging.dart'; +import 'package:uuid/uuid.dart'; + +void logAdditionalKeys(Iterable expectedSet, Iterable actualSet, + Logger logger, Level level, String label) { + if (!logger.isLoggable(level)) { + return; + } + + final extraKeys = + actualSet.where((element) => !expectedSet.contains(element)); + + for (var k in extraKeys) { + logger.log(level, '$label: $k'); + } +} + +String randomId() => const Uuid().v4(); + +bool timestampInRange(int timestampinMS, DateTime start, DateTime stop) { + final startMS = start.millisecondsSinceEpoch; + final stopMS = stop.millisecondsSinceEpoch; + + return timestampinMS >= startMS && timestampinMS <= stopMS; +} + +bool dateTimeInRange(DateTime timestamp, DateTime start, DateTime stop) { + final timestampMS = timestamp.millisecondsSinceEpoch; + final startMS = start.millisecondsSinceEpoch; + final stopMS = stop.millisecondsSinceEpoch; + + return timestampMS >= startMS && timestampMS <= stopMS; +} + +RegExp wholeWordRegEx(String word) => RegExp('\\b$word\\b'); diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_comments_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_comments_screen.dart new file mode 100644 index 0000000..b91e30d --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_comments_screen.dart @@ -0,0 +1,115 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/components/comment_card.dart'; +import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_comment.dart'; +import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_archive_service.dart'; +import 'package:friendica_archive_browser/src/screens/error_screen.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; +import 'package:result_monad/result_monad.dart'; + +import '../../screens/loading_status_screen.dart'; +import '../../screens/standin_status_screen.dart'; + +class FacebookCommentsScreen extends StatelessWidget { + static final _logger = Logger('$FacebookCommentsScreen'); + + const FacebookCommentsScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final service = Provider.of(context); + final username = Provider.of(context).facebookName; + + _logger.fine('Build FacebookPostListView'); + + return FutureBuilder, ExecError>>( + future: service.getComments(), + builder: (context, snapshot) { + _logger.fine('Future Comment builder called'); + + if (!snapshot.hasData || + snapshot.connectionState != ConnectionState.done) { + return const LoadingStatusScreen(title: 'Loading Comments'); + } + + final commentsResult = snapshot.requireData; + if (commentsResult.isFailure) { + return ErrorScreen( + title: 'Error getting comments', error: commentsResult.error); + } + + final comments = commentsResult.value; + if (comments.isEmpty) { + return const StandInStatusScreen(title: 'No comments were found'); + } + _logger.fine('Build Comments ListView'); + return _FacebookCommentsScreenWidget( + comments: comments, username: username); + }); + } +} + +class _FacebookCommentsScreenWidget extends StatelessWidget { + static final _logger = Logger('$_FacebookCommentsScreenWidget'); + final List comments; + final String username; + + const _FacebookCommentsScreenWidget( + {Key? key, required this.comments, required this.username}) + : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.fine('Redrawing'); + return FilterControl( + allItems: comments, + imagesOnlyFilterFunction: (comment) => comment.hasImages(), + videosOnlyFilterFunction: (comment) => comment.hasVideos(), + textSearchFilterFunction: (comment, text) => + comment.title.contains(text) || comment.comment.contains(text), + itemToDateTimeFunction: (comment) => + DateTime.fromMillisecondsSinceEpoch( + comment.creationTimestamp * 1000), + dateRangeFilterFunction: (comment, start, stop) => + timestampInRange(comment.creationTimestamp * 1000, start, stop), + builder: (context, items) { + if (items.isEmpty) { + return const StandInStatusScreen( + title: 'No comments meet filter criteria'); + } + + return ScrollConfiguration( + behavior: + ScrollConfiguration.of(context).copyWith(scrollbars: false), + child: ListView.separated( + primary: false, + restorationId: 'facebookCommentsListView', + itemCount: items.length, + itemBuilder: (context, index) { + _logger.finer('Rendering FacebookComment List Item'); + final comment = items[index]; + final newTitle = username.isEmpty + ? comment.title + : comment.title + .replaceAll(username, 'You') + .replaceAll(wholeWordRegEx('his'), 'your') + .replaceAll(wholeWordRegEx('her'), 'your'); + final cardComment = username.isEmpty + ? comment + : comment.copy(title: newTitle); + return CommentCard(comment: cardComment); + }, + separatorBuilder: (context, index) { + return const Divider( + color: Colors.black, + thickness: 0.2, + ); + }), + ); + }); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_conversations_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_conversations_screen.dart new file mode 100644 index 0000000..0551e56 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_conversations_screen.dart @@ -0,0 +1,232 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/components/conversation_message_card.dart'; +import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_messenger_conversation.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_messenger_message.dart'; +import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_archive_service.dart'; +import 'package:friendica_archive_browser/src/screens/error_screen.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; +import 'package:result_monad/result_monad.dart'; +import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; + +import '../../screens/loading_status_screen.dart'; +import '../../screens/standin_status_screen.dart'; + +class FacebookConversationScreen extends StatelessWidget { + static final _logger = Logger('$FacebookConversationScreen'); + + const FacebookConversationScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final service = Provider.of(context); + _logger.info('Build Facebook Conversation Screen'); + + return FutureBuilder< + Result, ExecError>>( + future: service.getConvos(), + builder: (context, snapshot) { + _logger.fine('Future Conversation builder called'); + + if (!snapshot.hasData || + snapshot.connectionState != ConnectionState.done) { + _logger.finer('No data yet, just return status screen'); + return const LoadingStatusScreen( + title: 'Loading Conversations', + subTitle: + 'This can take several minutes the first time loading the archive.', + ); + } + + final convoResult = snapshot.requireData; + if (convoResult.isFailure) { + return ErrorScreen(error: convoResult.error); + } + + _logger.finer( + 'Now have data! ${snapshot.requireData.value.length} conversations'); + + final conversations = convoResult.value; + + if (conversations.isEmpty) { + return const StandInStatusScreen( + title: 'No conversations were found'); + } + + return _FacebookConversionsFilteredWidget( + conversations: conversations); + }); + } +} + +class _FacebookConversionsFilteredWidget extends StatelessWidget { + final List conversations; + + const _FacebookConversionsFilteredWidget( + {Key? key, required this.conversations}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return FilterControl( + allItems: conversations, + imagesOnlyFilterFunction: (convo) => convo.hasImages(), + videosOnlyFilterFunction: (convo) => convo.hasVideos(), + textSearchFilterFunction: (convo, text) => + convo.title.contains(text) || + convo.messages + .map((e) => e.message) + .where((element) => element.contains(text)) + .isNotEmpty, + itemToDateTimeFunction: (convo) => + DateTime.fromMillisecondsSinceEpoch(convo.latestTimestampMS()), + dateRangeFilterFunction: (convo, start, stop) => + timestampInRange(convo.earliestTimestampMS(), start, stop) || + timestampInRange(convo.latestTimestampMS(), start, stop), + getSecondary: (convo) => convo.messages, + copyPrimary: (convo) => convo.copy(), + secondaryItemToDateTimeFunction: (message) => + DateTime.fromMillisecondsSinceEpoch(message.timestampMS), + secondaryDateRangeFilterFunction: (message, start, stop) => + timestampInRange(message.timestampMS, start, stop), + secondaryImagesOnlyFilterFunction: (message) => + message.hasImages() || message.stickers.isNotEmpty, + secondaryVideosOnlyFilterFunction: (message) => message.hasVideos(), + secondaryTextSearchFilterFunction: (message, text) => + message.message.contains(text), + builder: (context, conversations) { + return _FacebookConversationsScreenWidget( + conversations: conversations); + }); + } +} + +class _FacebookConversationsScreenWidget extends StatefulWidget { + final List conversations; + + const _FacebookConversationsScreenWidget( + {Key? key, required this.conversations}) + : super(key: key); + + @override + State<_FacebookConversationsScreenWidget> createState() => + _FacebookConversationsScreenWidgetState(); +} + +class _FacebookConversationsScreenWidgetState + extends State<_FacebookConversationsScreenWidget> { + static final _logger = Logger('$_FacebookConversationsScreenWidget'); + + static final FacebookMessengerConversation noConversationSelected = + FacebookMessengerConversation.empty(); + FacebookMessengerConversation _currentConversation = noConversationSelected; + final ItemScrollController _scrollController = ItemScrollController(); + + _setConversation(int index) { + if (index > widget.conversations.length) { + _logger.severe( + 'Requested participants index greater then max: $index > ${widget.conversations.length}'); + return; + } + + final conversation = + index < 0 ? noConversationSelected : widget.conversations[index]; + if (conversation == _currentConversation) { + return; + } + + _logger.finer('Jumping to $index'); + final scrollToIndex = index > 0 ? index - 1 : 0; + _scrollController.scrollTo( + index: scrollToIndex, duration: const Duration(seconds: 1)); + setState(() { + _currentConversation = conversation; + }); + } + + @override + Widget build(BuildContext context) { + _logger.fine('Build _FacebookConversationsScreenWidget'); + if (!widget.conversations.contains(_currentConversation)) { + final selectedIndex = widget.conversations + .indexWhere((c) => c.id == _currentConversation.id); + _setConversation(selectedIndex); + } + return Row( + children: [ + SizedBox( + width: 200, + child: + _buildConversationParticipantsList(context, widget.conversations), + ), + SizedBox(width: 1, child: Container(color: Colors.grey)), + Expanded(child: _buildConversationPanel(context)), + ], + ); + } + + Widget _buildConversationParticipantsList( + BuildContext context, List conversations) { + _logger.fine('Build _buildConversationParticipantsList'); + final textTheme = Theme.of(context).textTheme; + return ScrollablePositionedList.separated( + itemScrollController: _scrollController, + itemCount: conversations.length, + itemBuilder: (context, index) { + final conversation = conversations[index]; + return TextButton( + onPressed: () => _setConversation(index), + style: _currentConversation == conversation + ? TextButton.styleFrom( + backgroundColor: + textTheme.bodyText1?.decorationColor ?? Colors.blue) + : null, + child: Align( + alignment: Alignment.centerLeft, + child: Text(conversation.title, + softWrap: true, + textAlign: TextAlign.start, + style: _currentConversation == conversation + ? textTheme.bodyText1 + : textTheme.bodyText2), + )); + }, + separatorBuilder: (context, index) { + return const Divider( + color: Colors.black, + thickness: 0.2, + ); + }); + } + + Widget _buildConversationPanel(BuildContext context) { + _logger.fine('Build _buildConversationPanel'); + if (_currentConversation == noConversationSelected) { + return const StandInStatusScreen( + title: 'No conversation selected', + subTitle: 'Select a conversation to display here', + ); + } + + final settings = Provider.of(context); + final username = settings.facebookName; + + return ListView.separated( + primary: false, + restorationId: 'facebookConversationPane', + itemCount: _currentConversation.messages.length, + itemBuilder: (context, index) { + final msg = _currentConversation.messages[index]; + return ConversationMessageCard( + message: msg.from == username ? msg.copy(from: 'You') : msg); + }, + separatorBuilder: (context, index) { + return const SizedBox(height: 5); + }); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_events_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_events_screen.dart new file mode 100644 index 0000000..3d2ce19 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_events_screen.dart @@ -0,0 +1,100 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/components/event_card.dart'; +import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_event.dart'; +import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_archive_service.dart'; +import 'package:friendica_archive_browser/src/screens/error_screen.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; +import 'package:result_monad/result_monad.dart'; + +import '../../screens/loading_status_screen.dart'; +import '../../screens/standin_status_screen.dart'; + +class FacebookEventsScreen extends StatelessWidget { + static final _logger = Logger('$FacebookEventsScreen'); + + const FacebookEventsScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final service = Provider.of(context); + _logger.fine('Build FacebookEventsScreen'); + + return FutureBuilder, ExecError>>( + future: service.getEvents(), + builder: (context, snapshot) { + _logger.fine('Future Events builder called'); + + if (!snapshot.hasData || + snapshot.connectionState != ConnectionState.done) { + return const LoadingStatusScreen(title: 'Loading events'); + } + + final eventsResult = snapshot.requireData; + if (eventsResult.isFailure) { + return ErrorScreen(error: eventsResult.error); + } + + final events = eventsResult.value; + + if (events.isEmpty) { + return const StandInStatusScreen(title: 'No events were found'); + } + _logger.fine('Build events ListView'); + return _FacebookEventsScreenWidget(events: events); + }); + } +} + +class _FacebookEventsScreenWidget extends StatelessWidget { + static final _logger = Logger('$_FacebookEventsScreenWidget'); + final List events; + + const _FacebookEventsScreenWidget({Key? key, required this.events}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return FilterControl( + allItems: events, + textSearchFilterFunction: (event, text) => + event.name.contains(text) || + event.description.contains(text) || + event.location.name.contains(text) || + event.location.address.contains(text), + itemToDateTimeFunction: (event) { + if (event.endTimestamp == 0) { + return DateTime.fromMillisecondsSinceEpoch( + event.startTimestamp * 1000); + } + return DateTime.fromMillisecondsSinceEpoch(event.endTimestamp * 1000); + }, + dateRangeFilterFunction: (event, start, stop) => + timestampInRange(event.startTimestamp * 1000, start, stop) || + timestampInRange(event.endTimestamp * 1000, start, stop), + builder: (context, items) { + if (items.isEmpty) { + return const StandInStatusScreen( + title: 'No events meet filter criteria'); + } + + return ListView.separated( + primary: false, + restorationId: 'facebookEventsListView', + itemCount: items.length, + itemBuilder: (context, index) { + _logger.finer('Rendering Facebook Event List Item'); + return EventCard(event: items[index]); + }, + separatorBuilder: (context, index) { + return const Divider( + color: Colors.black, + thickness: 0.2, + ); + }); + }); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_friends_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_friends_screen.dart new file mode 100644 index 0000000..9d72361 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_friends_screen.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_friend.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_archive_service.dart'; +import 'package:intl/intl.dart'; +import 'package:friendica_archive_browser/src/screens/error_screen.dart'; +import 'package:friendica_archive_browser/src/screens/loading_status_screen.dart'; +import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; +import 'package:result_monad/result_monad.dart'; + +class FacebookFriendsScreen extends StatelessWidget { + static final _logger = Logger('$FacebookFriendsScreen'); + + const FacebookFriendsScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final service = Provider.of(context); + final rootPath = Provider.of(context).rootFolder; + _logger.fine('Build FacebookFriendsScreen'); + + return FutureBuilder, ExecError>>( + future: service.getFriends(), + builder: (context, snapshot) { + _logger.fine('Future Friends builder called'); + + if (!snapshot.hasData || + snapshot.connectionState != ConnectionState.done) { + return const LoadingStatusScreen(title: 'Loading Friends'); + } + + final friendsResult = snapshot.requireData; + if (friendsResult.isFailure) { + return ErrorScreen( + title: 'Error getting friends', error: friendsResult.error); + } + + final friends = friendsResult.value; + if (friends.isEmpty) { + return const StandInStatusScreen(title: 'No friends were found'); + } + _logger.fine('Build Friends Data Grid View'); + return _FacebookFriendsScreenWidget( + friends: friends, rootPath: rootPath); + }); + } +} + +class _FacebookFriendsScreenWidget extends StatelessWidget { + final List friends; + final String rootPath; + + const _FacebookFriendsScreenWidget( + {Key? key, required this.friends, required this.rootPath}) + : super(key: key); + + @override + Widget build(BuildContext context) { + final formatter = Provider.of(context).dateFormatter; + + final headerStyle = Theme.of(context) + .textTheme + .bodyText1 + ?.copyWith(fontWeight: FontWeight.bold); + + const nameSize = 250.0; + const statusSize = 100.0; + const dateSize = 150.0; + + return ListView.separated( + restorationId: 'friendListView', + itemCount: friends.length + 1, + itemBuilder: (context, index) { + if (index == 0) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + SizedBox( + width: nameSize, child: Text('Title', style: headerStyle)), + SizedBox( + width: statusSize, + child: Text('Status', style: headerStyle)), + SizedBox( + width: dateSize, + child: Text('Friends Since', style: headerStyle)), + ], + ), + ); + } + + final friend = friends[index - 1]; + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + SizedBox(width: nameSize, child: SelectableText(friend.name)), + SizedBox(width: statusSize, child: Text(friend.status.name())), + SizedBox( + width: dateSize, + child: + Text(_dateText(friend.friendSinceTimestamp, formatter))), + ], + ), + ); + }, + separatorBuilder: (context, index) { + return Divider( + color: Colors.black, + thickness: index == 0 ? 1.0 : 0.2, + ); + }, + ); + } + + String _dateText(int timestamp, DateFormat formatter) => timestamp == 0 + ? 'Not Available' + : formatter.format(DateTime.fromMillisecondsSinceEpoch(timestamp * 1000)); +} diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_geospatial_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_geospatial_screen.dart new file mode 100644 index 0000000..c7933bc --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_geospatial_screen.dart @@ -0,0 +1,386 @@ +import 'dart:math'; + +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/components/geo/geo_extensions.dart'; +import 'package:friendica_archive_browser/src/friendica/components/geo/map_bounds.dart'; +import 'package:friendica_archive_browser/src/friendica/components/geo/marker_data.dart'; +import 'package:friendica_archive_browser/src/friendica/components/post_card.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_post.dart'; +import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_archive_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:intl/intl.dart'; +import 'package:friendica_archive_browser/src/screens/error_screen.dart'; +import 'package:friendica_archive_browser/src/screens/loading_status_screen.dart'; +import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:friendica_archive_browser/src/utils/temp_file_builder.dart'; +import 'package:latlng/latlng.dart'; +import 'package:logging/logging.dart'; +import 'package:map/map.dart'; +import 'package:multi_split_view/multi_split_view.dart'; +import 'package:network_to_file_image/network_to_file_image.dart'; +import 'package:provider/provider.dart'; +import 'package:result_monad/result_monad.dart'; + +class FacebookGeospatialViewScreen extends StatelessWidget { + static final _logger = Logger('$FacebookGeospatialViewScreen'); + + const FacebookGeospatialViewScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.info('Build FacebookGeospatialViewScreen'); + final service = Provider.of(context); + final username = Provider.of(context).facebookName; + + return FutureBuilder, ExecError>>( + future: service.getPosts(), + builder: (context, snapshot) { + _logger.info('FacebookGeospatialViewScreen Future builder called'); + + if (!snapshot.hasData || + snapshot.connectionState != ConnectionState.done) { + return const LoadingStatusScreen(title: 'Loading posts'); + } + + final postsResult = snapshot.requireData; + + if (postsResult.isFailure) { + return ErrorScreen( + title: 'Error getting posts', error: postsResult.error); + } + + final allPosts = postsResult.value; + final filteredPosts = + allPosts.where((p) => p.locationData.hasPosition); + + final posts = username.isEmpty + ? filteredPosts.toList() + : filteredPosts.map((p) { + var newTitle = p.title; + if (p.title == username) { + newTitle = 'You posted'; + } else { + newTitle = p.title + .replaceAll(username, 'You') + .replaceAll(wholeWordRegEx('his'), 'your') + .replaceAll(wholeWordRegEx('her'), 'your'); + } + if (newTitle == p.title) { + return p; + } else { + return p.copy(title: newTitle); + } + }).toList(); + if (posts.isEmpty) { + return const StandInStatusScreen(title: 'No posts were found'); + } + + _logger.fine('Build Posts ListView'); + return GeospatialView(posts: posts); + }); + } +} + +class GeospatialView extends StatefulWidget { + final List posts; + + const GeospatialView({Key? key, required this.posts}) : super(key: key); + + @override + _GeospatialViewState createState() => _GeospatialViewState(); +} + +class _GeospatialViewState extends State { + static final _logger = Logger('$_GeospatialViewState'); + static const billboardXSize = 150.0; + static const billboardYSize = 60.0; + static const maxZoom = 19.957; + static const minZoom = 2.0; + + MapBounds bounds = MapBounds.globe; + final controller = MapController( + location: LatLng(0.0, 0.0), + zoom: 3, + ); + + Offset? dragStart; + final postsInList = []; + final postsInView = []; + double scaleStart = 1.0; + + @override + void initState() { + _logger.finer('_GeospatialViewState initState'); + double latitudeSum = 0.0; + double longitudeSum = 0.0; + for (final p in widget.posts) { + latitudeSum += p.locationData.latitude; + longitudeSum += p.locationData.longitude; + } + + double averageLatitude = latitudeSum / widget.posts.length.toDouble(); + double averageLongitude = longitudeSum / widget.posts.length.toDouble(); + controller.center = LatLng(averageLatitude, averageLongitude); + super.initState(); + } + + void _onDoubleTap() { + controller.zoom += 0.5; + setState(() {}); + } + + void _updatePostsInBoundsFilter() { + postsInView.clear(); + postsInView.addAll(widget.posts.where((p) => bounds.pointInBounds( + p.locationData.latitude, p.locationData.longitude))); + _logger.finest(() => 'Posts in view? ${postsInView.length}'); + } + + void _onScaleStart(ScaleStartDetails details) { + _logger.finest('Drag update'); + dragStart = details.focalPoint; + scaleStart = 1.0; + } + + void _onScaleUpdate(ScaleUpdateDetails details, MapTransformer transformer) { + _logger.finest('_onScaleUpdate'); + final now = details.focalPoint; + final scaleDiff = details.scale - scaleStart; + scaleStart = details.scale; + + if (scaleDiff > 0) { + _tryZoom(controller.zoom + 0.02, transformer); + } else if (scaleDiff < 0) { + _tryZoom(controller.zoom - 0.02, transformer); + } else { + final diff = now - dragStart!; + dragStart = now; + controller.drag(diff.dx, diff.dy); + _logger.finest('Dragged map by: ${diff.dx}, ${diff.dy}'); + if (MapBounds.computed(transformer).isOverflowed()) { + controller.drag(-diff.dx, -diff.dy); + } + } + + setState(() {}); + } + + void _tryZoom(double newZoom, MapTransformer transformer) { + final originalZoom = controller.zoom; + final tryZoomValue = max(minZoom, min(maxZoom, newZoom)); + controller.zoom = tryZoomValue; + if (MapBounds.computed(transformer).isOverflowed()) { + _logger.finest( + () => 'This zoom overflowed map so setting back: ${controller.zoom}'); + controller.zoom = originalZoom; + } else { + _logger.finest(() => 'New zoom: ${controller.zoom}'); + } + } + + void _fixOutOfBounds(MapTransformer transformer, {double increment = 0.5}) { + _logger.finest( + 'Map somehow out of bounds (maybe window enlargement), attempting to correct by zooming in'); + var overflowed = true; + while (overflowed && controller.zoom < (maxZoom - increment)) { + controller.zoom += increment; + bounds = MapBounds.computed(transformer); + overflowed = bounds.isOverflowed(); + } + } + + @override + Widget build(BuildContext context) { + _logger.finer('Call Geospatial builder'); + final formatter = + Provider.of(context).dateTimeFormatter; + final mapper = Provider.of(context); + + _updatePostsInBoundsFilter(); + final map = _buildMap(context, formatter, mapper); + final postList = _buildPostList(context, formatter, mapper); + final panel = MultiSplitView( + axis: Axis.vertical, + children: [ + map, + postList, + ], + initialWeights: const [0.3], + minimalWeight: 0.2, + ); + + return MultiSplitViewTheme( + child: panel, + data: MultiSplitViewThemeData( + dividerPainter: DividerPainters.grooved1( + size: 50, + highlightedSize: 75, + color: Colors.indigo[100]!, + highlightedColor: Colors.indigo[900]!))); + } + + Widget _buildPostList( + BuildContext context, DateFormat formatter, PathMappingService mapper) { + _logger.finest(() => 'Building PostList with ${postsInList.length} items'); + if (postsInList.isEmpty) { + return const StandInStatusScreen( + title: 'No Selected Posts', + subTitle: + 'Click on summary bubbles to select posts\n(and right click on map to clear selection)', + ); + } + + return ScrollConfiguration( + behavior: ScrollConfiguration.of(context).copyWith(scrollbars: false), + child: ListView.separated( + itemBuilder: (context, index) => PostCard(post: postsInList[index]), + separatorBuilder: (context, index) => const Divider(height: 1), + itemCount: postsInList.length), + ); + } + + Widget _buildMap( + BuildContext context, DateFormat formatter, PathMappingService mapper) { + final settings = Provider.of(context); + + final shouldDebugCache = + _logger.level <= Level.FINEST; // compare to logger level + return MapLayoutBuilder( + controller: controller, + builder: (context, transformer) { + _logger.finer('Call MapLayoutBuilder'); + bounds = MapBounds.computed(transformer); + if (bounds.isOverflowed()) { + _fixOutOfBounds(transformer); + } + _updatePostsInBoundsFilter(); + + final markerData = + postsInView.map((p) => p.toMarkerData(transformer, Colors.blue)); + final collapsedMarkerData = []; + + _logger.finest(() => + 'Markers in view (of ${widget.posts.length}): ${markerData.length}'); + for (final data in markerData) { + if (collapsedMarkerData.isEmpty) { + collapsedMarkerData.add(data); + continue; + } + + MarkerData? includedMarker; + for (final cd in collapsedMarkerData) { + final dx = (cd.pos.dx - data.pos.dx).abs(); + final dy = (cd.pos.dy - data.pos.dy).abs(); + if (dx <= billboardXSize && dy <= billboardYSize) { + includedMarker = cd; + break; + } + } + + if (includedMarker != null) { + includedMarker.posts.addAll(data.posts); + } else { + collapsedMarkerData.add(data); + } + } + + final markerWidgets = collapsedMarkerData + .map((m) => _buildMarkerWidget(m, formatter, mapper)); + + return GestureDetector( + behavior: HitTestBehavior.opaque, + onDoubleTap: _onDoubleTap, + onScaleStart: _onScaleStart, + onScaleUpdate: (details) => _onScaleUpdate(details, transformer), + onSecondaryTapUp: (event) { + setState(() { + postsInList.clear(); + }); + }, + child: Listener( + behavior: HitTestBehavior.opaque, + onPointerSignal: (event) { + if (event is PointerScrollEvent) { + final delta = event.scrollDelta; + final newZoom = controller.zoom - (delta.dy / 1000.0); + setState(() { + _tryZoom(newZoom, transformer); + }); + } + }, + child: Stack( + children: [ + Map( + controller: controller, + builder: (context, x, y, z) { + final filename = '${z}_${x}_$y.png'; + final imageFile = + getTileCachedFile(settings.geoCacheDirectory, filename); + //Legal notice: This url is only used for demo and educational purposes. You need a license key for production use. + + //Google Maps + // final url = + // 'https://www.google.com/maps/vt/pb=!1m4!1m3!1i$z!2i$x!3i$y!2m3!1e0!2sm!3i420120488!3m7!2sen!5e1105!12m4!1e68!2m2!1sset!2sRoadmap!4e0!5m1!1e0!23i4111425'; + // + // final darkUrl = + // 'https://maps.googleapis.com/maps/vt?pb=!1m5!1m4!1i$z!2i$x!3i$y!4i256!2m3!1e0!2sm!3i556279080!3m17!2sen-US!3sUS!5e18!12m4!1e68!2m2!1sset!2sRoadmap!12m3!1e37!2m1!1ssmartmaps!12m4!1e26!2m2!1sstyles!2zcC52Om9uLHMuZTpsfHAudjpvZmZ8cC5zOi0xMDAscy5lOmwudC5mfHAuczozNnxwLmM6I2ZmMDAwMDAwfHAubDo0MHxwLnY6b2ZmLHMuZTpsLnQuc3xwLnY6b2ZmfHAuYzojZmYwMDAwMDB8cC5sOjE2LHMuZTpsLml8cC52Om9mZixzLnQ6MXxzLmU6Zy5mfHAuYzojZmYwMDAwMDB8cC5sOjIwLHMudDoxfHMuZTpnLnN8cC5jOiNmZjAwMDAwMHxwLmw6MTd8cC53OjEuMixzLnQ6NXxzLmU6Z3xwLmM6I2ZmMDAwMDAwfHAubDoyMCxzLnQ6NXxzLmU6Zy5mfHAuYzojZmY0ZDYwNTkscy50OjV8cy5lOmcuc3xwLmM6I2ZmNGQ2MDU5LHMudDo4MnxzLmU6Zy5mfHAuYzojZmY0ZDYwNTkscy50OjJ8cy5lOmd8cC5sOjIxLHMudDoyfHMuZTpnLmZ8cC5jOiNmZjRkNjA1OSxzLnQ6MnxzLmU6Zy5zfHAuYzojZmY0ZDYwNTkscy50OjN8cy5lOmd8cC52Om9ufHAuYzojZmY3ZjhkODkscy50OjN8cy5lOmcuZnxwLmM6I2ZmN2Y4ZDg5LHMudDo0OXxzLmU6Zy5mfHAuYzojZmY3ZjhkODl8cC5sOjE3LHMudDo0OXxzLmU6Zy5zfHAuYzojZmY3ZjhkODl8cC5sOjI5fHAudzowLjIscy50OjUwfHMuZTpnfHAuYzojZmYwMDAwMDB8cC5sOjE4LHMudDo1MHxzLmU6Zy5mfHAuYzojZmY3ZjhkODkscy50OjUwfHMuZTpnLnN8cC5jOiNmZjdmOGQ4OSxzLnQ6NTF8cy5lOmd8cC5jOiNmZjAwMDAwMHxwLmw6MTYscy50OjUxfHMuZTpnLmZ8cC5jOiNmZjdmOGQ4OSxzLnQ6NTF8cy5lOmcuc3xwLmM6I2ZmN2Y4ZDg5LHMudDo0fHMuZTpnfHAuYzojZmYwMDAwMDB8cC5sOjE5LHMudDo2fHAuYzojZmYyYjM2Mzh8cC52Om9uLHMudDo2fHMuZTpnfHAuYzojZmYyYjM2Mzh8cC5sOjE3LHMudDo2fHMuZTpnLmZ8cC5jOiNmZjI0MjgyYixzLnQ6NnxzLmU6Zy5zfHAuYzojZmYyNDI4MmIscy50OjZ8cy5lOmx8cC52Om9mZixzLnQ6NnxzLmU6bC50fHAudjpvZmYscy50OjZ8cy5lOmwudC5mfHAudjpvZmYscy50OjZ8cy5lOmwudC5zfHAudjpvZmYscy50OjZ8cy5lOmwuaXxwLnY6b2Zm!4e0&key=AIzaSyAOqYYyBbtXQEtcHG7hwAwyCPQSYidG8yU&token=31440'; + //Mapbox Streets + // final url = + // 'https://api.mapbox.com/styles/v1/mapbox/streets-v11/tiles/$z/$x/$y'; + + final url = 'https://tile.openstreetmap.org/$z/$x/$y.png'; + _logger + .finest(() => 'Attempting to display tile from $url'); + return Image( + image: NetworkToFileImage( + url: url, file: imageFile, debug: shouldDebugCache), + fit: BoxFit.cover, + ); + }, + ), + ...markerWidgets, + ], + ), + ), + ); + }, + ); + } + + Widget _buildMarkerWidget( + MarkerData data, DateFormat formatter, PathMappingService mapper) { + return Positioned( + left: data.pos.dx - 16, + top: data.pos.dy - 16, + width: billboardXSize, + height: billboardYSize, + child: InkWell( + onTap: () { + setState(() { + postsInList.clear(); + postsInList.addAll(data.posts); + _logger.finest( + () => 'Reset post list with ${data.posts.length} posts'); + }); + }, + child: Center( + child: SizedBox( + width: billboardXSize, + height: billboardYSize, + child: Card( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + data.toLabel() + '\n' + data.subLabel(), + textAlign: TextAlign.center, + ), + ), + )), + )), + ); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_media_slideshow_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_media_slideshow_screen.dart new file mode 100644 index 0000000..6039d53 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_media_slideshow_screen.dart @@ -0,0 +1,185 @@ +import 'dart:io'; + +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:friendica_archive_browser/src/friendica/components/facebook_media_wrapper_component.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_media_attachment.dart'; +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/themes.dart'; +import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; +import 'package:provider/provider.dart'; + +class FacebookMediaSlideshowScreen extends StatefulWidget { + static const _spacing = 5.0; + + final List mediaAttachments; + final int initialIndex; + + const FacebookMediaSlideshowScreen( + {Key? key, required this.mediaAttachments, required this.initialIndex}) + : super(key: key); + + @override + State createState() => + _FacebookMediaSlideshowScreenState(); +} + +class _FacebookMediaSlideshowScreenState + extends State { + static const fastestChangeMS = 250; + FacebookMediaAttachment media = FacebookMediaAttachment.blank(); + int index = 0; + int lastKeyInducedIndexChange = 0; + + @override + void initState() { + index = widget.initialIndex; + media = widget.mediaAttachments[index]; + super.initState(); + } + + void updateIndex(int newIndex) { + setState(() { + index = newIndex; + media = widget.mediaAttachments[index]; + }); + } + + void previousImage() { + if (index == 0) { + return; + } + + updateIndex(--index); + } + + void nextImage() { + if (index == widget.mediaAttachments.length - 1) { + return; + } + + updateIndex(++index); + } + + @override + Widget build(BuildContext context) { + final formatter = + Provider.of(context).dateTimeFormatter; + + const toolBarHeight = 50.0; + final width = MediaQuery.of(context).size.width; + final height = MediaQuery.of(context).size.height - toolBarHeight; + + return Theme( + data: FriendicaArchiveBrowserTheme.darkroom, + child: KeyboardListener( + focusNode: FocusNode(), + autofocus: true, + onKeyEvent: (event) { + final key = event.logicalKey; + final now = DateTime.now().millisecondsSinceEpoch; + if (key == LogicalKeyboardKey.arrowLeft) { + if (now - lastKeyInducedIndexChange >= fastestChangeMS) { + previousImage(); + lastKeyInducedIndexChange = now; + } + } else if (key == LogicalKeyboardKey.arrowRight) { + if (now - lastKeyInducedIndexChange >= fastestChangeMS) { + nextImage(); + lastKeyInducedIndexChange = now; + } + } else if (key == LogicalKeyboardKey.escape) { + Navigator.of(context).pop(); + } + }, + child: Scaffold( + appBar: AppBar( + toolbarHeight: toolBarHeight, + title: Text(media.title), + elevation: 0.0, + ), + body: Stack( + children: [ + Positioned( + width: width, + height: height, + child: Center( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: FacebookMediaWrapperComponent( + mediaAttachment: media, + ), + ), + const SizedBox( + height: FacebookMediaSlideshowScreen._spacing), + SelectableText(media.description), + const SizedBox( + height: FacebookMediaSlideshowScreen._spacing), + SelectableText( + formatter.format(DateTime.fromMillisecondsSinceEpoch( + media.creationTimestamp * 1000)), + style: const TextStyle( + fontStyle: FontStyle.italic, + ), + ), + ], + ), + )), + ), + Container( + width: width, + alignment: Alignment.centerLeft, + child: TextButton( + onPressed: index == 0 ? null : previousImage, + child: const Icon(Icons.arrow_back))), + Container( + width: width, + alignment: Alignment.centerRight, + child: TextButton( + onPressed: index == widget.mediaAttachments.length - 1 + ? null + : nextImage, + child: const Icon(Icons.arrow_forward))), + ], + ), + floatingActionButton: FloatingActionButton( + onPressed: () => _saveFile(context), + tooltip: 'Save file to disk', + child: const Icon(Icons.save)), + ), + ), + ); + } + + Future _saveFile(BuildContext context) async { + final pathMapper = Provider.of(context, listen: false); + + final filename = media.uri.pathSegments.last; + final initialPath = pathMapper.toFullPath(media.uri.toFilePath()); + final newPath = await FilePicker.platform.saveFile( + dialogTitle: 'Export Image', + fileName: filename, + ); + + if (newPath == null) { + return; + } + + final initialFile = File(initialPath); + final copiedFile = await initialFile.copy(newPath); + final copiedFileExists = await copiedFile.exists(); + + final message = copiedFileExists + ? 'File exported to: $newPath' + : 'Error exporting file to: $newPath'; + + SnackBarStatusBuilder.buildSnackbar(context, message); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_photo_album_browser_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_photo_album_browser_screen.dart new file mode 100644 index 0000000..7227216 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_photo_album_browser_screen.dart @@ -0,0 +1,127 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/components/facebook_media_wrapper_component.dart'; +import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_album.dart'; +import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_archive_service.dart'; +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/screens/error_screen.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; +import 'package:result_monad/result_monad.dart'; + +import '../../screens/loading_status_screen.dart'; +import '../../screens/standin_status_screen.dart'; +import 'facebook_photo_album_screen.dart'; + +class FacebookPhotoAlbumsBrowserScreen extends StatelessWidget { + static final _logger = Logger('$FacebookPhotoAlbumsBrowserScreen'); + + const FacebookPhotoAlbumsBrowserScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.fine('Build FacebookAlbumListView'); + final service = Provider.of(context); + + return FutureBuilder, ExecError>>( + future: service.getAlbums(), + builder: (futureBuilderContext, snapshot) { + _logger.fine('FacebookAlbumListView Future builder called'); + + if (!snapshot.hasData || + snapshot.connectionState != ConnectionState.done) { + return const LoadingStatusScreen(title: 'Loading albums'); + } + + final albumsResult = snapshot.requireData; + if (albumsResult.isFailure) { + return ErrorScreen( + title: 'Error getting comments', error: albumsResult.error); + } + + final albums = albumsResult.value; + + if (albums.isEmpty) { + return const StandInStatusScreen(title: 'No albums were found'); + } + + _logger.fine('Build Photo Albums Grid View'); + return _FacebookPhotoAlbumsBrowserScreenWidget(albums: albums); + }); + } +} + +class _FacebookPhotoAlbumsBrowserScreenWidget extends StatelessWidget { + final List albums; + + const _FacebookPhotoAlbumsBrowserScreenWidget( + {Key? key, required this.albums}) + : super(key: key); + + @override + Widget build(BuildContext context) { + final settingsController = Provider.of(context); + final pathMapper = Provider.of(context); + + return FilterControl( + allItems: albums, + textSearchFilterFunction: (album, text) => + album.name.contains(text) || album.description.contains(text), + itemToDateTimeFunction: (album) => DateTime.fromMillisecondsSinceEpoch( + album.lastModifiedTimestamp * 1000), + dateRangeFilterFunction: (album, start, stop) => + timestampInRange(album.lastModifiedTimestamp * 1000, start, stop), + builder: (context, albums) { + return Padding( + padding: const EdgeInsets.only( + left: 16, + right: 16, + top: 16, + ), + child: GridView.builder( + itemCount: albums.length, + gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( + mainAxisExtent: 255, + maxCrossAxisExtent: 225, + ), + itemBuilder: (itemBuilderContext, index) { + final album = albums[index]; + return InkWell( + onTap: () { + Navigator.push(context, + MaterialPageRoute(builder: (routeContext) { + return MultiProvider(providers: [ + ChangeNotifierProvider.value(value: settingsController), + Provider.value(value: pathMapper) + ], child: FacebookPhotoAlbumScreen(album: album)); + })); + }, + child: SizedBox( + width: 200, + height: 200, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + FacebookMediaWrapperComponent( + preferredWidth: 150, + preferredHeight: 150, + mediaAttachment: album.coverPhoto), + const SizedBox(height: 5), + Text( + '${album.name} ', + overflow: TextOverflow.ellipsis, + ), + const SizedBox(height: 5), + Text('(${album.photos.length} photos)'), + ])), + ); + }, + ), + ); + }); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_photo_album_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_photo_album_screen.dart new file mode 100644 index 0000000..9ba6b64 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_photo_album_screen.dart @@ -0,0 +1,137 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/components/facebook_media_wrapper_component.dart'; +import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_album.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_media_attachment.dart'; +import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; + +import 'facebook_media_slideshow_screen.dart'; + +class FacebookPhotoAlbumScreen extends StatelessWidget { + static final _logger = Logger('$FacebookPhotoAlbumScreen'); + final FacebookAlbum album; + + const FacebookPhotoAlbumScreen({Key? key, required this.album}) + : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.fine( + 'Build FacebookPhotoAlbumScreen for ${album.name} w/ ${album.photos.length} photos'); + + return album.photos.isEmpty + ? _buildEmptyGalleryScrene(context) + : FilterControl( + allItems: album.photos, + textSearchFilterFunction: (photo, text) => + photo.title.contains(text) || photo.description.contains(text), + itemToDateTimeFunction: (photo) => + DateTime.fromMillisecondsSinceEpoch( + photo.creationTimestamp * 1000), + dateRangeFilterFunction: (photo, start, stop) => + timestampInRange(photo.creationTimestamp * 1000, start, stop), + builder: (context, photos) => _FacebookPhotoAlbumScreenWidget( + photos: photos, + albumName: album.name, + albumDescription: album.description, + ), + ); + } + + _buildEmptyGalleryScrene(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(album.name), + backgroundColor: Theme.of(context).canvasColor, + foregroundColor: Theme.of(context).primaryColor, + elevation: 0.0, + ), + body: const StandInStatusScreen(title: 'No photos in album')); + } +} + +class _FacebookPhotoAlbumScreenWidget extends StatelessWidget { + static final _logger = Logger('$_FacebookPhotoAlbumScreenWidget'); + final List photos; + final String albumName; + final String albumDescription; + + const _FacebookPhotoAlbumScreenWidget( + {Key? key, + required this.photos, + this.albumName = '', + this.albumDescription = ''}) + : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.fine('Rebuilding album widget w/${photos.length} photos'); + final pathMapper = Provider.of(context); + final settingsController = Provider.of(context); + + return Scaffold( + appBar: AppBar( + title: Text(albumName), + backgroundColor: Theme.of(context).canvasColor, + foregroundColor: Theme.of(context).primaryColor, + elevation: 0.0, + ), + body: Padding( + padding: const EdgeInsets.only( + left: 16, + right: 16, + top: 16, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (albumDescription.isNotEmpty) ...[ + Text( + albumDescription, + softWrap: true, + ), + const SizedBox(height: 5) + ], + Expanded( + child: GridView.builder( + itemCount: photos.length, + gridDelegate: + const SliverGridDelegateWithMaxCrossAxisExtent( + mainAxisExtent: 400.0, maxCrossAxisExtent: 400.0), + itemBuilder: (itemBuilderContext, index) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: InkWell( + onTap: () async { + Navigator.push(context, + MaterialPageRoute(builder: (context) { + return MultiProvider( + providers: [ + ChangeNotifierProvider.value( + value: settingsController), + Provider.value(value: pathMapper) + ], + child: FacebookMediaSlideshowScreen( + mediaAttachments: photos, + initialIndex: index)); + })); + }, + child: FacebookMediaWrapperComponent( + mediaAttachment: photos[index], + preferredWidth: 300, + preferredHeight: 300, + ), + ), + ); + }, + ), + ), + ], + ))); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_posts_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_posts_screen.dart new file mode 100644 index 0000000..98b07c1 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_posts_screen.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; +import 'package:friendica_archive_browser/src/friendica/components/post_card.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_post.dart'; +import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_archive_service.dart'; +import 'package:friendica_archive_browser/src/screens/error_screen.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; +import 'package:result_monad/result_monad.dart'; + +import '../../screens/loading_status_screen.dart'; +import '../../screens/standin_status_screen.dart'; + +class FacebookPostsScreen extends StatelessWidget { + static final _logger = Logger('$FacebookPostsScreen'); + + const FacebookPostsScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.info('Build FacebookPostListView'); + final service = Provider.of(context); + final username = Provider.of(context).facebookName; + + return FutureBuilder, ExecError>>( + future: service.getPosts(), + builder: (context, snapshot) { + _logger.info('FacebookPostListView Future builder called'); + + if (!snapshot.hasData || + snapshot.connectionState != ConnectionState.done) { + return const LoadingStatusScreen(title: 'Loading posts'); + } + + final postsResult = snapshot.requireData; + + if (postsResult.isFailure) { + return ErrorScreen( + title: 'Error getting posts', error: postsResult.error); + } + + final allPosts = postsResult.value; + final filteredPosts = username.isEmpty + ? allPosts + : allPosts.where((p) => + p.title != username || + p.post.isNotEmpty || + p.mediaAttachments.isNotEmpty || + p.links.isNotEmpty); + + final posts = username.isEmpty + ? filteredPosts.toList() + : filteredPosts.map((p) { + var newTitle = p.title; + if (p.title == username) { + newTitle = 'You posted'; + } else { + newTitle = p.title + .replaceAll(username, 'You') + .replaceAll(wholeWordRegEx('his'), 'your') + .replaceAll(wholeWordRegEx('her'), 'your'); + } + if (newTitle == p.title) { + return p; + } else { + return p.copy(title: newTitle); + } + }).toList(); + if (posts.isEmpty) { + return const StandInStatusScreen(title: 'No posts were found'); + } + + _logger.fine('Build Posts ListView'); + return _FacebookPostsScreenWidget(posts: posts); + }); + } +} + +class _FacebookPostsScreenWidget extends StatelessWidget { + static final _logger = Logger('$_FacebookPostsScreenWidget'); + + final List posts; + + const _FacebookPostsScreenWidget({Key? key, required this.posts}) + : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.fine('Redrawing'); + return FilterControl( + allItems: posts, + imagesOnlyFilterFunction: (post) => post.hasImages(), + videosOnlyFilterFunction: (post) => post.hasVideos(), + textSearchFilterFunction: (post, text) => + post.title.contains(text) || post.post.contains(text), + itemToDateTimeFunction: (post) => + DateTime.fromMillisecondsSinceEpoch(post.creationTimestamp * 1000), + dateRangeFilterFunction: (post, start, stop) => + timestampInRange(post.creationTimestamp * 1000, start, stop), + builder: (context, items) { + if (items.isEmpty) { + return const StandInStatusScreen( + title: 'No posts meet filter criteria'); + } + + return ScrollConfiguration( + behavior: + ScrollConfiguration.of(context).copyWith(scrollbars: false), + child: ListView.separated( + primary: false, + physics: const RangeMaintainingScrollPhysics(), + restorationId: 'facebookPostsListView', + itemCount: items.length, + itemBuilder: (context, index) { + _logger.finer('Rendering FacebookPost List Item'); + return PostCard(post: items[index]); + }, + separatorBuilder: (context, index) { + return const Divider( + color: Colors.black, + thickness: 0.2, + ); + }), + ); + }); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_saved_items_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_saved_items_screen.dart new file mode 100644 index 0000000..1afbd44 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_saved_items_screen.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; +import 'package:friendica_archive_browser/src/friendica/components/post_card.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_post.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_saved_item.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_timeline_type.dart'; +import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_archive_service.dart'; +import 'package:friendica_archive_browser/src/screens/error_screen.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; +import 'package:result_monad/result_monad.dart'; + +import '../../screens/loading_status_screen.dart'; +import '../../screens/standin_status_screen.dart'; + +class FacebookSavedItemsScreen extends StatelessWidget { + static final _logger = Logger('$FacebookSavedItemsScreen'); + + const FacebookSavedItemsScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.info('Build FacebookSavedItemsScreen'); + final service = Provider.of(context); + final username = Provider.of(context).facebookName; + + return FutureBuilder, ExecError>>( + future: service.getSavedItems(), + builder: (context, snapshot) { + _logger.info('FacebookSavedItemsScreen Future builder called'); + + if (!snapshot.hasData || + snapshot.connectionState != ConnectionState.done) { + return const LoadingStatusScreen(title: 'Loading savedItems'); + } + + final savedItemsResult = snapshot.requireData; + + if (savedItemsResult.isFailure) { + return ErrorScreen( + title: 'Error getting saved items', + error: savedItemsResult.error); + } + + final allSavedItems = savedItemsResult.value; + + final savedItems = username.isEmpty + ? allSavedItems.toList() + : allSavedItems.map((item) { + var newTitle = item.title; + if (item.title == username) { + newTitle = 'You posted'; + } else { + newTitle = item.title + .replaceAll(username, 'You') + .replaceAll(wholeWordRegEx('his'), 'your') + .replaceAll(wholeWordRegEx('her'), 'your'); + } + if (newTitle == item.title) { + return item; + } else { + return item.copy(title: newTitle); + } + }).toList(); + if (savedItems.isEmpty) { + return const StandInStatusScreen( + title: 'No saved items were found'); + } + + _logger.fine('Build Saved Items ListView'); + final savedItemsAsPosts = savedItems + .map((item) => FacebookPost( + creationTimestamp: item.timestamp, + title: item.title, + post: item.text, + links: item.uri.toString().isNotEmpty ? [item.uri] : [], + timelineType: FacebookTimelineType.active)) + .toList(); + return _FacebookSavedItemsScreenWidget( + savedItemsAsPosts: savedItemsAsPosts); + }); + } +} + +class _FacebookSavedItemsScreenWidget extends StatelessWidget { + static final _logger = Logger('$_FacebookSavedItemsScreenWidget'); + + final List savedItemsAsPosts; + + const _FacebookSavedItemsScreenWidget( + {Key? key, required this.savedItemsAsPosts}) + : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.fine('Redrawing'); + return FilterControl( + allItems: savedItemsAsPosts, + textSearchFilterFunction: (post, text) => + post.title.contains(text) || + post.post.contains(text) || + post.links.where((l) => l.toString().contains(text)).isNotEmpty, + itemToDateTimeFunction: (post) => + DateTime.fromMillisecondsSinceEpoch(post.creationTimestamp * 1000), + dateRangeFilterFunction: (post, start, stop) => + timestampInRange(post.creationTimestamp * 1000, start, stop), + builder: (context, items) { + if (items.isEmpty) { + return const StandInStatusScreen( + title: 'No saved items meet filter criteria'); + } + + return ScrollConfiguration( + behavior: + ScrollConfiguration.of(context).copyWith(scrollbars: false), + child: ListView.separated( + primary: false, + restorationId: 'facebookSavedItemsListView', + itemCount: items.length, + itemBuilder: (context, index) { + _logger.finer('Rendering Saved Item List Item'); + return PostCard(post: items[index]); + }, + separatorBuilder: (context, index) { + return const Divider( + color: Colors.black, + thickness: 0.2, + ); + }), + ); + }); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_stats_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_stats_screen.dart new file mode 100644 index 0000000..7eb3f5a --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_stats_screen.dart @@ -0,0 +1,251 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/components/heatmap_widget.dart'; +import 'package:friendica_archive_browser/src/components/timechart_widget.dart'; +import 'package:friendica_archive_browser/src/components/word_frequency_widget.dart'; +import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_media_attachment.dart'; +import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_archive_service.dart'; +import 'package:friendica_archive_browser/src/models/time_element.dart'; +import 'package:friendica_archive_browser/src/screens/standin_status_screen.dart'; +import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; + +class FacebookStatsScreen extends StatefulWidget { + const FacebookStatsScreen({Key? key}) : super(key: key); + + @override + State createState() => _FacebookStatsScreenState(); +} + +class _FacebookStatsScreenState extends State { + static final _logger = Logger("$_FacebookStatsScreenState"); + FacebookArchiveDataService? archiveDataService; + final allItems = []; + StatType statType = StatType.selectType; + bool hasText = true; + + @override + void initState() { + super.initState(); + } + + void _updateSelection(BuildContext context, StatType newType) async { + statType = newType; + await _updateItems(context); + setState(() {}); + } + + Future _updateItems(BuildContext context) async { + if (archiveDataService == null) { + _logger.severe( + "Can't update stats because archive data service is not set yet"); + } + allItems.clear(); + Iterable newItems = []; + switch (statType) { + case StatType.post: + newItems = (await archiveDataService!.getPosts()).fold( + onSuccess: (posts) => posts.map((e) => TimeElement( + timeInMS: e.creationTimestamp * 1000, + hasImages: e.hasImages(), + hasVideos: e.hasVideos(), + title: e.title, + text: e.post)), + onError: (error) { + _logger.severe('Error getting posts: $error'); + return []; + }); + break; + case StatType.comment: + newItems = (await archiveDataService!.getComments()).fold( + onSuccess: (comments) => comments.map((e) => TimeElement( + timeInMS: e.creationTimestamp * 1000, + hasImages: e.hasImages(), + hasVideos: e.hasVideos(), + title: e.title, + text: e.comment)), + onError: (error) { + _logger.severe('Error getting comments: $error'); + return []; + }); + break; + case StatType.photo: + newItems = (await archiveDataService!.getAlbums()).fold( + onSuccess: (albums) => albums.expand((album) => album.photos).map( + (photo) => TimeElement( + timeInMS: photo.creationTimestamp * 1000, + hasImages: true, + hasVideos: false, + title: photo.title, + text: photo.description)), + onError: (error) { + _logger.severe('Error getting photos: $error'); + return []; + }); + break; + case StatType.video: + newItems = (await archiveDataService!.getPosts()).fold( + onSuccess: (posts) => posts + .where((post) => post.hasVideos()) + .expand((post) => post.mediaAttachments.where((m) => + m.estimatedType() == FacebookAttachmentMediaType.video)) + .map((e) => TimeElement( + timeInMS: e.creationTimestamp * 1000, + hasImages: false, + hasVideos: true, + title: e.title, + text: e.description)), + onError: (error) { + _logger.severe('Error getting comments: $error'); + return []; + }); + break; + case StatType.selectType: + break; + default: + _logger.severe('Unknown stat type'); + Future.delayed( + Duration.zero, + () => SnackBarStatusBuilder.buildSnackbar( + context, 'Unknown stat type')); + } + + allItems.addAll(newItems); + } + + @override + Widget build(BuildContext context) { + archiveDataService = Provider.of(context); + + return FilterControl( + allItems: allItems, + imagesOnlyFilterFunction: (item) => item.hasImages, + videosOnlyFilterFunction: (item) => item.hasVideos, + textSearchFilterFunction: (item, text) => item.hasText(text), + itemToDateTimeFunction: (item) => item.timestamp, + dateRangeFilterFunction: (item, start, stop) => + dateTimeInRange(item.timestamp, start, stop), + builder: (context, items) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + constraints: const BoxConstraints(maxWidth: 800), + child: Column( + children: [ + Row( + children: [ + const Text('Statistic Type: '), + DropdownButton( + hint: const Text('Select type'), + value: + statType == StatType.selectType ? null : statType, + onChanged: (StatType? type) => + _updateSelection(context, type!), + items: StatType.values + .map((value) => DropdownMenuItem( + enabled: value != StatType.selectType, + value: value, + child: Text(value.toLabel()))) + .where((element) => element.enabled) + .toList()), + ], + ), + statType == StatType.selectType + ? const Expanded( + child: StandInStatusScreen( + title: 'Select data type to show graphs'), + ) + : _buildChartPanel(context, items) + ], + ), + ), + ); + }); + } + + Widget _buildChartPanel(BuildContext context, List items) { + if (items.isEmpty) { + return Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + StandInStatusScreen( + title: 'No items for statistics', + subTitle: 'Adjust the filter or select a new archive', + ) + ], + ), + ); + } + + return Expanded( + child: SingleChildScrollView( + primary: false, + child: Column(children: [ + ..._buildGraphScreens(context, items), + const Divider(), + WordFrequencyWidget(items), + ]), + )); + } + + List _buildGraphScreens( + BuildContext context, List items) { + return [ + TimeChartWidget(timeElements: items), + const Divider(), + HeatMapWidget(timeElements: items), + ]; + } +} + +enum StatType { + post, + comment, + photo, + video, + selectType, +} + +extension StatTypeString on StatType { + String toLabel() { + switch (this) { + case StatType.post: + return "Posts"; + case StatType.comment: + return "Comments"; + case StatType.photo: + return "Photos"; + case StatType.video: + return "Videos"; + case StatType.selectType: + return "Select Type"; + } + } + + StatType fromLabel(String text) { + if (text == 'Posts') { + return StatType.post; + } + + if (text == 'Comments') { + return StatType.comment; + } + + if (text == 'Photos') { + return StatType.photo; + } + + if (text == 'Videos') { + return StatType.video; + } + + if (text == 'Select Type') { + return StatType.selectType; + } + + throw ArgumentError(['Unknown enum type: $text', 'text']); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/screens/facebook_videos_screen.dart b/friendica_archive_browser/lib/src/friendica/screens/facebook_videos_screen.dart new file mode 100644 index 0000000..ca0516e --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/screens/facebook_videos_screen.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/components/filter_control_component.dart'; +import 'package:friendica_archive_browser/src/friendica/components/post_card.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_media_attachment.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_post.dart'; +import 'package:friendica_archive_browser/src/friendica/models/model_utils.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_archive_service.dart'; +import 'package:friendica_archive_browser/src/screens/error_screen.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:logging/logging.dart'; +import 'package:provider/provider.dart'; +import 'package:result_monad/result_monad.dart'; + +import '../../screens/loading_status_screen.dart'; +import '../../screens/standin_status_screen.dart'; + +class FacebookVideosScreen extends StatelessWidget { + static final _logger = Logger('$FacebookVideosScreen'); + + const FacebookVideosScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.fine('Build FacebookVideosScreen'); + final service = Provider.of(context); + + return FutureBuilder, ExecError>>( + future: service.getPosts(), + builder: (context, snapshot) { + _logger.fine('FacebookVideosScreen Future builder called'); + + if (!snapshot.hasData || + snapshot.connectionState != ConnectionState.done) { + return const LoadingStatusScreen(title: 'Loading videos'); + } + + final result = snapshot.requireData; + if (result.isFailure) { + return ErrorScreen( + title: 'Error getting video posts', error: result.error); + } + + final videos = result.value + .where((p) => p.mediaAttachments + .where((m) => + m.estimatedType() == FacebookAttachmentMediaType.video) + .isNotEmpty) + .toList(); + + if (videos.isEmpty) { + return const StandInStatusScreen(title: 'No videos were found'); + } + + _logger.fine('Build Videos ListView'); + return _FacebookVideosScreenWidget(posts: videos); + }); + } +} + +class _FacebookVideosScreenWidget extends StatelessWidget { + static final _logger = Logger('$_FacebookVideosScreenWidget'); + final List posts; + + const _FacebookVideosScreenWidget({Key? key, required this.posts}) + : super(key: key); + + @override + Widget build(BuildContext context) { + _logger.fine('Redrawing'); + return FilterControl( + allItems: posts, + textSearchFilterFunction: (post, text) => + post.title.contains(text) || post.post.contains(text), + itemToDateTimeFunction: (post) => + DateTime.fromMillisecondsSinceEpoch(post.creationTimestamp * 1000), + dateRangeFilterFunction: (post, start, stop) => + timestampInRange(post.creationTimestamp * 1000, start, stop), + builder: (context, items) { + if (items.isEmpty) { + return const StandInStatusScreen( + title: 'No videos meet filter criteria'); + } + + return ScrollConfiguration( + behavior: + ScrollConfiguration.of(context).copyWith(scrollbars: false), + child: ListView.separated( + primary: false, + restorationId: 'facebookVideosListView', + itemCount: items.length, + itemBuilder: (context, index) { + _logger.finer('Rendering Facebook Video List Item'); + return PostCard(post: items[index]); + }, + separatorBuilder: (context, index) { + return const Divider( + color: Colors.black, + thickness: 0.2, + ); + }), + ); + }); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/services/facebook_archive_reader.dart b/friendica_archive_browser/lib/src/friendica/services/facebook_archive_reader.dart new file mode 100644 index 0000000..b9884bb --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/services/facebook_archive_reader.dart @@ -0,0 +1,524 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_album.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_comment.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_event.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_friend.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_messenger_conversation.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_post.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_saved_item.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_timeline_type.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_file_reader.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:logging/logging.dart'; +import 'package:result_monad/result_monad.dart'; + +import '../../utils/temp_file_builder.dart'; + +class FacebookArchiveFolderReader extends ChangeNotifier { + static final _logger = Logger('$FacebookArchiveFolderReader'); + static final expectedDirectories = [ + 'posts', + 'comments_and_reactions', + 'saved_items_and_collections', + 'posts/media', + 'posts/album', + 'events', + 'messages', + ]; + + String _rootDirectoryPath = ''; + + String get rootDirectoryPath => _rootDirectoryPath; + + set rootDirectoryPath(String value) { + _rootDirectoryPath = value; + notifyListeners(); + } + + FacebookArchiveFolderReader(String rootDirectoryPath) { + _rootDirectoryPath = rootDirectoryPath; + _logger.fine('Create new FacebookArchiveFolderReader'); + } + + FutureResult, ExecError> readPosts() async { + final posts = []; + final errors = []; + + final yourPostPath = '$rootDirectoryPath/posts/your_posts_1.json'; + if (File(yourPostPath).existsSync()) { + (await _getJsonList(yourPostPath)) + .andThen( + (json) => _parsePostResults(json, FacebookTimelineType.active)) + .match( + onSuccess: (newPosts) => posts.addAll(newPosts), + onError: (error) { + _logger + .severe('Error $error responses json for ${yourPostPath}'); + errors.add(error); + }); + } + + final archivedPostsPath = '$rootDirectoryPath/posts/archive.json'; + if (File(archivedPostsPath).existsSync()) { + (await _getJson(archivedPostsPath)) + .andThen((json) => json.containsKey('archive_v2') + ? Result.ok(json['archive_v2']) + : Result.error( + ExecError.message('No archive_v2 key in $archivedPostsPath'))) + .andThen((archivedPostsJson) => _parsePostResults( + archivedPostsJson, FacebookTimelineType.archive)) + .match( + onSuccess: (archivedPosts) => posts.addAll(archivedPosts), + onError: (error) { + _logger.severe( + 'Error $error responses json for $archivedPostsPath'); + errors.add(error); + }); + } + + final trashPostsPath = '$rootDirectoryPath/posts/trash.json'; + if (File(trashPostsPath).existsSync()) { + (await _getJson(trashPostsPath)) + .andThen((json) => json.containsKey('trash_v2') + ? Result.ok(json['trash_v2']) + : Result.error( + ExecError.message('No trash_v2 key in $trashPostsPath'))) + .andThen((archivedPostsJson) => + _parsePostResults(archivedPostsJson, FacebookTimelineType.trash)) + .match( + onSuccess: (archivedPosts) => posts.addAll(archivedPosts), + onError: (error) { + _logger + .severe('Error $error responses json for $trashPostsPath'); + errors.add(error); + }); + } + + if (errors.isNotEmpty) { + return Result.error(ExecError.message( + 'Error reading one or more present post files. Check logs for more details.')); + } + + return Result.ok(posts); + } + + FutureResult, ExecError> readComments() async { + final path = '$rootDirectoryPath/comments_and_reactions/comments.json'; + final jsonResult = await _getJson(path); + if (jsonResult.isFailure) { + return Result.error(jsonResult.error); + } + + final jsonData = jsonResult.value; + if (!jsonData.containsKey('comments_v2')) { + return Result.error( + ExecError(errorMessage: 'Comments JSON file is malformed: $path')); + } + + final commentsJson = jsonData['comments_v2'] as List; + final commentsResult = runCatching(() => Result.ok( + commentsJson.map((e) => FacebookComment.fromFacebookJson(e)).toList())); + + commentsResult.match( + onSuccess: (value) => _logger.fine('Comments processed into PODOs'), + onError: (error) => + _logger.severe('Error mapping JSON to post data: $error')); + + return commentsResult.mapExceptionErrorToExecError(); + } + + FutureResult, ExecError> readPhotoAlbums() async { + final albumFolderPath = '$rootDirectoryPath/posts/album'; + final folder = Directory(albumFolderPath); + final albums = []; + + if (!folder.existsSync()) { + final msg = 'Photos folder does not exist; $albumFolderPath'; + _logger.severe(msg); + return Result.error(ExecError(errorMessage: msg)); + } + + await for (var entity in folder.list(recursive: true)) { + final filePath = entity.path; + if (entity.statSync().type != FileSystemEntityType.file) { + _logger + .severe("Unexpected file/folder in photo albums folder: $filePath"); + continue; + } + + if (!entity.path.toLowerCase().endsWith('json')) { + _logger + .severe("Unexpected file type in photo albums folder: $filePath"); + continue; + } + + final jsonResult = await _getJson(filePath); + jsonResult.match( + onSuccess: (json) { + final albumResult = + runCatching(() => Result.ok(FacebookAlbum.fromJson(json))); + albumResult.match( + onSuccess: (album) { + albums.add(album); + _logger.fine('Album converted to PODO'); + }, + onError: (error) => + _logger.severe('Error parsing album JSON for $filePath')); + }, + onError: (error) => + _logger.severe('Error parsing photo album: $filePath')); + } + + return Result.ok(albums); + } + + FutureResult, ExecError> readFriends() async { + final basePath = '$rootDirectoryPath/friends_and_followers'; + final friendsFile = File('$basePath/friends.json'); + final receivedFile = File('$basePath/friend_requests_received.json'); + final rejectedFile = File('$basePath/rejected_friend_requests.json'); + final removedFile = File('$basePath/removed_friends.json'); + final sentFile = File('$basePath/friend_requests_sent.json'); + final allFriends = []; + + if (!Directory(basePath).existsSync()) { + _logger.severe('Friends base folder does not exist: $basePath'); + return Result.error( + ExecError(errorMessage: 'Friends data does not exist')); + } + + (await _readFriendsJsonFile( + friendsFile, FriendStatus.friends, "friends_v2")) + .match( + onSuccess: (friends) => allFriends.addAll(friends), + onError: (error) => _logger.info( + "Errors processing friends.json, continuing on without that data")); + + (await _readFriendsJsonFile( + receivedFile, FriendStatus.requestReceived, "received_requests_v2")) + .match( + onSuccess: (friends) => allFriends.addAll(friends), + onError: (error) => _logger.info( + "Errors processing received_friend_requests.json, continuing on without that data")); + + (await _readFriendsJsonFile( + rejectedFile, FriendStatus.rejectedRequest, "rejected_requests_v2")) + .match( + onSuccess: (friends) => allFriends.addAll(friends), + onError: (error) => _logger.info( + "Errors processing rejected_friend_requests.json, continuing on without that data")); + + (await _readFriendsJsonFile( + removedFile, FriendStatus.removed, "deleted_friends_v2")) + .match( + onSuccess: (friends) => allFriends.addAll(friends), + onError: (error) => _logger.info( + "Errors processing removed_friends.json, continuing on without that data")); + + (await _readFriendsJsonFile( + sentFile, FriendStatus.removed, "sent_requests_v2")) + .match( + onSuccess: (friends) => allFriends.addAll(friends), + onError: (error) => _logger.info( + "Errors processing sent_friend_requests.json, continuing on without that data")); + + return Result.ok(allFriends); + } + + FutureResult, ExecError> readEvents() async { + final basePath = '$rootDirectoryPath/events'; + final invitationsFile = File('$basePath/event_invitations.json'); + final responsesFile = File('$basePath/your_event_responses.json'); + final yourEventsFile = File('$basePath/your_events.json'); + final events = []; + + if (!Directory(basePath).existsSync()) { + _logger.severe('Events base folder does not exist: $basePath'); + return Result.error( + ExecError(errorMessage: 'Events data does not exist')); + } + + if (invitationsFile.existsSync()) { + final json = (await _getJson(invitationsFile.path)).fold( + onSuccess: (json) => json, + onError: (error) { + _logger.severe( + 'Error $error reading json for ${invitationsFile.path}'); + return {}; + }); + final List invited = + json['events_invited_v2'] ?? >[]; + try { + events.addAll(invited.map((e) => FacebookEvent.fromJson(e, + statusType: FacebookEventStatus.invited))); + } catch (e) { + _logger.severe( + 'Error $e processing JSON invitations file: ${invitationsFile.path}'); + } + } else { + _logger.info('Invitations file does not exist; ${invitationsFile.path}'); + } + + if (responsesFile.existsSync()) { + final json = (await _getJson(responsesFile.path)).fold( + onSuccess: (json) => json, + onError: (error) { + _logger.severe( + 'Error $error responses json for ${responsesFile.path}'); + return {}; + }); + final Map responses = + json['event_responses_v2'] ?? {}; + final List joined = responses['events_joined'] ?? []; + try { + events.addAll(joined.map((e) => + FacebookEvent.fromJson(e, statusType: FacebookEventStatus.joined))); + } catch (e) { + _logger.severe( + 'Error $e processing JSON joined events file: ${invitationsFile.path}'); + } + final List declined = responses['events_declined'] ?? []; + try { + events.addAll(declined.map((e) => FacebookEvent.fromJson(e, + statusType: FacebookEventStatus.declined))); + } catch (e) { + _logger.severe( + 'Error $e processing JSON declined events file: ${invitationsFile.path}'); + } + final List interested = responses['events_interested'] ?? []; + try { + events.addAll(interested.map((e) => FacebookEvent.fromJson(e, + statusType: FacebookEventStatus.declined))); + } catch (e) { + _logger.severe( + 'Error $e processing JSON interested events file: ${invitationsFile.path}'); + } + } else { + _logger.info('Responses file does not exist; ${responsesFile.path}'); + } + + if (yourEventsFile.existsSync()) { + final json = (await _getJson(yourEventsFile.path)).fold( + onSuccess: (json) => json, + onError: (error) { + _logger.severe( + 'Error $error your events file json for ${responsesFile.path}'); + return {}; + }); + final List yourEvents = + json['your_events_v2'] ?? >[]; + try { + events.addAll(yourEvents.map((e) => + FacebookEvent.fromJson(e, statusType: FacebookEventStatus.owner))); + } catch (e) { + _logger.severe( + 'Error $e processing JSON your events file: ${yourEventsFile.path}'); + } + } else { + _logger.info('Your events file does not exist ${yourEventsFile.path}'); + } + + events.sort((e1, e2) => -e1.startTimestamp.compareTo(e2.startTimestamp)); + + return Result.ok(events); + } + + FutureResult, ExecError> + readConversations() async { + final path = '$rootDirectoryPath/messages'; + final folder = Directory(path); + final conversations = {}; + + if (!folder.existsSync()) { + _logger.severe('Messages folder does not exist; $path'); + return Result.ok([]); + } + + await for (var entity in folder.list(recursive: true)) { + if (entity.path.toLowerCase().endsWith('json')) { + if (entity is Directory) { + continue; + } + + try { + final jsonResult = await _getJson(entity.path, level: Level.FINEST); + if (jsonResult.isFailure) { + _logger.severe( + 'Error ${jsonResult.error} reading JSON data for ${entity.path}'); + continue; + } + + final conversation = + FacebookMessengerConversation.fromFacebookJson(jsonResult.value); + if (conversations.containsKey(conversation.id)) { + final existingConvo = conversations[conversation.id]!; + existingConvo.messages.addAll(conversation.messages); + existingConvo.messages + .sort((m1, m2) => -m1.timestampMS.compareTo(m2.timestampMS)); + } else { + conversations[conversation.id] = conversation; + } + } catch (e) { + _logger.severe('Error $e processing conversation ${entity.path}'); + } + } + } + + return Result.ok(conversations.values.toList()); + } + + FutureResult, ExecError> readSavedItems() async { + final path = + '$rootDirectoryPath/saved_items_and_collections/saved_items_and_collections.json'; + final jsonResult = await _getJson(path); + if (jsonResult.isFailure) { + return Result.error(jsonResult.error); + } + + final jsonData = jsonResult.value; + if (!jsonData.containsKey('saves_and_collections_v2')) { + return Result.error(ExecError( + errorMessage: + 'Saved Items and Collections JSON file is malformed: $path')); + } + + final savedItemsJson = + jsonData['saves_and_collections_v2'] as List; + final savedItemsResult = runCatching(() => Result.ok(savedItemsJson + .map((e) => FacebookSavedItem.fromFacebookJson(e)) + .toList())); + + savedItemsResult + .andThen( + (items) => Result.ok(items.where((e) => e.timestamp != 0).toList())) + .match( + onSuccess: (value) => + _logger.fine('Saved Items processed into PODOs'), + onError: (error) => _logger + .severe('Error mapping JSON to saved items data: $error')); + + return savedItemsResult.mapExceptionErrorToExecError(); + } + + static bool validateCanReadArchive(String path) { + _logger.fine('Validating whether path is a valid Facebook Archive: $path'); + final baseDir = Directory(path); + if (!baseDir.existsSync()) { + _logger.severe('Unable to find base directory: $path'); + return false; + } + + try { + baseDir.listSync(); + } catch (e) { + _logger.severe('Unable to access base directory: $path'); + return false; + } + + return true; + } + + Result, ExecError> _parsePostResults( + List json, FacebookTimelineType timelineType) { + final postsResult = runCatching(() => Result.ok( + json.map((e) => FacebookPost.fromJson(e, timelineType)).toList())); + + postsResult.match( + onSuccess: (value) => _logger.fine('Posts processed into PODOs'), + onError: (error) => + _logger.severe('Error mapping JSON to post data: $error')); + return postsResult.mapError((error) => + error is ExecError ? error : ExecError.message(error.toString())); + } + + static FutureResult, ExecError> _getJson(String path, + {Level level = Level.FINE}) async { + final file = File(path); + final result = await (await _readFacebookFile(file, level)).andThenAsync( + (jsonText) async => await _parseJsonFileText>( + jsonText, file, level)); + return result.mapError((error) => error as ExecError); + } + + static FutureResult, ExecError> _getJsonList(String path, + {Level level = Level.FINE}) async { + final file = File(path); + final fileTextResponse = await _readFacebookFile(file, level); + if (fileTextResponse.isFailure) { + return Result.error(fileTextResponse.error); + } + + final jsonText = fileTextResponse.value.trim(); + if (!jsonText.startsWith('[')) { + final parsedJsonResult = + await _parseJsonFileText>(jsonText, file, level); + return parsedJsonResult.mapValue((value) => [value]); + } + return await _parseJsonFileText>(jsonText, file, level); + } + + static FutureResult _readFacebookFile( + File file, Level level) async { + _logger.log(level, 'Attempting to open and read ${file.path}'); + final response = await file.readFacebookEncodedFileAsString(); + response.match( + onSuccess: (value) => _logger.log(level, 'Text read from ${file.path}'), + onError: (error) async { + final tmpPath = + await getTempFile(file.uri.pathSegments.last, '.fragment.json'); + await File(tmpPath).writeAsString(response.error.errorMessage); + _logger.severe('Wrote partial read of ${file.path} to $tmpPath'); + }); + + return response; + } + + static FutureResult _parseJsonFileText( + String text, File originalFile, Level levelForFullDump) async { + final jsonParseResult = runCatching(() => Result.ok(jsonDecode(text) as T)) + .mapExceptionErrorToExecError(); + final msg = jsonParseResult.fold( + onSuccess: (value) => 'JSON decoded from ${originalFile.path}', + onError: (error) async { + final tmpPath = await getTempFile( + originalFile.uri.pathSegments.last, '.ingested.json'); + await File(tmpPath).writeAsString(text); + _logger.severe( + 'Wrote ingested JSON stream text read of ${originalFile.path} to $tmpPath'); + + return 'Error parsing json for ${originalFile.path}'; + }); + _logger.log(levelForFullDump, msg); + return jsonParseResult; + } + + FutureResult, ExecError> _readFriendsJsonFile( + File file, FriendStatus status, String topKey) async { + final friends = []; + + if (file.existsSync()) { + final json = (await _getJson(file.path)).fold( + onSuccess: (json) => json, + onError: (error) { + _logger.severe('Error $error reading json for ${file.path}'); + return {}; + }); + final List invited = json[topKey] ?? >[]; + try { + final entries = invited.map((f) => FacebookFriend.fromJson(f, status)); + _logger.fine( + '${entries.length} friends of type $status found in ${file.path}'); + friends.addAll(entries); + } catch (e) { + _logger.severe('Error $e processing JSON $topKey file: ${file.path}'); + } + } else { + _logger.info('$topKey file does not exist; ${file.path}'); + } + + return Result.ok(friends); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/services/facebook_archive_service.dart b/friendica_archive_browser/lib/src/friendica/services/facebook_archive_service.dart new file mode 100644 index 0000000..a849753 --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/services/facebook_archive_service.dart @@ -0,0 +1,497 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_album.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_comment.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_event.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_friend.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_media_attachment.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_messenger_conversation.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_post.dart'; +import 'package:friendica_archive_browser/src/friendica/models/facebook_saved_item.dart'; +import 'package:friendica_archive_browser/src/friendica/services/path_mapping_service.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as p; +import 'package:result_monad/result_monad.dart'; + +import 'facebook_archive_reader.dart'; + +class FacebookArchiveDataService extends ChangeNotifier { + static final _logger = Logger('$FacebookArchiveDataService'); + final PathMappingService pathMappingService; + final String appDataDirectory; + final List albums = []; + final List posts = []; + final List comments = []; + final List events = []; + final List friends = []; + final List convos = []; + final List savedItems = []; + bool canUseConvoCacheFile = true; + + FacebookArchiveDataService( + {required this.pathMappingService, required this.appDataDirectory}) { + _logger.info('Facebook Archive Service created'); + } + + void clearCaches() { + _logger.fine('clearCaches called'); + _logger.finer('Clearing caches'); + albums.clear(); + posts.clear(); + comments.clear(); + events.clear(); + convos.clear(); + friends.clear(); + savedItems.clear(); + notifyListeners(); + canUseConvoCacheFile = false; + _logger.finer('Deleting files'); + try { + final convoCacheFile = File(_conversationCachePath); + if (convoCacheFile.existsSync()) { + convoCacheFile.deleteSync(); + } + + if (convoCacheFile.existsSync()) { + _logger.severe( + 'Attempted to delete conversations cache file but it did not succeed. ${convoCacheFile.path}'); + } + } catch (e) { + _logger.severe( + 'Exception thrown while attempting to clear conversations cache file: $e'); + } + canUseConvoCacheFile = true; + _logger.fine('clearCaches complete'); + } + + FutureResult, ExecError> getPosts() async { + _logger.fine('Request for posts'); + if (posts.isNotEmpty) { + _logger.fine( + 'Posts already loaded, returning existing ${posts.length} posts'); + return Result.ok(List.unmodifiable(posts)); + } + _logger.finer('No previously pulled posts reading from disk'); + final postsResult = await _readAllPosts(); + postsResult.match( + onSuccess: (newPosts) { + posts.clear(); + posts.addAll(newPosts); + posts.sort((p1, p2) => + -p1.creationTimestamp.compareTo(p2.creationTimestamp)); + }, + onError: (error) => _logger.severe('Error loading posts: $error')); + + _logger.fine('Returning ${posts.length} posts'); + return Result.ok(List.unmodifiable(posts)); + } + + FutureResult, ExecError> getComments() async { + _logger.fine('Request for comments'); + if (comments.isNotEmpty) { + _logger.fine( + 'Comments already loaded, returning existing ${comments.length} comments'); + return Result.ok(List.unmodifiable(comments)); + } + _logger.finer('No previously pulled comments reading from disk'); + final commentsResult = await _readAllComments(); + commentsResult.match( + onSuccess: (newComments) { + comments.clear(); + comments.addAll(newComments); + comments.sort((c1, c2) => + -c1.creationTimestamp.compareTo(c2.creationTimestamp)); + }, + onError: (error) => _logger.severe('Error loading comments: $error')); + + _logger.fine('Returning ${comments.length} comments'); + return Result.ok(List.unmodifiable(comments)); + } + + FutureResult, ExecError> getEvents() async { + _logger.fine('Request for events'); + if (events.isNotEmpty) { + _logger.fine( + 'Events already loaded, returning existing ${events.length} events'); + return Result.ok(List.unmodifiable(events)); + } + _logger.finer('No previously pulled events reading from disk'); + final eventsResult = await _readAllEvents(); + eventsResult.match( + onSuccess: (newEvents) { + events.clear(); + events.addAll(newEvents); + events.sort((e1, e2) => + -e1.creationTimestamp.compareTo(e2.creationTimestamp)); + }, + onError: (error) => _logger.severe('Error loading events: $error')); + + _logger.fine('Returning ${comments.length} events'); + return Result.ok(List.unmodifiable(events)); + } + + FutureResult, ExecError> getFriends() async { + _logger.fine('Request for friends'); + if (friends.isNotEmpty) { + _logger.fine( + 'Friends already loaded, returning existing ${friends.length} friends'); + return Result.ok(List.unmodifiable(friends)); + } + _logger.finer('No previously pulled friends reading from disk'); + final friendResult = await _readAllFriends(); + friendResult.match( + onSuccess: (newFriends) { + friends.clear(); + friends.addAll(newFriends); + }, + onError: (error) => _logger.severe('Error loading friends: $error')); + + _logger.fine('Returning ${friends.length} friends'); + return Result.ok(List.unmodifiable(friends)); + } + + FutureResult, ExecError> getAlbums() async { + _logger.fine('Request for albums'); + if (albums.isNotEmpty) { + _logger.fine( + 'Albums already loaded, returning existing ${albums.length} albums'); + return Result.ok(List.unmodifiable(albums)); + } + _logger.finer('No previously pulled albums reading from disk'); + + final albumResult = await _readAllAlbums(); + albumResult.match( + onSuccess: (newAlbums) { + albums.clear(); + albums.addAll(newAlbums); + }, + onError: (error) => _logger.severe('Error loading albums: $error')); + + final postsAlbum = await _generatePostsAlbum(); + postsAlbum.match( + onSuccess: (album) => albums.add(album), + onError: (error) => + _logger.severe('Error generating posts album: $error')); + + albums.sort((a1, a2) => + -a1.lastModifiedTimestamp.compareTo(a2.lastModifiedTimestamp)); + + _logger.fine('Returning ${albums.length} albums'); + return Result.ok(List.unmodifiable(albums)); + } + + FutureResult, ExecError> + getConvos() async { + _logger.fine('Request for conversations'); + if (convos.isNotEmpty) { + _logger.fine( + 'Conversations already loaded, returning existing ${convos.length} posts'); + return Result.ok(List.unmodifiable(convos)); + } + + final convoCacheFile = File(_conversationCachePath); + try { + if (canUseConvoCacheFile && convoCacheFile.existsSync()) { + _logger.finer( + 'Attempt to load conversations from: $_conversationCachePath'); + final newConvosTextResult = await convoCacheFile.readAsString(); + if (newConvosTextResult.isNotEmpty) { + final newConvosData = + jsonDecode(newConvosTextResult) as List; + final newConvos = newConvosData + .map((json) => FacebookMessengerConversation.fromJson(json)) + .toList(); + convos.clear(); + convos.addAll(newConvos); + _logger.fine( + '${newConvos.length} conversations loaded from disk. Returning ${convos.length} conversations'); + return Result.ok(List.unmodifiable(convos)); + } + } + } catch (e) { + _logger.severe('Exception thrown trying to read from cache, $e'); + } + + _logger.finer('No cache data available so reading from original archive'); + + final conversationsResult = await _readAllConvos(); + conversationsResult.match(onSuccess: (newConversations) { + convos.clear(); + convos.addAll(newConversations); + convos.sort((c1, c2) => + -c1.latestTimestampMS().compareTo(c2.latestTimestampMS())); + }, onError: (error) { + _logger.severe('Error loading posts: $error'); + }); + try { + _logger.finer( + 'Writing ${convos.length} to conversation cache file $_conversationCachePath'); + String json = jsonEncode(convos); + await convoCacheFile.writeAsString(json, flush: true); + } catch (e) { + _logger.severe('Error trying to write to cache file, $e'); + } + + _logger.fine('Returning ${convos.length} conversations'); + return Result.ok(List.unmodifiable(convos)); + } + + FutureResult, ExecError> getSavedItems() async { + _logger.fine('Request for saved items'); + if (savedItems.isNotEmpty) { + _logger.fine( + 'Saved items already loaded, returning existing ${savedItems.length} comments'); + return Result.ok(List.unmodifiable(savedItems)); + } + _logger.finer('No previously pulled saved items, reading from disk'); + final savedItemsResult = await _readAllSavedItems(); + savedItemsResult.match( + onSuccess: (newSavedItems) { + savedItems.clear(); + savedItems.addAll(newSavedItems); + savedItems.sort((c1, c2) => -c1.timestamp.compareTo(c2.timestamp)); + }, + onError: (error) => _logger.severe('Error loading savedItems: $error')); + + _logger.fine('Returning ${savedItems.length} saved items'); + return Result.ok(List.unmodifiable(savedItems)); + } + + String get _conversationCachePath => + p.join(appDataDirectory, 'convo_cache.json'); + + FutureResult, ExecError> _readAllPosts() async { + final allPosts = []; + bool hadSuccess = false; + for (final topLevelDir in _topLevelDirs) { + try { + _logger.fine( + 'Attempting to find/parse Post JSON data in ${topLevelDir.path}'); + final reader = FacebookArchiveFolderReader(topLevelDir.path); + final postsResult = await reader.readPosts(); + postsResult.match( + onSuccess: (newPosts) { + allPosts.addAll(newPosts); + hadSuccess = true; + }, + onError: (error) => _logger.fine(error)); + } catch (e) { + _logger.severe('Exception thrown trying to read posts, $e'); + } + } + + if (hadSuccess) { + return Result.ok(allPosts); + } + + return Result.error(ExecError.message( + 'Unable to find any post JSON files in $_baseArchiveFolder')); + } + + FutureResult, ExecError> _readAllComments() async { + final allComments = []; + bool hadSuccess = false; + for (final topLevelDir in _topLevelDirs) { + try { + _logger.fine( + 'Attempting to find/parse comment JSON data in ${topLevelDir.path}'); + final reader = FacebookArchiveFolderReader(topLevelDir.path); + final commentsResult = await reader.readComments(); + commentsResult.match( + onSuccess: (newEvents) { + allComments.addAll(newEvents); + hadSuccess = true; + }, + onError: (error) => _logger.fine(error)); + } catch (e) { + _logger.severe('Exception thrown trying to read comments, $e'); + } + } + + if (hadSuccess) { + return Result.ok(allComments); + } + + return Result.error(ExecError.message( + 'Unable to find any comment JSON files in $_baseArchiveFolder')); + } + + FutureResult, ExecError> _readAllEvents() async { + final allEvents = []; + bool hadSuccess = false; + for (final topLevelDir in _topLevelDirs) { + try { + _logger.fine( + 'Attempting to find/parse event JSON data in ${topLevelDir.path}'); + final reader = FacebookArchiveFolderReader(topLevelDir.path); + final eventsResult = await reader.readEvents(); + eventsResult.match( + onSuccess: (newEvents) { + allEvents.addAll(newEvents); + hadSuccess = true; + }, + onError: (error) => _logger.fine(error)); + } catch (e) { + _logger.severe('Exception thrown trying to read events, $e'); + } + } + + if (hadSuccess) { + return Result.ok(allEvents); + } + + return Result.error(ExecError.message( + 'Unable to find any event JSON files in $_baseArchiveFolder')); + } + + FutureResult, ExecError> _readAllFriends() async { + final allFriends = []; + bool hadSuccess = false; + for (final topLevelDir in _topLevelDirs) { + try { + _logger.fine( + 'Attempting to find/parse friend JSON data in ${topLevelDir.path}'); + final reader = FacebookArchiveFolderReader(topLevelDir.path); + final friendsResult = await reader.readFriends(); + friendsResult.match( + onSuccess: (newFriends) { + allFriends.addAll(newFriends); + hadSuccess = true; + }, + onError: (error) => _logger.fine(error)); + } catch (e) { + _logger.severe('Exception thrown trying to read friends, $e'); + } + } + + if (hadSuccess) { + return Result.ok(allFriends); + } + + return Result.error(ExecError.message( + 'Unable to find any album JSON files in $_baseArchiveFolder')); + } + + FutureResult, ExecError> _readAllAlbums() async { + final allAlbums = []; + bool hadSuccess = false; + for (final topLevelDir in _topLevelDirs) { + try { + _logger.fine( + 'Attempting to find/parse album JSON data in ${topLevelDir.path}'); + final reader = FacebookArchiveFolderReader(topLevelDir.path); + final albumResult = await reader.readPhotoAlbums(); + albumResult.match( + onSuccess: (newAlbums) { + allAlbums.addAll(newAlbums); + hadSuccess = true; + }, + onError: (error) => _logger.fine(error)); + } catch (e) { + _logger.severe('Exception thrown trying to read albums, $e'); + } + } + + if (hadSuccess) { + return Result.ok(allAlbums); + } + + return Result.error(ExecError.message( + 'Unable to find any album JSON files in $_baseArchiveFolder')); + } + + FutureResult, ExecError> + _readAllConvos() async { + final allConvos = []; + bool hadSuccess = false; + for (final topLevelDir in _topLevelDirs) { + try { + _logger.fine( + 'Attempting to find/parse conversation JSON data in ${topLevelDir.path}'); + final reader = FacebookArchiveFolderReader(topLevelDir.path); + final convosResult = await reader.readConversations(); + convosResult.match( + onSuccess: (newConvos) { + allConvos.addAll(newConvos); + hadSuccess = true; + }, + onError: (error) => _logger.fine(error)); + } catch (e) { + _logger.severe('Exception thrown trying to read conversations, $e'); + } + } + + if (hadSuccess) { + return Result.ok(allConvos); + } + + return Result.error(ExecError.message( + 'Unable to find any event JSON files in $_baseArchiveFolder')); + } + + FutureResult, ExecError> _readAllSavedItems() async { + final allSavedItems = []; + bool hadSuccess = false; + for (final topLevelDir in _topLevelDirs) { + try { + _logger.fine( + 'Attempting to find/parse saved items JSON data in ${topLevelDir.path}'); + final reader = FacebookArchiveFolderReader(topLevelDir.path); + final savedItemsResult = await reader.readSavedItems(); + savedItemsResult.match( + onSuccess: (newSavedItem) { + allSavedItems.addAll(newSavedItem); + hadSuccess = true; + }, + onError: (error) => _logger.fine(error)); + } catch (e) { + _logger.severe('Exception thrown trying to read saved items, $e'); + } + } + + if (hadSuccess) { + return Result.ok(allSavedItems); + } + + return Result.error(ExecError.message( + 'Unable to find any saved items JSON files in $_baseArchiveFolder')); + } + + FutureResult _generatePostsAlbum() async { + const name = 'Photos in Posts'; + const description = 'Photos that were added to posts'; + final posts = await getPosts(); + + if (posts.isFailure) { + return Result.error(posts.error); + } + + final photos = posts.value + .map((p) => p.mediaAttachments) + .expand((m) => m) + .where((m) => m.estimatedType() == FacebookAttachmentMediaType.image) + .toList(); + photos + .sort((p1, p2) => p1.creationTimestamp.compareTo(p2.creationTimestamp)); + final lastModified = photos.isEmpty ? 0 : photos.last.creationTimestamp; + final coverPhoto = + photos.isEmpty ? FacebookMediaAttachment.blank() : photos.last; + + final album = FacebookAlbum( + name: name, + description: description, + lastModifiedTimestamp: lastModified, + coverPhoto: coverPhoto, + photos: photos, + comments: []); + return Result.ok(album); + } + + String get _baseArchiveFolder => pathMappingService.rootFolder; + + List get _topLevelDirs => + pathMappingService.archiveDirectories; +} diff --git a/friendica_archive_browser/lib/src/friendica/services/facebook_file_reader.dart b/friendica_archive_browser/lib/src/friendica/services/facebook_file_reader.dart new file mode 100644 index 0000000..b8a425b --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/services/facebook_file_reader.dart @@ -0,0 +1,50 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:logging/logging.dart'; +import 'package:result_monad/result_monad.dart'; + +final _facebookFileReadingLogger = Logger('File.FacebookFileReading'); + +extension FacebookFileReading on File { + FutureResult readFacebookEncodedFileAsString() async { + const leadingSlash = 92; + const leadingU = 117; + final data = await readAsBytes(); + final buffer = StringBuffer(); + int i = 0; + try { + while (i < data.length) { + if (data[i] == leadingSlash && data[i + 1] == leadingU) { + final byteBuffer = []; + while (i < data.length - 1 && + data[i] == leadingSlash && + data[i + 1] == leadingU) { + final chars = data + .sublist(i + 2, i + 6) + .map((e) => e < 97 ? e - 48 : e - 87) + .toList(growable: false); + final byte = (chars[0] << 12) + + (chars[1] << 8) + + (chars[2] << 4) + + (chars[3]); + byteBuffer.add(byte); + i += 6; + } + final unicodeChar = utf8.decode(byteBuffer); + buffer.write(unicodeChar); + } else { + buffer.writeCharCode(data[i]); + i++; + } + } + } catch (e) { + _facebookFileReadingLogger.severe('Error parsing $path, $e'); + return Result.error(ExecError( + exception: e as Exception, errorMessage: buffer.toString())); + } + + return Result.ok(buffer.toString()); + } +} diff --git a/friendica_archive_browser/lib/src/friendica/services/path_mapping_service.dart b/friendica_archive_browser/lib/src/friendica/services/path_mapping_service.dart new file mode 100644 index 0000000..5a2a22a --- /dev/null +++ b/friendica_archive_browser/lib/src/friendica/services/path_mapping_service.dart @@ -0,0 +1,121 @@ +import 'dart:io'; + +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as p; + +class PathMappingService { + static final _logger = Logger('$PathMappingService'); + final SettingsController settings; + final _archiveDirectories = []; + + PathMappingService(this.settings) { + refresh(); + } + + String get rootFolder => settings.rootFolder; + + List get archiveDirectories => + List.unmodifiable(_archiveDirectories); + + void refresh() { + _logger.fine('Refreshing path mapping service directory data.'); + if (!Directory(settings.rootFolder).existsSync()) { + _logger.severe( + "Base directory does not exist! can't do mapping of ${settings.rootFolder}"); + return; + } + _archiveDirectories.clear(); + + try { + if (_calcRootIsSingleArchiveFolder()) { + _archiveDirectories.add(Directory(rootFolder)); + return; + } + } catch (e) { + _logger + .severe('Error thrown while trying to calculate root structure: $e'); + return; + } + + _archiveDirectories.addAll(Directory(settings.rootFolder) + .listSync(recursive: false) + .where((element) => + element.statSync().type == FileSystemEntityType.directory)); + } + + String toFullPath(String relPath) { + for (final file in _archiveDirectories) { + final fullPath = p.join(file.path, relPath); + if (File(fullPath).existsSync()) { + return fullPath; + } + } + + _logger.fine( + 'Did not find a file with this relPath anywhere therefore returning the relPath'); + return relPath; + } + + bool _calcRootIsSingleArchiveFolder() { + for (final entity in Directory(rootFolder).listSync(recursive: false)) { + if (_knownRootFilesAndFolders.contains(entity.uri.pathSegments + .where((element) => element.isNotEmpty) + .last)) { + return true; + } + } + + return false; + } + + static final _knownRootFilesAndFolders = [ + "facebook_100000044480872.zip.enc", + "activity_messages", + "ads_information", + "apps_and_websites_off_of_facebook", + "bug_bounty", + "campus", + "comments_and_reactions", + "events", + "facebook_accounts_center", + "facebook_assistant", + "facebook_gaming", + "facebook_marketplace", + "facebook_news", + "facebook_payments", + "friends_and_followers", + "fundraisers", + "groups", + "journalist_registration", + "live_audio_rooms", + "location", + "messages", + "music_recommendations", + "news_feed", + "notifications", + "other_activity", + "other_logged_information", + "other_personal_information", + "pages", + "polls", + "posts", + "preferences", + "privacy_checkup", + "profile_information", + "reviews", + "saved_items_and_collections", + "search", + "security_and_login_information", + "shops_questions_&_answers", + "short_videos", + "soundbites", + "stories", + "volunteering", + "voting_location_and_reminders", + "your_interactions_on_facebook", + "your_places", + "your_problem_reports", + "your_topics", + ]; +} diff --git a/friendica_archive_browser/lib/src/home.dart b/friendica_archive_browser/lib/src/home.dart new file mode 100644 index 0000000..4d30b3d --- /dev/null +++ b/friendica_archive_browser/lib/src/home.dart @@ -0,0 +1,119 @@ +import 'package:flutter/material.dart'; + +import 'friendica/screens/facebook_photo_album_browser_screen.dart'; +import 'friendica/screens/facebook_posts_screen.dart'; +import 'friendica/screens/facebook_stats_screen.dart'; +import 'friendica/services/facebook_archive_reader.dart'; +import 'settings/settings_controller.dart'; +import 'settings/settings_view.dart'; + +class Home extends StatefulWidget { + final SettingsController settingsController; + + const Home({Key? key, required this.settingsController}) : super(key: key); + + @override + _HomeState createState() => _HomeState(); +} + +class _HomeState extends State { + static final Widget notInitialiedWidget = Container(); + final List _pageData = []; + final List _pages = []; + int _selectedIndex = 0; + + @override + void initState() { + _pageData.addAll([ + AppPageData('Posts', Icons.home, () => const FacebookPostsScreen()), + AppPageData('Photos', Icons.photo_library, + () => const FacebookPhotoAlbumsBrowserScreen()), + AppPageData('Stats', Icons.bar_chart, () => const FacebookStatsScreen()), + AppPageData('Settings', Icons.settings, () => _buildSettingsView()), + ]); + for (var i = 0; i < _pageData.length; i++) { + _pages.add(notInitialiedWidget); + } + + if (FacebookArchiveFolderReader.validateCanReadArchive( + widget.settingsController.rootFolder)) { + _setSelectedIndex(0); + } else { + _setSelectedIndex(_pageData.length - 1); + } + + super.initState(); + } + + @override + void dispose() { + _pages.clear(); + super.dispose(); + } + + void _setSelectedIndex(int value) { + setState(() { + if (_pages[value] == notInitialiedWidget) { + _pages[value] = _pageData[value].widget; + } + _selectedIndex = value; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Row( + children: [ + _buildNavBar(), + SizedBox(width: 1, child: Container(color: Colors.grey)), + _buildMainArea(), + ], + ), + ); + } + + Widget _buildNavBar() { + return LayoutBuilder(builder: (context, constraint) { + return Scrollbar( + isAlwaysShown: true, + child: SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints(minHeight: constraint.maxHeight), + child: IntrinsicHeight( + child: NavigationRail( + destinations: + _pageData.map((p) => p.navRailDestination).toList(), + selectedIndex: _selectedIndex, + onDestinationSelected: _setSelectedIndex, + labelType: NavigationRailLabelType.all, + ), + ), + ), + ), + ); + }); + } + + Widget _buildMainArea() { + return Expanded( + child: IndexedStack(index: _selectedIndex, children: _pages)); + } + + Widget _buildSettingsView() { + return SettingsView(controller: widget.settingsController); + } +} + +class AppPageData { + final String label; + final IconData icon; + final Widget Function() _widgetBuilder; + late final Widget widget = _widgetBuilder(); + final NavigationRailDestination navRailDestination; + + AppPageData(this.label, this.icon, widgetBuilder) + : _widgetBuilder = widgetBuilder, + navRailDestination = + NavigationRailDestination(icon: Icon(icon), label: Text(label)); +} diff --git a/friendica_archive_browser/lib/src/localization/app_en.arb b/friendica_archive_browser/lib/src/localization/app_en.arb index 070aa99..62158b9 100644 --- a/friendica_archive_browser/lib/src/localization/app_en.arb +++ b/friendica_archive_browser/lib/src/localization/app_en.arb @@ -1,6 +1,6 @@ { - "appTitle": "friendica_archive_browser", + "appTitle": "Kyanite", "@appTitle": { - "description": "The title of the application" + "description": "A viewer of Facebook Archive Folders" } } diff --git a/friendica_archive_browser/lib/src/models/stat_bin.dart b/friendica_archive_browser/lib/src/models/stat_bin.dart new file mode 100644 index 0000000..9671043 --- /dev/null +++ b/friendica_archive_browser/lib/src/models/stat_bin.dart @@ -0,0 +1,29 @@ +class StatBin { + static final DateTime noData = DateTime.fromMillisecondsSinceEpoch(0); + final DateTime? _binEpoch; + final int _index; + int _count; + + DateTime get binEpoch => _binEpoch ?? noData; + + bool get hasEpoch => _binEpoch != null; + + int get count => _count; + + int get index => _index; + + StatBin({required index, DateTime? binEpoch, int initialCount = 0}) + : _count = initialCount, + _index = index, + _binEpoch = binEpoch; + + int increment({int amount = 1}) { + _count += amount; + return _count; + } + + @override + String toString() { + return 'StatBin{index: $_index, binEpoch: $_binEpoch, count: $_count}'; + } +} diff --git a/friendica_archive_browser/lib/src/models/time_element.dart b/friendica_archive_browser/lib/src/models/time_element.dart new file mode 100644 index 0000000..3b45a14 --- /dev/null +++ b/friendica_archive_browser/lib/src/models/time_element.dart @@ -0,0 +1,18 @@ +class TimeElement { + final DateTime timestamp; + final bool hasImages; + final bool hasVideos; + final String text; + final String title; + + TimeElement( + {int timeInMS = 0, + this.hasImages = false, + this.hasVideos = false, + this.text = '', + this.title = ''}) + : timestamp = DateTime.fromMillisecondsSinceEpoch(timeInMS); + + bool hasText(String phrase) => + text.contains(phrase) || title.contains(phrase); +} diff --git a/friendica_archive_browser/lib/src/sample_feature/sample_item.dart b/friendica_archive_browser/lib/src/sample_feature/sample_item.dart deleted file mode 100644 index b376e0d..0000000 --- a/friendica_archive_browser/lib/src/sample_feature/sample_item.dart +++ /dev/null @@ -1,6 +0,0 @@ -/// A placeholder class that represents an entity or model. -class SampleItem { - const SampleItem(this.id); - - final int id; -} diff --git a/friendica_archive_browser/lib/src/sample_feature/sample_item_details_view.dart b/friendica_archive_browser/lib/src/sample_feature/sample_item_details_view.dart deleted file mode 100644 index 66b1288..0000000 --- a/friendica_archive_browser/lib/src/sample_feature/sample_item_details_view.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:flutter/material.dart'; - -/// Displays detailed information about a SampleItem. -class SampleItemDetailsView extends StatelessWidget { - const SampleItemDetailsView({Key? key}) : super(key: key); - - static const routeName = '/sample_item'; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Item Details'), - ), - body: const Center( - child: Text('More Information Here'), - ), - ); - } -} diff --git a/friendica_archive_browser/lib/src/sample_feature/sample_item_list_view.dart b/friendica_archive_browser/lib/src/sample_feature/sample_item_list_view.dart deleted file mode 100644 index e251432..0000000 --- a/friendica_archive_browser/lib/src/sample_feature/sample_item_list_view.dart +++ /dev/null @@ -1,71 +0,0 @@ -import 'package:flutter/material.dart'; - -import '../settings/settings_view.dart'; -import 'sample_item.dart'; -import 'sample_item_details_view.dart'; - -/// Displays a list of SampleItems. -class SampleItemListView extends StatelessWidget { - const SampleItemListView({ - Key? key, - this.items = const [SampleItem(1), SampleItem(2), SampleItem(3)], - }) : super(key: key); - - static const routeName = '/'; - - final List items; - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Sample Items'), - actions: [ - IconButton( - icon: const Icon(Icons.settings), - onPressed: () { - // Navigate to the settings page. If the user leaves and returns - // to the app after it has been killed while running in the - // background, the navigation stack is restored. - Navigator.restorablePushNamed(context, SettingsView.routeName); - }, - ), - ], - ), - - // To work with lists that may contain a large number of items, it’s best - // to use the ListView.builder constructor. - // - // In contrast to the default ListView constructor, which requires - // building all Widgets up front, the ListView.builder constructor lazily - // builds Widgets as they’re scrolled into view. - body: ListView.builder( - // Providing a restorationId allows the ListView to restore the - // scroll position when a user leaves and returns to the app after it - // has been killed while running in the background. - restorationId: 'sampleItemListView', - itemCount: items.length, - itemBuilder: (BuildContext context, int index) { - final item = items[index]; - - return ListTile( - title: Text('SampleItem ${item.id}'), - leading: const CircleAvatar( - // Display the Flutter Logo image asset. - foregroundImage: AssetImage('assets/images/flutter_logo.png'), - ), - onTap: () { - // Navigate to the details page. If the user leaves and returns to - // the app after it has been killed while running in the - // background, the navigation stack is restored. - Navigator.restorablePushNamed( - context, - SampleItemDetailsView.routeName, - ); - } - ); - }, - ), - ); - } -} diff --git a/friendica_archive_browser/lib/src/screens/error_screen.dart b/friendica_archive_browser/lib/src/screens/error_screen.dart new file mode 100644 index 0000000..56a4283 --- /dev/null +++ b/friendica_archive_browser/lib/src/screens/error_screen.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/settings/settings_controller.dart'; +import 'package:friendica_archive_browser/src/utils/exec_error.dart'; +import 'package:provider/provider.dart'; + +class ErrorScreen extends StatelessWidget { + final ExecError error; + final String title; + + const ErrorScreen( + {Key? key, this.title = 'Error executing', required this.error}) + : super(key: key); + + @override + Widget build(BuildContext context) { + final logPath = Provider.of(context).logPath; + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + title, + textAlign: TextAlign.center, + style: Theme.of(context).textTheme.headline6, + softWrap: true, + ), + const SizedBox(height: 5), + SelectableText('See logfile for more details: $logPath'), + const SizedBox(height: 5), + if (error.exception != null) + SelectableText('Error with exception: ${error.exception}'), + const SizedBox(height: 5), + if (error.errorMessage.isNotEmpty) SelectableText(error.errorMessage), + ], + )); + } +} diff --git a/friendica_archive_browser/lib/src/screens/loading_status_screen.dart b/friendica_archive_browser/lib/src/screens/loading_status_screen.dart new file mode 100644 index 0000000..8a1fd79 --- /dev/null +++ b/friendica_archive_browser/lib/src/screens/loading_status_screen.dart @@ -0,0 +1,24 @@ +import 'package:flutter/material.dart'; + +class LoadingStatusScreen extends StatelessWidget { + final String title; + final String subTitle; + + const LoadingStatusScreen({Key? key, required this.title, this.subTitle = ''}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Center( + child: Column(mainAxisAlignment: MainAxisAlignment.center, children: [ + Text(title, style: const TextStyle(fontSize: 18)), + const SizedBox(height: 20), + if (subTitle.isNotEmpty) ...[ + Text(subTitle, style: const TextStyle(fontSize: 14)), + const SizedBox(height: 20) + ], + const CircularProgressIndicator() + ]), + ); + } +} diff --git a/friendica_archive_browser/lib/src/screens/standin_status_screen.dart b/friendica_archive_browser/lib/src/screens/standin_status_screen.dart new file mode 100644 index 0000000..f9d265b --- /dev/null +++ b/friendica_archive_browser/lib/src/screens/standin_status_screen.dart @@ -0,0 +1,34 @@ +import 'package:flutter/material.dart'; + +class StandInStatusScreen extends StatelessWidget { + final String title; + final String subTitle; + + const StandInStatusScreen({Key? key, required this.title, this.subTitle = ''}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text( + title, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 28), + softWrap: true, + ), + const SizedBox(height: 5), + if (subTitle.isNotEmpty) + Text( + subTitle, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 20), + softWrap: true, + ), + ], + )); + } +} diff --git a/friendica_archive_browser/lib/src/settings/settings_controller.dart b/friendica_archive_browser/lib/src/settings/settings_controller.dart index e32c0df..4359076 100644 --- a/friendica_archive_browser/lib/src/settings/settings_controller.dart +++ b/friendica_archive_browser/lib/src/settings/settings_controller.dart @@ -1,43 +1,97 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/settings/video_player_settings.dart'; +import 'package:friendica_archive_browser/src/utils/temp_file_builder.dart'; +import 'package:intl/intl.dart'; +import 'package:logging/logging.dart'; +import 'package:path_provider/path_provider.dart'; import 'settings_service.dart'; -/// A class that many Widgets can interact with to read user settings, update -/// user settings, or listen to user settings changes. -/// -/// Controllers glue Data Services to Flutter Widgets. The SettingsController -/// uses the SettingsService to store and retrieve user settings. class SettingsController with ChangeNotifier { - SettingsController(this._settingsService); - - // Make SettingsService a private variable so it is not used directly. + final String logPath; final SettingsService _settingsService; - // Make ThemeMode a private variable so it is not updated directly without - // also persisting the changes with the SettingsService. - late ThemeMode _themeMode; + SettingsController({required this.logPath}) + : _settingsService = SettingsService(); - // Allow Widgets to read the user's preferred ThemeMode. - ThemeMode get themeMode => _themeMode; - - /// Load the user's settings from the SettingsService. It may load from a - /// local database or the internet. The controller only knows it can load the - /// settings from the service. Future loadSettings() async { _themeMode = await _settingsService.themeMode(); - - // Important! Inform listeners a change has occurred. + _rootFolder = await _settingsService.rootFolder(); + _videoPlayerSettingType = await _settingsService.videoPlayerSettingType(); + _videoPlayerCommand = await _settingsService.videoPlayerCommand(); + _dateTimeFormatter = DateFormat('MMMM dd yyyy h:mm a'); + _dateFormatter = DateFormat('MMMM dd yyyy'); + _logLevel = await _settingsService.logLevel(); + _appDataDirectory = await getApplicationSupportDirectory(); + _facebookName = await _settingsService.facebookName(); + _geoCacheDirectory = await getTileCachedDirectory(); + Logger.root.level = _logLevel; notifyListeners(); } - /// Update and persist the ThemeMode based on the user's selection. + late Directory _geoCacheDirectory; + + Directory get geoCacheDirectory => _geoCacheDirectory; + + late Directory _appDataDirectory; + + Directory get appDataDirectory => _appDataDirectory; + + late Level _logLevel; + + Level get logLevel => _logLevel; + + Future updateLogLevel(Level newLevel) async { + if (newLevel == _logLevel) return; + _logLevel = newLevel; + Logger.root.level = _logLevel; + await _settingsService.updateLevel(newLevel); + notifyListeners(); + } + + late DateFormat _dateTimeFormatter; + + DateFormat get dateTimeFormatter => _dateTimeFormatter; + + late DateFormat _dateFormatter; + + DateFormat get dateFormatter => _dateFormatter; + + late String _rootFolder; + + String get rootFolder => _rootFolder; + + Future updateRootFolder(String newPath) async { + if (newPath == _rootFolder) return; + _rootFolder = newPath; + notifyListeners(); + await _settingsService.updateRootFolder(newPath); + } + + late String _facebookName; + + String get facebookName => _facebookName; + + Future updateFacebookName(String newName) async { + if (newName == _facebookName) return; + _facebookName = newName; + notifyListeners(); + await _settingsService.updateFacebookName(newName); + } + + late ThemeMode _themeMode; + + ThemeMode get themeMode => _themeMode; + Future updateThemeMode(ThemeMode? newThemeMode) async { if (newThemeMode == null) return; - // Do not perform any work if new and old ThemeMode are identical + // Dot not perform any work if new and old ThemeMode are identical if (newThemeMode == _themeMode) return; - // Otherwise, store the new ThemeMode in memory + // Otherwise, store the new theme mode in memory _themeMode = newThemeMode; // Important! Inform listeners a change has occurred. @@ -47,4 +101,34 @@ class SettingsController with ChangeNotifier { // SettingService. await _settingsService.updateThemeMode(newThemeMode); } + + late VideoPlayerSettingType _videoPlayerSettingType; + + VideoPlayerSettingType get videoPlayerSettingType => _videoPlayerSettingType; + + Future updateVideoPlayerSettingType(VideoPlayerSettingType type) async { + if (type == _videoPlayerSettingType) return; + _videoPlayerSettingType = type; + if (_videoPlayerSettingType != VideoPlayerSettingType.custom) { + await _resetVideoPlayerCommand(); + } + notifyListeners(); + await _settingsService.updateVideoPlayerSettingType(type); + } + + late String _videoPlayerCommand; + + String get videoPlayerCommand => _videoPlayerCommand; + + Future updateVideoPlayerCommand(String newCommand) async { + if (newCommand == _videoPlayerCommand) return; + _videoPlayerCommand = newCommand; + notifyListeners(); + await _settingsService.updateVideoPlayerCommand(newCommand); + } + + Future _resetVideoPlayerCommand() async { + _videoPlayerCommand = _videoPlayerSettingType.toAppPath(); + await _settingsService.updateVideoPlayerCommand(_videoPlayerCommand); + } } diff --git a/friendica_archive_browser/lib/src/settings/settings_service.dart b/friendica_archive_browser/lib/src/settings/settings_service.dart index 6f94dc3..4248ea3 100644 --- a/friendica_archive_browser/lib/src/settings/settings_service.dart +++ b/friendica_archive_browser/lib/src/settings/settings_service.dart @@ -1,17 +1,122 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; +import 'package:logging/logging.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'video_player_settings.dart'; -/// A service that stores and retrieves user settings. -/// -/// By default, this class does not persist user settings. If you'd like to -/// persist the user settings locally, use the shared_preferences package. If -/// you'd like to store settings on a web server, use the http package. class SettingsService { - /// Loads the User's preferred ThemeMode from local or remote storage. - Future themeMode() async => ThemeMode.system; + static const themeDarknessKey = 'themeDarkness'; + static const rootFolderKey = 'rootFolder'; + static const videoPlayerSettingTypeKey = 'videoPlayerSettingType'; + static const videoPlayerCommandKey = 'videoPlayerCustomPath'; + static const logLevelKey = "logLevel"; + static const facebookNameKey = 'facebookName'; + + Future logLevel() async { + const defaultLevelIndex = 5; //INFO + final prefs = await SharedPreferences.getInstance(); + final levelIndex = prefs.getInt(logLevelKey) ?? defaultLevelIndex; + if (levelIndex > Level.LEVELS.length - 1 || levelIndex < 0) { + return Level.INFO; + } + + return Level.LEVELS[levelIndex]; + } + + Future updateLevel(Level newLevel) async { + final prefs = await SharedPreferences.getInstance(); + final index = Level.LEVELS.indexOf(newLevel); + prefs.setInt(logLevelKey, index); + } + + Future themeMode() async { + final prefs = await SharedPreferences.getInstance(); + final themeIndex = prefs.getInt(themeDarknessKey) ?? 0; + if (themeIndex > ThemeMode.values.length - 1 || themeIndex < 0) { + return ThemeMode.system; + } + + return ThemeMode.values[themeIndex]; + } - /// Persists the user's preferred ThemeMode to local or remote storage. Future updateThemeMode(ThemeMode theme) async { - // Use the shared_preferences package to persist settings locally or the - // http package to persist settings over the network. + final prefs = await SharedPreferences.getInstance(); + prefs.setInt(themeDarknessKey, theme.index); + } + + Future rootFolder() async { + final prefs = await SharedPreferences.getInstance(); + final result = prefs.getString(rootFolderKey) ?? ''; + return result; + } + + Future updateRootFolder(String folder) async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setString(rootFolderKey, folder); + } + + Future facebookName() async { + final prefs = await SharedPreferences.getInstance(); + final result = prefs.getString(facebookNameKey) ?? ''; + return result; + } + + Future updateFacebookName(String folder) async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setString(facebookNameKey, folder); + } + + Future videoPlayerSettingType() async { + final prefs = await SharedPreferences.getInstance(); + if (!prefs.containsKey(videoPlayerSettingTypeKey)) { + return _platformDefaultVideoType(); + } + final type = prefs.getInt(videoPlayerSettingTypeKey) ?? 0; + if (type > VideoPlayerSettingType.values.length - 1 || type < 0) { + return _platformDefaultVideoType(); + } + + return VideoPlayerSettingType.values[type]; + } + + Future updateVideoPlayerSettingType( + VideoPlayerSettingType videoPlayerType) async { + final prefs = await SharedPreferences.getInstance(); + prefs.setInt(videoPlayerSettingTypeKey, videoPlayerType.index); + } + + Future videoPlayerCommand() async { + final prefs = await SharedPreferences.getInstance(); + final result = prefs.getString(videoPlayerCommandKey); + if (result != null) { + return result; + } + + final currentType = await videoPlayerSettingType(); + + return currentType.toAppPath(); + } + + Future updateVideoPlayerCommand(String videoPlayerCommand) async { + final prefs = await SharedPreferences.getInstance(); + await prefs.setString(videoPlayerCommandKey, videoPlayerCommand); + } + + VideoPlayerSettingType _platformDefaultVideoType() { + if (Platform.isWindows) { + return VideoPlayerSettingType.windows; + } + + if (Platform.isMacOS) { + return VideoPlayerSettingType.macOS; + } + + if (Platform.isLinux) { + return VideoPlayerSettingType.linuxVlc; + } + + return VideoPlayerSettingType.custom; } } diff --git a/friendica_archive_browser/lib/src/settings/settings_view.dart b/friendica_archive_browser/lib/src/settings/settings_view.dart index 496b241..f72f9dc 100644 --- a/friendica_archive_browser/lib/src/settings/settings_view.dart +++ b/friendica_archive_browser/lib/src/settings/settings_view.dart @@ -1,35 +1,215 @@ +import 'dart:io'; + +import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; +import 'package:friendica_archive_browser/src/friendica/services/facebook_archive_reader.dart'; +import 'package:friendica_archive_browser/src/settings/video_player_settings.dart'; +import 'package:friendica_archive_browser/src/utils/clipboard_helper.dart'; +import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; +import 'package:logging/logging.dart'; import 'settings_controller.dart'; -/// Displays the various settings that can be customized by the user. -/// -/// When a user changes a setting, the SettingsController is updated and -/// Widgets that listen to the SettingsController are rebuilt. -class SettingsView extends StatelessWidget { - const SettingsView({Key? key, required this.controller}) : super(key: key); +class SettingsView extends StatefulWidget { + const SettingsView({Key? key, required SettingsController controller}) + : _settingsController = controller, + super(key: key); static const routeName = '/settings'; - final SettingsController controller; + final SettingsController _settingsController; + + @override + State createState() => _SettingsViewState(); +} + +class _SettingsViewState extends State { + static final _logger = Logger('$_SettingsViewState'); + final _facebookNameController = TextEditingController(); + final _folderPathController = TextEditingController(); + final _videoPlayerPathController = TextEditingController(); + String? _invalidFolderString; + VideoPlayerSettingType _videoPlayerTypeOption = VideoPlayerSettingType.custom; + bool _validRootFolder = false; + bool _differentSettingValues = false; + Level _logLevel = Level.SEVERE; + + @override + void initState() { + _folderPathController.addListener(_validateRootFolder); + _facebookNameController.addListener(() { + _updateSettingsValueDiffs(); + }); + _videoPlayerPathController.addListener(() { + _updateSettingsValueDiffs(); + }); + _setInitialValues(); + super.initState(); + } @override Widget build(BuildContext context) { + _updateSettingsValueDiffs(); return Scaffold( - appBar: AppBar( - title: const Text('Settings'), - ), - body: Padding( - padding: const EdgeInsets.all(16), - // Glue the SettingsController to the theme selection DropdownButton. - // - // When a user selects a theme from the dropdown list, the - // SettingsController is updated, which rebuilds the MaterialApp. - child: DropdownButton( - // Read the selected themeMode from the controller - value: controller.themeMode, - // Call the updateThemeMode method any time the user selects a theme. - onChanged: controller.updateThemeMode, + appBar: AppBar( + title: const Text('Settings'), + backgroundColor: Theme.of(context).canvasColor, + foregroundColor: Theme.of(context).primaryColor, + elevation: 0.0, + ), + body: Padding( + padding: const EdgeInsets.all(16.0), + child: Column(children: [ + _buildThemeOptions(context), + const SizedBox(height: 10), + const Divider(), + const SizedBox(height: 10), + _buildLoggingOptions(context), + const SizedBox(height: 10), + _buildFacebookNameOptions(context), + const SizedBox(height: 10), + _buildLogFilePath(context), + const SizedBox(height: 10), + _buildGeocacheOptions(context), + const SizedBox(height: 10), + _buildRootFolderOption(context), + const SizedBox(height: 10), + _buildVideoPlayerOption(context), + const SizedBox(height: 10), + _buildSaveCancelButtonRow(), + ]), + )); + } + + Widget _buildLoggingOptions(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('Logging Level: ', style: Theme.of(context).textTheme.bodyText1), + const SizedBox(width: 10), + DropdownButton( + value: _logLevel, + onChanged: (newLevel) async { + _logLevel = newLevel ?? Level.INFO; + setState(() {}); + }, + items: Level.LEVELS + .map((level) => + DropdownMenuItem(value: level, child: Text(level.name))) + .toList()), + ]); + } + + Widget _buildLogFilePath(BuildContext context) { + final path = widget._settingsController.logPath; + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('Log file: ', style: Theme.of(context).textTheme.bodyText1), + const SizedBox(width: 10), + Expanded( + child: Text(path, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.bodyText2)), + const SizedBox(width: 10), + IconButton( + onPressed: () async { + await copyToClipboard( + context: context, + text: path, + snackbarMessage: 'Copied "$path" to clipboard'); + }, + icon: const Icon(Icons.copy)), + ]); + } + + Widget _buildGeocacheOptions(BuildContext context) { + final path = widget._settingsController.geoCacheDirectory.path; + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('Map Tile Directory: ', + style: Theme.of(context).textTheme.bodyText1), + const SizedBox(width: 10), + Expanded( + child: Text(path, + overflow: TextOverflow.ellipsis, + style: Theme.of(context).textTheme.bodyText2)), + const SizedBox(width: 10), + IconButton( + onPressed: () async { + try { + _logger.fine('Flushing tile cache folder: $path'); + await Directory(path).delete(recursive: true); + Directory(path).createSync(recursive: true); + SnackBarStatusBuilder.buildSnackbar( + context, 'Geocache cleared'); + _logger.fine('Tile cache cleared: $path'); + } catch (e) { + _logger.severe('Error flushing tile cache: $e'); + } + }, + icon: const Icon(Icons.delete_sweep)), + ]); + } + + Widget _buildRootFolderOption(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('Archive Folder: ', + style: Theme.of(context).textTheme.bodyText1), + const SizedBox(width: 10), + Expanded( + child: TextField( + controller: _folderPathController, + decoration: InputDecoration( + hintText: + 'Root folder of the unzipped Facebook archive file', + errorText: _invalidFolderString, + ))), + const SizedBox(width: 15), + IconButton( + onPressed: _setNewRootFolder, + icon: const Icon(Icons.folder_outlined)), + ]); + } + + Widget _buildFacebookNameOptions(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text("Facebook User's Name:", + style: Theme.of(context).textTheme.bodyText1), + const SizedBox(width: 10), + Expanded( + child: TextField( + controller: _facebookNameController, + decoration: const InputDecoration( + hintText: 'Displayed user name (used for filtering titles)', + ))), + ]); + } + + Widget _buildThemeOptions(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('Application Theme: ', + style: Theme.of(context).textTheme.bodyText1), + const SizedBox(width: 10), + DropdownButton( + value: widget._settingsController.themeMode, + onChanged: (newMode) async { + await widget._settingsController.updateThemeMode(newMode); + setState(() {}); + }, items: const [ DropdownMenuItem( value: ThemeMode.system, @@ -45,7 +225,149 @@ class SettingsView extends StatelessWidget { ) ], ), - ), + ], ); } + + Widget _buildVideoPlayerOption(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('Video Player: ', style: Theme.of(context).textTheme.bodyText1), + const SizedBox(width: 10), + DropdownButton( + value: _videoPlayerTypeOption, + onChanged: (newPlayer) async { + setState(() { + _videoPlayerTypeOption = + newPlayer ?? VideoPlayerSettingType.custom; + _videoPlayerPathController.text = + _videoPlayerTypeOption.toAppPath(); + }); + }, + items: VideoPlayerSettingType.values + .map((e) => e.toDropDownMenuItem()) + .toList(), + ), + const SizedBox(width: 10), + Expanded( + child: TextField( + enabled: + _videoPlayerTypeOption == VideoPlayerSettingType.custom, + controller: _videoPlayerPathController, + decoration: const InputDecoration( + hintText: 'Command to play videos', + ))), + const SizedBox(width: 15), + IconButton( + onPressed: _setNewCustomPlayerPath, + icon: const Icon(Icons.folder_outlined)), + ]); + } + + Widget _buildSaveCancelButtonRow() { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + onPressed: _differentSettingValues ? _saveSettings : null, + child: const Text('Save Settings')), + const SizedBox(width: 10), + ElevatedButton( + onPressed: _setInitialValues, child: const Text('Cancel Changes')) + ], + ); + } + + Future _saveSettings() async { + await widget._settingsController + .updateRootFolder(_folderPathController.text); + await widget._settingsController + .updateVideoPlayerSettingType(_videoPlayerTypeOption); + if (_videoPlayerTypeOption == VideoPlayerSettingType.custom) { + await widget._settingsController + .updateVideoPlayerCommand(_videoPlayerPathController.text); + } + await widget._settingsController.updateLogLevel(_logLevel); + await widget._settingsController + .updateFacebookName(_facebookNameController.text); + setState(() {}); + } + + void _setInitialValues() { + _folderPathController.text = widget._settingsController.rootFolder; + _validateRootFolder(); + _videoPlayerTypeOption = widget._settingsController.videoPlayerSettingType; + _videoPlayerPathController.text = + widget._settingsController.videoPlayerCommand; + _logLevel = widget._settingsController.logLevel; + _facebookNameController.text = widget._settingsController.facebookName; + } + + void _updateSettingsValueDiffs() { + bool oldValue = _differentSettingValues; + bool newValue = false; + newValue |= + (_folderPathController.text != widget._settingsController.rootFolder && + _validRootFolder); + newValue |= (_videoPlayerTypeOption != + widget._settingsController.videoPlayerSettingType); + newValue |= (_videoPlayerPathController.text != + widget._settingsController.videoPlayerCommand); + newValue |= (_logLevel != widget._settingsController.logLevel); + newValue |= (_facebookNameController.text != + widget._settingsController.facebookName); + if (oldValue == newValue) return; + setState(() { + _differentSettingValues = newValue; + }); + } + + void _validateRootFolder() { + setState(() { + _validRootFolder = false; + if (!Directory(_folderPathController.text).existsSync()) { + _invalidFolderString = 'Choose an existing folder'; + return; + } + + if (!FacebookArchiveFolderReader.validateCanReadArchive( + _folderPathController.text)) { + _invalidFolderString = + 'Choose a folder that is a Facebook Archive and accessible.\nOn Macs make sure root folder is in Downloads directory.'; + return; + } + + _invalidFolderString = null; + _validRootFolder = true; + }); + } + + void _setNewRootFolder() async { + final path = await FilePicker.platform.getDirectoryPath(); + + if (path == null) { + return; + } + + setState(() { + _folderPathController.text = path; + }); + } + + void _setNewCustomPlayerPath() async { + final picked = await FilePicker.platform.pickFiles( + dialogTitle: 'Pick Video player', + type: FileType.any, + allowMultiple: false); + + if (picked == null || picked.paths.isEmpty) { + return; + } + + setState(() { + _videoPlayerPathController.text = picked.paths.first ?? ''; + }); + } } diff --git a/friendica_archive_browser/lib/src/settings/video_player_settings.dart b/friendica_archive_browser/lib/src/settings/video_player_settings.dart new file mode 100644 index 0000000..be090c5 --- /dev/null +++ b/friendica_archive_browser/lib/src/settings/video_player_settings.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +enum VideoPlayerSettingType { + windows, // + macOS, //open + linuxVlc, //vlc + linuxTotem, //totem + linukMpv, //gnome-mpv + custom, +} + +extension VideoPathMapping on VideoPlayerSettingType { + String toAppPath() { + switch (this) { + case VideoPlayerSettingType.custom: + return ''; + case VideoPlayerSettingType.linuxVlc: + return 'vlc'; + case VideoPlayerSettingType.linuxTotem: + return 'totem'; + case VideoPlayerSettingType.linukMpv: + return 'gnome-mpv'; + case VideoPlayerSettingType.macOS: + return 'open'; + case VideoPlayerSettingType.windows: + return 'C:\\Program Files\\Windows Media Player\\wmplayer.exe'; + } + } + + DropdownMenuItem toDropDownMenuItem() { + switch (this) { + case VideoPlayerSettingType.custom: + return const DropdownMenuItem( + value: VideoPlayerSettingType.custom, + child: Text('Custom'), + ); + case VideoPlayerSettingType.linuxVlc: + return const DropdownMenuItem( + value: VideoPlayerSettingType.linuxVlc, + child: Text('VLC (Linux)'), + ); + case VideoPlayerSettingType.linuxTotem: + return const DropdownMenuItem( + value: VideoPlayerSettingType.linuxTotem, + child: Text('Totem (Linux)'), + ); + case VideoPlayerSettingType.linukMpv: + return const DropdownMenuItem( + value: VideoPlayerSettingType.linukMpv, + child: Text('MPV (Linux)'), + ); + case VideoPlayerSettingType.macOS: + return const DropdownMenuItem( + value: VideoPlayerSettingType.macOS, + child: Text('macOS'), + ); + case VideoPlayerSettingType.windows: + return const DropdownMenuItem( + value: VideoPlayerSettingType.windows, + child: Text('Windows'), + ); + } + } +} diff --git a/friendica_archive_browser/lib/src/themes.dart b/friendica_archive_browser/lib/src/themes.dart new file mode 100644 index 0000000..87e8e45 --- /dev/null +++ b/friendica_archive_browser/lib/src/themes.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class FriendicaArchiveBrowserTheme { + static ThemeData dark = ThemeData.dark().copyWith( + primaryColor: Colors.white, + ); + + static ThemeData light = ThemeData.light().copyWith( + primaryColor: Colors.black, + ); + + static ThemeData darkroom = dark.copyWith( + appBarTheme: const AppBarTheme( + backgroundColor: Colors.black, + ), + scaffoldBackgroundColor: Colors.black, + floatingActionButtonTheme: const FloatingActionButtonThemeData( + foregroundColor: Colors.white, + backgroundColor: Colors.indigo, + ), + bottomNavigationBarTheme: const BottomNavigationBarThemeData( + selectedItemColor: Colors.green, + ), + ); +} diff --git a/friendica_archive_browser/lib/src/utils/clipboard_helper.dart b/friendica_archive_browser/lib/src/utils/clipboard_helper.dart new file mode 100644 index 0000000..02db994 --- /dev/null +++ b/friendica_archive_browser/lib/src/utils/clipboard_helper.dart @@ -0,0 +1,11 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:friendica_archive_browser/src/utils/snackbar_status_builder.dart'; + +Future copyToClipboard( + {required BuildContext context, + required String text, + required String snackbarMessage}) async { + await Clipboard.setData(ClipboardData(text: text)); + SnackBarStatusBuilder.buildSnackbar(context, snackbarMessage); +} diff --git a/friendica_archive_browser/lib/src/utils/exec_error.dart b/friendica_archive_browser/lib/src/utils/exec_error.dart new file mode 100644 index 0000000..41af06e --- /dev/null +++ b/friendica_archive_browser/lib/src/utils/exec_error.dart @@ -0,0 +1,23 @@ +import 'package:result_monad/result_monad.dart'; + +class ExecError { + final int errorCode; + final Object? exception; + final String errorMessage; + + @override + String toString() { + return 'ExecError{\n errorCode: $errorCode,\n exception: $exception,\n errorMessage: $errorMessage\n}'; + } + + ExecError({this.errorCode = -1, this.errorMessage = '', this.exception}); + + ExecError.message(this.errorMessage) + : errorCode = 0, + exception = null; +} + +extension ResultToExecError on Result { + Result mapExceptionErrorToExecError() => + mapError((error) => ExecError(exception: error)); +} diff --git a/friendica_archive_browser/lib/src/utils/scrolling_behavior.dart b/friendica_archive_browser/lib/src/utils/scrolling_behavior.dart new file mode 100644 index 0000000..4271ecd --- /dev/null +++ b/friendica_archive_browser/lib/src/utils/scrolling_behavior.dart @@ -0,0 +1,11 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +class FacebookAppScrollingBehavior extends MaterialScrollBehavior { + @override + Set get dragDevices => { + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }; +} diff --git a/friendica_archive_browser/lib/src/utils/snackbar_status_builder.dart b/friendica_archive_browser/lib/src/utils/snackbar_status_builder.dart new file mode 100644 index 0000000..f60a32c --- /dev/null +++ b/friendica_archive_browser/lib/src/utils/snackbar_status_builder.dart @@ -0,0 +1,15 @@ +import 'package:flutter/material.dart'; + +class SnackBarStatusBuilder { + static Future buildSnackbar(BuildContext context, String message, + {int durationSec = 10}) async { + final snackBar = SnackBar( + content: SelectableText(message), + duration: Duration(seconds: durationSec), + action: SnackBarAction( + label: 'Dismiss', + onPressed: () => + ScaffoldMessenger.of(context).hideCurrentSnackBar())); + ScaffoldMessenger.of(context).showSnackBar(snackBar); + } +} diff --git a/friendica_archive_browser/lib/src/utils/temp_file_builder.dart b/friendica_archive_browser/lib/src/utils/temp_file_builder.dart new file mode 100644 index 0000000..2ad27a5 --- /dev/null +++ b/friendica_archive_browser/lib/src/utils/temp_file_builder.dart @@ -0,0 +1,36 @@ +import 'dart:io'; + +import 'package:intl/intl.dart'; +import 'package:path/path.dart' as p; +import 'package:path_provider/path_provider.dart'; + +Future getTempFile(String prefix, String extension) async { + final tempDirPath = await customGetTempDirectory(); + final dateString = DateFormat('yyyyMMdd_HHmmss').format(DateTime.now()); + return '$tempDirPath$prefix$dateString$extension'; +} + +Future customGetTempDirectory() async { + if (Platform.isMacOS) { + final tempDirPathFromEnv = Platform.environment['TMPDIR']; + if (tempDirPathFromEnv != null) { + return tempDirPathFromEnv; + } + } + + final tempDirPath = await getTemporaryDirectory(); + return tempDirPath.path + Platform.pathSeparator; +} + +Future getTileCachedDirectory() async { + final base = await getApplicationSupportDirectory(); + final cachePath = p.join(base.path, 'geocache'); + final cacheDir = Directory(cachePath); + await cacheDir.create(recursive: true); + return cacheDir; +} + +File getTileCachedFile(Directory cacheDirectory, String filename) { + final path = p.join(cacheDirectory.path, filename); + return File(path); +} diff --git a/friendica_archive_browser/lib/src/utils/time_stat_generator.dart b/friendica_archive_browser/lib/src/utils/time_stat_generator.dart new file mode 100644 index 0000000..5633572 --- /dev/null +++ b/friendica_archive_browser/lib/src/utils/time_stat_generator.dart @@ -0,0 +1,78 @@ +import 'package:friendica_archive_browser/src/models/stat_bin.dart'; +import 'package:friendica_archive_browser/src/models/time_element.dart'; + +class TimeStatGenerator { + final List _elements; + + TimeStatGenerator(Iterable items) : _elements = items.toList() { + _elements.sort((e1, e2) => e1.timestamp.compareTo(e2.timestamp)); + } + + List get sortedElements => List.unmodifiable(_elements); + + List calculateDailyStats() { + final result = []; + final interimBins = {}; + for (final element in _elements) { + final day = element.timestamp.toDayOnly(); + final currentSum = interimBins[day] ?? 0; + interimBins[day] = currentSum + 1; + } + + for (final bin in interimBins.entries) { + result.add(StatBin(index: 0, binEpoch: bin.key, initialCount: bin.value)); + } + + result.sort((a, b) => a.binEpoch.compareTo(b.binEpoch)); + + return result; + } + + List calculateByDayOfWeekStats() => _calculateStats( + binCount: 7, + elementToTimeIndex: (e) => e.timestamp.weekday, + timeIndexToArrayIndex: (ti) => ti - 1, + arrayIndexToTimeIndex: (ai) => ai + 1); + + List calculateByMonthStats() => _calculateStats( + binCount: 12, + elementToTimeIndex: (e) => e.timestamp.month, + timeIndexToArrayIndex: (ti) => ti - 1, + arrayIndexToTimeIndex: (ai) => ai + 1); + + List calculateStatsByYear() { + if (_elements.isEmpty) { + return []; + } + final earliestYear = _elements.first.timestamp.year; + final latestYear = _elements.last.timestamp.year; + final binCount = latestYear - earliestYear + 1; + return _calculateStats( + binCount: binCount, + elementToTimeIndex: (e) => e.timestamp.year, + timeIndexToArrayIndex: (ti) => ti - earliestYear, + arrayIndexToTimeIndex: (ai) => ai + earliestYear); + } + + List _calculateStats( + {required int binCount, + required int Function(TimeElement) elementToTimeIndex, + required int Function(int) timeIndexToArrayIndex, + required int Function(int) arrayIndexToTimeIndex}) { + final bins = List.generate(binCount, (index) { + final timeIndex = arrayIndexToTimeIndex(index); + return StatBin(index: timeIndex); + }); + + for (final e in _elements) { + final arrayIndex = timeIndexToArrayIndex(elementToTimeIndex(e)); + bins[arrayIndex].increment(); + } + + return bins; + } +} + +extension DateTimeToDateOnly on DateTime { + DateTime toDayOnly() => DateTime(year, month, day); +} diff --git a/friendica_archive_browser/lib/src/utils/word_map_generator.dart b/friendica_archive_browser/lib/src/utils/word_map_generator.dart new file mode 100644 index 0000000..7be657c --- /dev/null +++ b/friendica_archive_browser/lib/src/utils/word_map_generator.dart @@ -0,0 +1,139 @@ +import 'dart:math'; + +class WordMapGenerator { + final _words = {}; + final int minimumWordSize; + final Set _filterWords; + + WordMapGenerator({Set? filterWords, this.minimumWordSize = 1}) + : _filterWords = filterWords ?? {}; + + WordMapGenerator.withCommonWordsFilter({this.minimumWordSize = 1}) + : _filterWords = commonWords; + + void clear() { + _words.clear(); + } + + void processEntry(String text) { + final wordsFromText = text + .toLowerCase() + .replaceAll(RegExp(r'[^\w]+'), ' ') + .replaceAll(RegExp(r'[_]+'), ' ') + .split(RegExp(r'\s+')) + .where((word) => + word.length >= minimumWordSize && !_filterWords.contains(word)); + for (final word in wordsFromText) { + final oldCount = _words[word] ?? 0; + _words[word] = oldCount + 1; + } + } + + List getTopList(int threshold) { + if (_words.isEmpty) { + return []; + } + + final entries = + _words.entries.map((e) => WordMapItem(e.key, e.value)).toList(); + entries.sort((e1, e2) => e2.count.compareTo(e1.count)); + return entries.getRange(0, min(entries.length, threshold)).toList(); + } +} + +class WordMapItem { + final String word; + final int count; + + WordMapItem(this.word, this.count); + + @override + String toString() { + return 'WordMapItem{word: $word, count: $count}'; + } +} + +const commonWords = { + 'does', + 'aren', + 'did', + 'the', + 'and', + 'for', + 'com', + 'you', + 'are', + 'www', + 'but', + 'not', + 'was', + 'all', + 'can', + 'out', + 'one', + 'how', + 'his', + 'him', + 'she', + 'her', + 'don', + 'has', + 'had', + 'why', + 'who', + 'too', + 'let', + 'may', + 'isn', + 'far', + 'utm', + 'yet', + 'that', + 'this', + 'http', + 'https', + 'html', + 'htm', + 'with', + 'they', + 'like', + 'from', + 'about', + 'just', + 'what', + 'their', + 'when', + 'will', + 'even', + 'there' + 'their', + 'than', + 'more', + 'them', + 'these', + 'been', + 'would', + 'there', + 'into', + 'only', + 'still', + 'which', + 'your', + 'have', + 'because', + 'much', + 'didn', + 'back', + 'were', + 'then', + 'very', + 'many' + 'maybe' + 'here', + 'ever', + 'doesn', + 'every', + 'having', + 'already', + 'some', +}; diff --git a/friendica_archive_browser/linux/CMakeLists.txt b/friendica_archive_browser/linux/CMakeLists.txt index 27cbaf7..8bacb49 100644 --- a/friendica_archive_browser/linux/CMakeLists.txt +++ b/friendica_archive_browser/linux/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.10) project(runner LANGUAGES CXX) set(BINARY_NAME "friendica_archive_browser") -set(APPLICATION_ID "com.example.friendica_archive_browser") +set(APPLICATION_ID "social.myportal.friendica_archive_browser") cmake_policy(SET CMP0063 NEW) diff --git a/friendica_archive_browser/linux/flutter/generated_plugin_registrant.cc b/friendica_archive_browser/linux/flutter/generated_plugin_registrant.cc index e71a16d..ae5025a 100644 --- a/friendica_archive_browser/linux/flutter/generated_plugin_registrant.cc +++ b/friendica_archive_browser/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,14 @@ #include "generated_plugin_registrant.h" +#include +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) desktop_window_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopWindowPlugin"); + desktop_window_plugin_register_with_registrar(desktop_window_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); } diff --git a/friendica_archive_browser/linux/flutter/generated_plugins.cmake b/friendica_archive_browser/linux/flutter/generated_plugins.cmake index 51436ae..d4196a6 100644 --- a/friendica_archive_browser/linux/flutter/generated_plugins.cmake +++ b/friendica_archive_browser/linux/flutter/generated_plugins.cmake @@ -3,6 +3,8 @@ # list(APPEND FLUTTER_PLUGIN_LIST + desktop_window + url_launcher_linux ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/friendica_archive_browser/linux/my_application.cc b/friendica_archive_browser/linux/my_application.cc index 61b8894..16801f3 100644 --- a/friendica_archive_browser/linux/my_application.cc +++ b/friendica_archive_browser/linux/my_application.cc @@ -40,14 +40,14 @@ static void my_application_activate(GApplication* application) { if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "friendica_archive_browser"); + gtk_header_bar_set_title(header_bar, "Kyanite"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); } else { - gtk_window_set_title(window, "friendica_archive_browser"); + gtk_window_set_title(window, "Kyanite"); } - gtk_window_set_default_size(window, 1280, 720); + gtk_window_set_default_size(window, 900, 700); gtk_widget_show(GTK_WIDGET(window)); g_autoptr(FlDartProject) project = fl_dart_project_new(); diff --git a/friendica_archive_browser/macos/Flutter/Flutter-Debug.xcconfig b/friendica_archive_browser/macos/Flutter/Flutter-Debug.xcconfig index c2efd0b..4b81f9b 100644 --- a/friendica_archive_browser/macos/Flutter/Flutter-Debug.xcconfig +++ b/friendica_archive_browser/macos/Flutter/Flutter-Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/friendica_archive_browser/macos/Flutter/Flutter-Release.xcconfig b/friendica_archive_browser/macos/Flutter/Flutter-Release.xcconfig index c2efd0b..5caa9d1 100644 --- a/friendica_archive_browser/macos/Flutter/Flutter-Release.xcconfig +++ b/friendica_archive_browser/macos/Flutter/Flutter-Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/friendica_archive_browser/macos/Flutter/GeneratedPluginRegistrant.swift b/friendica_archive_browser/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817..402cf10 100644 --- a/friendica_archive_browser/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/friendica_archive_browser/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,14 @@ import FlutterMacOS import Foundation +import desktop_window +import path_provider_macos +import shared_preferences_macos +import url_launcher_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + DesktopWindowPlugin.register(with: registry.registrar(forPlugin: "DesktopWindowPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) } diff --git a/friendica_archive_browser/macos/Podfile b/friendica_archive_browser/macos/Podfile new file mode 100644 index 0000000..dade8df --- /dev/null +++ b/friendica_archive_browser/macos/Podfile @@ -0,0 +1,40 @@ +platform :osx, '10.11' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/friendica_archive_browser/macos/Podfile.lock b/friendica_archive_browser/macos/Podfile.lock new file mode 100644 index 0000000..ddebf10 --- /dev/null +++ b/friendica_archive_browser/macos/Podfile.lock @@ -0,0 +1,40 @@ +PODS: + - desktop_window (0.0.1): + - FlutterMacOS + - FlutterMacOS (1.0.0) + - path_provider_macos (0.0.1): + - FlutterMacOS + - shared_preferences_macos (0.0.1): + - FlutterMacOS + - url_launcher_macos (0.0.1): + - FlutterMacOS + +DEPENDENCIES: + - desktop_window (from `Flutter/ephemeral/.symlinks/plugins/desktop_window/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + - path_provider_macos (from `Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos`) + - shared_preferences_macos (from `Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos`) + - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + +EXTERNAL SOURCES: + desktop_window: + :path: Flutter/ephemeral/.symlinks/plugins/desktop_window/macos + FlutterMacOS: + :path: Flutter/ephemeral + path_provider_macos: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_macos/macos + shared_preferences_macos: + :path: Flutter/ephemeral/.symlinks/plugins/shared_preferences_macos/macos + url_launcher_macos: + :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + +SPEC CHECKSUMS: + desktop_window: fb7c4f12c1129f947ac482296b6f14059d57a3c3 + FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424 + path_provider_macos: 160cab0d5461f0c0e02995469a98f24bdb9a3f1f + shared_preferences_macos: 480ce071d0666e37cef23fe6c702293a3d21799e + url_launcher_macos: 45af3d61de06997666568a7149c1be98b41c95d4 + +PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c + +COCOAPODS: 1.10.2 diff --git a/friendica_archive_browser/macos/Runner.xcodeproj/project.pbxproj b/friendica_archive_browser/macos/Runner.xcodeproj/project.pbxproj index 9df3dd7..e0d77a4 100644 --- a/friendica_archive_browser/macos/Runner.xcodeproj/project.pbxproj +++ b/friendica_archive_browser/macos/Runner.xcodeproj/project.pbxproj @@ -26,6 +26,7 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 4BDE3286C73FDA8B999E5FF1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5A62DF101BD155ACE6A97EE5 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -54,7 +55,7 @@ /* Begin PBXFileReference section */ 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* friendica_archive_browser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "friendica_archive_browser.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* Kyanite.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Facebook Archive Viewer.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -66,8 +67,13 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 4BB1ABD4272E2E48001A21BE /* RunnerDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerDebug.entitlements; sourceTree = ""; }; + 5A62DF101BD155ACE6A97EE5 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 65CE868E4C57844CD2D62123 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 8FA4A7CF34D8F959E50C03F8 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + 982DE8DD39E855D2451A342E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -75,12 +81,23 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4BDE3286C73FDA8B999E5FF1 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1AD654E9D11F7EC5F226D2B4 /* Pods */ = { + isa = PBXGroup; + children = ( + 982DE8DD39E855D2451A342E /* Pods-Runner.debug.xcconfig */, + 65CE868E4C57844CD2D62123 /* Pods-Runner.release.xcconfig */, + 8FA4A7CF34D8F959E50C03F8 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; 33BA886A226E78AF003329D5 /* Configs */ = { isa = PBXGroup; children = ( @@ -99,13 +116,14 @@ 33CEB47122A05771004F2AC0 /* Flutter */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, + 1AD654E9D11F7EC5F226D2B4 /* Pods */, ); sourceTree = ""; }; 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( - 33CC10ED2044A3C60003C045 /* friendica_archive_browser.app */, + 33CC10ED2044A3C60003C045 /* Kyanite.app */, ); name = Products; sourceTree = ""; @@ -135,6 +153,7 @@ 33FAB671232836740065AC1E /* Runner */ = { isa = PBXGroup; children = ( + 4BB1ABD4272E2E48001A21BE /* RunnerDebug.entitlements */, 33CC10F02044A3C60003C045 /* AppDelegate.swift */, 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, 33E51913231747F40026EE4D /* DebugProfile.entitlements */, @@ -148,6 +167,7 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( + 5A62DF101BD155ACE6A97EE5 /* Pods_Runner.framework */, ); name = Frameworks; sourceTree = ""; @@ -159,11 +179,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 433B9574F7E94075D058E585 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, + 44C7D6FFFB0D86BDDC27CD29 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -172,7 +194,7 @@ ); name = Runner; productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* friendica_archive_browser.app */; + productReference = 33CC10ED2044A3C60003C045 /* Kyanite.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -182,7 +204,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 0930; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { @@ -270,6 +292,45 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + 433B9574F7E94075D058E585 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 44C7D6FFFB0D86BDDC27CD29 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -484,7 +545,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_ENTITLEMENTS = Runner/RunnerDebug.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Runner/Info.plist; diff --git a/friendica_archive_browser/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/friendica_archive_browser/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index b0ce3a7..0183b49 100644 --- a/friendica_archive_browser/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/friendica_archive_browser/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ @@ -31,7 +31,7 @@ @@ -54,7 +54,7 @@ @@ -71,7 +71,7 @@ diff --git a/friendica_archive_browser/macos/Runner.xcworkspace/contents.xcworkspacedata b/friendica_archive_browser/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/friendica_archive_browser/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/friendica_archive_browser/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index a2ec33f..90e900a 100644 --- a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -3,61 +3,61 @@ { "size" : "16x16", "idiom" : "mac", - "filename" : "app_icon_16.png", + "filename" : "fba_app_icon_16.png", "scale" : "1x" }, { "size" : "16x16", "idiom" : "mac", - "filename" : "app_icon_32.png", + "filename" : "fba_app_icon_32.png", "scale" : "2x" }, { "size" : "32x32", "idiom" : "mac", - "filename" : "app_icon_32.png", + "filename" : "fba_app_icon_32.png", "scale" : "1x" }, { "size" : "32x32", "idiom" : "mac", - "filename" : "app_icon_64.png", + "filename" : "fba_app_icon_64.png", "scale" : "2x" }, { "size" : "128x128", "idiom" : "mac", - "filename" : "app_icon_128.png", + "filename" : "fba_app_icon_128.png", "scale" : "1x" }, { "size" : "128x128", "idiom" : "mac", - "filename" : "app_icon_256.png", + "filename" : "fba_app_icon_256.png", "scale" : "2x" }, { "size" : "256x256", "idiom" : "mac", - "filename" : "app_icon_256.png", + "filename" : "fba_app_icon_256.png", "scale" : "1x" }, { "size" : "256x256", "idiom" : "mac", - "filename" : "app_icon_512.png", + "filename" : "fba_app_icon_512.png", "scale" : "2x" }, { "size" : "512x512", "idiom" : "mac", - "filename" : "app_icon_512.png", + "filename" : "fba_app_icon_512.png", "scale" : "1x" }, { "size" : "512x512", "idiom" : "mac", - "filename" : "app_icon_1024.png", + "filename" : "fba_app_icon_1024.png", "scale" : "2x" } ], diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_128.png b/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..460f8ce314c213cf84b0a557f1d4b50abf9b0a9f GIT binary patch literal 2073 zcmcIl`CAfr6aRvWU?zqa;t^iex_OlsW{L+1DrBwXU8t#O9;g(SWJIYTd6)X8wyB$% z?y8%ccS#-{YNXXhu3D5=rV`qrt!u6Ad;ACQJkQK$KJ&}W^Ol(DXLWJhyg&ch~)0#n^Lw|9u%uiMc?}x6?H=JAq$(- zyaUD!RtVG##9OIaR_3F_E*QX!(UXN4=&4b~m+Ykx9>%)by`5<3k_~NXYg5IW8z}7{ z@?7Yxor^b;_c%4}9FwX{T>00i_6)nbW}=-vJ1=TX7M0E>TMrdjn5dN_^2^iZ>HJnP#2!H# zD38dhV!TLpQGk4EmWIMq7$qXQo-cl>$k=fGyzQcKJ0elPa{RSg;pJhiiy@B^A- z?H)7TEFBXSL+s+j{bOT-ZqXLLg(+Scg#C&xA@5b7G4>MRw8XXDbn-)vprM4wJ^>mI$wYx*GpRqG=;vo;MgxM8?o}tJK!L^)wpG2fD(C zrO{(WF{YQ=&0q%JWb#n8kxk|c@9xRfoH`I6u+rsi(AA$!v5kV-n_rRX#K?R8r$Zhn zaQk1o{|CvLBvo>`4aZg|7qpKypVoM%#@|u0E6xE^y6 z))kfpwHROor}C&W1X+Xearvd|T0k}8NdfEN{BRj0Yj&tq>&OK<^G$o9Q5N_5lPFpr zPqE9}Z20^>PMD@yP|hD6kG0HHubr<}!uDYy#+mYYx+r`S5j-&Xhm`qzk~3CWSGEcK z<7U07QuV_t0xM+pM}vAA$`g{ay(3m!PTVHDyC3fvA}OmA;F5~w;^3e;mmWs`|VWNovFeb-U&)& zLH_NLW|+&D*#ko%M2_Ka6=~dNy<9~;FzN;XvoC!X2So`p@^9WO8N*nxyO+h+xWJ^5 z)SX*l`j1Q%roxOXQk~U!v8ZR|ws*B`bQjtA;PUxlxX_R_AJI8>%k98;$D>axlSBN; zh}QYJ+Xm{+ybZZa{#vyL!sm&TRySHGJMON|%w$bz?@8nO{Dnnb-Yp!kv7pV2pG-;N zuHNDI$25IjWF<;h3L{egWRm6VEmK|U3w`AXba~oNF8^Vn-o5Jyu{}K|``hzI)?Mgz zz*YI*TTFZkljz=mF)-R7X6jW(k2bL6L^xjp!5DQ#IvVqu2zrMTzdRDePrrs!52y+V zBmREK-y?^d4|vkkzU#FPJxV^>jI*|VT5-6^0&nXohDjuE=Ez1*{5~@icd0o*q{D@j zUd!q7_4^(}1Y`k~i}gnzG_JkymTpz?7dh zNhz{gU>WHj*c&{L81j-ihCiP_a0sVMp5GuQao?iQ5KtgQ zLQMc3rL5SCmaTRUr^Z6J1BM^;Zs?k%qGF`^s~G0Ab*Y|sLFg3y0N08RFAWSF6KdNk zA3j6>s{dPKn#u@$&Z|-|H~3R}O)e7Jp()qunJG*b<=eAsQ}Tz0*_s~^>ge$NqGv6+ zgCxAV1VnCEE04OlhSFbyl9#@QO%7-{7(YA3S lyOZB*Z*I*TKaIsm&bS3-{Qmin4sPR(0}_Ga-r!2({tf4RkO}|* literal 0 HcmV?d00001 diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_16.png b/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..7fe4b7310953e1418dd9e0453788850f41e75ef8 GIT binary patch literal 479 zcmV<50U-W~P)Qyp1zrMB_X8}N`m8sBpm@g?6tM+@0lXJL}iSro% zpFl1vWs9XUWVv7mK&yv`EJ-;4AhrsN{bS(x=n$8QGw8bB96${NojxD5s@fdjX=_Js zUjP@UCwO|e|2x170sw&JIAosF4FMJa91d2He0M( z@jM72==b|AV-t{GGqL#f=AvHH2p9$f!4Zs2PX8JMUvD7p#SYp!ymOq>MQfUdvQo4a zn*acayW9I+J>3yrXrYu++W=dCh;40%3(@FoUVazTcehO8Eu;Mu=~eYbDVJ^l-~-Eg Vd-@~>%nJYj002ovPDHLkV1i*P!m|JX literal 0 HcmV?d00001 diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_256.png b/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..00536b90ad7d985fb3cf2b4eadc9c81fe39a5364 GIT binary patch literal 3392 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 literal 0 HcmV?d00001 diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_512.png b/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_512.png new file mode 100644 index 0000000000000000000000000000000000000000..7aac0cc9dade4439b7e70ffc47725394591076ab GIT binary patch literal 6636 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 literal 0 HcmV?d00001 diff --git a/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_64.png b/friendica_archive_browser/macos/Runner/Assets.xcassets/AppIcon.appiconset/fba_app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..b4ed28be20eac2278279734a80f6448d4ab90d21 GIT binary patch literal 1312 zcmV+*1>gFKP)?YLfN3x#T3jZV@y#74%-~Y~hGqXF(hzM@nJ~%XJ>iRLqaYl(qa}D$- zLesQQ1mPt+@y)nf5OXtN$BvPv&hCFwef|C6z5Dh7i~#_$*&H}`KyWus1q=+Pslzl) z0D!|ezMYuBd@A*~4jzlgSz zzxEv0E>M7okmDR6z;T>n^YSa4J75677|P`LB4rIA0;T2`i-~f1c?FqF$z0+aB9RaR zfqWv&ELF}|qnX*%`~kD@cyT@1-TbkU{AS&Ot5plKR(!-Q^_Fbo5RamD*wHj8(Tzl`5!F36Ho zL{1A}Kwtk2uA@LUyMo2^JkoP>=-swmilhRK9H3gjT2g<`V*2NEARr;a{f_qu&y09)ODbJzX{aMLZjV4e5^f6ZQ$Qn#;iK2T0q$oT73p>ef1@#5*C&g7XZj{K#Bne4jo2Muj@7)gd!2_+`Sh> z1WnTriL|2ox?UO5%PJjZLQfH4Ns zFwhbV7PGydsL%z7&CRDhspwKBgIF}GWWiGoX79~`js_mrpAV440Q;Z5~8msJN z{1E^j)JcmHY96fZr1cmW-m8NaC2VN6VkfM}!SI&XVpOo<>6)Feo&e|#FU6=}Q}b0j z8Gn)(d)+HBD%kXdeJU~j41nVvXi(@W=g(iBxiB3R zOy7Mfaq>*5c+U+0fI9| - + - + @@ -13,7 +13,7 @@ - + @@ -326,14 +326,15 @@ - + - - + + - + + diff --git a/friendica_archive_browser/macos/Runner/Configs/AppInfo.xcconfig b/friendica_archive_browser/macos/Runner/Configs/AppInfo.xcconfig index fc4ac93..5bc0d19 100644 --- a/friendica_archive_browser/macos/Runner/Configs/AppInfo.xcconfig +++ b/friendica_archive_browser/macos/Runner/Configs/AppInfo.xcconfig @@ -8,7 +8,7 @@ PRODUCT_NAME = friendica_archive_browser // The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = com.example.friendicaArchiveBrowser +PRODUCT_BUNDLE_IDENTIFIER = social.myportal.friendica_archive_browser // The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. +PRODUCT_COPYRIGHT = Copyright © 2021 Hank G. All rights reserved. diff --git a/friendica_archive_browser/macos/Runner/DebugProfile.entitlements b/friendica_archive_browser/macos/Runner/DebugProfile.entitlements index dddb8a3..5b87bdc 100644 --- a/friendica_archive_browser/macos/Runner/DebugProfile.entitlements +++ b/friendica_archive_browser/macos/Runner/DebugProfile.entitlements @@ -4,9 +4,17 @@ com.apple.security.app-sandbox + com.apple.security.assets.movies.read-write + + com.apple.security.assets.music.read-write + + com.apple.security.assets.pictures.read-write + com.apple.security.cs.allow-jit - com.apple.security.network.server + com.apple.security.files.downloads.read-write + + com.apple.security.files.user-selected.read-write diff --git a/friendica_archive_browser/macos/Runner/Release.entitlements b/friendica_archive_browser/macos/Runner/Release.entitlements index 852fa1a..2b87bc5 100644 --- a/friendica_archive_browser/macos/Runner/Release.entitlements +++ b/friendica_archive_browser/macos/Runner/Release.entitlements @@ -4,5 +4,17 @@ com.apple.security.app-sandbox + com.apple.security.assets.movies.read-write + + com.apple.security.assets.music.read-write + + com.apple.security.assets.pictures.read-write + + com.apple.security.files.downloads.read-write + + com.apple.security.files.user-selected.read-write + + com.apple.security.network.client + diff --git a/friendica_archive_browser/macos/Runner/RunnerDebug.entitlements b/friendica_archive_browser/macos/Runner/RunnerDebug.entitlements new file mode 100644 index 0000000..bc4f510 --- /dev/null +++ b/friendica_archive_browser/macos/Runner/RunnerDebug.entitlements @@ -0,0 +1,24 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.assets.movies.read-write + + com.apple.security.assets.music.read-write + + com.apple.security.assets.pictures.read-write + + com.apple.security.cs.allow-jit + + com.apple.security.files.downloads.read-write + + com.apple.security.files.user-selected.read-write + + com.apple.security.network.client + + com.apple.security.network.server + + + diff --git a/friendica_archive_browser/pubspec.lock b/friendica_archive_browser/pubspec.lock index 696f08a..6b0c677 100644 --- a/friendica_archive_browser/pubspec.lock +++ b/friendica_archive_browser/pubspec.lock @@ -29,6 +29,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + charts_common: + dependency: transitive + description: + name: charts_common + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.0" + charts_flutter: + dependency: "direct main" + description: + name: charts_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "0.12.0" clock: dependency: transitive description: @@ -43,6 +57,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.15.0" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.1" + csslib: + dependency: transitive + description: + name: csslib + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.1" + desktop_window: + dependency: "direct main" + description: + name: desktop_window + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.0" fake_async: dependency: transitive description: @@ -50,6 +85,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.2" + file_picker: + dependency: "direct main" + description: + name: file_picker + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.7" flutter: dependency: "direct main" description: flutter @@ -67,18 +123,65 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" - intl: + flutter_web_plugins: dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + html: + dependency: transitive + description: + name: html + url: "https://pub.dartlang.org" + source: hosted + version: "0.15.0" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.4" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + intl: + dependency: "direct main" description: name: intl url: "https://pub.dartlang.org" source: hosted version: "0.17.0" + js: + dependency: transitive + description: + name: js + url: "https://pub.dartlang.org" + source: hosted + version: "0.6.3" + latlng: + dependency: "direct main" + description: + name: latlng + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.0" lints: dependency: transitive description: @@ -86,6 +189,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" + logging: + dependency: "direct main" + description: + name: logging + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + map: + dependency: "direct main" + description: + name: map + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" matcher: dependency: transitive description: @@ -100,13 +217,188 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.7.0" - path: + metadata_fetch: + dependency: "direct main" + description: + name: metadata_fetch + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.1" + multi_split_view: + dependency: "direct main" + description: + name: multi_split_view + url: "https://pub.dartlang.org" + source: hosted + version: "1.10.0+1" + nested: dependency: transitive + description: + name: nested + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + network_to_file_image: + dependency: "direct main" + description: + name: network_to_file_image + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.3" + path: + dependency: "direct main" description: name: path url: "https://pub.dartlang.org" source: hosted version: "1.8.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.7" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.2" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.1" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" + provider: + dependency: "direct main" + description: + name: provider + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.1" + result_monad: + dependency: "direct main" + description: + name: result_monad + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" + scrollable_positioned_list: + dependency: "direct main" + description: + name: scrollable_positioned_list + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.3" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.10" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.9" + shared_preferences_ios: + dependency: transitive + description: + name: shared_preferences_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.8" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + shared_preferences_macos: + dependency: transitive + description: + name: shared_preferences_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" sky_engine: dependency: transitive description: flutter @@ -140,6 +432,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.0" + string_validator: + dependency: transitive + description: + name: string_validator + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.0" term_glyph: dependency: transitive description: @@ -161,6 +460,69 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.17" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.13" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + url: "https://pub.dartlang.org" + source: hosted + version: "6.0.13" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.4" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.2" + uuid: + dependency: "direct main" + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.5" vector_math: dependency: transitive description: @@ -168,5 +530,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.1" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.1" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0" sdks: - dart: ">=2.15.1 <3.0.0" + dart: ">=2.14.4 <3.0.0" + flutter: ">=2.5.0" diff --git a/friendica_archive_browser/pubspec.yaml b/friendica_archive_browser/pubspec.yaml index ce11a5a..ddadbd6 100644 --- a/friendica_archive_browser/pubspec.yaml +++ b/friendica_archive_browser/pubspec.yaml @@ -1,19 +1,37 @@ name: friendica_archive_browser -description: A new Flutter project. +description: A Friendica Archive Browser # Prevent accidental publishing to pub.dev. publish_to: 'none' -version: 1.0.0+1 +version: 0.1.3+1 environment: - sdk: ">=2.15.1 <3.0.0" + sdk: ">=2.14.0 <3.0.0" dependencies: + desktop_window: ^0.4.0 + file_picker: ^4.1.6 flutter: sdk: flutter + charts_flutter: ^0.12.0 flutter_localizations: sdk: flutter + intl: ^0.17.0 + logging: ^1.0.2 + latlng: ^0.1.0 + map: ^1.0.0 + metadata_fetch: ^0.4.1 + multi_split_view: ^1.10.0+1 + path: ^1.8.0 + path_provider: ^2.0.6 + provider: ^6.0.0 + result_monad: ^1.0.2 + scrollable_positioned_list: ^0.2.2 + shared_preferences: ^2.0.8 + url_launcher: ^6.0.12 + uuid: ^3.0.5 + network_to_file_image: ^3.0.3 dev_dependencies: flutter_test: diff --git a/friendica_archive_browser/test/additional_key_logger_test.dart b/friendica_archive_browser/test/additional_key_logger_test.dart new file mode 100644 index 0000000..24621dd --- /dev/null +++ b/friendica_archive_browser/test/additional_key_logger_test.dart @@ -0,0 +1,72 @@ +// ignore_for_file: avoid_print + +import 'package:flutter_test/flutter_test.dart'; +import 'package:friendica_archive_browser/src/facebook/models/model_utils.dart'; +import 'package:logging/logging.dart'; + +void main() { + final entries = []; + Logger.root.level = Level.ALL; + Logger.root.onRecord.listen((event) { + print( + '${event.level.name} - ${event.loggerName} @ ${event.time}: ${event.message}'); + entries.add(event); + }); + final logger = Logger('AdditionalKeyLoggerTest'); + + group('Test logAdditionalKeys', () { + test('Exact matching sets', () { + entries.clear(); + final expectedSet = ['Key1', 'Key2', 'Key3']; + final actualSet = ['Key1', 'Key2', 'Key3']; + logAdditionalKeys( + expectedSet, actualSet, logger, Level.SEVERE, 'Unknown key:'); + expect(entries.isEmpty, true); + }); + + test('Expected Set With more', () { + entries.clear(); + final expectedSet = ['Key1', 'Key2', 'Key3', 'Key4']; + final actualSet = ['Key1', 'Key2', 'Key3']; + logAdditionalKeys( + expectedSet, actualSet, logger, Level.SEVERE, 'Unknown key:'); + expect(entries.isEmpty, true); + }); + + test('Extra keys in actual set', () { + entries.clear(); + final expectedSet = ['Key1', 'Key2', 'Key3']; + final actualSet = ['Key1', 'Key2', 'Key3', 'Key4']; + logAdditionalKeys( + expectedSet, actualSet, logger, Level.SEVERE, 'Unknown key:'); + expect(entries.isNotEmpty, true); + }); + + test('Empty expected set', () { + entries.clear(); + final expectedSet = []; + final actualSet = ['Key1', 'Key2', 'Key3', 'Key4']; + logAdditionalKeys( + expectedSet, actualSet, logger, Level.SEVERE, 'Unknown key:'); + expect(entries.isNotEmpty, true); + }); + + test('Empty actual set', () { + entries.clear(); + final expectedSet = ['Key1', 'Key2', 'Key3']; + final actualSet = []; + logAdditionalKeys( + expectedSet, actualSet, logger, Level.SEVERE, 'Unknown key:'); + expect(entries.isEmpty, true); + }); + + test('Empty sets', () { + entries.clear(); + final expectedSet = []; + final actualSet = []; + logAdditionalKeys( + expectedSet, actualSet, logger, Level.SEVERE, 'Unknown key:'); + expect(entries.isEmpty, true); + }); + }); +} diff --git a/friendica_archive_browser/test/facebook_archive_reader_test.dart b/friendica_archive_browser/test/facebook_archive_reader_test.dart new file mode 100644 index 0000000..499f663 --- /dev/null +++ b/friendica_archive_browser/test/facebook_archive_reader_test.dart @@ -0,0 +1,81 @@ +// ignore_for_file: avoid_print + +import 'package:flutter_test/flutter_test.dart'; +import 'package:friendica_archive_browser/src/facebook/models/facebook_event.dart'; +import 'package:friendica_archive_browser/src/facebook/services/facebook_archive_reader.dart'; +import 'package:logging/logging.dart'; + +void main() { + const String rootPath = 'test_assets/test_facebook_archive'; + + Logger.root.level = Level.ALL; + Logger.root.onRecord.listen((event) { + print( + '${event.level.name} - ${event.loggerName} @ ${event.time}: ${event.message}'); + }); + + group('Test Read Posts JSON', () { + test('Read posts from disk', () async { + final posts = + (await FacebookArchiveFolderReader(rootPath).readPosts()).value; + expect(posts.length, equals(6)); + posts.forEach(print); + }); + }); + + group('Test Read Comments JSON', () { + test('Read from disk', () async { + final comments = + await FacebookArchiveFolderReader(rootPath).readComments(); + expect(comments.value.length, equals(3)); + comments.value.forEach(print); + }); + }); + + group('Test Read Photos JSON', () { + test('Read photos from disk', () async { + final albums = + await FacebookArchiveFolderReader(rootPath).readPhotoAlbums(); + expect(albums.value.length, equals(1)); + albums.value.forEach(print); + }); + }); + + group('Test Read Events JSON', () { + test('Read from events disk', () async { + final events = await FacebookArchiveFolderReader(rootPath).readEvents(); + expect(events.value.length, equals(11)); + events.value + .where((element) => element.eventStatus == FacebookEventStatus.owner) + .forEach(print); + }); + }); + + group('Test Read Friends JSON', () { + test('Read from friends disk', () async { + final friendsResult = + await FacebookArchiveFolderReader(rootPath).readFriends(); + friendsResult.match( + onSuccess: (friends) => expect(friends.length, equals(13)), + onError: (error) => fail(error.toString())); + }); + }); + + group('Test Read Conversation JSON', () { + test('Read conversations from disk', () async { + final conversations = + await FacebookArchiveFolderReader(rootPath).readConversations(); + expect(conversations.value.length, equals(1)); + conversations.value.forEach(print); + }); + }); + + group('Test Read Saved Items JSON', () { + test('Read savedItems from disk', () async { + final savedItems = + (await FacebookArchiveFolderReader(rootPath).readSavedItems()).value; + expect(savedItems.length, equals(6)); + savedItems.forEach(print); + }); + }); +} diff --git a/friendica_archive_browser/test/facebook_reader_test.dart b/friendica_archive_browser/test/facebook_reader_test.dart new file mode 100644 index 0000000..efda99e --- /dev/null +++ b/friendica_archive_browser/test/facebook_reader_test.dart @@ -0,0 +1,55 @@ +// ignore_for_file: avoid_print + +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:friendica_archive_browser/src/facebook/services/facebook_file_reader.dart'; +import 'package:logging/logging.dart'; + +void main() { + const String rootPath = 'test_assets'; + + Logger.root.level = Level.ALL; + Logger.root.onRecord.listen((event) { + print( + '${event.level.name} - ${event.loggerName} @ ${event.time}: ${event.message}'); + }); + + // group('Test Facebook Reading timing', () { + // test('Normal Read vs. proper encoded read', () async { + // final expected = [ + // 'This is malformed and should be Polish diacritical character ą.', + // 'This should be a heart ❤.', + // 'This should be a five stars ★★ ★★ ★.', + // ]; + // const path = '$rootPath/mangled.txt'; + // final result = await File(path).readFacebookEncodedFileAsString(); + // expect(result.isSuccess, true); + // final lines = result.get().split('\n'); + // expect(lines.length, equals(expected.length)); + // for(var i = 0; i < lines.length; i++) { + // //expect(lines[i], equals(expected[i])); + // print('|${lines[i]}| ?= |${expected[i]}|'); + // } + // }); + + group('Test Facebook Reading', () { + test('Read encoded text from disk', () async { + final expected = [ + 'This is malformed and should be Polish diacritical character ą.', + 'This should be a heart ❤.', + 'This should be a five stars ★★ ★★ ★.', + ]; + const path = '$rootPath/mangled.txt'; + final result = await File(path).readFacebookEncodedFileAsString(); + expect(result.isSuccess, true); + final lines = result.value.split('\n'); + lines.forEach(print); + expect(lines.length, equals(expected.length)); + for (var i = 0; i < lines.length; i++) { + //expect(lines[i], equals(expected[i])); + print('|${lines[i]}| ?= |${expected[i]}|'); + } + }); + }); +} diff --git a/friendica_archive_browser/test/time_stat_generator_test.dart b/friendica_archive_browser/test/time_stat_generator_test.dart new file mode 100644 index 0000000..61575dd --- /dev/null +++ b/friendica_archive_browser/test/time_stat_generator_test.dart @@ -0,0 +1,167 @@ +// ignore_for_file: avoid_print + +import 'package:flutter_test/flutter_test.dart'; +import 'package:friendica_archive_browser/src/models/time_element.dart'; +import 'package:friendica_archive_browser/src/utils/time_stat_generator.dart'; +import 'package:logging/logging.dart'; + +void main() { + Logger.root.level = Level.ALL; + Logger.root.onRecord.listen((event) { + print( + '${event.level.name} - ${event.loggerName} @ ${event.time}: ${event.message}'); + }); + + group('Test Daily stats', () { + test('With no data', () { + final bins = TimeStatGenerator([]).calculateDailyStats(); + bins.forEach(print); + expect(bins.length, equals(0)); + for (var element in bins) { + expect(element.count, equals(0)); + } + }); + + test('With Data', () { + final data = [ + TimeElement(timeInMS: DateTime(2020, 10, 19).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 20, 12,00,00).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 20, 13,00,00).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 23).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 24).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 25).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2021, 10, 26).millisecondsSinceEpoch), + ]; + final bins = TimeStatGenerator(data).calculateDailyStats(); + bins.forEach(print); + expect(bins.length, equals(6)); + for (var i = 0; i < bins.length; i++) { + final expected = i == 0 + ? 1 + : i == 1 + ? 2 + : 1; + expect(bins[i].count, equals(expected)); + } + }); + }); + + group('Test Weekly stats', () { + test('With no data', () { + final bins = TimeStatGenerator([]).calculateByDayOfWeekStats(); + bins.forEach(print); + expect(bins.length, equals(7)); + for (var element in bins) { + expect(element.count, equals(0)); + } + }); + + test('With Data', () { + final data = [ + TimeElement(timeInMS: DateTime(2020, 10, 19).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 20).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 21).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 22).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 23).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 24).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 25).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 26).millisecondsSinceEpoch), + TimeElement( + timeInMS: DateTime(2020, 10, 27, 10, 0, 0).millisecondsSinceEpoch), + TimeElement( + timeInMS: DateTime(2020, 10, 27, 11, 0, 0).millisecondsSinceEpoch), + TimeElement( + timeInMS: DateTime(2020, 10, 27, 12, 0, 0).millisecondsSinceEpoch), + ]; + final bins = TimeStatGenerator(data).calculateByDayOfWeekStats(); + bins.forEach(print); + expect(bins.length, equals(7)); + for (var i = 0; i < bins.length; i++) { + final expected = i == 0 + ? 2 + : i == 1 + ? 4 + : 1; + expect(bins[i].count, equals(expected)); + } + }); + }); + + group('Test Monthly stats', () { + test('With no data', () { + final bins = TimeStatGenerator([]).calculateByMonthStats(); + bins.forEach(print); + expect(bins.length, equals(12)); + for (var element in bins) { + expect(element.count, equals(0)); + } + }); + + test('With Data', () { + final data = [ + TimeElement(timeInMS: DateTime(2020, 10, 19).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 20).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 21).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 22).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 23).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 24).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 25).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 26).millisecondsSinceEpoch), + TimeElement( + timeInMS: DateTime(2020, 10, 27, 10, 0, 0).millisecondsSinceEpoch), + TimeElement( + timeInMS: DateTime(2020, 10, 27, 11, 0, 0).millisecondsSinceEpoch), + TimeElement( + timeInMS: DateTime(2020, 10, 27, 12, 0, 0).millisecondsSinceEpoch), + ]; + final bins = TimeStatGenerator(data).calculateByDayOfWeekStats(); + bins.forEach(print); + expect(bins.length, equals(7)); + for (var i = 0; i < bins.length; i++) { + final expected = i == 0 + ? 2 + : i == 1 + ? 4 + : 1; + expect(bins[i].count, equals(expected)); + } + }); + }); + + + group('Test Yearly stats', () { + test('With no data', () { + final bins = TimeStatGenerator([]).calculateStatsByYear(); + bins.forEach(print); + expect(bins.isEmpty, true); + }); + + test('With Data', () { + final data = [ + TimeElement(timeInMS: DateTime(2020, 10, 17).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 18).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 19).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2020, 10, 20).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2021, 10, 21).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2021, 10, 22).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2021, 10, 23).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2022, 10, 24).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2022, 10, 25).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2023, 10, 26).millisecondsSinceEpoch), + TimeElement(timeInMS: DateTime(2023, 10, 27).millisecondsSinceEpoch), + ]; + final bins = TimeStatGenerator(data).calculateStatsByYear(); + bins.forEach(print); + expect(bins.length, equals(4)); + for (var i = 0; i < bins.length; i++) { + final expected = i == 0 + ? 4 + : i == 1 + ? 3 + : 2; + expect(bins[i].count, equals(expected)); + } + }); + }); + +} diff --git a/friendica_archive_browser/test/unit_test.dart b/friendica_archive_browser/test/unit_test.dart deleted file mode 100644 index e100eb0..0000000 --- a/friendica_archive_browser/test/unit_test.dart +++ /dev/null @@ -1,15 +0,0 @@ -// This is an example unit test. -// -// A unit test tests a single function, method, or class. To learn more about -// writing unit tests, visit -// https://flutter.dev/docs/cookbook/testing/unit/introduction - -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('Plus Operator', () { - test('should add two numbers together', () { - expect(1 + 1, 2); - }); - }); -} diff --git a/friendica_archive_browser/test/widget_test.dart b/friendica_archive_browser/test/widget_test.dart deleted file mode 100644 index eed0073..0000000 --- a/friendica_archive_browser/test/widget_test.dart +++ /dev/null @@ -1,31 +0,0 @@ -// This is an example Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. -// -// Visit https://flutter.dev/docs/cookbook/testing/widget/introduction for -// more information about Widget testing. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('MyWidget', () { - testWidgets('should display a string of text', (WidgetTester tester) async { - // Define a Widget - const myWidget = MaterialApp( - home: Scaffold( - body: Text('Hello'), - ), - ); - - // Build myWidget and trigger a frame. - await tester.pumpWidget(myWidget); - - // Verify myWidget shows some text - expect(find.byType(Text), findsOneWidget); - }); - }); -} diff --git a/friendica_archive_browser/test/word_map_generator_test.dart b/friendica_archive_browser/test/word_map_generator_test.dart new file mode 100644 index 0000000..740c8cd --- /dev/null +++ b/friendica_archive_browser/test/word_map_generator_test.dart @@ -0,0 +1,54 @@ +// ignore_for_file: avoid_print + +import 'package:flutter_test/flutter_test.dart'; +import 'package:friendica_archive_browser/src/utils/word_map_generator.dart'; + +void main() { + + test('Empty collection stats', () { + final generator = WordMapGenerator(); + expect(generator.getTopList(10).isEmpty, true); + }); + + test('Simple Sentence', () { + final generator = WordMapGenerator(); + generator.processEntry('The quick brown fox jumped over the lazy dog.'); + final list = generator.getTopList(10); + list.forEach(print); + expect(list.length, equals(8)); + expect(list.firstWhere((e) => e.word=='the').count, equals(2)); + expect(list.firstWhere((e) => e.word=='dog').count, equals(1)); + }); + + test('Test case-insensitive', () { + final generator = WordMapGenerator(); + generator.processEntry('The THE tHE THe the'); + final list = generator.getTopList(10); + list.forEach(print); + expect(list.length, equals(1)); + expect(list.firstWhere((e) => e.word=='the').count, equals(5)); + }); + + test('Test punctuation filtering', () { + final generator = WordMapGenerator(); + generator.processEntry('.the. ,the, :the: ;the; .the. "the" %the% !the!'); + generator.processEntry('@the@ #the# %the% ^the^ &the& *the* (the( )the)'); + generator.processEntry('-the- _the_ {the{ }the} +the+ =the+ /the/ ?the?'); + generator.processEntry('the> ~the~ `the`[the[ ]the] |the|'); + generator.processEntry("'the'"); + generator.processEntry(r'$the$ \the\'); + final list = generator.getTopList(10); + list.forEach(print); + expect(list.length, equals(1)); + expect(list.firstWhere((e) => e.word=='the').count, equals(34)); + }); + + test('Test minimum word size filter', () { + final generator = WordMapGenerator(minimumWordSize: 4); + generator.processEntry('A an the test testing'); + final list = generator.getTopList(10); + list.forEach(print); + expect(list.length, equals(2)); + expect(list.map((e) => e.word).toSet().containsAll(['test', 'testing']), true); + }); +} diff --git a/friendica_archive_browser/test_assets/mangled.txt b/friendica_archive_browser/test_assets/mangled.txt new file mode 100644 index 0000000..7d9c50c --- /dev/null +++ b/friendica_archive_browser/test_assets/mangled.txt @@ -0,0 +1,3 @@ +This is malformed and should be Polish diacritical character \u00c4\u0085. +This should be a heart \u00e2\u009d\u00a4\u00ef\u00b8\u008f. +This should be five stars \u00e2\u0098\u0085\u00e2\u0098\u0085\u00e2\u0098\u0085\u00e2\u0098\u0085\u00e2\u0098\u0085. \ No newline at end of file diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/comments_and_reactions/comments.json b/friendica_archive_browser/test_assets/test_facebook_archive/comments_and_reactions/comments.json new file mode 100755 index 0000000..9415211 --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/comments_and_reactions/comments.json @@ -0,0 +1,73 @@ +{ + "comments_v2": [ + { + "timestamp": 1571613236, + "data": [ + { + "comment": { + "timestamp": 1571613236, + "comment": "I'm counting...", + "author": "Your Facebook User" + } + } + ], + "title": "Your Facebook User replied to Other Facebook User's comment." + }, + { + "timestamp": 1571585885, + "attachments": [ + { + "data": [ + { + "external_context": { + "url": "https://duckduckgo.com" + } + } + ] + } + ], + "data": [ + { + "comment": { + "timestamp": 1571585885, + "comment": "My favorite search engine! https://duckduckgo.com", + "author": "Your Facebook User" + } + } + ], + "title": "Your Facebook User replied to Other Facebook User's comment." + }, + { + "timestamp": 1571538865, + "attachments": [ + { + "data": [ + { + "media": { + "uri": "photos_and_videos/your_posts/ZDkxMjdlMzk4Y2FmMDQzYTU5NDdiMmUw.jpg", + "creation_timestamp": 1571538865, + "media_metadata": { + "photo_metadata": { + "orientation": 1, + "upload_ip": "1.2.3.4" + } + }, + "title": "" + } + } + ] + } + ], + "data": [ + { + "comment": { + "timestamp": 1571538866, + "comment": "", + "author": "Your Facebook User" + } + } + ], + "title": "Your Facebook User replied to Other Facebook User's comment." + } + ] +} diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/events/event_invitations.json b/friendica_archive_browser/test_assets/test_facebook_archive/events/event_invitations.json new file mode 100755 index 0000000..f8cba9c --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/events/event_invitations.json @@ -0,0 +1,19 @@ +{ + "events_invited_v2": [ + { + "name": "Event 1", + "start_timestamp": 1593100800, + "end_timestamp": 1593446400 + }, + { + "name": "Event 2", + "start_timestamp": 1575765000, + "end_timestamp": 1575788400 + }, + { + "name": "E3", + "start_timestamp": 1572562800, + "end_timestamp": 1574022600 + } + ] +} diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/events/your_event_responses.json b/friendica_archive_browser/test_assets/test_facebook_archive/events/your_event_responses.json new file mode 100755 index 0000000..fde03ce --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/events/your_event_responses.json @@ -0,0 +1,40 @@ +{ + "event_responses_v2": { + "events_joined": [ + { + "name": "Joined Event 1", + "start_timestamp": 1831662300, + "end_timestamp": 0 + }, + { + "name": "Joined Event 2", + "start_timestamp": 1569790800, + "end_timestamp": 0 + } + ], + "events_declined": [ + { + "name": "Declined Event 1", + "start_timestamp": 1577044800, + "end_timestamp": 1577563200 + }, + { + "name": "Declined Event 2", + "start_timestamp": 1572130800, + "end_timestamp": 0 + } + ], + "events_interested": [ + { + "name": "Interested Event 1", + "start_timestamp": 1572134400, + "end_timestamp": 0 + }, + { + "name": "Interested Event 2", + "start_timestamp": 1543710600, + "end_timestamp": 1543734000 + } + ] + } +} diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/events/your_events.json b/friendica_archive_browser/test_assets/test_facebook_archive/events/your_events.json new file mode 100755 index 0000000..0e95641 --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/events/your_events.json @@ -0,0 +1,33 @@ +{ + "your_events_v2": [ + { + "name": "Event 1", + "start_timestamp": 1451602800, + "end_timestamp": 0, + "place": { + "name": "House Address, 1234 Some Lane, Somewhere, NV 12345", + "coordinate": { + "latitude": 36.0, + "longitude": -115.0 + } + }, + "description": "Event 1 Description", + "create_timestamp": 1448639852 + }, + { + "name": "Event 2", + "start_timestamp": 1447804800, + "end_timestamp": 0, + "place": { + "name": "Some Restaurant", + "coordinate": { + "latitude": 37.0, + "longitude": -114.0 + }, + "address": "Some Restaurant, Somewhere Shopping Center, 1 Somewhere Lane, Somewhere, NV 12345" + }, + "description": "Event 2 Description", + "create_timestamp": 1447367349 + } + ] +} diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friend_requests_received.json b/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friend_requests_received.json new file mode 100755 index 0000000..1e3480d --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friend_requests_received.json @@ -0,0 +1,12 @@ +{ + "received_requests_v2": [ + { + "name": "Facebook User4", + "timestamp": 1569081606 + }, + { + "name": "Facebook User5", + "timestamp": 1569082606 + } + ] +} diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friend_requests_sent.json b/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friend_requests_sent.json new file mode 100755 index 0000000..ee43e10 --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friend_requests_sent.json @@ -0,0 +1,12 @@ +{ + "sent_requests_v2": [ + { + "name": "Facebook User11", + "timestamp": 1569340806 + }, + { + "name": "Facebook User12", + "timestamp": 1569360806 + } + ] +} diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friends.json b/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friends.json new file mode 100755 index 0000000..fadeaf2 --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/friends.json @@ -0,0 +1,17 @@ +{ + "friends_v2": [ + { + "name": "Facebook User1", + "timestamp": 1568995206 + }, + { + "name": "Facebook User2", + "timestamp": 1568996206 + }, + { + "name": "Facebook User3", + "timestamp": 1568997206, + "contact_info": "fbu3@email.com" + } + ] +} diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/rejected_friend_requests.json b/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/rejected_friend_requests.json new file mode 100755 index 0000000..cc1ca7a --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/rejected_friend_requests.json @@ -0,0 +1,16 @@ +{ + "rejected_requests_v2": [ + { + "name": "Facebook User6", + "timestamp": 1569168006 + }, + { + "name": "Facebook User7", + "timestamp": 1569178006 + }, + { + "name": "Facebook User8", + "timestamp": 1569188006 + } + ] +} diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/removed_friends.json b/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/removed_friends.json new file mode 100755 index 0000000..73a62d4 --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/friends_and_followers/removed_friends.json @@ -0,0 +1,16 @@ +{ + "deleted_friends_v2": [ + { + "name": "Facebook User8", + "timestamp": 1569254406 + }, + { + "name": "Facebook User9", + "timestamp": 1569264406 + }, + { + "name": "Facebook User10", + "timestamp": 1569274406 + } + ] +} diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/messages/inbox/User1andUser2_DQxMmNhY/photos/OWRkZTNlNjJhNmU4ODZjMDg0MGY3NjEy.jpg b/friendica_archive_browser/test_assets/test_facebook_archive/messages/inbox/User1andUser2_DQxMmNhY/photos/OWRkZTNlNjJhNmU4ODZjMDg0MGY3NjEy.jpg new file mode 100755 index 0000000000000000000000000000000000000000..9282c81304e07c917e434d96ce05faedb073c8e7 GIT binary patch literal 71584 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%0D~tO#?u0Uf4p1+eN0a{)$9m><3M@nM3F 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 literal 0 HcmV?d00001 diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/posts/photos_and_videos/TimelinePhotos_NzMwNzNlYzI0YT/OWRkMmRiMTVkOWU4ZGVhNGEzN2RiMDFk.jpg b/friendica_archive_browser/test_assets/test_facebook_archive/posts/photos_and_videos/TimelinePhotos_NzMwNzNlYzI0YT/OWRkMmRiMTVkOWU4ZGVhNGEzN2RiMDFk.jpg new file mode 100755 index 0000000000000000000000000000000000000000..5ebbfb358934df832a0887d6ba3d53f2f6ade02f GIT binary patch literal 201323 zcmb@tbyS;8*EgEr-r_||@gl)p3Ppok&;*JF*AOV$;>B9rtvCetV5PXb7bq0>Qlu@l zliv4x*7JPlk8iEB);m|$%)a*6o;^D=`&#pxKP!K>0QWUi!Kwft761UmJb*uEfLuLC z4<8SNqlYJp2uKhh`4p^;g9G>*UNT~F18h{EYAXv02?`2YOW6zBVNy&GvHu&}2ui~L zrjmBn*8irq!hch7J0ZJ&YKUWMU}}mkV zk>lSo4*ylg73t;#01yTJ<-6HiBQSI#hGw^M@$|va&42mc|JEJ(hyJg+KK8bl_K4Oo zd=g)zJ*F?Bzj}%G^Z8qs`0x0sY(2gI(h(S1!q(9mQ--(;L-YMBKZXJT9wPoK5Uipk zE+i!`&M(X_#A4%WZR^5IifE&OM5C%v9WB>{P6@Ugn7hnW116TrV0geDSfH%Mo5CjMXL;>OeiGVaf zHlP4d0;mMk0vZ8rfG)s$zz|>@FauZwd;n|#_5de<&wyLN4;1LJ_nz--`KU?s2thz7m~jsjg42&)>a73)3LIMyQ87S;*Y z4K@Iq7@G$B5jH=zB(@T^F19%~9NQZ^1UnWx9lHp-7P|v`7<(Rj3;PuNI}RQWB@PP? zKaLEJIt~QK7RL)G1ScLR8>a%N6=wiv9%mcpGtO^ZQd~w{UR-HhFs>=C1Fj!#6mB|h z8Ey;iAnqdW9_}q39v%%I7oG&3I-VJxGhQHGJYF7N9bPZqEZz>@4L&|T9X>C<9KJ5T zHNFpi6n++dHU2yNIs85RZv?~y4+(?`R0+%p+zG-6(g~^vdI;tS4hVh_-Y4WBlqS?A zv?KH zY3FFaK45sD@WB2-?1Q=oix2MTSm;#fTd=JejhX`k79dX_yt5otaaadzg&EYvKDEUqk>ECVc`A2B{se}sJW_R-X%AFN!g5Y{l(I@S#~A~s1jI9n=PAKPd4 zhwR$yLF_2@H4Z`!Ne)Mj431%rubf<*CY;fnZJdW(54gZw0bD4qb#7AbC){4#McfOI z@g7S)c6prlc!mdyM~ugjCx>U67mHV%*NHceca{&APm0f-uZVA%pM+nL-l6DWE+OtMUMqei!7lMkB3EKrl1frfGG1~-3Rmi>)C;LD zsqfO_(mv9S(ibxPGA=SzGKaEUvi7nivO99Da@KNh<+kKm1e$wL6^499m#?sc%PSIZ1 z;m~o{Y10Mhf^}1LH}tsly!1Nt@$~idbM*HOgbacVh7BnVtqiLSZ;hTBy)pU#;f5d~ zea82Up~jWQUrm%vl1;Wu1x$lY$Ia-?oXpzI@y(6R%gk>qR4mdg_Ml?WDCiQ53-%l~ zYDsVDYT0dd&&t}W=^5@blV?@Wep>5V7g^uffNgSZKHDnUX4szCDcGgj9ofs-C)*#u z<>1NiLkBsB6o(_nCywckr%p;v*-n?v>dpnuUtM%v%3c1rnz+`v5x6~bL%UPBySNW{ zFnc`rnDylKjPl&_lJ-jT`s}UgU4{T6V2E}fD$E8mf#gO;BDa0zeRF)j`5F5)Jtu$e z{(Qop$3MpZAV4*sG!Q4yHn1<~QBY{mcCcdb+Yn%gO-SDhwigjE_Fk&JtOz9vbqSpe z6AViZyAC%A?}%WEcp0%1sTPTfB8&2lT8@^9E_j9W%IVcqj7UsY%SFyF#bJmA7hd zTZ=f0(u?tmeT(-?j7x?~B}*&I=*!~DewDkIZ&esn3{*-~R#q`qy+L82kf@_-X!T5u za!q?Jf9=~kn!31pKs~blxZzpDQln;LUz220Z8Jx6ZVP2gY%8$Uzx8vQW7}4{S^F$n z1Krml)6voi>MZYi)Rogs-TkJAs3)T5&%1zkH@%*{r|%u!@AO&qedsssUl`CIm>Sd^ z92rs_>K|4dem5dF(lshQiXM|3Ya16IZ=DdEXqgn7Y?%_DYMqvtZl95w>6n$B?U{Qr z_kLb^erN%_Futg>IJ*Q{T3LoJZ>`v^9Im>qUatAB{rK>59d|u;wnz-{P{261cY%*SpMUeDBHuWk*+>0e;pPj4_6PQH;bXCwXHo1 zKg(Yy=3fWme=YuxpJI~*0JKE{01wvw!^3o=_itDK`fdNv|K(r)A7Wtrrye#90Dvum z@m@>*!}BNt03>fP{6vJ41Iyo31@l!P1ppx6BEtWO1SC<$xOpG{{JG);0Ps@*fM0L^{Q2?r&!1ly zU0{Cz0D6&sJ^+*egn0M__;`c_1O!Axgv4aD_sB>|$r!1q$!S@c+1MU2v#@aRi1Bl9 z33IcsfSw2lOGwGe%Chr6RaKN$6_b&b`r8PQh=_=cgpA?dJq9UG7EY=E-{DUmfSdpu zfP?wIUrfX|PfcdgBuu4}Deu|)4GWS!d z3@os<340ny(O?U*PUgO)(ayNx$Bt^3%F~04P;?Yldh)<Yq-JGohM^dU+(03X1%jD61I^kZj&UM1mS#J~7QogZg>asFg;biHWb^#W3tH<_ zhu4L-vd@1j&H1BQk}(4yWKRZTX(mDvBQs7Eu6@mrtB{7w5EPL6y&YPe=y-lx$-Lf3 z=Kb@J`x&G7<%7+rrFW1X0fv*XTsMMN?~n+}2RDt5wfC4KrQ#9qO4M?4@|10E-_|Il zDZDRT(syzruP_(JovJ!*`5Mjtp80s9R%-?pXGs|YfsDpt6o=^@2URJ(dG!^)Fh2x* z$cv@eTI-sOoCs|M4bt%(yBHi|EHb&w9?Du0v5**tCde?R*bRe5j3;u8hn3WC(T=k1 zYtEI9vM2t}lTHol&pAwDJW(y zpFczq+Yx3JW+l0mWOFv&Na>XNB<(vnc5T2C8Zzf;hHRBf9#@lLHEnLAPjuxf^PTK@ zQL0V8`$9fbvX>bW9H{;9hM`op1uFhVdy1$`EQlkNeq&iJ?_QB&Q<@I$2+2tnOtTO( zoqr#_zjKLWFJ9578R=Xbljg}&3pP09lGB4A4QYec)eLipd)&#&1@r6jUu8^?eQWvT zsA}oPo&kgYwKZ>zj(Ut$9PYg|5v4AcngnplG%vx`0IVIM2#2aBA^!8SVj*FKi*+>@ zkE8!^WYc|EDeKxNa+`6VRoBxzW(uC);QX5VPTw?w+r~r*+K@EcJ?{Md>ka;L&b*== ztTJGQZT3^3H)Zy?ABh%R(fNblI5Xcycut)Yo~Cc*5IjMQujf;8bxLm&ufqiEjv{sz z{U!Ecdgtf%S?tsrzsY%n!@pC&ftfBGNtv4Lv;}R*EUf{U=kOm^a>=>os|8!Zium3HfGOt@Fg36qk&&?~S248F+gFEjXG^S1WE~@BaZn z;x8cMdo2%i;%Bwh_Oq5h(2hx%ReG|?EyMk%N*mcbU&eR2+@7AP!^WIzJIu#jUgPKn z1JXQHln2fCLg4XZ`~2fXClmhZ7L)PPC!TxNCG#n7K~d-|cXdg9nt82x*NP2~K`a%& zA5;5Z-pfwqrwJvU%uJoiY>so&i2P_2oe_C(YlAuzu_y=Sz`m=2w0YDiFvgn<86io6 z8;^p@T0pp(l~SFB`!I}26LKuEw__GTXav|Zi~o7()!LOmd*g00*c&IMa5rkkGE#IU zt7Znkbrs*HCH{QHLO%ew()H^q0AKcZ_GY`=VXMK1N{t_38FTrsI$v#@EgU42Hkfi; zncf~49vx4`dF7~<1)A_pyhzmV@*4rAl$YzfZWbKRW^86W3)L#s@tHZrnpQ1N2t_B^ zhfb}=E+#h|j^PctPgFUUXjcB5)EChEpdHg1aQC){Jz##dvEkZ7M83)X*a4*z=jcp5 zHh80XHh!SHHeq;bC;I9{#x}yI9=oCe!pE@pVXWt#W2-B)s3I>d&{sQ9l;hHwvnr=0ghIYXxwEC5r+1-~I5!e?q!rjIpeTrvyD58OPV7eW zNV?D-Dzi90u;xswsZZA+ikO7*-fWJ!K>To5TMLvaMv9Fcy_U3SDi|MswGWPN1|Kx;AI!e7fk6h2S2Ly zcG8y1H_MyS9U4rO4D>>Hw&4h^!4ikTfY$CJgKFfP5^%d2p*T&}wW#bx`4^SVHZg*$ zs~Lo2-vxYYpl0QP>>ch%KYY;G&2vf=<&T{xvrUJ?8^%Q~-(h=X58M0A#DLU*X7Vfne{BCCtE~ zDeCC);Y_(Me)Qses<0*x7%<5`x4NF}0$IcbvttYZrY{HfqBSAN;LAeV8N~C`yu650 zfu>jUOBpW>tBjneyEyNW!{huKcWg(ijKKyQxeCVlepIs$2K#n!ifoc!-}A7P(lq0D zjTli~Y%NO|Fxz~jTKjl6`Q$gu#dPiLc( z&=%)9X^t)UND|*iG59`03KdwAyQ<6xGnsiXaueT8)OHvYmQwV{kNphJ*=|t^NnMx- zID#$~>|iGzEw&nIHma)nNf$LDvW1DQN@>_;?OVH2EGp)H=TMW5z!$xd45Kbg{?i*^ zx%m4>#dX}Jiz)O*i=AmOWdtY;eUVs&W=9pCAAjN)Cq!Da@8hDYK#w_=iJ777wluvKHCtTeNyRHZQs?rxYOZc(#L~-NH>I1r)g^ zA3)<98SQCi^bL!Yj~+_9|Dx@^cmh((5$QZ6<0yf)L{sK~mj%M%`s! z-m9uK+yKT3YgX0?gLz6LH4Fc)>c$kuyRr3o4u$uPGj*VxH)sdm@5WqpDUhY4nkQg| zXt~r&p7;_gG05wX56<7%Q1EqmQQZLR=x6FxpnP8B)NnjvN4m=kJb6<#Ep6mgylayj8Du0vR9F8dgr4-Iz`KWlo&_0VpQ9*LslD zmE*e=Zn&Cpm!KjRVPF$(88ks{N!aeo_V4ZO_RKe+>`uB?pEoWtuYpNzjw0yIJohVf zNEVOFfySK1^X1-aZ~q#;^NqLsl=`BLEdo&7 z8?R!{LrI#Dlvomuz+DoVlxEpw_-RFT40Ghw^Zh1?vQ@K?EFYPsylB+q&Pm0Ss4GTy zZ53&kteN+^woi0&uU<4pF;$6#90SnWFu)_**W%6NEZh02KzH;B9-z79bP!L=7X6wMz`e^Id0m$zY_g-oO~5y-meVV%y8Z(&2|+#}(y9dqK^IVZf*Ta&CGVY=sim9tcKjz7tlsYN7QCoa z%Rg>z@DuT=l1V>npp~$C!sYQ;8|M}-v|!V6Zq&F3<;w0z>8VnNExt5CTf7Q)?`I%p zV2kQ5ewQl8BHkT;A&?N@9?fMUazP0hdB^<1yQ=GV!lVUUn7(q_VS3=qF`_#l{2VVd zNVs{dC)oHVg|gMqw%XFhmo&oVgN2})&2>f5dq*saghN@$6)Pn!H4Oxe)AzLl+eu_C zDz@9#gYEe`&PR>Txans#kIySSoJ^(ez%!lDf`)6>?`<`_pN_fa4(iH`j26+sc+cLj z6|HEeez&}uYm9d(seM$NLb9xoxmM*PsC<(WhAnf)l0KVy6Kq_2AU=5QFqEOpTUgnA zb=7*OIA>}40&fx8er(TQ8vR_cG+;SHJ9T~UiGYlYP&ePL(uYRoi%QdSBg&jgLf(p3 z!ln4Kw4o6*cpc5uI*a*w3%mi@JDK@|eqYd*lfguT%dfYVv~;qd$olXm$#~8mE@LW_ zvucJ8&4R9mV>WVfE~$46M8a2Ou(8?aq&%wWWm>)9g^q#1!#ow8C?;8oOxK%_D$PX@ zl=6wCzr*7>yCq{*`3kI{g11d<4je#0u4LXeLc_30V^_7FX(|#oj&gAs8@ojL?5I|w zbCvv65JRkNfLSN#!1j&t$vc*8Tdqv44>q&lLEdsoD**-cb2$?+zo0q~DjoY!z6gPu zjKZ7Gc+^vW0O0*#tmVJ|x6S^&`vdZf-} zfm4rXvA>yr@i~XbmCLbaTJhw>PSw7l6AErP0F)+$G|EsqPzHK4J;Dzy6>g4`aMn~x zEs1F{-Fk;_sH;8va>-?5DN|JWGaz3mX3A%27Nlcg+PCZjm3bnvuJmF=f&+ z=d~pwwycvH$YxPr##WP3TvxvTi>Wd;kW=G8r+xW-hKb#JRaOV;QT@%L-`>}?{S9)% z(J7sb3uR>1yEpU{vr|Z$0LQQXa~8GSU+?8Kx7fZanGDJcF`O-cbalB%EMM)mK9rQb zD_MFcx`J|-SOM1}6Ai7nPpZatLo83K(jZW>?^`&;m3l*>$gVXSj1$ zo0aZglx~?;H=Xjdd{}nFb;3o)BU13SxeA9$#p=Wc8K!;iWEva>dN~t79K1rb!g`Be z_2<_TIL4vFUWy4}z1QGpRuu(CS%`O;XJ`4*Rl{?q8ywn@ciDbi^dRain;_XnGe%AR z${Sw$1|M0d$Y@@$8631rbXDIgL*|BL>)sMiV&vm6&on{^d zx(;R1P^Xc*n$Cdl-Awt-PR#E6IQAnuh7UDh2%&}jKwcA(dkFDP=0OVNMq_M@0ihuo zSG)M5+LOKRv~aD_Ysq!TvN;K>Le0*%VyPWd2SV4n zgoL{`8*t1i>>*vr$rmbV_GOyqKD4toN##qvJ|uqtG!?e^&Hi50A$3oz3@5I4?>2*a z(%tC0X0IHLD(33O@-qk~nn-x^6rF4xcRZ~TOj66ds~%p#b0!arr-lnowMg4(z&jb7K)_s%iJ%l_(e zv?VFIxonQg?%JG^G&6D2UeP5)8!RY(?^gd5> zMyAwDkvxGNNJCREiqY1#>D)trxrMy-=vnk=YSucj2&SXm#?H#RM)HDKtC#QI z`=Cs+R84OZtPxXQu5o#JS&Ix<;}s%3*V}q+lRDQ|d7W-755?zD)_%MREYwFPR%3Uo ztqu%anh0}*)WYDv%yiWCH;tcfDn`(GvZZS#knh%<1IZox<3_k!o%BS`Y_`0@S;HDS z0W>$xSU36un0quOjHz$2THW&Ci&sZcE_}4EO>i%&w3c zgx61LG)I8CV`0w%{P@~1AtGhAUf6zC0+Ac!`2@U|o;{<~X3Y6ZX~O+{l~YZ}})>d?oDji?X7t!>&lL#lMs|SU&L6IT}V1xuL5Qv1Zyf zc7|A2wSGD7N_<15kSUex^YEUE&(#+Vl43d9ZnhzqujQ zQrm5pr=NdW6|8J1Nl=HV(ZwH?)1Zn=z?)_<|>vi7i8@V_qRJ2 zvA$lZ5@t!*#)(jH*3E~jkfM7s9YJIF{HM(_okxKFIbV9Ec{kT& z(r^!Q7jomiEa!E3=t{!rckW4E3sFzUcJ@A)AE;#K)GQLydm$8@cxKb!Oy6IY7uLHn zWAEt$(iE4y-G^P;oY-EV46GeJ&jCKHq$A)EH97LREc{?_RgP4Sc$1}{n$#OV9n8UG ztayTK?x8rUIEVHblX1WU7#9;lY`^SS=a5Sv8j;6(fI{S$p)-7v<_9Z?WC~DG^>G#t zYnJ79eJ_%3MlMG8<(MPhSIsLfWM`J4R?5X~>So(JwU>Hn0u3c+E@{=`DS@!i7~mRG+7$e(&{`cr?J{=l|t+<7s!6@bR*^ zX6~6op2Qm+;p}yvhBtxJ5VNC&2`2#&LK3kCqwViY)+sPo(DBdi+?uh#FOBuzKc<5N zMD+1l>wMxQ4a~fVXUAtW@+_-sGE|bUMVYGC*28(oF59^mXLm*QuKgX`=?-Xhnvg#l ze|~R~TAYHlrYyC@TT;K($x=wrE1v%%FZ)n2LpR4toBy(@A$jj8AqkcD#)OP}s@j}} z!nQ;gBG)?C++Ay0xd!u4r!RHs;wUd!CyiSDXH4-26ft$OBN{P43u5wD;;Y9c^6Ak>nNq zhuXVe-{Z=wVI;d|=~OOoHO;}xuLl)A&1WXBzrB!V@;2TOMd{tPc#C;E#nv}{BgR3U z`_=ReBMUxU^AiZu8)yo(Y{kD zD~~J38EzL>1GBeOhc#RI3xTcU-Mb?XT=_*Hp^|qR9CRo~XDRzYty3-h(AUZ`Svl9(!f|R;`dGTaJBg z26C|pi1hj@+d7$}TBGoA$^!cvb2v~9#B+Y`gcd}@><}A4TJIuNRSP%CyTnO*F!)Ab`=F8U(bZ{BTe-f(cw03d{2vKu75UDbE&W>~foY2M)A;(I1m{wvHVTa-uhwj6Swe`ZwQS zn<)M`eJEmRiTL!LA$YTo`$tGn73ydwSzTg&W^(5`E%5b`KCNU6ypB8lGlFoW6-?N- zAcvbEPJb8X66 zzLvvR(&0{MqU_sOvsk_~9w`2G-v0RxcWW4va$F#BAkFNZ6~`%kwel}Y(dlGuqZHKm zWwG&7@y{NfK2z~B4_#z;Qtf-b=-3V)sXnP4pZ!?ySk6e)Jo5=8qI1De1~?~8Lv7vi z*d|;CnWjEb2acQMeaa+^7UvN6po6Bl`YDA)qq1}rqq}k%AMH3!9|_N7QyW+;PD5`f z4+q2jKlD_r^rKi@L8jUM0VYs?e#?*nGz+r&XE(Y1kh%9oRDcrIZtF3L?seS$%?Fx9 z+|ShdF!s%6F@GDkhMn#*1EUPL%E{%p%{KZgL>6=4)jd>!T`f<9U=Gg zTeMdL=Tt{^`Ez&A6k3A$5(M!DAIINbHQeDE+QZPx$ySW0!uaY1STvQeGy`kobPVtT zOkU$PFwoU{I5KH7OT1CSVN$6UE(by|erW;Ss=NbLTz#-;_G)WjC^u)FBAnX+_)Z^> zy$iIblEW{UwbU)Fafr+pD<+(KN0Dy3Hs_yb^c7AuW}j8-atc>Ivc+u70C5NQi1ck{ zAJ~^Q?Vw=U(;2gnmkW;tL!K9MY2G|?4DKCUUZcxy!0GSqvQlhg)s4vw`1zI0WsTaF z>sh??K}aiky+oarn68?%Faz|H*cwE8nBA4f1y*gr88jTyd`gW7|WY^=_X)eRE2yM8TFr!ac`J8a`ElK@ikfny{-_WEwGh8XIhwgxmziY)h4- zVGfmC!}90^*%l{sjc`ThT^Fp`!6XxV&@vDC(3bOwKwGxl&jJr>=O5PiELch)?FZTD zJG3eD=_|M6k9-e75*NnIGP5{mqq_;HVJC$L->0_@0%zm*ty)}6z zylK(B1KU=b$2w6HSm+B<5XE=*VtSG>yzCG-a(Fy@%4r<#MJq6JSk>{{`r3r8=yIjc z_d6m>XKrSq|Kl_;bwiKnsGU7AHbarUkPR$C5`5Z<@M+1Mo*U2OKq780^@(kc#?x{R zr2+>Je+pF08#q01c1kq4M;VMom!BR-yorSU`~yIQxF{|M(i!Z}=kz2V1qX#ho9cQ* zg52P9MD<*dwwU=(Vu4)39huApu1hW)D+vq6Dv?=``eLfNY48{>Yqx^sWR7{#&u-?| zIyf^AN*NY7++I$|@cIv%rn|Z9y9#}uvdHGiGlv4cv4z5p%DRn34PTUG?X6d&u&Fw@ zJh2FFG{xtVc~Rnn?$+BCCY4-wlR&uASPof`o70)cw_24M+ApT@-|X?eSH5cQcwC^E zQM9>wIdzVeLl7>{`7O`HWQx-%vF)7%*{g-|`L`Dt&1SVMe$>!0*8?vT{(OuXar5jF zD6Yu&aao>`GHR35Evv+q3sGGwE$kmOXo?sfdK@B<$0a=t4?%BpL z9p0~ryhTU}25>2E`}7?B{IPmE^`VPWX5~mxcKV@#zc6g<;R^|uf`!<|V*Tt zn0IP#jfbrPqRXRo9Qi6LiFMfWu}AoavyY^l3v4+R`{Ndi%@jJ)J>`8_y@*_Y`QyRX zhjfq~QMtbwu|F+vuZY;JwIKCdToX=PQ36pv;EczTXXYzC%ggxS3af5z4f$CBU4~s| zi8l1c^8T9e4_!{4q;k_P3t8vv6J(Rn(HC)O*_EhQgUeNi#sTM6YB0FTdnz}NW^$Zf zd35KZCU-7}D^g~Ag{M}VrxpiQm~09eCtKC~ylkd?__6j}={xJvg7&&7#0Ta>JM(P^ z(Gd_3Ijz##Ic486OZt8Cd*_JWqth>jH?qUuUvFx!-ZbgZ-=tU0|Ge$4oRcGhj=dmK zO&~ZjzTQS#pa?Gz6L&2~P?ZgsSq74(*m;5k2DU$q5;}G>KXyD(ugoi#-SdsoQ3-UT zFgG($M` zH8L^P$DLWZ!cE@;y6wel-dY6`RwS3A8?_9 zTg$~xB**tNTUNbY?O^~EdW_UQTVS?={(5;6_etx=`ps8SuEFSqmbZ^jeA2a{d$?2Z zQ_EmHC3Mwj0D9`N5eDq$)^#g=oZ+F6c+1o#_@0cvI-Wr~u?Iec>ow!5*P0s4)Vbzq zj^0TAX_GN%pRXiz4r{h{tamXaPbaVtYNZPYF1eFr5G-gsT0D2mhi{4^R|okNN7srtS069JFb1CIa4V4#G0i-t$PCsG4R2yh zMtPoMAT}MLJeZ?#juBdRVoAQHNtV9WQ*>x)ifT4J<9t?jYwRz14F$ivNsFcLgcBPd zTPMEk{-XKqb+Mt-AeLzP2O!JjVwoW(HEa1qD(ht4@}W=wfy=={ZD!9zi}F!@hS}F6 z;TVhdajv;5&XwAqi&Do~#^L=wr*uE(+4NuK8a@c!$EL=kPw%^*yhyfP-gUKsdx}*v zz06oSv8K|vIxhS{xay3w`JPCJH@fzAbbOO0NL4nCiPceD0OiTIzVW?`RI6pL-Ipo$3CUeq?)d(i-Op z^3RtV_?Pb;Ou18GP6{!Ip&6JuwKonLYc~{R>N8dn0k|aY=gfL{>ibT; zq0B?KEE2CtD0>*R+r1~&&~k9NyyON^ycr#7da%;5v&tYt3Ywt_3CuVf|8&D|rL_C& zMfN20yc{_^@Isru;hHp}J160}b~o~7t7++5iXODPi#nbut1Tq(Xb>^!c$GT#^&|3~ zfD+qWXp;aIT7)*PM06xA5Zj{kI*eBH@ZidzR9Ky&HVlka5^8YBu^5ru2gceng`)6G zr@cEE5MmMT%YJm#i}O=nu~&^@TYg`f+Wp-lm)6EjI6wOIC~g+mpq3Ioou2bt77tGNP;gI#)_Qg*budhS_Ac@l4+4mnF$mV2_9D zB|7UcZ4!DTN2Bd~Fl_QMZ{wl(R~b#T`*nKbFyvM5%&GbIfRy5O1zg&U%B^vGHnnG) zHzrsoXg_P(P)Xq#lY^Jv)u(I5wTS%ZtEc;%Q{HqRHj(B|w-cY-k1Ss#fAtTn|IXD` z&`sr0&%D z11c3W!K&IaYNzIi7Tz-IAmsU1JBd8I#2qhB%n}SOCLM$d+)-I14hcx?axJO%t};>t z0){$eAUiKSdSC+hh<;$ys#k;gJNUs^u#7c%-+PhS;Zk193XH5~Z1nL!{oyF8wf_V=E*kG{SCQn1S}mZn*KFw}ax=V%{iEtgVLk&{F=Er$^8GSBXl1OJ zVNo&e9W{cZY2h!pCIf@!!<;;W6_Gv^r5JP3sK*??s?#E^W%jYF_eHdIh4NKgR=Udc zCg&U;%Ig42NEy2>Tjf>~_by!DEaSj?ZV*U{~ej@})R+kR%M(kv`O& z%Kgo&1f3}Me7S!%dDV#y`kgvEGS}?p_n=3t_Ghu-kx{?B+tTjzWYFiY2q$ERgozET zvy!0q#E)kj*w`L-p2c+1_wofBD78P|L}td>#Eva+>pOz}>n+)hNIum~ z^RDcV&q73kg+9Ky$!tjpf0(}TN$7T;RzHERSM_eHrXFss=+q(^@<+k?Ye+< zfVA<;Q|~teu)TlaRG4*y9itBRP>$YYJ!m2b68TY_7Kyc|;1qwp-NAQ|X2I;o zcQ{`)#p_)B6L-vd^2A=^>WlxfiE&U5l6u3a_rk5q@3`c`#dq#Vl?|)GO=RB(?Sd-mV_Y#f-tS zxAcRW-1%R7oZ36@c9#w1#%>L-b1wu=zFZKv+E$F+Qcfy;c!l%1j2WR|nUh3MGGG`485 zd~?QZs9ujT>H!075gL27d|n_u!1IlP_^-(NnTPnO5x!q@Mn!%8#Z)wCZ!7&6^K|o= z!Y5uTfi{K8wMm>v=NpZ;A2^f`T2GY_KjyY|cV0);1T)BiSH9_gy6{&dOm_r+x=EWR z9kT|>aQ7bMuvJwU?3ce%#Lw46wnxC3BExg6h)NWXB3KL0kgmsBQ zX0{nh+q7doh46pGH8wKcO@lTV*{o zTn~#res2jCbIs6Mw3kN$RlTHB=V9U5=y15F+}>5+(8*;wu?YBCXktjHNi6Gn1J3TF zMkrAlFH5;Fs>d}Bh1sw%Ufm+@SSW`=$3O5>xr@Rt@;$b%i6_F)qZEh{q=|unfS1UZ z5p&3J@KdQ|EzM*?j!_fizi>z5G;8)yP$3M1Anq%jK?beBV7Qv023ybyrp)_I8x9n7 zl}rB4UjuZj8a9)vK3G&28QhU-Q5PaxgO7U0#eNg?-ITe!KuF;y z?%w)f9jn>PdfTLt{Mxrn&|^+dO@N{J)AYrO$3qb$=RUhbR_4BRK`wp5oWsht#v9-m zi$$@%nobhljoo-~1L5e2u{m1Apa{X4L1{D+mnbo$H!Xd zGh<0oLcB+uj=g*1fX*4cl0ftNp)$V1G za&`@`4qUc$_1fcfv|h_t;ki*9a+#KL@roE3)EC$TB0Heb{wP7|U5J!wm&xr5Z0O~P z1-gnW2HJF!A>77I=Y*YfLlIp!Vyrt&;!qFeTdMX+?5n3+7C+bAVwqD6j`e+JbFVo#~Ky@ya?2k{5sv8CASg3)2llyy zWN=RNQW|}AMptFH?EWFAR{tS$C-xoK#NiXG`3_m=eYdhT%+K3tv|L0gYhntH_?!Jd zq)66(zvLeLTR+4sdeU6iK#gfe@jlzvD-VF3cOre*h z59pRFm!8!kAMjkwI4I`H2TSEqmie61J7{{8Mx2OL_odV#rzj(4{{Yx%BGAD^x=*=^ zC}(004M=!ON0;raep2qXeI)Af{r%>NYo`q84*=gV;v}rSIYpXF?RBWMftMmaP>K(P za~gHD=3t$dlI1kfZ=E|ep0$dbAIK#no}%GkK9y))I90Jo*GHAhML6&W5FPQ;kb)(-4l~<)!4_()Bfw z^2*6?7ty~}H}HBgC97-Mw7e|mrW!EjP*WSQ%{Sp^`i}QE;J5D=i)(!Um8*sW@th~) zl>_gg=33^3g&tusqsphb&2$G+tCCQY`PBiAAjLA)tGcRRv6l8W(6TO#MLBu-^mu(x zU*(pDzI6SkTrd8?qJeUX2<9BB{)BkADrb6pP!T=qS=qh|z6Ns&u7Y8q{1U^8nk&An5i ziA}BHimXhH6uQr4$vQZyNXOH1-dy6^Ps@)sSWlm^zOkrr4_|AmlR7%hBOxM31@#HH zS@~GS$7y@QvyAm^zw_{$_O7ZVLK66fWqHa$BakYXt<-hnSao$xn6E%_r0?r|7Nkz}b8{Y*4qM9$M+Yh+g<4y%HK| zE>x|eY?@xI`5b+Hfh!TNx8V25;Ie1HX{Z&_k4{*$Gp=rqy~}wc%+lm37+U^>c_~jZ zd~qNx7yj=3!+nXDY(akjf()@qE^%606~v*WoskFVB3q$o`bJ6EO0!;51C3t-$~(PW z%r!9PK@{7fmZl7Fw3?x=%@>x`m+!vj&h?tZ^>ojrp>Wt~4#ytG>P4~mIqfwEUd{v6 z(t+CL()@IXfVy_G4ts*zC#t%99ZT&suC&lcXmjL_XpQm;)u`x(UgeQ)Vqhp(;p{3en7kkp2UP{5x75Q0oeD?7V0Vp{aNUa z6JsXColhecMH_#WkihGF6tGxhsA4ct-{3(rWNB~=i!PZttF2#k)j4yr6tp{b7c;YW zIi9t#=O`OItucAXEUr?T-kzt4+cMNxmba+0R*tl|s3oq-TT}|xvoh}wcra;}{l&G- zC3Aie9Wyd^ybE#F1hfx7<)V~*)wa^qZHcs%EvqlupUaIR5l%{P(9{e}9)HYBir9dX zVypPSr#I8urbpMj;K_V4CJ%^zk)rPsXQUC;8pc2Zj~ZP%t>S&wK5^{TV2v~J){f{l zyCJ)Mm8X8gKJnZ!GiGnrxJN^%6Th6ZK^>J$5q(+(E_;dlF?nH#6|bp;z|l0#_4DnG zDQDPxee5?tTj<@m|41 zoSO=`%^5gMujao&HGh~-HNdrK{~rL8Ky1ITIQBCwx1!GS(%;EJBrb;|zD+AN^@?pM zE3s3p!dFFfj@Pkys=`YeDja3&=NjgL4OZIkWv_Lzt1PNNI~dz(3K?3)dnHyqVaM*f z7iM2iE7hzfMQ}4LQ$1BC6I%zdQClapF$+5<$?(r;(h!%c<{-k6U8Y z8U~7BeZyZM=wVn?kK;%_KgTCS+xsaXt)!|r)z|T!r`=XU&DPTAT3Dkhs~8?DLPHBH zjIgiq50U;whJUZ%*5X&Vl*Oz7UVo==30;}y6(LC zD)cH<4M8syGQ`1#FJyU>a8%2V-sr7BPZM&4kv@==aTURwt!g$krQmV_A&^6T7PLF6V zjP-ksCtRH+$g42wN1bRx)wNt}m960$5>t*ADghm8c6@X*fW53kQ-*<{vRP1Y)ka80 zzlBfu=i}tR$LkBYmF`zjgoO^rWrQubh>Izy>`-aO2QZUXR^e@j$W=7gb3XpoKLtj8 z+s&O-6kLIpgd%d5gV?kdN4-rQt5261dL`Lh_nTu~XgXSC)ed=q4^BG5wrzWvyhyKwO;;V`aFlxhtF=2fe#?Rj27Soq0crx5LH3M@smdRo!c3qyj9vjJXQw=Ab|>(ph3 z$Lb#==loOTvC#b>ZYoOZ|tolDXBs=Z)CFcsZH)p88$ODpbPGO^*q+43g$Jc zgk+X$Z{-wihCLu~#emi$raM8<0qHTT$7#nJ1jkv&ACc(NiU3hZD+N$=#We3As@7{d zu{BS1n;xW(`7?PF{zU%(lQ`whIa7{Q;gve_ql@bpj9y*p&SS zFLES9Sz8*VgMnSpvxp7KmM5(ODo@%k#<=LEX@0ZG6+;eOYqm0#D!ivaiV8~YB3S%q zs@qj)kBpA?pd#7=SGXE0Mz5G^;aF6U)V~A#M>>KxlllPM0#cBbP|dkv+49A!^unwh zhh|xBBTDegv9T#twk^7y<{qO13uR~&@Lok!gvVZYjf;7T+xAPnro2vSxd~~HlE#c` zTuj}{aykQ4*%7U5dVx6Ybx(Y2jw;mLZpcP(3+n#>6tCrWz!=r>^!3k8T=cciOH}l< z&r4MFw9E0;63_l@Bksul-kMWPy5ja?Hte$>u+zHk;p#1_rlvKEX~be{Y+aSeXR8@Q zoPh4NSnAs0ak;Eb>~yGu;b~G@l>=SXio#1ciyqKioyxD!w-e1&gn>L?U6w9FSx~a3 ztwDjOBcc_>si?q4U(%<_{{V>IS-cO>qj6Vel+<_JEg9hC=XI#X$22Qj68*=p1-A0@ zM?h@!*eArUwy@Z!f$n07kq$_hq`h~tb`+H9$vQMjxe5_-=F-G5rc6p)#68cN*NV zjrwbvGxSO+81=s+G7`p>)-i>aHH90AE}(aX33GBOS%$?iX;2t!3D%5iP6%3t6e@FV z1>T5IE9FU@$`M=v*oi$v?l523J5sk>G=FHoE0+akMWqeAoqALa+6QCuv(8EV8NW9> zEx_3un}kJ3OO)%Z%B=C)V_aED)JNT7{SNyHe3l2)BsK;se-&F$uo{V|Y7HqzX2tNf zFTJXF#HO>PiiLPy@4dgrKq zeyUY%mfLaRO||1eO{J?>MOx{4vWO(8m6BVHvsT7#$;^PIRy$hH@79>gS*u^$M)tE@ z%*eciJf~9@{{Z(7=+2i`-MV2t(~X>)jnmG#^^IEs+YN4IZD36(npSHCk2LYQS2hcc z^4`S&amXwWyOuv8Zf_-DQqbfv9hPz27lRGR2iwRxnt_-w;gYr2TEfC^kquQObQUNv zS|j<|w6T1+j5YTj3jY9t$3RE>sFjV%YXUhDj-x!qpja7fvR0Mju0_+e$pq6=F>kj~ zhieUP0MsFV)zsFvMVqf3nOniYPFC7E%Q1y!mR=XO)K+(zH>)^4!S!i)7OH38Z zd2nTAY!u^7=x(rMx;kRIvox?RX=csXr^m$u#yZ(I`ZYEBO^PAOtWQu(?YM;OF@?HO zWPZ^Nw=DGpMaV~i*MFy9qRUldJ2X!?mHz;4l-e4^$MDtoy7aQz>kU}%TMg^VxlL@) zqL>uzsa9Tw;-`ei9nSpgU{-{-z6)sffw-(ynO7>M#(mR6Z4j)o%PO-WS!@Od5noZh zEJ(r;ud;lPkLD*pc`fz>aYm&TZdlNm##K{VZPT5uGWxk*N|}AYB2xJ=@PtYopr>(= zS6aIfLf^{8?V8YsdvIcy$Zo+f^vyTlQ0^t`F%X2-m94 zO=2?fVCn{(w+l-e(p5!QWb5syC*tYt(Hd|T7$Y;509AR+Nu~RRhFp@vLd4ubT&dY_N~orTPcrn zto1-evz#Fo##X3^jkupS4-O$8ar6Avm?8Th)U8BsY$tHERqS?uO1Sm)jEi|qnT1hl zYgJHd&E-9)U5x8qvC(3!Z?Kh7Uv-S4{wSF*$TD(1*wu1=I2X4)(&<`nHhFGd6SQD~st~#!nZdo(bJoODL%A6M2+EkX> zw^(CPomQ#X5Hr@bUa$7H{xO)b`{I1j;~@)HeM+*@Ts@`TY~7*7q|~%bWBVD4#`I>b zxgH?$v+-rf)7f)0s@ARxaqe3asv=QT7F9AEl&d+f}$(MbjdIc=ukT z!9%F53=A4QdJK`r*?vFQ@*j_q-w{Mg;*KfhqnH(*aBO<8aoy}{w;K~=;(MxaTPo^! zQH)+KeM@l2WxD3s^;}MlLfUGdunIOv^U%7_3g44a=X(LRj5|>4On;eR=4iO z*}EUzmfl`Q!fpZodfGRXC|BX2tNoP##1s zF03)f4QakORr@WIkYi2OR=F7sVO{GK7Kql8H&xYEclg?vgOX!~no%?DS9_P5ub6~w z4v!tJn-RoesJ|=xwwSP;lpBh&s^yKi%wsW_h(#;=mOa`A{v~hRW4YLGvdl2eRYJAC z!(+g82V+4|G6{{Rx%b`Q3jnx_R`X4mea)f%>4Wm4By zR_v+qonrVg4~s#L3~>|Se;tQFMm|(ZlW`O(vu1&jP zuSUics;X?7{r6p05!ghmHH~5pdP#1#U*?Zj7D|hGGnI3dQ=N02QBVpV z0A9Zs-)>uXXo?g+<6ri&e=>YG+jHb&S>gWxX6%~z0Gy~+$8|u@ZAr@8jDOo+TAQ1j z-`MzwHg54m{{VVOX16{jca+FFYVY>7tn*V-&)aPd;oPhCtTrmml69%(8+y^7lm<~x zFk3{Je8*Yz@^_V?b}ofA{`CupqAg%WMwwQnZ*9xc4}jhj>RYZhZ*S%g1bwyqE_TPj zQMjT|vd@$8%3`8B){B*uc282Ds9CY~2aRd!qLnj(Zp%4@skq(kGYewbZH(&6b`C^A{1BeGQY)**z7J0jv##bRa+Wh}Cn!Z3IM3OZuq;BN^r? z<0`$T`{T11!@oiL|RjrRrtCHe9*1dJ=w5fOt8)xn(C=|3r@ok9ZUV>VxR=U4C z6?px!yyM;dg>9BPJTJ0zWlpTQ*OwdAtghGW=D-8&I%rtOPC@$d)BE$N)^)i`FKwy< z*`P=ha;EEhDXSX9}6DXm747;Yjym@-o=X@V+g+=!skI_MII`y z0l`U(W{Wkp*Gm05qg^>q$)*)umR-vD!>)>|g_UJvOLKCvs`;&pZP9A98#cB0W*oT? zq#}^KNpouMu3F4*6^*s4*irnX&oTJ)+cB+Er>ruFBWiwYjiVOGPjU5sX?%oobV{C5wI0 zzMjO_T2n7}u)sH0$d~!ValBq?qnIi@;-xtKU3idVQ)1KRH|Hx>X}G>!mQ}M_Hv`?x zSoJM`x*QC7k^RB#WA8#VNSOEcN>tZ-sCdAGS(KALqQqa5S7Zhug2=!bW}%A{_-s2r z0YtCKt#qv0jAI!|=t@VZ$>2yhYaa_i$5jsgnt)#RX4G2Ocee_MAu2jHHbrq1-H_xO z)%ePXbWyHuq)0H|h<58AH==I~wL;Him~h#4D->x*$v%twn40~K1k3m3c7g~qV%(seOgl`UF_*Svn!x?2hMUz3b%xMElh z31Y5QBOK=NFKHXiB(^gcSwq)I)%{RG9TA>O~VV(X%aB$XZn6Z+;8tUtq?L)me zEY{a?Y=e2W%Uc~SN~yAHqOb22+gX-ma7)_6g|<`|DNDTRegMiYEi4_?a3(!Rv+b|8 z%-NeiY-6jkJ-Hc!R%3apqEWQVY2_3yI)$g6NmFj)tCzRiem*-u`d8)441n1TP@7Kd zJ3OqVmet8x$p>}MWVLKH@wXoQnvHgUrDzze*2BkLe+{M&0b)wmLE1A#1?+w*xUO2P zn>@uEDY`|2v9zl>9!gtP4OeO9Wxv{c)`ORKVk(eW?at+R;cLnw%P+|3T(?753ZmU5 zKzaOeEB0dkw(zur4$D#Etds9?=NZ&8)^;mn6nlObTc(f}pLbJMt&N3YQ*B6-7-X|o zMgFTIte3HC)p;2p*N;h1zADAx&m04hlekehsaoF4UOP3DQm@XLX4cCa+J1jsCsyZ= zes|@HXPxAN)#IIGD=$me+A?VC1K~$1??Tkq+FKzTsOjpY@V4dTk3Be3ptOUL$@j9D;Ew_htKqpSM%5Db{8! zC%E137Xvm7;@|nB%D_P@9hKKntpl>lxmg+QWUrEj z?2fhEU-s%Cfzb6eg1alovD}hnE)v6$U5e{lSLDho+g0Ef$VE288JeeGfiPz_tCWyg2mI}GXS$1N1{uIDPtX6ItYx>I8F&7_7^VJLD7 zs^n3PUj(|dTk0;%Q=?$oTN~}}p6TwM>B!3%#h)xCE2(Fa{z337$m2lCEq4X5b)*QA z?IgypvdoGXh(Q2XnChZtA9W*7Pc}=bq&7PfWq?}Hmvn`nAf|D9JHiAJ%JHL)2iy{cc0m^HW-bHXQy~Eo+dO} zw7D0C5r-Pg##MVPY8Clo&Un+FF_nsL``zxuK5;7Xaf?`LaS90S!kV3W>pk@ZJE=%+ zAqsB1gtptNbXC7V%rpB}AU1TTGockry|nb53kRiGF||7QOLEX#k#MSS!a#fz%DW?d zm*ez&li)0@ZI|(5EY#U2Ca$_ZpGdabZPc?csr9cdC)3gmH8$58zj6x}pRa^W9 z@mu~VO5gE(RAW6uBpEc4EkiYVg=!P92+qb9jC`wkEzH?chqAM-mJus8uUE3iRZFjX z3OgyUF@#LzX~u`1oy0a=le(zcbR=AcadTKqGQxW%H}|rCzjfBF$0E@yz1rM=W?hQP z`ZLMHtZy9nu*9#JRy4PDti;+4Z1%YvZ8mJ6?0eJSUQy(PaoLzH?!QVbZJ+gwNWR4n zC_lE@)u~*{ntsiLI|)!^AvHw&f!tM6EgFyJf3^J<9|$4xK-{TeZ$Ipbjuo!VHP5D| zvF`b5Y%D0Vd1pX@eHaYwEYjSo&9VtvU^u02OPy<^lw@%l%{JCQo>s-C3I=e0$CJ|_}xx8Ie2=3uBhGNhz-Hbq$$!-f`PV<=X$h$WhMgv0jZ6+E{T zttkSgRJPH9Q(i@pGa(gQGBJGDheF%$ML083oYge+&%Cei56Tj+3c$yh@Vd$@39-5y#`M&Gydhv%|E!A6?L$H53;6$4NRls9B5{K zT8K)ivy%OX&UlaK6R<(=P;@z|oJoho1Q<}kwSO{}$3j5cAy2lUPRNw;P^u!IEpt6$ zvJaRCc;HObWrIw;fD>k|S1+C5N0?A`@hxBE6 zp*-QyQkuC27f?A0_>jaa1!+-gi`~v~b2+aiv{hkky}U@!CJ0W)==hG&RI#TT^t0*= zvjurQmVWMQl{Dm8$rzcwXe(5E@wpH5tT>?DaIwze_=Cv#`!VppC_K`JS+ZDYYs!Lb z14HT6`|R=>kz^QZC3W@8Uh=srF01MEt4k~ti(RaF@dbu0!V3iDISJs-2?w@pEbLJ* z0kZs}R+i3jE6d>Z-fUhw$fd=#Rg%Iz)K<6TS!ld*rm@Et^je#hrzCYyD!5oIq|PiS zx_hG3S~ZnXDn0gI-h8n|>sr`yQleD$G_kopDfVRzr5Q^NVV2A_Gt*r?HO3|)ED6PL zyPRq^EZYtKn>^v;{utohj9PqJmbJB2$Bma`*9#`?u^l#LzS~!jme|&YCE6d+#vLp+ z2uVL|AUZt$HtNqByb>jJTVSUZ`H?vGFntMNU~(U-M9?(Uw<=xganioiX&PhscF=r3fM({Ep6kAw<4Bm1Nw2i(?Qktdv6&0N%DjPWPJO2)x|uSn zBd{5l>eX?bhDF&HmIsJkmravrg>7y8M)`~6e2Bj_{MRh@!=XNB!OUw7UrS-i&znZ) zTTBtEM;lkusc@o{XKO4<39}~4E1hd($EyB$AuNqupjVEwq?;6VhVl=IYWAXyvVmP! zrTkPDQMH$G$w&M(V0$Wfz3X-IV%^N>y6eY_CyE2ug_d7X1puKzI5uzE{Q9 z4P{oO%Lf+o>Z=8>d#qS{`BRLBVSYbRPui7GO7H@8rzWjz3ria;P6b_fl~F4H z0E-s7>`xNDD|S{nvQdnpD`Qqwxg5j0>-oi20Y4C&^R5J2txfnvJGFd2%f|a8QwPYE z{8geK%=f5Yg>DvQSbBby`MB8_ix&|D;t;KmRi3`xZQQl~blqI-vCqv*e`Vv?%f%DG zQrhu8CWelJVj{jqN!1o-s1yN_9BD}<^}@@y>6~$?w6s_4#QJ*szSde2JC{GHU6v*K zg2KcynBM0pWa5!{h>S$_HVNu%k8_w{L@*;n46b+y+r~ad<2y9p-{bB!BDXKTANQ~J z-+J=NvAHt&l!yrq)%FIfAX*Ep_?|7w8=wy)Lj>233&;=L=v!qdqGep_#6-yi`c+es zQ&nZ%TG^XptWl-65#rWC#x27&isRs*GbK1$p9%1vmEIVLV|>8`NIc5^EB2+IFQGr# zmtJ2R3h_;qvRE4BP;&%ZyG~Hmj2b5OG5czywa;tT{AjJXwV`EqF?;OkT5LA2{eRxK zGOk^HF$}y1HsNSjeRYo2ByXNu80wi(D=S`Y^_s8t(Tq4_5)@mJzvBM@e*{|Mb}4|Q z=1kp&Riz}M74@jKm4Mg`%tNx7*n%5cf4|~ZKWtC$X8!R(t5+cfp?Sf zW|S?1aVu&^%*tLDRHfbd(4dT)-xYYmNqN||r}0Bh^3 zBh8&-c=Z*0p}OKf8Q8N!Rb*XUv6|9AY1bZ6(-S2IM|$6N?y9F`>t?lD(zQpaQiFH2 z%SRiQy6vMamy&D;Bn(Y=Ha(^FlqT}$W@PTmo}(yFRg*ndO!ava)nrdmlxL~Qo}(&v znE(47k3B-m%9yWlWUQ#g^P!?TyNYISX|)F>3yzy1Iwp_SCsD z@G7Nka6;mke!{{cv1wVlsgr%L6@8_d58E7Sth37H{Hd%stqi@8S-;uHr>f0F*pvau z{2K%@zJBQjr9*92mNv_2fg{}CIJ{E3s}{#yk5A4D1mKGt21EA_Kv&dfCM%H*gw6fb z>K0@6!&2E7u}ZEjwPvj=w#KsFT|rt~y_VI5yc)=fSrgj@8c@^0Jm zJ*{E)S+dRYe?md?Soa|+%)VL@39xZ$vcooAtoD62`|K>>N6D6E>SI~kU89YkWgLx_ z8rXs*XkEIfQGI+M1j@10F{5^M*Bc#7!KJHvKrMCn^14>p!n#L?u}N&ZTlc+@Mvuh& zhB->?dL0~g8~SW{b(M5*00X!OoRQe9bRNI?8615&ho0HUaei`-@2{M%segOzqxP@I z)2aU21G%(m{;^6zgj~XtG5ytz!>C6nfEp{~&d!rhxX=r0L+!^?OE~z({Lz8Fw(-?w zIi&5X%V98&jJo>~6ew@cmZDIiJwvM*HD_za0_8J_)s=7`d{y#~SSn*G&XqF2D?#j^ zQP$JQRB7%pbilBTHxG}}pD{jD=Fc;F4mr>IuY;FMZ|OgUsz|*_u3%ZF%U=*ju^qXs zR&rZZ1gS;H(!shZxt;YmkGC06)ViZ}t&44Dg<)NfvsvY6FIBwjmC;Rutz*?iYAd0q zrZcYY7IP|WuU624z7;K9xR76sD89BO-l%gfSZwgjI>n)-Ro+#o$Rdn;E3+Hjk@X+% z{)hJ9P*;yaPM2uJRMoOL?UrOZD&;l9-E#7xf5tI7OyE+>nUVSVabrPAhLERK2-Kpg zP?k;~i$o&iQAO=)5FaFyJ zZ-{&r*_S6W z>MgjsC6sJ-sNxl@+MA~B-&@0Foonive)Iz21K-3Pl9n^@{nTH4>$8nTwQ5*LMyg@P zTjLt3X#Lm5$F6l@%GVJaIo8aN(65a2al?sLEr*D&GcbPUFT}2$vQk#cyA&>+pRFgh zxb95uuHtU3V_$F$eX18HoEKK*?bsG{vsqLfWG5I8W==*=r&Y=Agp{&|ZsIn+<#e+n zO!*qHv3ikRwzaK|vOGa)jO35KDb4RBRMoP|HVrkdm32O%$zaY>h&&%6D(qD(I}hfw z@ZTSxK?d}V;0>V%P4Vtn(;C|@u8rg65wI%;1e;WrI+>GRnAOz%Yh&3?p@}~{{XR$Hh(PdsUO{&n&0cd{{ZQ~{{Xi? z`?#NLY|wi)j-LDSD@U&`j$AzP(QDOg7Exs2OYqdQE~*V#6y!fy3!s2y(D6lXI^`Dj zV&u>+eATnIyV9e313bX08U7IJ6zwlUmb7tvde?_4%*d!G+eDAG74QnGWtf5-Q!A~j z8T`61(G6MO-vdB$V5-6>{p*|EYZykO{-N+U6MSmXRt*|I%Y!iPHNHqIc0OJ7MP}>2 zBZ6I&^R(=0>T9&r%V7+ci1`9nYq_*;i9zjG$m3>-hlR#2+3mSu{TThy-xNJVqp`55A*f6FKP zcz>FZxwi~!&!)wmn;v>xcrj|8j=g#f&p=G{1W!QI9)V4l5OVYX0J(|w#HX2hxLCOY zdUMI~*^VupR5nM773ge=+V`scR5B8ES=efRYnGbJv2Ui7WK40kg-XEqcDL{ zl$t+bF~^$9lx<3CCO$X-lD}*Uf>n~ov(&6=-QJT;Lo5qUJ#?hXDRNO&YI0h;(wb6Q z)jcauzK)t!`iCrPt67$bX|A2ODteldrx7ct<)XR8BBWcpapqUW9@x)AxBPkk03K@| zYaVf;ajI~tb)@Q9(vziNuBDmGuK2%ZyjNaX?57n{q`HnRRce^yANMkAuH_Z6VO?IG z>MGd6x~sl`riw!~;+s&`z|v`|yXsxxaH%q@sirCge59_~hN)b=(UTkdA5i3xa@awY zUaiPykC5&wsq8jr1LW6sqg}AK6^NzT*>UP(SmUj-vP7-8%*u+TNY~w!XJx83+T2>( zRqigbs>Va z6R9UsOMG1V3&o~bJ%BX*$U7(QO}ymulg?I7R!+v9jXN54H01N%(-~MzO)G>dZ57tj zr6)pbr8Uu9>8^EGI;-DOPO9fsbE>)3T;P*}!&;fvvx3eEI%|fC;-?kQUQ|Rv@o_dD zlS>?e!TA;Q_t%_yxQi2%vk-2o&1fR5w!|;VmaNJ}ZBT+Lsf)R0z`Mjer@;M6bp#$_ zwvcLAJ=}Q0ykYpl*Qn>PhOB(9y}*KVRhHzaiIA-M74u)VEj{+H3dNPJf}CpVQi){A z$7O99$)-PRozFUao6)JWA={CGm`idpYd*I9dh6om-mrZ_(HB0^Kd8L^qT2qWWN)Zi zK>CG~`i+q@t!UXd3o2${Wq&s^3f{(uFL7(KI)`+#vbC#~h{GT@vLYq#4VEe6VN1Iz zm9>^PWr8h?VxCn*B4p^Tc3QErFW;-adYptly72~O>{~YB4t3mpee>7dKd8KasJ#B6 zY!?!}rdyeHc7IW_SCaNl;~z7se^E|ex|x1md?qmx>&+FtgCe|SV+&OEI*@+Y)PXAt z8&T;qtUxs1Qn8Yp8k|hLgIcwZX&_36yIYj$g|97QOZ>U<`p3X%q?uok-r{`2xOK|6 z>9U;A*5vGDeKM}gG9F|*OG$&lqTb}lt6y)YH@Q#STZUQ@tFpC*y|>^wK;ClK_Yifa z%m>b2;T20CMPZg!^~&mNAjeqP!ZH*!Q1-{hvcI)s#aN`(jgMo?D7kIO#$*Y^Ick}o zC4#m!haVj*v8?87zPH03sloMH9qi4MjMR);t+syUmO3^g-E!MlHLJHCUYWf%B@9QV zv%e!8BicNDsI1sjBF<9EmElqwt-kaxD_dLfGFNogIk}(jk0oW|-c0Iq2qIU=H&vEU zoT-1@VRbhnJ&eL*(n-j;P?hCA@$$D3gGR9?s+ZV~J2)JY-RtnaVkpw{+E>E4XD(#N zK7U$#BvTaX0yrL1UTyrCZhS_hD+~}Y_D}FLCmDoFoFmp3OMV9XI<$rTwPO~fx_QPdY$jN%4$gd>=`*@xFOP89Ats_`^0Ne8S zRZXQ42NP7fp;-6v>1ov3#XJrc>$-!eDd#V~uB&awTXm0v(V-+rXn88a= zcN&K%Q`vAqW7JW0c~XI%s%s(ZRGOY3_}x{@ET>iw&k?vVBE@6pF@QyGF08h$y}MMF z9#2BXYN=M}xMEPKrdXk;pSEf$UqwBU&sts0nOBiiBp^Ikc2#=y+k`q(*Dmk9@*(gM zOy8C9Ei&fPyl;=-Q{`Zl=!A2=HL%vmLi7FDJmFs4uEkKFOu2=ZF3(C9O1u^cEVeR- z0~2hw)ma%-vy%b|ZjE>K&-Yr6Ix_Aq-|m%8KIxKBFW7mQs7<+iO`K;Dzamxzm*#4M z&dn;K_=|1Xe1yg; zS@|M!ZaN&is?um;A-ADzJx8=+ zlrP1l)b`72YUMToEgj+Nb(q(!iMg>4iEdpeJmlL_P6}oCv8iP^`&F$}Oq}|vlu_!A zRmRtfx|R7TfoH+i>n+MzzD|6<$MC7}h6XBYFfx$iag=JnCm#TmWapQR%4xG3>J=5G z*1+~gvRRVGV`MdN;g;Hse`+%sC$6ViIZbm`6om;!3uzR}Malt#L%gd77 zuQzf#A7PpMB<^lecvbdmChk#cEh@Cu+CvEyu17YBS$T}6mb3R?S{^6Fe{^aav)fHo z=IxU8b^icHpl4G|qr!}JR=+6?G(a~1m8k`JFkNVSX(xg{$Jvjc;Zvd~!C6}oJdp+2u9x4x1NLQ2o`JB3N1mGeXrrDRzQcIW~ao zhwuKes9RM6)B!Tenf}AcpB4S>{OdyVCHN|3dY8)JwzAdOnF(E9u!~*Ik5*FGMY*Au z{>hL;OvY(jD>taBx@^^JR!Tj$ClN0EzRErKc%EW62CC6$;Pc80@(qC#aE*S1{>^kt zEn3HtY1%IZL3P~44kk;x9DI&9{j%=ob~Tn3w$-d;WHrpY-8MaDyEQ){et%0}mu0I@ zT^Qu-fi#g4DPt>ACi?3o%(%_QI{rj6=5Iwzsfmo6Vw#Qc!^;g!4ZQ=3*+x>=Ya+rt za4~Cv0?RcR11+np{FtL;m8Q0`#Y-|>*M4cN1?@u(=p~s%kC-BJt0< z{{TXMGN23($&(v$>#L?Bwal1EqQtFWyPMn9(ns!b@JF4v0 zX0e-*frx_E+czSX*<5^^Y!y^qS6CA26{Yy4O4r6?&>2E%Dw&^8s1@QG+WSq;AOy_? zin@#DR))y!EIJHz3~%I9ss58(D&iuvu~S4@vdmnisR0_zq_p~L@}R6#W`TId zvr_!IR##nsrRi-&KGlQIP7wzryvw{{|NElxo!=H3FtEmKuvw+*Fr8n%+;s<}v}$*~BmRck1&o>JVaE3U>5 zDSaPVVUNHwS+OhpnRz(@0LOkgw>9RaVT*}V zWixOYTj*nrp;AE+&yA^96A}9ECR$d7tLl{Tqc_yqY1GWHm$Z`85#F=;E!1&SkD9mLpOxv@xD>rfkcbZpLr6KA@giyBSQuEYRJw;Q#sP|*@@2YoKJE$*VqT6n>pyRUJU4x0M4a$9A!@cVC3EjvE?KSen5?3(Evt;&n^ zE4yRxonX$hyIHv7Veo8>lR}J}gdR!$+I}?+DDw`~9#Fq1#vhO75FN_S=F}S7!oJyo z4QGJVq+c`ef9e8d{{YCYeISmf6518z)#b@5+O-%*Y2mo7d) z-Y7~j>&J&Gm4?pN`Iad^dI$$0hQ8Hro7hUSm1u}wQ9xO6ZWdN{6q1$9eW;+GIn8A$ z{Zk`KJ!NQHoq@X*clK56`y%jKIF_-tY&sTrV+sEN0Zb4R5r~NTfC&EfB$!60V{9J##YJ6O3`c!TRCG7y(I{&iha2tq~~W^^HTR%B~DUuxQZ*|5uWOj+Ukvw zTM7sQr?TWuRR+G%DeOtj-B*&-oSw64OZB*;k+{XNr)hwP2%9fMEUArSCe^SliWiyX z-5BkqHkyKSrZEM+O>9+_9?~V?b2Oh17eu1T8bTOsHQaP#)xUIP|HRz~@lU;M=m?5AbxD=Mpzs=WZ9M${@DZN@7; zKS;Dr#M@*duF=&tq`=~KtYgWbBu4k9j~|(>Ku-1K`~X4upA%=1_bED>JN$>l9D(_b zvj*q;A&j_cR=SSdkBPqk7Bt}OdP)RbV6x@NdFbwrj)rP$?qG{kSZc;qik>Y7T|+BZ zicHi-)U<7C`k)cMsgK3Y+14*rH0C(A^i9n`3r?z5BBWJ2Rpoo0vi@bH7)&Qno&Nxc z4xoVUR&^BdYKJu_b*@L{p1*W8&C2fnuw4noD9~6QwGSUm$|!B5?JkXgqrZmdpK&f{6~jg zO$Qp4>}HQ}Gk(~|$M~vXI-HP^X2QHy2{va|Hu zp=xykeW?lJxeR)lc?&BkD6egbjm4|;Wh&ClQyCdP-yd%pl_yp^Wm*nKe`Q$sYjreN z!nU@G39hWA_f+nohO}zV<6o~juP(=e#%Z%Hwbpw3HXoGSY|al|&1v%s6$drzCp~4E z+>%vXvdu*WnG{o2PC?q+?`+B|TK=VwvnM{w(xhf$w+6&ZJ1d#L{U!xwiHhb|j;b!V zreB?FPHbBi?k!pSGHL-f5p4RhiC$5@j-|Y2UBrbZB5D>StxVA>3klId`<@WH_#_o} z_LxrNAMzBz;%{XlmQz~`65VK_V8c^H#|$A-Vms4jE=jfgMy)vdyp4S&xibQ19m^?G z9SAhgNl~E9#8~7(m0vw8N5uv;RxH=w8zma2uA-RqEw^M)_@@sn(sQm`8|kg@`j7Vz zm7XjNqRy z`CnCkPt*>HT5!lYf4P$0#U4c{IIiAmS6CAqZWq<2&o)08?d^-%D{Q$H`JW2B}&-mC`I0 zUt(fTy6X>|5Zjq$g0|Ggu$2d4#K@poDWD|dG-kMusWokr^y;iu6(tXyl+}_;vVx?j zBde4^BCeK^?CTp~u9jY=b6CbRc>e&aAM(M}Q?RGN@D=#V&koJp2X;9U!rnI&mA+uFYR@ZXbj;#(O zZ?4pe>vCO#x#%o|>DEO0dx>T>>M6>4?7p?hMW-MUO~x{T4Ju;R%N=&KS=n8$)`Q4p z4K-T8#fszJ^13Rf9G%bkPdz>D9|78bO|n$yJuvg}_^D`~dU9v$S<2{Ph@?|MM8O^6*jb)l^GNpIgCRQTd zE5o{`O7GtYRG4upGbX-hEZo89Pgy zg6|3jVO%4OyDNY>_Z4fbX2Y}Gr^Ahmin#@;iCR-#U_>74&Z@8KmaIQj@aFuN7`!XV z$#i=ydk+%=g+2sCV(6Nd>!}xTa15zN_A5NK4wgED1A9q~d~f{VbphN)((Q~_(F_`X z2Yrcke8$0qEn|YqKminiX(1Um0cwinUW^+XEY*uuFqh+IZekn^!+d4j2xq{v<06x5 z9A}MKClansf;WV>=hRp%8TQI@8rAuQeCv$l(YDazgE(6VzjkB0u*Y;ZP|Yi#tT@g{ z#A)cv^pnzVdQ_gCxG7OM0UE_fKB7Fmby!>76D>^9A_amKcPZB5E-mg9cMZYaic>sz zu|Uw`uEC{6g1Z(8ZiNB`ic5R*{=ViQKySv=qF@Aiu`d`&cf4YEu-wHR2g2@iq7D7+ zWN+lPPl^NNGL<+_cKaSL*R z56le}(+I7vGq~1u1u;~YRPign6P*vgw?1zIa{i$JOyD)gL1WH47=`70jC_QJs@d(W z1Jxx<+q&+K3$*t?a8h_Lv%v%mUOFJ(Z4*X7ZME(<5bvrtE;A zA2%b?EuODwxZl)7#C6sg-7iaaQ)0O61pT;^-p#vjqBX^X|9uX9bzyzt5&oUV^Ltjm zy}G&vW3c`{$9PrNEw z{i)sFwXjrlq7HUalzeD>h^S8{Zo=M!LAuu9uScF-OQRtSsPC1Iz6)9Z80_6KRmL|X z(iNze5LtOe5x77rL_H&UUdqyf^tWpt<7v2#`8A2-zH(7RB*>C1NTaXm(3b+}f1iWO zyZKki56@u1>?J`)6KCG<$jTpSq}(%1^9?yMS(%A*#Nb`QO6xn&fH#1RD((i%{eiPkW$;d4CkO#n09P;W5EG&xNP)d5~t5JPJ{53iS zC8oVvLe)>)YZaw>7FW|%mu{7x-$vXC^%IrrnS`dsxdI8+V)MMyxPlCzITns_#aAcjir0YCPt2j;ujyHUN*}$;yxuS;N?drzR8%MI24~y&KGOW z88l?wE3!RA3R*rH>DI&_!Pp&WJC~sus;&c!QT26Wjm{nCPBAE1Qpm(Zi!LSfR}jaS z#kll>`wy2q&VfA`7d&s*wj2Xgmh{_S)WYzKfAuU}!MD5=WfY99~BiEbO}%sDWvfr$@5IXb_FV!h5t=Tdl36@<&%6BwG%puCr9=&XtHo*MQt}OeS(v7832(mC7;u<1cdEv9^~(8MU}FWJSfY%k(TmX0P4ky1T_}d# zFT=m%l`p)JoYv$C()hx5D0V_@8fH-C#msntvoTnq(k50AglE%`VxXd@MVg(;f)f+H zIYF!WoZRfzuOn7Y%kvej^DCfzYI?J201y94 zqy6vo9>2$DE8*mSD4*-($a;Gxv+z@#m+#}IzrCOOV7>bOV8*ncKf=t^+{nbbuPI> zmE8)b1qFA^J1W<=Wy@~SKbJlPO!n_(Z~^ZhJ)^c=CXq0`E1?Z$@%*Fjtj=`vS=|?* z=Yt7s&Uj_0wi74z(w;*723GzEqpA1WNxqc0{IA_k30gADTP#_R8A&SDzJVZ z>PpO2Hk^3z=7d`J%G$i^==gr|_wz=`L#`b~Z%D*m=q@HBE*=@0Fq&f^wgIZM2GDd7 zyu~ES*A;a0nY1;~g}2s^tKo%Z_`IZX&9yaERz>5IZ?(cG4#v0N+IE5DFJDdMtT9dd zq_{HjA9Lm~nG{W}{dUzC1#j<{oF51}xwhIXKRRo?#~(34cGvIjfTXw!mRt&!od0L$ zp@t66meap5Lk*Fg|JPp9)dE{~Xd=x>>bN01IedCfA$o*c8-K$eNS2Xk|Do0Ll>B>N zl$9~=82Ql*!+rgJdcXR;@AS@z4)MMto@~;r18+lxFdHq!ftG~%A6KZ>v4O%jTntTA zc$dHuQ4bUDL_~3aU`d)7Y+*ctu$(VJBEiml4JAo~IW@BP=Q-&-mI{xk* z_Foz43t!s_#J;G8PWqwff9!op$I7Mj;E&g6Ltc>I-bAA{m-0V1vDm6l^Dl>``AVdZKtx~*InbGUB_i<4 zf9X%{p(=6`b+K$8fn$E8|9?}f9p}mTXtdLNQk`|;T6wEmBe;1d$PE2Fde6t}>%Yx*Sd-}}_w)gN(g zBXIpnQg$Fv<1p_A`E~khKp!3QXxWPD0kHh z=@!ae^%XdnPt#EF>SjpkHdm=#6HSz(Fbd4|2|D$WfK#tImOpHjnMgTey11~Y- z2Q5MpK6)N2ruQ=19{koAA1%XD{>Rsd3V0#?;vdQdLLFw6!@81OC%5Av0ws=xk3fm} z8ErJ!=++Kz!-+BTzJ3jawiXJ{u_1KXHuNP6m+Ik?@c019C!$#bs9bL|!p`Tgq{E^WVA8C#C&k9VlOY7v1g4 zI`ODbLtxJ_-7H7|=G64x(u8i`@w-H9;MN*;9@2n2;jV{Q*_1Di1-Tf|Lsp(I9vPI6 zx!E>CHQFC0+#72f55f5pq+ze(da(D`0WTb~Jm)=i5vlbdVTRtJJ;aVo$Q&pK#d(y!$8`zGubNZU=U-+b>#racsBs zUK2hZq%eAuPw1a?YSH}I0(a`pwdS@v2p*_}yJ-A9=nZht7SmwR zMdxTw6>BU0(jhpjkuG7El&iouHmcIyw#y!;FJ3Pqu#%8wH8POsk0a*GUD?#`i|)

_|AFV(M_=8JXd>m>S$>&aU7 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 Y| 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 Vi1y%xpr65q1%u-iDY@2v|JnFflX3t6 literal 0 HcmV?d00001 diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/posts/photos_and_videos/thumbnails/YjVkNjhiY2NiMjBjNzIwNDJhOTMyMTQx.jpg b/friendica_archive_browser/test_assets/test_facebook_archive/posts/photos_and_videos/thumbnails/YjVkNjhiY2NiMjBjNzIwNDJhOTMyMTQx.jpg new file mode 100755 index 0000000000000000000000000000000000000000..9ff75e39680813a963f3fb9bb716679507212665 GIT binary patch literal 12619 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 z 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%0D}c7~5Bq^-6L~KkB>o%p{WOR59XtDsY$J`Vy}t$1 z73d0!&)v6uOw~f8Tt=hc=$T%Z^ES?Iit!O|lRV05hxf6@HO>5MM&|9S%PRaMMv+uyV3t z{~z4^v#Y$c9fCgG0ko+ixM0Lm3Tt>bn;?{!ie@p+E*<5rNUM(IK5WEF&VqKy1nZvE zenF3d;n_1~d~FaEr2pqs@3UX)m9=T^PbGM`Yf#--K6`7oCArza8{XiqbnaWB`;MjB z2ec3{nOc!GhoQ$wBELB`p%>{PW=P2lcd4x+-V1S&X1W}|6K@4HB7yJ79MxrmE3~p#=NFR$CK(gzRQw;o#V`nl2tJ*rF zFs_9OWs(4syN0KE8rf3hF$Ik~dxe?sUMb+47597Ryx$xJU*X}AD@?AP)^RaLrWKx*|JV&}L8{7~ zxSPD{>v5~$sRm`%(=*2sJl#7^&qW=l>+>l~WhOk5F_0e}HVk$>-xiCMSGPT61?!|O z_EJ^BQMK*RC+&~MeuDa?f}cg5Fbdy^3b&#oTXt;@ErXOYc?HCl#=7WNBonhBF-cg) zq)gWNSizut1EjMzsmXKbRIOUNn!g@j8X1_W+tg9%L|r29_9kyK^{#fjaRSnF_UewR zMr`Q%b0YCotU(Au$x#pI<1LxUX{$Dj*VwJt-kI3W+Q+XhSOrby&8qzYYO5^>4>ASM zF2%%*3O3QNnd{H^26!UPxlS?zq>>dJigcjD(?eQpjz{Z6Ts<*@yXETb@p6df-NWU? zSldbIMLhS1G57!B^{^@G$i++bD$~dTZ$QW_-Qn`r;N7t#|OSYIr=J2ELiBjd*&(hMQtK&teg}A4|p#-SY zp600Wo8_X3h`Nt%IqOdfHa|c7&6soHdvr%E=2`I6BE_M8u#3WD`xr4=NW)lOu?{E) z^5PWIvjBVxTrzy=S!@f!L~zdBhdhaJCcaZ=dHor+TDUWMW*qSv6Tg_Ndno{0JbEdv zA!=Oq|4ZWin%7mtj-+r}+p|6~s~u{iB@k@Vij;tVKK>e~W?~wbx;Jg)ztc@j5zd&q z>}mHy5Hrs+&-h*>v-hrmo*_1m?l58c3Nn*|XX-6^N~t{osE_RCi|Jf-;j>yy;~%v1 z3#~}4vBe0FKS&-V-TMhb+k*~%J$GTlZzdsUdu3cNHc;I*oNy4A8+olZyd1YBB=Q-g zJwErvL+aF$P5EkTrCu(LSfZ1P(5mON5Qxv`=DX;s=@sG05PzRS;UA@Q}4SrvlSh))VwtxXimN1+gBP4uM&XD_;DkYrVLLe&)mjL zYVC4k%_Y5&sJk9|Y;P5Nmpo6=To(o_g9%9+`?@N~d#}eQqx|QBWw`3O2>I>JE-b+0 z?`lSLdL!s93TiiY1<}I3h+EoKrr!)c%&Vz&7!K+ADt9d+m5c(R*(0k17LC9lFa@6u zq_;_q#G`#3EKrgmg#7iSzsVF}xH#GLK6hGF4P|5Wpzgl|_m36?LfeS`6Y0SIpj(C} z)3q-p;gW(3wU5YL=1_n%7WLRSV*1_L`-X42e)OwuNPy)qmpFsI_u;01LxL+K`NGks zR~Q~EW9@8{{ZS{YuMwQ#sI?(>eVHkvqG=kK&%j9n6y7AX>FZ1B(<4y|uMFDogCuKu zPg#^h@t7Xx#ZAd5dg>w@o1m*XJ4 znlIx!F2&fj{0kA8vA&5H7H^moyQTy`OUOxgsaIVgb8{4cH_W3X6~r7BzJKEi260OH z?=B(ke?WS4?%?tCb3bWIPk01bKumNrN^V7i@{^`Pt)iCxjIn`V^0JB$AJeC8Og$3$ z^)SV!%ch=|LbBu+py3LJ^N)BUuU`vfUl4;UG9F3#gx-%l;~{QsbJA&sGWQRkvIH8i z;npey)H?+#L03tDTQ)fUU|*kt)hDtkVh{fW=MSuIlje-JKe%e0(s{W?TDU-%Ize@y zq>2fr{J*x#b}hajOu9syA?PQ0?`Ps|UgasSzes)y_LkE35Wc0D1w45^D4Zh+%bX1q zi`#ex+Uaijd}4TBw{#?=4@)slJUHTMBkyiey#T>kunPxdtFUckg`8~ey-JD7 z3p@E9kuWsAldDpe0rpI2SxDVvylZHhP69|(E?g&HN%1q6#v%n4Zvwk<{)I~0*^iT~ z{A}Hdq>FdCoPu3Bc^+yx=G7zZ>qN#0LV)A4m8zO4V2J%wYVrcq1kJ+OlZ$?z1(cp` zMsR5fL(=3{Y44BEvOZd8V&5`n$+9LrB*SfT?E$%Jw z)V&d*t?Xa7Rf02|IFPkMUVLpJ)~FQ|W3r7>w-e|pE(3o9}loBvtjs@nJx7_5(a5a+~LPa_sSkd4uT!H51j_z)QsY zhQP|XrVZ8w@9qMzoc=hJ9h6Yq5-~~eyW2a+WmIuK5}W>=+{JjrMsy*|1hWx3n?u~# znFWaGDZGomuwxvL=Da%Us(wgT2;&oF=#AV;u})RHbzI^*7z;r2vK08QFxdt_oLyzz zj@e9b3>nR*;1U|YD|GZpRF7SMr>Mx|d2BAlP%aDY(Lp@T@!Z*3bVv(eP4Qb#S-^;a z-bnm!`ri$SuHaXuSf4A8^WSap2)?y-Y$X-mrN5bNyr^Rpf(pq9dK~g#-B|wj$8X-+ zc5h$1{r*8vS0MLdcT^j1A=^6Ors2)fuXYU7MIXav6##QIXW_{HeCj7Vv(1kirro@<8+t3;I>U7f0Nml7hDHfDn zxW_O?+yxBpg${L~@^DqHcFxDciy1MjKG4h-E7u|Sc{CthWriYJ=YK5w_^araa~~W8 zy5`Y=K(*jvq}*Q_-wKz!`8e3xp|jK>bwkJL^U*_c(LB9J+ms^hxe)6}EOkHslAdC1 z?$sf4icvI|p@QOn!em@cK@J4+0~+#;Q(`a@vc^rLI*!WAq>UTeMhea2RHal)07GvL zLA|8}xLm&K$v2QOXd`Y{*>h(1(|nN|TS;)N3ClwKWIscb&8D zW!FRRA1(7%4r*Ddofu$(7tQ#zqN#d%iSfZa-bY*gyK+-3BY9rfh={X3!-Y) zbs)iM{#@csyGtr>RTX^$CR#4jDrApl`ZPBBDJGIQv9#Pf4|{S}rWE0`mk(NP>i7D- zNs~yXaTuTH4*_$e)?Y>$>7~hkUFNU2dp-9?@L1Q@UG*b6k1V4pp%d4gmUQe4@eMG> z`2pv~m@SNvyDwHjy6#U>aq~M-s_n_J#RTpbTmoHH&jD9%SyS3}aitlG;qB_29H-ND z65g8oVzYvVT>EeJyt(@H-3Uls zeaJQ#@cyt}j~nDKw?D(OA0gE~1+&?GfG$^ov^KJZbCw#b2yi@iP0#zg@y~lrF!xKM zRSD`A8Dk~8_k2SuuZrY3oVcvMvgMF6Rjo(lNH#XAO?+k#ywsfWBx^6>p-ng4ad)vG zw9aJJJO5}&4*bA8O8}1*;1rg};nveqPd_${Cc|uP>-U`ME2%}Z1VQr71{x#QdTk=} zo|~#q#3hwZlG#M2>s`lsEj)}Gdx+ott8;qd-qh0_cl~MuE6T6mj7cVvPX`tRli=0q zU&a8{QZsq=LcqXkaGf{GuiYvm4Vnc;FCrxP`Tb>8jP^1nX0fPGwlz~{9hXR-uHSTr%bA9{B~GV`>&AN2D>N;M zWKKID3Ax7Y6M)J5pe91mI6ZE4;eh9~I4$>qCjM*%`hFNJ&?!WWf3Jx!MK}aVX&7x`13WL*+y zVw3r9iPN^Us|9YeGoU%bhw!e7IG4CWp{rH3vXJzV)R;aGIU)TL{-5Q-hqxy|OF zQwJXd+6Npy%yx+7+SvBUAPoTWBX+f+?OwDSV)LPEfi&C0k&!%oxsytf&r3&czjYRj1bTUf|R^V^v(ES(j{qXSBBRZd%W>-+F5B>@9A{g!Y1 z*4Ly3r@_P9zo31bIS0}1!h;osH@uFE`+O%*OK)b|LuYd7CF!}!(>--TAz?R+;uq~U z7}q@9-lWF7m;64-uW7tzzdQ)MlA7j{z-dGuz1pW< zBs^zMW}emUgl7-iG@~13c(p(?32^M{f0!4N=Clzw%G$YD>4{)y+ z-CbI$Q2g}<)Ppd@d9}v~M}gR7^ASDGGe^||E}2$#iU<7v^iEZbrXV4Ft}ZBW$jua} z{lGb2S*a`Dia?vao~J`IoyTZb3q>WBto$CQ$6yh*4}zw zC_O**>u?Evfl#u*6cZG9@EuFO5PnWv(zs=nUO+%O^zP*{@XIsorL_N~7X*os=D)YLT~48R+Rqp(2DGGv z)5Z0RWWo5_uh4tO^+uaYN%T8E+d93y#elibOw?BA8%2hO5PJQq4o}ZDUe8nMsiwiV zTV{BaYuUx@Kr{23dxWB;l3}F7>b~|x>-lS7P zQ?8mMrQUo3pUNBY&T!=uX)>S-q%7wchI6#W{K91gZf#rhz>C-vysC#1O%A~j(X~Jd z1XlEx%teUsFMD~4Q#1@sZ+M9Gcmh0%XBme~$s7Gv`ShM5-2oyji~SabY9&tcw~ zNv&q`I27NZaLHU$Am8NbBbtaee|#@6b|eJI(1T5${^jPACn}V`e+Ml79GDZXz1Q4N zuE2f7@%GV;}C^_eG_V0xg&(vY9Hd4^y8Z@fBW4K6SYd-7(@NS8nq^-UTi zmv@!PK3uKzDH|%(wJ_VZi_?r#;R8C zu_YB<(9Mj7J1Ic=8C{Idf8*PfOLq29kkz<+ZbIo^!Ij-Wl2-nKS%rfs zxNc>MBvV{Mr&yI=E$qzA+*vO`>C9el`4P?a?C1WFVKTdb`LSsT@q3|kbh5Qdgg{rM4W6> z9#pL{UMo2ggT$~0lvQ?>OH3j2DaMW0CChj;bCZyH#gCkMGY$bH4Tr|thJR`Etje!3 zUq=4wtV)55oHne+N0+XvnVuno!|63*pnG_|D6LkX37yzKX4-Gc7(ENdpgAgG{Mp~r zxfplCM}qk9SV|4fS!>o?8P%QJ{I1;0ogVt}lt5f)f(sIcF=x6OeAL2z$Dk_CeLTf) zC3v~Q(^N}SGt+XKJ)6MTRdLVUJg|T@4+EJN%ye|ay4vW(HKYr7aWhS&`lSxGf4aIw zxpACaeef&yOj0HS({s)B33u}H@^)ZUjVI0$`Sgn6 zpgERx*6IWq2U_(L{2@VJktC#x+J8*(XQC$;Vy{O5B>_b3_t*a(Ayt7`WNHVBJ^L-x zWn&u6wfA}A6XP9T8=O5@57$fjPDQlo4FW>a!Zq(u^rIOn_L7?-Uza@PEbAZn9Wxm# zA5;fqB{W(s0MmmzW73@_Y?*i?|@bqHu8-3KxJS^Eaj18dkO=3EuH${&?OF z@4J}p!I|w;q2VNDQ<0+;{{BsZ)>|!qd}c!N{wO^LZ&G?*Uyp8NF;PSGGM?l6YRoLt z*P4ioY&b9Ods^iIW#bD)>}tEp@7|?=F;~fi|AsSylSDd!7E0mSO7@w;%|Y>pff7JE zN~o*C1m~JQJWlo}R0T{{N7O$}jBj#75L({9`8-(#=La(3=Mrkao+H-Oda{Vh2ZIPr zdlqSFnuhs-$P?wVpM@@X8CN)?7mIT?YF%Ko^ko3lbRs+P(OQlyIyZLMhM@@BBk-;s zqm(lQO3y2WjYOM9>`E$Oj>1Tk4FN`9X{ueUaYHuIJ4d%^fro<*=9pTtt<}~YIcTN` zU~E}CP~3fuWvS5g^$4u9wo0?N4D|Ir?!#55sjyjA0SUVu{v7qest!7{$-6Yx zO{5lY;vEt36OMBQA9q`@{ToeC)~t2GOaV{dhfF?Wx&bHW1llJL7}?DIlq)EOY;6+=QpvkV zW?n~=?VWY8#49RW!rpuBM`16IB`nS@nHDSrNe^JSQ2e#3F8*nbQt{TXfZ_Bjg0|WP zgDVkZpf(mQ=8f5nSK;e6TL7G$WI(IfM5$5g>vSZ~C`IzzKGyQ+z zAfZHeluPlP#xpV_rbc#Ku0!FohoOdY=Km-<7k{R|KaQhe?)Q7{_e5{WmHOTvoR8)3+p=D2(@Y($uQe*zx@rL$JsgW_v`h17DA0Q zI1`y}cTQ0G6RMZ<;n5)dB$#1wZ}%UX!Ul52L$a`XM*Xbfsq;IIXVPvlubnsB$zS$c zN?+6+ddj|I_rnt3p}=@MRF6M7k!dR;-ahb$qt0R*=Dv9xx*yNpdu{b3zJd2aJs+Cb zIFHvXZb=`GokCsoy_%Qm0y{Xnb)J=js)t%a09(Z@C(EKR-k#u)bAuK)kI$flw|QjN zUAq12GzhPdu#4Eq##VEAziJ{LyU&*4h;j+r6LvMFe@FAq;C||7+8!coPkEizO(~z! zi~B+~Z}ofHRycJirxu*+7SnT%cAN3W$Ablwk0W#>Oaa;2Oi1M#Od!D!Tj3(8T;C!S zYvliui-P5z=jorV)5R_*p};9yuT1CG*k_u7A@bom0dzhC^I1i-Ix z!YJf5Co$LS4?Rvp$c0>13AbwC^M#uq>;4ec$h9(Wd%s9B{d$f*^3;R?xnj;AI2@6EyDuJ+MSi6sDM*U&*I$Q4 zDc>@>*L~P}xfF9;@^>Vn%oDhHJ9JtD_^j9QYVi{KVz7(&n%*vvfEBn#Ait80+0?a1 z?~Bl|j`lP&lIcAuiq8}BC(Ip)|LNjV{nj!r1T(&(h`;*RdfRC(&31B6ylWU)88K+( zda!5&@6nCTy{xescW;s%qv!j>o;Epi6S92xXiZ4#P2220hQoS_6%B)nQU`L91mGjB zTMt1kg7b>}PyT%s=`{#`u?xIqGJ0a&TUH`j$`NC;eC1JkjHZ5G4f`u zvm?tNQE~GFg208gBpqQ{k|akz2;>L>O~nFx|Burx6UI54pn0%f-mk?6!@8KdK1?p? z@qY|)BRJdefFN0XUn#F+wqd&QytfKI^GyN#`ofn=s*Auf>k|?3%gOD} zejKk+>l`T$8ZzxX-Kn`ket}b#Et1y9j8*{>-SmU#?s%)Ab4#?{=Cc#8)LVGArI-lh zLX1Jlvm!&e$-PMulJD8{X)V4jc|IIXR@LG-5qVzz&%h;$m^H?AL)` z(?pLuXJNONFS@7kRg`?;;x5W>Bejf#yqxmsR{jTFY930IJ@5Th26bRK>#MPb2-$u35$!vwpMhW3gtiLLw$a-IC=%N9X z;W`_tFHo<1P|r9B+iZ&z|J3$Y+89;f&c8%-mX_8OAsXU~thnmy3)K`$1*a4Vc%o@= z*cQrJc9?Q&SzRgnc;*R=P4HKkRe zLfVMmbCy3_nZE}o{?V`zcGJgYCsQUf*fR{oiUK0Lx$y64Bc@c%itMHe!y+(}@7M(v zL{aXEr1`ix2tCaX61o{R9g^GBm$?zM2fo{6dxzc7sg#Sg2$e2mRZrJ0Avm`#pITwf zPv++u;uTOy2S*e|TT&WE5v)uX3=VF@4M_+Err8uN>aH#b3@=~v%H2?d^f!3i6b;gV4CTELUSOGp8I2O*YNn4$o%p90vzwD1Eq>JpD(gJCW z%Z8&5L?3q>uFOBqMLRnx9B%Zp)|=4H7SA>Sg?43{&b?jDmYbj2qLfEvA3o*8ySDW? zH#l*NxZM4$eb$?eAV}9qJeZ4B=aLHShk;ZR)ia0z3& zR(yA5@;vSoJvIDpq2%|MGkyd*{H8c9!7PwYY1Qa2MBu6_a?dy)!L)>*UvLT9%8JGO zV2wPf@%NDzi~%#2XTXos%a!B*40F?K&JJRM_p4hmT%nw?q1J1J*kbI)1vUF{3h3v@ zuFp*J9;ohqk&J?(oXGKSyy~WI#UFiEw*(>z#)E0;5FqhZ^%ySRMg495$TtXOelmAn z4X9N+@@M|%Y?mh_q%9mF(fA{33a*^fZi*k)_!@KstH2l9X__%2`tuU`l=2zgGg^OT zZ!%MVTi*Q0ldrDE!!crNA;bba37BoJr;UqWXRw`iY7c){yGt&6KuTsblW*bPPmbG# zubvJ5u;A+lY(2uQ0GZBoJboCw8k2M!+PBq^@Bj=jM2!FRrO?YKCI**U_qfhY7OBfy zdkUeXe3xcaH#b3wLU-cDqh$9&xS=y^VXo=A*(sY?``f4~;fG7Z@Bs7SI-j7kDR0xrN%d?qOjkB@6q&G*UcV2>`hAn$ z^7YGj?pb^!F1jx~kO3E(?^#mSu2P3F0t9_VZUCC4fib#&}BqPlcnB_)q>{Z7nvoKjs+ z|J1Q;@zAY1j@S5_T#Z|a->kkzJTktms!;eAEWUah^)@cSm9}H2PipQzxGR#Zw*owr z#EiNu9!F&B*y4c7Z#{#Y9ysY{qt0{^%fo&?QrVPCL64? zys3RpO1_C88&V&z$iy%y%p~7#G@_a<>I7lx(B{LEhT?Yog$PjZwng9=z%t)tQ@2%1 zRMr1d%elQx_miNI9yva1`9fqAZMyD$-F#Wv8pFvY0nARoC-?N*S1?bMLm(@xR$_}) zb&*BU(Ai-e@R`n2<9Xu~$WvN%xBl(s)H!QZ7yUC0(+b?f+PlEszyv9CLah#RE1x$s zVWgx71R9|vS^*N%=33hXp!TKm*wc>3c3&r)giifRE!jurl*gg5@S7QiQ`B40#Z*T< zql&GvI&+YzW2aU%gOSbxA)Hh7wGo@o>^b^$g zSJES5BB`uOKZ`)a5TQVMU}jL2R^PhKvTIsfWCBNC1~#xeXG~A2#u%M^ZP0JVIvtjZ zH|QE5V5P084$=a1Y~Sg*=e=M}!tuxv)2qf)e_6$DY*H0>%Ap`Sf7T_0eo&DI@D}{w z+z`Pw#8q-Rk*b~NPjO6ox=${&?q?B+Vam~igb1x{Gk>IScCMZ4Uzs1A$m?Tq_7?(3i-Bu?Rw$uX_aV&5<uBGq;6yfp&G48J9QMfJ|cph&*(zCd^ zkv{LEH7RDNr)WZbvN0j_+?G4~>#)2S#r@hB^=6kcHKdlw|`O!;E`)3DYWvTgRFA6$|3hbrWWCdx}eO|f0HU8GI#_0pj z$oZr5AMJed2|1Sjc}>~p3Y}vZZtG3#$;@KP{7u_EXg3m})6rAqspWdN3BI0uYIZSqvBKN%ypz$$0bDwEyr=y~S96{WZ zgvlJc`ztUEf9-1@OS$%R`=1Bq5lg^5+xEpaM3f@t-s>-cYeaI6nU_P4M##+KZdZ_< zR_VS*L}N!!#jrYE7$H!>d2&2z-52#q*gbWx#5Q$aep2@7G^NK_z>Zv?7l27&j=Eo4 z@oyq20&rv}(UU(0-K-xwN`+HrUH#8CUO3yR_uT{Pbye5@;f)LRMum5Zodaa{F5Q+0 z>`25q&N63whyk)Rm{pfc#});dx|)dfq-_2(EJ-gW`tZ$rSyCxoDPq5qz79P;ni9}LnQ{FVGj1(`b^rR+ zm6&J$b!mFE2LO_n1|&(^-Ivc|5|Ndt7oB;2r?(>Xom>Q*YJ3UyGm9()Qu{{#V&Cw`o_a}P<*s~}`gPP%A|Jz~04~xa0&tF+KALyZv^nwAS zm^h8XNdcGdE;a*GG%p<$DvhUo@|IhA%unu-hkJ?gZd4Zc3?G=-_qm$e&cu4o99?Z> zN0}PW{T%o!iswHVL`_mcufG4$_AoVTDP!r9-86^u_fW5;O(8#`ND3Z^grI^?r5g(S z!v%bBN0+3$3q$O))p>(6o2aJ&F3&BU#A)oclo|`alUdu6!RW@>Di+MWL|v8uq0+q z1%<(2pLI%$d8J;_asukw6n>5<^ECJutHfGbH%JXf_x+WN+cD84h%j;tiK0kMKC&#L z_65_`VUDny?{KL@ZPLB%`naG~I^(Kd)yxs6nzO|_?N#xDQZ`Q{j1y>!9Ww}4gmnL@ zphe=A3!apukWU|66vOFS8^9=ui?K?B%k4WQwdSzV$EQ%TfNM5P?YU^_qolk&5< z536{z41y7I(gmC|SP~AB&U`Hj=ex_18_E(RQo-n3QgP67id;&#*mALy!m(y!q_Y6J z_u91WKN;-t3MmK0R!R(OHO;Ztj&d+D5n@Uyl!j;f`O}K`K?SZfdKC1r?F2OqUJ$odZ8#(@UBJ$Rv-dY#iN)imnTS&d# zO#AD>a{UA{e_1;;He&cncZET5m{>@hbP5(MVG)ihIY^^qNdII<49OJPEx$IuwR{`g z!g-?3wsS;Z(ELe8fvwoQZEd5LRGzb%aoyz)Qrw=c?|a`sz{LAn7N<+L_m-wmfrk_v z-;f8Ybq|Aih?EKg&*FRV=qA&H&(cX=y30waqr7vy(77RJXxTOa1*r%w^PB=8ruBSt zuXBsJ%MxtQ4fx1H(oN!WYIWH8e_{^9Nx*ZB8UPK^{8YgmszljN-^zO~0QkSZf{d|X-{Yr6@ttpSpuD%4S0dy2W zf0m`6GuEHQEvnZT*D)Dk`wg*a@Z9O$>6J1?qg-vIeZ6zGsV=r&|8c>^N5VGyi8n^; zL^5*Uv30>#{2iTg5PKJo2J=*KeqOesKkwOLo^aS6{l*nQrGmf!gXh;?1KZskGaSpBs8WU(EimKj-E}451U*(($WLE*Gh=m3S|)@^(q`hNQejBf9nH69n8l7%aF`?tzNo%e4u$ zxB))25mh{yvb8Q!8Xl_l>3enzW?5jJvnXGe+V`C`zm#V|@i@V8s;#<`q+#AV4IOLm zfo#`ZWokR05k+B-t%~aXedqwH#9ZddL@5-9y`^BImg5`nr@Gry!Azy<;1ho*;P;cY zYz$Q>xf}~i%8iJs;p--M4{(u|T_*$Op8m&VxwI4Cm%#byLtN2(jx-J0 z`32vkz{C$ZVa1c|Hq95#?J6L~rA;@cdnAI6fiLb%lHE;8>t!H^?n%eK}*D|uI?cUmOVMwD28bPRzSKr(N@ z;N;veHXD)H@k&==;$&^EYY_*C;NpmcMJ(e4E2G`y4?v__)L)azxy4L79{hC&24u^# zVZ6^}>w;7oScQ>g%Q9N~7Eu*ch=Q8{gS%0CoR@Uu6c*=c&(c#^-Aj9P|1nF;Oc{`$ z{aa0`mc8^N;GYP9{(@Wuee`6qKQk^uQr;j5# zyKxpbH}`j*3RjaEMc>GQl0X8yd3<>3uGDCMFJiP#(*A&xjEYpFzJSVUc8_hqP~Lrz zfwJPHBTcHdcWlTu@SqGUD`izFt9VJ7;ggtXua;&V#W3AI0rqQ z!3gkr?YEzBpji}4f&q1q!WVM}sD5UtmZ6Q8(bqmvDJsg~Sza0D0y+)g^wCjZ?z#<0 zP10HKtC(GpZ}pr0%8=s`w}&@b#%ik(sOS-roJI*r%{V`b6{R=+CE*HhtSyaHkNl7; zbmjEZ(79l*z`;%30a3J9$GzLEuGxAPHds&G_0_%1XXbK2kHNy40Ng{m3={D-i+Nt2 z&Zxsy-uJ#O^_0&Nng0_(ypnR@jL2edi=xQSA$*%-I=kBVXVYX|;)j{-za5>Q#z$x7 z?v`eh>|9^u!nuW$%O7FkoSvlWh}Qm^qeH$^oxWkxC%(%qyKsfpU&1X8w1o&pWuC2% zIv*2tz1}S3klO5y_9B4KUO;Ar#6HOXDouSD68Da#g1@kk5^}R}a}t*jas|w`F%aXn zbd|7WAP-iTrdD?%D$&!^3_mFcdl9yL<@7TAkgBp+!i2+wv1-7YquGrY!>J8i-;eho z84u_WVZlx7=UA?#)t|Tu7(k;4js zk;Xupk3cZODoLtinucRT*iz+pi&`I9Z$DTWVE1LQZbW?he#j(UHtFun4;XS#nkZ&Y&*dHkB_{XRt<@V+bB^OOh}6Z-zLkgmeUK4d%AtulhQMnCr#*-MLkb^ zvBV@v%a^{V@}IFy2xt1LiR7w=mc?+we8=mv)TUm#E`dUpQJFz^8=Yb)<*VQK+cTI_ z<3Psk#!rAMZPfsd#Bt!_scE4i1C9$s5U`wd;MROkAENZjtYq_P_pbQ3zo!|MRE%z| zWAA4SA@?k1m%xUy>T&#W$OGuxSEV}-gI)tnNS8ya4bT}B(9M?)KMTG;-{e=C-k|5B z@$O8(&XAi-;6QcRQ2k2Za3+ZZEB>d6rSVk)JHcMo#_NpJ@dtB@*wD@)4>V2+w)Sd;RaCuf0c$SQFg4dJm6L!YDq{YYg1*Qha}|Gu(|9Y=bS<(c_~+?T(X`W z23*mwV1Ye;r zIaH>!K&9@GH34r=AMZ6>$bBG4%#AK9awJuBPk7QPS{1P5u_S&g;nvDvnZZ}~z+A;Y zJMdsLgT3J;qzVSBH4_HvLg@4LcfdUx-4~*gTOA=k(t(*y=O|$#t-`fMqR#I*7qOyV z2HW!nf*))2^Z{?ojE)&D@~i?{MF;2Y?cAbAw97tAa5B4&0G%&Z`9wRDpME_7Z_`hP z2lgIxJLP9ay)RJ0$l6ojc6GXV41w-;1yy-d4Ukb|26p0x5C6f-F`tk7& z$(r=w08#eMl?o5r_;JnP_hY3?ttr>wx*{03RtGMQsj3rkg0dEY{%so*Sh=|g}r6^$l0lrb+9n%S^ z&Mr61M2H04Kt>Ysw#lJ?HHpr^h17K{z}!X@uWWb*W;-BxFJ{Q3(%^IBlfpo}6NCJv_HY%-^`+Sz$kMixCdzmMob zxs^y;ZGU4~O0J&2__v9Y){iY+Qd6a`tFtn+u(u+6Tz{odB3|ofdK(cOmWWULgU(Gy zDa6khJy?hic7u)>az@L4Z&glHf>wC&T$a!2=N9_=YF|-0+r_3j^wsc8Z*y4dcCYD@ zX8GMu*Qea*x+J?~n{@>?`>E*-v#blyBf#-PS@SsHFu7R`uAX~a-&rZ!J&KJ}9V0Nu znI+66UwqglNzrw0kVQNtz;wuwW8kCXAXA%)$Y)-pysO&biU_gwG$+OhXLdy37q!>K zGR$}Mn3ZpUyIN-*B62R_-5=ftQMc}5q~pnc=Q!=5;hr8Ip99MoBoR(5b_* zCUbWQ+wB1)!yz}&eYrv|CCa>GPvO{ly^;;{zZ>|A{&hS*1>tB&{mVMUO5=5Sd(Lkw zU29XhiHN8NuU8nnlT(-nuo-F`COg;_3ucNni3??_6@YiST(%}yjJs$clC8D_=Cbb( zzS7okh9M7;n;3J|3|GeMZ2~)>U*4!ZmhEVbQ^o+I9Au8kH6#N>k3$U^61{0GQD&hPV8UU zk=8q+CH+Q9lM52~5Q(aQ2|eoRR&{wX^qel*p1(fd@V)aS-9bWml1q2dD*75a%|+z_ zWN`B#?Y#Ja1i!}!qY%fZy|iu$9WSw>R!D&tZSvhDsdtCmFd)gXFBU%{O^rX9LS;zvfG$rX_-Mk+JZ2AMl1rJpd_HK!-863f*%yofY`pI49y!s`X;XC>u6Xr+-@Xd) zEYZ0gXZK)_doaJkw)vecyegqnM9WhMAqzV4`o*IXNU;s>r`!UYlyVeHu7K@X{*2zm zD0>}$GeA$Pp*??!fTUW-0uFSa|z zW?v>K1ld1~n$cTJ-JJz*y?a6X`UPHHmFE2CQWJQt7`?T`bDKL)xS0H$W!~Kh_5Tlh zMXOAIQPgSPsYE=e;K0^^niM|w{M9jQ6yn+lmishAyKSyaS<(fyOWG-#Xn%25?_L)% zy^{WCFXqR7hKKCS#Isu@k;^LZ+;uA}Y_c)Uc9O?8C4|m_UQl|WdUgfiUf``2sh0jU zeo>mn>(d7$2%LPo3pX#S>s0e02L**j!iuhaVN|t>rlvN$G4u;hO$~=um+YtU%7fnY`ce--6;;v*@Zs~>DHPu_YOLsDeDLA?6!_=_jJAY_TK^6-hX3QO9~T{T zDSYMU7yUI7syApgxhJFw*WIFys(e{|dLG}(c0#Xo$5Dsypb|!7PY&k5k&!2~eB<*L z*ojlq23np40x-k+VR%#Ra`seaZIc0l029mf9M25Ook>A7q-|ac5(!eIox?ZTQcX3i zaX@44)Ruetr+CnmTvt5wuw)~6nHL7~3}Kazh{9hAey+@~84vW88R8v<{?7HFAR|b0t!8-Q_rJm+P1HLBi{s)}M_cSn=H(4at&EM46&D!Q=qeu;e+vaRuq` zyTZBU9eMBIHY(;aEUYg`fvoqU{1r1QH%w6ol+|}*GV_mya9UCRg*uqR3x;!RlSYsI zkBlQcUy9{XUgv~Av7@0zqNQVLS2&vR?qjzhmFIf>#y7%$Fp?!J9`+)j+xO6!1^$zV z;2&$#gj|NLsXj)siE+1sv&g=FuXGMAGVFSmEOdvr$ZjmZ=DQ8a`B4>_zs9H~-Q6o6 zDok@f?pF}#nQ8H~z*qcy2l{oX&-YGL$S7)kJh&XVHf@pdsz2dY5K&t9JO5io6CpFV zTCkC0L2drQ!r1NrKZ|%u`XskkPSkxw~if?)a4Z+IQ?tY#d2dR7^p4;vWYD z{9Ql(;nNYs*$TMUHu>roPX1Wy^C7wULNu{saVW&*jmYSFM9oN(h~r<|A+`KXy?5x| z*_eE_@~FMp+6G8#>(-)P$&01bRcJj*&^O;^cNVjdqHp&k9u_(Sc+{c#F4OuU{dV*n z?%8L#)!U077iE+${8V6XtnMTq`dvHDI0N|Aa$*>63=}mPSkTXa5Ty=@Sqzz4Dvq4R z#6SvO(kNGWe?VEQiz56&&V1|KnMa1yYIHsD)>HLMk#9J%7K6iob_JZ2`Y3j~sv8qW zxiaKYj!f%|pYI~_;3rrSn!7^3v_l!?Vszl56c7m^PQvX01es7~G}}bxJTD5(7J<1q zUy8Zpw#IRxXKx2(PBdD3v%mFaY_U4EiCnc{E$Z^+mhods$-afo5B&@P+2#cr`=?2X zyR^wokGi`|Mqkj8wD>@0o!dNNZLpIxTvjOB@3LxxHfN+ahUvh~x9KtY?fU4T$ZJLE z-W?Ctd!EtsG-|u}q{2lF9;$vx$YS`XciddDla}J3`2pOda%&h}IR3S- zkO!kE<2}>;%mRU}L@LHe1fxsht>OOKtO#$^4mgXKWypPYzrPWlC4~_I#25X$o>w-7>Z702BU`n!?2$fB_ z&z-31(w)q}DqPr-xMb~5J1i$WLsU`Xt3)6m5MiCs2VDA|+7;P9qwg6tq_+UyK)xT$JK@qkU5qQic3aeecI_tlUX$(- zRQfI(RF#TF&K1oM?H~-H&V1G5;6BWHW2#Gt)Lol7Ry=b%yabvP;h$h2|DL&|Xe_Dz zO&BF8-v6i-ZXPmXWD9plyB&#|mvGvQ3862A?=|s%yzra2kwG3(D9Gb`Wgyz3d4PZA zXH=yfe~i%Bw^6bw)IvHcQkC%bT(kCtm6oR&D#pf{aU=$nq->-kiOhX#Xq_^u4cFCt zl$%KQlHfNNHbmcM*tsX%8&r(Y8lE&7MGM~M2>;nfd;fT;Gw^#T6h5StD^)a4a~)wW zmmfJfKot}{qIdXV<|s=}spK8w?xFy#)LF*ip>KgwuV&fK@dM<3J#~ep7x^EJ>~x2M zep8Z{s+R?0nEs5zmR*dD*{@5B0VIN}pze}oJGwGdyccrjLg_Ag*1mlad&a@Fq1y7` zUsO{1#Y6)|8IcdZvUTsi4G3vRt!2y9urhcKhrwg2-fofX7Xtq<9vPHTuhfixBVxfh z$r|7Zo+}m-$hL^Sy1Ohk(~hn`Y*dqfJbvnje(#^RqIHmtnda3`Z~9fw|M}hhZ(tS5 zdjEKS|oA6oexj8rmdQaU$t$|}*|m+`HlZ565#wdqoT3zWH8sY~5m8XPLMU<@A20B|&Qhq;la~P94w(B>iu~ba>aY z+DZtvUs&j_w1n%8haK>fllFz0sk7R>0_6X4gX(4$A8oC7m|xvn`hF)MDE~C3MbCWq zA#Z_~e#$iz4alcme*HY_V#~Uo*Qw3pJAF2eBiDqBumxa+d8@6za&JGn?e?s}NIEZ= z5#E6NE$@jtZ-)5|adz4+guotG&^YoYEwueG|3RVq(BD33d&FS8NBC9h%l@nww4tEQ zZaMVw`)1@FMm>HriWuBK@j1sSk}om8EZWh@E3y4Zyk*iebnq{K)E?Bg(5d9HLKcFO!xs*tB zscXKoCw!!R}1qIVGjw%EFhc(ns6%-G0w|RXuu{#d4F+G{UR`b+(v#{g_MID*F=5 zoHZM*u%8@!w306@*OMX-M(5_Ty+#Ul*-oYa7u%B~abH~aUduA7Jev~@@hX-&TNS{9 z@_8fmWsZOa5a`M_KykUxVrgvwP9;PayO+2=&$h;a*@K!ByX#xo=$CBIX0PkwnQ3s} zjZl_rH4_Z#?wK1$#T(t|?;aVTW*ZtVM1QYHMcQjZ5vb&3V{?Q{R+fDIhuG%e&>2vb z6toG4X|7D+7-rU1vUC^rVV+>0M&D9R>Ui2jre~FL@NDGq>w%|Yr*N>7AHD^-a>Cb0 zSr^y=m3S^1XF22$*J9eS?%Vpa1uOM4k2FBlpOIxWwyO!0;5FF?Q4SvHOGmSn8FPfa zpOcx{n4t>_D>;08eCf{h5$wM4NGZmP4^?_yF3HloFz+pcud-wxlF#(%0PFjenqkT= z{g_dgOrSUG8(p;Y=BH2O24lmt@r}qUQ5K{9rLH?^z;`ud< ztAmQ$?@8d=yU+rr9dxw3z&IAKvOzbnwjF=%-bL->ZKJTx^*KZRXUR{Q|7QnrSx(wq zEQTw-yT{#U(DB2#GEean#WG=*nfFFnT~P{aA8scWB6}X)Giu8y)_qR zlNwJOMTurw4gd?QTFkcrtCS^J-LcO-!FmQF&LJ=5@aq(u2U}alyG(M}eUTBW7bU3P zNb!r8b@&f+h@2ouJ|{$OE^?aMs4qU;uVmnR#mw@63ZcrkL4>O&w#(!iM8+9bBI1=T zCO-Fk2DZ2u+=o|~!fWl!AKFQmi1;We5O-snyoW^c1TL5%ioQ0@tL5a1mx>5z)jd8Q zmJ%2vTUg(YX2vvqfAYQYr6cRe=(w4rFvF;(6<(#eQ7dHogqodGUgW~zc~-vv(v(Y! zCe&#U-Z#~$Mrx!Tb~nSq&|6?ZsW5^8OvpJR$Hn39TZsR7^ZwCGA54O>f*5k6J~Qa2 z=zEY%gG)gfTjZL+2rh=40~NEGqr3<{$+!|G0u`3LVgAc`$jfpsO7ZHDbqsIU1S}z` zl-d@$v+~l!Lp$%OynE2$-9D>zx8n33*6J=KJ`}wOv`f~t`FJWkNTJJa4mz+p_cLnX zu5=Jo{o}gtLhd1!3439VClQGJk0&-wEj&rS1+QjV36V(W-C?bdA#y4&%#FYhOubIj zqtz~5Ki#?gRO&;TfHM05LHxuUk^RDy!d&dS>95PouT90Qp!wLb7A%158JP=jTFM=f zYd7V8%uIh}4bRkF^$1h!Jq&3+9Yo%evg|f7De1Ltc1BoqC5n?HF3QR5r`4?8Bg8z_ ziX{!grBhxZvo@l(H(1jGT&fV+E)ui^m={>pKMgQR3EQ|*MxTP~T^#|W%MGfwfKXqh9cnd=#kLb#Q?^261VZ`!Sfq(_M?14pG zRgN>+Uljh^OWerU$NbFisMR2*ZYt6%Q5va%<~SL!E(1B50#f**TSE~MUR*_JAxKu9 zWaeX7u04%HlmQV2+He!%{l3H|WX~0fWg`ysB6wE;3JIxdDM5F1zReOmEOpm=|7ybG z`NJs2TSce-?&tJywX#atq<>Jwe?qTK7ZVzq;FU5v0vu827q#RZTT0@_t>fZMsTS?C z30W>QsM4+ktNE#V$LzaIZ%ofiCCu|14!(rx1VMfTpp_Gr+?r<^T~`U$5F-YM*+oMF zO~o$Z`K4U{qph+2;5Ah6O>#ASye#hM{&^^BCL> z4EKB6O|1u37${+2gz<;*+=tNViPsd*)b733h4@bAilEq~tDT13iq+DxBL*t~wSIA% zXe!OT=Z>Qxb;wAS@yMsCp6SMnugbF*0wYi7<=m$v7;zPC!#qR5vj)Wc6ubtka>*7Y z0Ev`BW+CoFt*H|e*Py2omxho@3YOOlIM%_~rt({)-eX`m7X|P7%9~@z@K8S6IYrC1 z@iNm+$y==BT#6Js$6SnTj@U;`@vAeOU2ZKa*fx6E(5mbIJve4k#W9FY77+-=djK^- zsFq^=bglw{am*AdIwHq9!hw714xQzQB43RSP8Ot)Z_2Bn7ZT)tbgE^WwY*z6XdogG zQCXsLwEFPWrqy+64?^`3QKPW4=T8cgX6MBEy9LEvIxj!_Yoh&ESXA{JPpafwY%gY8 zuIvN;*D-omNmN^P+aWP|bDH92VFtv%y;BG^0i~B$?F?Rtle1rf`~~nlQC7iL!UtT>f^`^G8rCL+m`uTGn$JwD1av9`JFkp@Yz z*ZIR2+zz0&iL-ts_u{*vkEd@jlB18eQKTc6nev8dE>ySS?bL3+j~Sp>xzca_J*)>< zq+wp+A1lO<5zsm^TmKuq)|N%uqOU$`MceEM1Ym|tLk2oeU48v{N5F+CQmn{L?p&MaD?A!07R+5umH}%4C|9mZ7j#atj}#NZqo&$0sry3 zIh6nI+%hbDcgLhuKw8VPrETbaF9DM8C{nt(AED1z1qwY9UHHKw0FQ#fEZa-agxHei zzDF=~$7rJcF2i?$$hfB5S^p5d`-4l-s1ciZ1QI%w?QBQYB#B7Omtb=$h4!USq+-R2 z7WGBy&cp7+MFy*^1z6+oRcKb3K`|%(O(k)d9nwJv+86FyMZf&8V5)B=a5DkJYx?IW zYHw{fV^Y33JU1<^f<@cD12a6lnK2Q*h5zJq4!%@tgI);z31+-ZrD-PMhshxVmsTtu z!IbJ&pT5bu9<(}lgFvo10ZBz2Xm9fcEIWua-)~Q-W?Xm47+;a@?zuE^pYF2a$enz2 zG^i8D*Q4RrBLX+NA5@~!$wUsR@p4Ae`O4w(p|g+Ke;a|KSY$+PG;X5)KES_e?ARpN zS!0g+-M3eqBlh>H`*q>JnFpLH_$Mu0L1sF>9L|GDBw=-jYLJn5ZG?bTL3sC|9j8 z&N?`OWg$os6^0)^P^xUCdBzER@e21l|KqvZxtDQk?CW5 z^S*E=pw?Z{q6I47t2Z5l*N>owZZ83{?JQleGA%_&;XT_;mfU@M>TdpPB5Is^URKdg zN6^ul8TV!X+(dq7;LsQ+*8m1eM~E-?X0vLt{~?a;Y=MqUYZln6B~I=NYsx9hGfTQsC*U(}K9+asjlqa^)m%4z3sLgjdRFyx~$3uygj%H3c-TExMip> zy@CP7&HD^(32+Kbftqbc(mf}WsmpEpzNiLV^K^p=^w`>|8Vqu|ZuBkS^Vth*6sDL$7=L%0PFVh3HQwWE*6 zQ*x6n%FZ)e!kU6_-hOSF?6NkCv>5F6MzmtFPC8bR^R2c+U0Izg(h7j(9{&xj0%ZOo z#T(uJsQyu}ehyp=eOq|?NK=rrS1_z;OGy0Tz=!6$jv4|X4!#nlQ{jo1T%=ETyvq$d zUK2wPM{XeTi=dR^w6BlF!c1T;P9NnJ4rr=1Y8LUY{M%b?3&lmuueV*P-dlamH_8{R zZW%igs0sWDPCD6eZKubwr2lo_eH(&J$#pgQ;ss90`Yk&xbhojXSko!4%4*f)+6IZ9 z@{_h>6Dh$#C+@6Jh<|i3E6sMLs3CagOm~2Nv*AQ1^1#a($tI%x#ng~H%9zf z6Mf$)TCQjQ$KXJg-$8(gbRz6o&h-P$MT~Pv&f~mPR7}!B%2_nw_>BTc7WLo>Qmg_@ z`NK~S@2t>;y6%yL9b$`6X8%qSM)h677Gzc7OzihG%A2PK7i@eZA%2|(?$cBu620)H zApW`aNEYPct&qiwe(s0=D0_LPW-MOyMtAvZRTXH%PfOgMJue}QZ!|K$N*|YehxDs+ z@_S;BZHh@cxY~E*JpMbj?@EMWZsI7UfmUbo16lc)WBl)G9J=Xr!o|9mSNeBiPPU_8 z$C=u-!WL*VaeXihfk4>WUin)stZn9aNb(RhFB_1gLeUid>Z+LFFpZHNF%8yHc9!v+ zZB0LYw)q(Z1ACgq=P;*r#)RQA_bm3#K_dOrGuAoAmOB@h<{(>`elYX(Kr6?z5C!U7 z7lbRFG+#Olfm|GEFTee#2Je%-gYVV{)dszUlIWDeF9ZND{L+W?z;w6X3*I-2NaB|pN3j7;av~{VuO6XqVY~?hZkX$0!W;CR6@Y4Yf5bVt z;C*ZMgu7a#6%EZ!2J&VXfgNaH%7**S?ZVy1ZQ``97#~J^)Pp}((@r;9Z)8UnB@E7Y zGe++&d1YzqL5=_Ouola&Zal<0D!ts(>hT ze?;T#%-w&7$+)-~%CGvh<)2((=xntN2X{q=HC8S_dz;BHTkak}x8Fz3J3{mGlGas_ zXvgHY1a859v@qDb1>n>0;iLDSi%3+g{Yx;4M|aCx{5w0>c<~IuLTTsql^yDE{MhK@ zgT>{Zz{1Wp|2wbVb!irViDi3u+Z-ITK5^&exfOB1?Oo!41gfqUONa-|pK`~@iUwR| zPB7XTZYF~6s+^g=vxF?ah`S^zXQ;L38Ce|t8x_CzV=o1#tka70AUxqVt)K2)Is#Ss zWhXmxdVfUY;>LaemrjzAl)qq_E$zP7JpcDhX*hHCc`}rE zu!0}jJB6N8quUK}z|OF_5jidWo$TX4`AQz^40~;ZMzfH+lzdH8Wo{Nk^+9dpH4MWz z6v0Wre z<6+5E$xW{eshNpBA#rH*2-1E?Tr1D^k2%}Z_2~7CZ=EN8-$;0gNUdl0@8DAF9E}4_%&dHJweM7H<#+&xn-tDDm%MhyxXEgns+c(pVB0S{5ZetY%PyvT8v3a z4suXSIKGqku@N!ifPj`K?0!l_jR&K=k_j$eH(oCn%dSX>;-urnwz$r1ltkW5-}@h+ zvbr4qFC@l+$!&Jgg;ty%K^~guqkjiMm@q&JPo5PiU4t|nj#R(4CpX`6Tu{JqE=)T( zc3xdiwPSqzVN3SNQy}`U`j)=rw?Wx#)cIw{D`p4^zd`{jS%#IIfb=ccVH(`k*e~mZ zJ&s3K8cuSQyW^=2PQMW!d{HSAnI&I)fb^}}52nj`qy(oyYKki^A%7CybZ?4~qOb<> z*W`Jx4#mn~*?UyeB3|gB@wtvS&2V0)1=xJy+5*Mf`k&B&9pSVA3U_>Q=wNodoYHc( z8l9^-k-GBAIH(Cwo!1{f&vjZWD*hiu=i<-w|HW};m`j-Z{eD;Gk|_6E^PNNKe z<32SXtJKye!}zj+?aF&w-3R6%-GDTl*3(HdLs##Y;}xMVA%RAZ;)rg0TdrMBK07DN z9Z7O%i8RmC>_UBUkZWQp95`SZVjHT)2*YMeKeFmg}mj@%{wsugzc=_SVk z>~#1v=Qk}HXIr21fR?HV;a-!O0-`3i!2&rJe3c&PT%@6l=0>s@7_F8=;N(4EAFa*^ ziM6B~y?%kQj%%y5OX{cc-uNm+4tFlm)^VVYu1YZQ^itzdM*HI!qDtOb5Jsr+09IbE zB_ie=b0>x%CYcejEnN8P;Ws6vKrXP*O~^Xz`H!H$*Ksi2RQUz$=;OoF%+7gEYOsSS z7OaNT5X1r`#v2By-HjBBx&__Ukfz3#==LycAI0T>b)WD=Od$bB`cpIkRLbVF(zT?t zqNI2a$Y-2(JKg!no-FeLHMC&iq0fch8%3fAM{B#Z`GT#0at?lonC?G_rn4Q{W~;(8e44~4}hVB>UOF5U?83R6h@Kp+^SURL3o0?H-UdCFQ78l$A9106ga z1sc7==hU@!=-!~s{*zQ^Tj1AauS&TXpLj2Ru1j>uK4LVZwhZXd5%EV!JiR4ow)*qM zt)~x<3*s(kH9%p%0o8qL!28F&$A`}UI$bnTxtuwj=-=iW)^%yo?VR~j?u3T_RJEV= zGKcLIg(<%z(|32#pPx8CdMHqHyP;^bMEBIh*ImxAFQ%^$`SJ0<#WR%|F4nYp==Y(5VZaj2{;AfwiOSH2 z?Tr}(Bw}cdk+(|MN>Mf|!gs~$%*bH){-786Y(YH!x-FD4Vm!tN08X0`bSu2j-O6YS z1l>AV^vT-tc8`a9)rJR^fZnOq2ke6$H7~nMsUY4On zcU%WJ%O$k5bQ9lQbB$}ePtU$%hqrHk_7x_X6UB%W$Q&WQleGq1Q;mV$syS{-FT>a^ z((nJLRRFg!EYq`M;Ga88;6p7Jr1>i`s&9$9CpH9(#)I07%H4Yz5CNz@Bv1lq;aM&} z%4XJdiMa~G4LGZf(+N_HdVCb)_f#i3Vd!u4?oB1UuAvtoSfadj6K*GCFG54~m5R(2 zAe3VIUO#eSFD%|%-CiY$_rkQLD&|Z;!-a!|T`lvh$TExrLYB#ncu!y9)KYt{%v32- z>wpX0O%AA?elRS$PDZJ)iuJRuP2tGSbdCkd{%z`OkwpQ|V^mfTK zpG^NfRe>Ch>!Li?j0fD3e;VHUH9O`(VH1wo%$|=*p?}=oB~`U`>HP%AV5wR%)liu- zNc+tWEK6V-$BB~?%0rwJO*4ah}AA+yt`X1 z{*1|Y!3C^pcpEIJGHS;u94+?M+-$zehhH1S32ZV}p=qOW*S}*@4(;o*fs-XL}Gj-kqnPXt%8h2#EPW<2)D8X`#w=Voj3FMUX|CD5%;hoSJc`- zWx?-{U8U2bu}udOG}=&q=Ad4W_$m{cIp?>Pu;AV2eO%DMx2;LvpV9H}uc-ha1<->Z z-lh)afsUvJENG97EiXL%^1RKNhaLl4&l%zv!XhO3!j~-Mjd~Q-5fd~TtyQ!kEHt}x zy1g6EZdDm)1%%IM?`9Rx55cT535-wLazk7+aj96~ZZhWD7-jHkt&H~F<3QDGl7dlk z>oZokt)tev>!Mg5uJ*~a_M<+vyOQZrg;y_>OkdHin5^!X6?dhaT-I8K@^sKUQHu12eq!T^vZ2~Yx%Mb*3 z2L*0#kPB>VE1{h??>w|Oy>sle*`q8XEm&fa!>uw43#wZ=bsk>XJKM2vC4-7Q{W%eT zuw2sw-I7(ecOe9hH8l)c0vZKFyJsu^bd%+0Bu-2RRauA3<^`IjZ-*{R4F%OGeh%GT z`q)t!*wx|~A+Toxdp2Ht7-$fTSKdLfGSrW^jFDDbUjlh?epp&gGb?YXf`G}I-@cn0 zjj=fO7WQYmWGwl87xdE$sv?z(AJV(&n+3_!Ba#1oOV8!@3VdD3*__sM_*&)vmQ5O}hJR{hEiMv&gv0(2~Zg764lRhnG=9;Ol_l;+||^ zk^9o7esL>6E#LvSR4R>^OWlgBo~rNT``@N4G9s2Gy)UZ5cPzcnH~!&Q;)SdMH3($5 zXyzT*NJDHrm=lTdc*V9al}G8PlU`f4aLnF{Yfy`u>7$iCP;|Kw?2_2(k#bitoIJYE zxu;geXnW!i5UtF+4JEzOGi8Wk{c{zEbV31-u4h~) zl;MEZ!9!#oXd|ul&^*WB0&4zdOnm{M2&y=HoOrzBEnFb%!*l$!;5B60Vd5@22Q1g< zqg^Lg-OF2&Rl$DE6}E<#)oG|nYY9krd(S!O`0w|GknUZ)fD(<9wD`HfMEDKP@S>29 zgYrKVh17%H&PBe~lO~x*5H@oMR04j9Q04DJooWa&p^G{nU<`+-l1V^Mp}i- zD!MdiUn80nVdr?W5Q4O;7*dkKd3-13rxl(uPZA$kJT0y_9grsZ2R9tgb#l@{5XDvf zqT1^Z0&Q^sb+HaUAHYK^97lIg$BJWY^X6{H%~?f=I5S-h9I_`l*)!UL3@@^2m3Sm8 z%vBYbMRhb7lXhC`CNF{|%z0h!75c86#7()7c-**^g#^-O8Y_F5;zd9c+HPHKzwRNu zEU0$os8~^XVA2vl!pn{{W%^5H^@AHlG~Y@Rh*M<>sEGoCrEzw6RGZZG5_v&%U-4vf z_(7OV+UUBbL^{s3Ox$2mpOPd!E*VeT#L6-s8}Mt-2%L6ITmZ$MpbZc^Q&~-DP2>S@ zjki6;s0__@2Ihjzd$o7eV7tJbl6^Jt?nSsOR)9&Yb)FF{^lbN{ATR#L zR(=XXb9F>M#@_rw19Bf@|AzmX_ZJ5Qc?Xdvr6122_m>zBE}o=!)fP7+soAxI0`y#* z>AG!k6QJ$fQgcK>G_82>WS`w`Zlt!Tx%YNTgt%{tip=@~XgVe>#n(nmM+(btx7v@{ zJl{_$q z1wZ3vj)>Q}Vyih&u7H5)i2o$^SZ8zGGPsI<9{o0x@aI3q1uba6pxcSc2QFRbnL4yy zve)8yrQe?9&rId*SR+jg;5ZbQ3+CZoTcgRt&}6M1IgLBWn7)(Ne1 zM3F8j&2Jc(B%yEvQ?!@rbFeAhDRvzmr1VVOV1j8)wb7u9gXMi3u20VI=Vg!vm$%fR z2TkJ@`?Pf#yPcAd1-NpOnFRiX#>LQ~(Lc82TuxX-<8ijivqiYt?Y-V?@l#;!fK1bO z=|fFBTIaV+pMO66XYl-B5(xg*T8Wwp_ZknnBO>ImzixY1U7eObzXrd~@S1FM4Zt=P zVp6L9$>8~lIyHc5(co?))h|ne1W3bM zAPQl}=$N_QtM0Edj%%lQ64>Wv7cLdN8*PxhMdIQTYdl|w78;EF#TDWbZEVGPVUm(E zh5cojrWb%Bu}%}%C?IwS|k*YuPVSWj3Yjh>y%7XizFYM z*2_Gt!J8&wLGYk@y`M2h#{G+a>x_M=W)SP_oF!0|1WNRAw8=$R&#>bzqpEw{-(Egw zVG4r2fYUDkxYXI~-MFh+R7mwvl)oV=^f-;CfG5(-f@hJ%krG+si=!SVjegVqwZ1yu zw9DeE$m}$<_k$)}bmsm~uydYdrTUp9D7gLaV-ji3w~-^k(fC)y!ilbWi$H3PZGGRp zVs8sJ+w-3JJjiA@M2cZ^JIs!;>0toS$tzEsGE=S%-FaF1w)bq|wEt^&mF24kd(odU z)`h*pLH+1nQtKuoJ+BxJ+Z;tJu7$1e!47DG&V?DtohgF<(#D7NUN%ZwWIpxys<^dr zZZqmNwhiwT^7R`gx?R|Eslhe*!S^B=JnMd2Z+vY~YsW?ZrqO&2GdR!z3HUpq?B-Lg zLO|B;2$@@|D&6dq=jbSsnHa!Zb2r%a#~H?p-}|OnK>mnI4~QRSQ_KCSQ%q!;{|CWq z!c;uVb|1+50!ept+K^0^(=+v4YnuIg5^Q^b(3z?<5SSy(F#K)u^ug-C?oO-}y-)0p zeySuuO29~O#P|X=yIw$73mP9kGs)-di>3|c+x#hR-}IQ%D_XXCzC8AFn`YXQV!cgh z2Efi*B>P5Sv8h(h0SVpqR^hOoh>PK;i;Hh%PJIPADb*^OSPL?J1NR39u877*%4HbMCOBvfS0e@c3!(`(1P8jbh|3+tFm4^*jLx| zZfzp1&Q3fwddhBb->7D2VM(gq9 zvcevv80zD1Eq>28Bo@hv&$P8g&IU9;svWSDTi%F@IjvJZNg%o@TcsPS{@# zn%<7++G^#%8fThnI*NCETQXwO5A?G?`N@MS2mu9s4VJVsKRs>Nt6G)(odGdHu$C1+ z=1Q|{+V9%LQ8v4nX#zopJ&$%=7SGTWnmp)hkt2istF_F}Ia!*#*V@&rE z`c~O0iILcPfhac{)Nd9#zzFsVk8!BtH4+R~7r#kE=#)o7dw3&H*6{PcD(T&Yza1@D ze%|=<(mW0IFh7K;68#rT)!B2O4uv9})KQlI1kpNvt@oxhouYJFCWOKWS%vT|M?p-s z_r>;y;VJYX?yu&ccsJ8N&h>( zb05T)9C`MMtdqn>(G4BsxSc+ZWw*2XNBcP*uOcbP!KtQxnM%}q`040s_I7gg)a!9| ziEZq-?x{nsJSkYIrtFf(fs<9XB}OeR;CgPB`J9em(5mRCp6f@w zB5>LO|2Hu^+Is-?TkITUqbm7egDnG{)@wjL)r&%~GYjK?rx1N>gxbnWC?Lk#Oq-v- zza;P($c(DoqI>7jYTd)-JDkQyQn%$_dbQpWy}P-y%`+g{p`3y2p!nf_rlIUYgGlBz%UC-gu-Q9;M-6BtGG!0@+Iz(K+9W_C0H$V25 z_2mE0Depg&sE9~*de!cpjfJDAgR{KXf{v`g{p;<4349k&FMeIecf*Q334;x;4+xJR z{P@P6dYr2rZlHcTh3AH8ZO5x|tCyPgcg+PuYy8d;60`G~?Lx8S#xN3EA?|y}t2uR< z*$URoj=t2)n|pT&G0~mLXw~Ojpf~a|G>P5tBqXIgQU=?zkz{`1i0&y3rHtU~NhPlJ zudsmx#S{|TQ?E+iQEBJjf_RaD36$O1bwO_@4?y&So?w5L&CEu(^MylN+26m7NB%WD zhyRy(;TC_{rb(fN0_-MHz$Jivh-7RMxk^xP=|q|Prs9GOuTNhegtD1)r!&8u6n{$k zNCs!Cp}?_!bKnd=7!z4{roVU{$-1p6CzaJlHJ0qbkDWWytaVY6bEJ{{TE*|4H)b<= zcz@Yj-a2;|?@)@P<9Bx!tyG7;8@Xik>^Dq>V@$H_tR&-BThdG8xy|RiwhaHwGOw$v z8=mk9>k>GJVU*!<5~z?hRVgy(;krI>z*6JSDF!9c_%+7I9=&1L zrlcQ2+|<#%5cXT)WWd3}1us?y3@6q>pH$5c|yg!_l!iyH5cGZjTd zJ_E-=)4W>q9oBeM;{JDa6PDUvPc-U>h_qDDn;E`S-{t3O(_XC3E_YZ|fxc;b&qUsT zW#2>cv}m_nKi5Mb5@uhEk>M8KUNEKq`>${8)~ENfUB~t<{tXOulb$#K<1!TL3FC*n zxS-pVERCOfR&gWX(HgDbw}2vhPe+HVOGJZb+vkP3GRL(yQxT>xYt56jd?%5IM-FP-MoGR53h1&hELKsr7zM2zkM+q!~qTDvY*owBMsU2fWtp zL#>qKR!y#+z{1{foEQq$@9w>Tlf-0l7}>fGxL5 z*+n*+{tow+#;5=~<>G9hYVFAvBAo*wFF~IZKVQC412|Up(bIgh)i$PvU^DssaG&(x zFrzZlY_>(`@a34!=J8-Xsd;kB=25p*H;?KVCUPuWSy9<5BJk@-;o&uS^VgQdW&$o{?#Xmu zQ$&V?=1c9^N|VyANIr*mTE1%c4(RKfCkIpGTfQ%SPJSq!F?bhBgR)o<6^<=HzGuUm6BY*TRVup}(HzT;QBXk?P$7G-__qP#S ztaKvhS`>QEpJL@GA+b%Op=-FBwr`Qob)zXRBO~Pz9^y<}jc0TpuSfAsy@}&@Tr&2y z#*H2wW~xVF&K4yik?!aGFg@2cUA$=};FoiOsHeYQzTovyZ#KUlvBm>j~hL@{%vs_Bz_F zy{&_PEPvIXu?tXr4?AQZR`C@U-pv!M*{3l+|L&71q|I~)&Gz>CHXIiBY;6aSGkzg0 zLTe7c%b#p#&Ro#cwX?x~9AY#67|X^c&LVx@V;y-2AUZpJzHXPu8ko+J61vbN^~I`H=b zlzb5=u=(za1lwh{aet)ilohxtP_G~d(Z5S z{eE$Ho1e|J(X(;AWAdCYR!G^dEzT}ppJs}B`#dc=hx@W#hU0-c@d39FSBZ_WSb2gg z@Ey?E#`OKIih|(oO`w;k2C+d?e!{k(py@rC6D>V$Uu8ky**#!0#Y(9CuJiqrYtYL# zK$DBl2Z?rSTBKJX!BS&}eB0B?gc_)Li3a@p-8`<*&qbw}Py+CH0(r4tg?>CIXS<)Y zJ6v~jSET57{rn)%{-n87*OT;rf;GN^yY(IxI#C&?Wu0j!*3MGn7H1~RZK50qGR4-k z?9I$sdV=J6sU*UEN@mNKN@g2xXr2J+=$mK-!igu%sR2IrP&56O zC@!lw(Z`7m>cGPvN`{)OBq!d0kS{>K-(#w5SJ8oy*_(9F6%KvFy^D0Dc=FRFwYExi z5YTh541QdZKEhALYVToo(~%0=dSM@$!u`|I%02a8CYf(0sBwlaivkja5WKsG>$m)J?8N_|~J_5MKVZNeg1PGE*Axm=_SDbGZP>g+V8!f$~#>g0Thm z#?~bAq*%0anJv1ikX}#*g1}O5NI8n-7`Q$9p)D;IUp%CY{2<=oDjxG7`>B$+XMTM| zerZzOj+TJpUrCHuBNd=5F*v+usHx*^cY^#&w`dlG>byaB03`O~rOC}&?-;MH?%Bu( zHi*H^DTfZqVpB?p-sCdNUuO_ahGJSCC!vsTJ_2jscDg4`SqLGx+luyAZkTEn$0Llbw;~B|_1K<~c$y?s z$tZJczVL|06zIsSxcP_NX1-&V(3L^AGe2F^+wTxNxDG+r-=vZ6oHf*dyXjmlqB^x) zi?Di(dux;Ga%^Zc`MH}HC9}t1b7n84UES^r^UNm|v{(qyEUOqiC``Q#Np`|*3vhO5 z>Q!`AH?P7vUdp9>)H%4l-D;hDO$4^C=o;~Cih4zUu7zGjzu0AAaWm>+!b^lSJ&*T| zEt`_$i?NCy!lnQ+c>R5wPiqxL$k9ji;PH3GZUwDLfM(9twev_ zo$~qH&z1U7Yu+!SL<+9nq&z$7Reh9Hd2@{sES7?oF;`h)z8Kt~rtu-b92p=wqq`Mc z(fCYamLt%Z58?w9dj^4Sng5)F#^gmi_+&UdCZQqYC$V zE_Y$WjtionEeg#6jUc>3pyRk>I|hiZx}$fsdVHXjK`K7syJlQ#VOg7^|9J38H=L5| z3?(eYH3o3rvi{0@51}fD#w`(v2eV|bskpE>)cje1vz}?GBcDerJ0 zl70vW-v}qf1x)p;Ox}`TbYG<#aihv#OCBy9+==; zH2g_HIAV>qXtldiz}4piv88*)T!pdL*2)`3RII;Mk5{0XFwi>u9~lN|I}&% zSDQFvd9C_ixLp)2KnF3xgqFbQUj>^eV_-sC7hBeHbW9+;t!_huX{n4BC238lI{3W@%FiAE6 zL`er7*f9ymFwkd4Crn+2$aVh}(*AhFj9)Q`Q9!R*e}sV`bj7LBt}dfg>DO+d%X_%d zpL7S)fm5G$>junGT(We>ESc7=^qoSnrNbh6ouj1vQv%xLPY2#Ub`SS`iEe}D@^(AR zQB326`+9+Jp&Z8zr&|F5K|Xdj$aNZhPdHoUv3n|Pr(IlBZ#?z^HY4J#!_|yz zqgL&=Z#OC7kE9o$O-KEUD1+JRt0G zhK<+z!hpQwo8Z|Q0(9t1e~l5cU)f{t$TA`&tx!&b*;z~)2{M1bvNsVNw1}`>QPQ3W z-iU}S5aM}ba5l-|$Z@Csjsr&fFb8(^SZ5K77FEHkxA&Ed$!{ra0~#|5nC+cf)EKDRNfCVUHf~;hboNm3ZU@XfXRb zoV7CK0?y-W6%*_l*-sN`9uyIL_qlK4 zTH8s2V{3w!GkHoT<#2vM^Gx+_kRlI3;^uwUbtVb4yx4fkgAJhbZS zrLqS1d{q`|OEDPBo}O*=06Jz%0l*RWt_+=Q?+Jgp`wpIz5pdCeju59zJA`@P@j1Lk zR_k-&bv6mudi9l;Nd0);pW_l|1D7Saj1kPu)^FXxsL~6H^AW# zKqW!|#h+(7XHBh_{!EnBK7u}`3-|gHb+3h7S)YP379kBO5|TZnfR&D^;r~@t|8TB; z5cI0~l(q~cDYxkj-4~O;3HKQHqkEdmEUg7kE9B!EAs3SbOs zqKoxKq!2cGfD8Yfc&Z@NydiSbvBCo1UOSRY5GY(H61ml`CVcN%mPqmAQ;wUf7kPUX zYTN$tV|1F`Q-$B6o~$I(2bHar?U3E=YUqexv&3rFranwf(Dxbx+oC zzz8qx{=DS@)bt#_=ou|yfHJUZ4dLX5-{go>1ZEZ-l_8MXfweaxHBo1$|H zAL*?50`>Ig0|^%5J@IlDQLOQu?C=N45UJqXVkcB^)?p{lP2@Hzd}S9*6;;(;lZ+KW zhed{AeY3t}t3P57`p^n_6|dDae-)Ph22v}g;qtj8zy(wL2*$aAC|h3cB;K4)A|=qm z!KgcILFgV~^4-Dov1Crw^@2@> zB5*f4B@)9#kV^W)bOfLuq*;A7Nqn>pKyqDK54n){GsnqrKl?ssdF6 zSYUgX1BdUy*X68J3LmX2`>05*E9b$|E54qAki_~k;7t<1zRtcrUKL)HO3^y9f=s9j zmC@eq&CC2rZ&*qybo#S|%iD9_O;682^2GuSb%u^G4$1#10+Pckh6b^}Y(zSkmGE>7 zx6TmEPLC3~)01z7*2Z=YTKVilGUUFqw&N+^*vtuqI!>03rj0?x6 zK*~|`LVQXB?W=C{uc5H)bz77oCn|ks$ull1Tic>ka>6F-b14_V(tPma?zQ-hgL_pR zHX^|o+JrXDKfv#k6H~?L!J(hTZ5SbcHD4j0`iXIcZD8?A~zJ}1Y!xX zw|D=s`w6@eBbobr9f?->0hY2j#qQ{yegoo6uD^KO&<$*sFS4$mSkhQ_OeB?m>VIBDp z!pth~umr)NI-Q+|t1Zaw$YYCaaDS)Z4Z-bU2!IGYDKtB1&~@ zkyD0hgOBBNQqfB2nD8G#MiZeQpZUGrB#@wXI73hB%}YTmCiL2j^&ew_a)Ybfl9t*X z5BvvzN9=(9Fl%^r2t8Qj)K!_VN47MSOFzL#EK6CW!`_Xt{uQlOut-$xAdlmYic3ld zcQ>Y3b?5P@qmBEDe#rGEy-eY2w|k2_F7m9cJ~_tM%8*MQx+-6(4k?aE;tVhgI^73v zjQ_SH7YYc1NQe_wrvy)(@3)SsqaPK7U9<6V)18l2U!b1iiMf> ze0tfjTWz|LePDoHj+53vnd0`jRHO%wupSlBA{r0-jB%mmSxqk!c0eBwUu)mRY(02y z>_^tE8R$0_fwjxwHb+`ztT&P0>24A;$4rf73EH3$3N2f0>z>T=qAT(yN@yL5*+m=M z*$Y;x(zZY$>s*WU5a$EAqLWCGJo8*{YmB4Z4bhrMo>AWU_$2fCDUN_hKYNX{$$g}E z)xuTVJXjU2x&hggZwZ>ghh(nON-llN4scpRyX`O>$=}JZ>+nrqZEMV4ah#nz##e5& z#D4|_6%du9#rtpn6D+}E8yn~7;3#f&>Bc5{+&ggksGb`l221(IH!FD*~P)EB#yiCxD^cvjLL&A zU{qYA?9mq<&sShsrX#{)uov2fX^Y%k-I#^@Ftb-%1IkjslekRmM$KIUG9{dDp?10G zIyGf!j$nVR@aOW!A+A=N;}vKmYEXkhLerDTKOo%#_Get3hTU#b)OH0huhqt$+gv=Y zGFw@voTHLAMDVJbz#R;)eq}BW*dHsP$|nox)XH}b!Dup(KKsG7{S>$Z!<2DStSCZE z;*)D0vM&dy0>}}As|)o?zfq!3d<1UD%`d>(KD+ zV613o37kE0hP#}Nqyq5ra#X}1!-J(7esS)u19;u{x*N9NR#p(FwPxF|A=6&mLa}qC z*tvV{51ig(CU-CWvK_MgzNSrU4u^Za3cS%uFnuygp&X1Dm8TB_gs6#p_GtOF^-6D* z6G>LcIknkki8Le!tm1vtHdr61ijiQ55zERo)@O(JSlQm@TP$&<;B!TH?T%O3vg>w{ zv^y*7l=Q~N(RHcSpTD$~@0@s>l%GgSH&jh8d0)Sv5!N}Lab{gPavNTaaD=%pPuroU zw|%U(^i@-kF0*K^D1U*0a6$0w>}-uscAJ%Nvnsy`I%)#ot%{QcGzXsaRNZy321L$q zadC0J)$4FEtiuT2qo*xro(+U9ZBmX}qt6@SqpnInG>7#8a`CZ*(`eZhA`0kmTO%hO7Zw=jA^8=V7cO3}jBo#^*a|jQFSY^C|&-qvo zQ0Y?DA8Ds5)}b7Y#5>d6k9W&A23SY9%W@^kJFazY#7WfXd~Umgf{X6mCz&B&vEOL; zlO;+CEVMkm)NbYaqj?rztq5EOu6W^>!K}->k%A_9?XIl;dNf8Kx$YI5mhS?jrDtsU zRSYFNC@{T@0uvhpi;Z@XLJwaE1!-}KKt(ZWY?Ln8*x{ta5CvP1-F7ILm%61kpX@{W ztTgGwR^w0M+JjdnOA#&VQw(hfPkxYw@YiIC0KmrEhZGT}i0W$-1wZdXbiTk~M8^`# z&L*!!?<7H&rs{6e=s$F}sp;dfpf%EC0VJ1Esvzw8?3>|m$Y1e2ZaDzpHF2WJ z;+GXu3W7cs?E;)=R1w}S%qd}L$ot41*Mzo}p}A}1MPVj<$|Bqj3IWIgr06Kx6H0y$ zhZZqv40zogZUbbG3FoF|>%wJk08UTE6{>eqvmKmUnGzMo1N+J%M3n%nz49JIb*K*C zi`8x`8@V%*d&y5x@Y`vQu=}S7%6xzg8K8tsI|z*Z4jz(yK%1p}vqjDxts~7P)m-0N zrQJ)TJ76hdYa4KevHv9Tz!$_L`9vy_C=2%PFV6<)VEb)1QpCXb&%t9X2^Js_d zu5aJ~V`mreaxKTAqqzgq`5e!m;O1b+L9!lyB&^{e#(jk?5Dg>d z4!O~4oz?aZi~!S<)@`M|z>ZDB00JnFSx>N=wbFhRFMI>|ZG*>0Bk#(Z0X~VnBO{*n zZ-1AlV~2tKV%eu*fO{3i2;C{OdpB9R`1~b0R%j7^Zb#?+jxbJL7*38KGUW}Rh(QTQ zSV}I@uNvRuz@K{hasK20{pH0WhKIMhN#j9(UG7=_QwUUZB^!e{>f0OHCWZ{dmn?p4 z&+uB#{COmgDT!GH+B0LsjV5r4CG;GPy~CQbUZqPwxC8rV`V7-V^J#COoE&+TJP4r} zbrL6vrSsDZ6*l*vMQPQ+XEsWxPvDZY_!qxtz%wc;lut@W4vtnH)yd`huX0Vpg{lo@ zv}VKlCh`jyu9v;NU2aBb29YuV1rM3zZjkX!v zj0Z<1Ys#o!lY)2}jV?qifB=y>ZaT1J_3$95DY!5dCJm^gs?WW+b1?8OhqFFK$?+j; zqim8k>)_(otfQaAORU_Z26o9X?HtYfY#rOkPg1ThaW1_wV~US*9=$b|&MqQvjLc+T zJo215_B{9n?x%(0oMV4SUU-1zB zIwzxo)bnFa{>4kRz>34lH0#7>;X)^U+R@4Ih^vAjzBH6{qgj{t zQlG$ZX)R{Bm)5x$5LSD!+&#@b|F?IMNOUwI*Fu_qjhO&f`RDrz0} z*nM#*(Z&Ld(QjJNRA8DeOOP>^ivxHCK0E?{glQqR-yD+mWv{^?;;0wKnaQqn5&L-z z_3OHX7yJ7bgapo;c+N0|83z;H*qO`_+@ct(-uhB_yll)d#AN5;G$N|=q36+K9O(## zdEvYWHZKVPBgnHL{b%#~w@U7M6-$smQ6PDF^}Xq={byNRh-( zp}jJS=lWsV1e|rLgsodjU{n6B!+x9<4b}#Sg{Lx|abA0H3o$3Gn8~_BqA1g~>=c8B z;S34jVk~WXj@xURw2@apKmgUA^XvCW#SHZO60H;!xeX@cuHP=v`f4DYkxK7a8SOw8 zmAlM{6>xD1H-SFs-j5RYuoE|2)cAl^*8IM38KLsC#Ca$E$tzw@9bzU;p=c;2Waqj+ znKQxt#MzD9?~6?Pd*$*a(mukMw7_EgkUndc*`m-w*0(X;j&x{Zlh0BfYLsrSLa__H zAkKfAmesQlT7O-OGz7B?*S#oQT3=@;H8udo_S~5z(}9=#hQP;({=%p1E9MDw{VO?n zjePQABV{Jhax9_7ZfLy{MMM?-Zv$JdZTG4rgWE!_IYJ!^kd?4kYwJqr`&&69HG7i^ z9)f3sTJiY2)&rZ@&0RrcGPqueTy9dbARk#?-Fu#KRcxScUe@4CopPVOw`Fyor-)KY zZPql6oGC+AC2;eh%}Q=Tt*}p6ykUVWbtA+{WBLc58k2G?h zJFd3Dcv!9ep)d_lX*~Y&nRNG8^3$uES!Oi()Z|lFpKpcfAJ*6-EQ7_Yxo%G3)m(6x z^Q%GvgJKk5npA(?LtOzrM=!(zSSW9}+$r3dk%JOBpa+_+&^35OWiMM;=5v>;fg5*G z7C;}Eygn@l&Hv!dUQ;VfRd06_K93AmuWupM{*R>da7%Lk-?$y&Dk;+dODu0Py|IYE3K2G&WUBiqZQ!DM@9JYy?)Qd zAHcOA*h(U#dXPC`F+NKB>;ajvG;ZT ztMIH@iB~a;%sd}iwtj%Y+qj9^8<8Fsj%ZZ0I&eHTledtsaQXC;!r@y)cjrNW+?}07 zDmakk|BNru!Y2_V#w4ygzM59rr5rbZH#ZhHy&pFm(5YB7TC{5TOyp{&Jv-Mhb2)$! zVgKY=J!<*)Ll1X5MbqG%7;GxS!QsAkTCBtS%k@2-P{c#{U?%w{p@*nnkEK{*sR@Gk;HDrG? ze$_lOd``nSq++SRZg}dOZ@2`89yz;6%)`ok_W}|yl)9c2g0!{_|G|E)Q=wE>OS!zS zx=)O*k}LzGmBUgnBCC)pX8;|dXr&pz-oR#LY*xVCJ=)St-d@=1=jzk7u)>^p2}I9* zX@5IaIpGN4ApeZEPs<0gQpy;A`LazcP%I}I_5JgtOlUOmxH~Hs>UDTW2CZwC$ci%6 z!K%#a)m@ZJ+~!kBv=Gl~%Vh}3M;H*8{Vibx^!tEvv;6SfsH`jPxJf5Wgl)QQtKVNa zJX0z^d)xqeYV9`&{a=??A@7X7kJNUYs~0i)*m?E`t|yO=y!_&Ecu9-w^3C1ev#n1B zaU{@)-;9T4km&9O+hZ#79y{fNq)lEa&}{j}wJ;jshkVg+os8~2*Cx1EDpS!AQk$Hj zeevM!pFeyBao%3rGy^Si5ygqAX11%VfGE$Op5a-iq+(r4)lH_WQNk$8EiY7g4e0c{ z@aFOOwuV$?IlLJR^Gj!L&2;72EB8LVNlaI)0=Wu^jI!6$iJGoAokJ0&OoUFWSMo*# zxky{V`W+TTyjzF6Q5Iwd6L7#61>T#U{@_z^g@&DJf9RFo={z4S%(Nv=_SwW{XDNlH z?n4ICLUb)hQ11QW>#{==$E`lNodn#7O7kLnz}R-1echPX zM%^Luk;mR@jlBeuA9m|Af@(>^2R%+2Y%`sh79_6>c? zpeY;F#443Oz$>SmB+{YEduA?>ThZ6c!#g+~>d>1*i1CDV_IU_bi(_N3+)|i58otik z`jtzx8l~yP?h#R3bp@@xhi&@9!@GtNLCAFv-m_1V=S^KP3t$z9%&U~GwC>}hQGMs1 zFoHTLA>P{5Nbp0Lakk~9DIn-5B#C33YpwTulAY&3bd=8r)twyn2Iu9ec}d?4kwK@p zY#rm5-08cHp}<6ee=`n*{oN^qvOr@tN#*P1zezeNYDz!gZxV5~wBU`LPlDH79|RTAfFdAFG0Z-FZqUQC=T`1i*^&oghcDVQ(|bESK3S3Gh6n}ckaHN?G` zp0vvzRFQDjtwKiJ<(0QIz`rgaMKzGn%9fe0m}95jG=Dm-XB!QU_vAQ2Q)~{2bZY`x zFU|Zbm>XQLLU$DuxA#pYXbt-GPY&i*wCRp$=wZ;y{xH7VYrAu(_3USJ!twA?+F3q1 zvM}W-b>`dvP1@=72(rB`ZR1Z|&Aw8Nrb4kO@79i9r%JKV`2wIep6uT|xt3N0!M^Ce zid|2YW7j+{n38Wwvw~XV`Zd_~=e`B90cF~vT2Zc{tR!chu|)v8g?Q7qPF>p#BdJ3vQ}es8_9A!;lqm&6*b z;#YB?F?r(xh%rk!!7Xl0(-*LiyQke5^`B4k{MTcr6TZlovvky^Igc;b$uGVLjozkx zoBtY^D_f?8pFv;-5pwa;)zbu2^!-fCYcrs>qvhzytxg;)uaAwZ!&ufm`E`{5jun5K zzK1`4bQV`NImBVzZc=FZ7Y^dg4W`(k_L(|864!2zGkWWGjFf`lC#IIyyS7G%g*3>C zh<^5fX3D5AKUGuX_1DKUf|lXBg8w|uk2il?0UZHEYEmWNsxSwq;r;020K(>z)SqpC zIVf)AAG_|Ydb?W!-pZ2W2Pcu6v+W7uxRQq()H#Gx3Uq?Mt3iH|>qi>~TkLK4GvGz6rrjW&#tXY*wQtS6ZATXeB5T#T9-c zO4=u`ENJIc);ACO7k)5SmSC`n*Sg6~uRG&(*Ov29OT#VX2@ybN!#b&+x;$CSj!0SrG5f@4L5+E z-4c)E38Ue{mDsH@+IM&(ODDKsID8QyAW?Qot-Png@kK_JcLtUio z61Y>1IIW!g$yZGL@#GKV|=}=_< zH`xQVMBbM*tAu*-o3{tAl_-PqB$oYuug*ebyhhk{H#`QvX*$A_S5V)yN`LX4@>9C8 z9x;*Cm*DdZIln{~;umsvoasw>s{$LLw#=Z@r?}!f^t2EAds@%^XciyT#q=iD8c@_S zcMP*ej3nzwrje$CTtXjuIqJBl5=u*hu^#oWv}%+GD3JCdNoyB74@pXq;akWK_mv&r z8YOvoDs#|51%@AiC-VKR;Mva^Iqd7F^Mh=<>mMER4YoV0 zgZS$ws4-SN*Py=nYOUNki0?2tWO+xa;PJ_1u#p3#;5{?r)1u^dA**vMxlO#LFq(mN zESm}W@1FYl#Mjf3TSvo$0w_On3~+S&a55pgwozMCBOvWGqrff$F#9^Z(Me+{;zhfB zc1|-qW=*5^LAMnE|HvY*F^i7t6>0~>IwZZNCVaq~!PT>S+U`H9z9}my7gD`-5(rW? zl6iw=3r_BLemZ%t|UE5*&?wz;C^=#d0^3z?>ED#+nZo6BP5mAr0>WT$=1Bgt9o z->>|a2%Xu}_kK|r`W#GY2kaO;&QXgC2veG+Zo&1o;ngICbM2GFC zsqeeLBS2ZRohJc|f|DN^Y`XEAI(&hFl^FfA`42~vCn#EFD=!ah)OmQLIAy{iEDvNg zn%-S$?4^fcD$vdZorQ4MSMba|LyDeNM81hcXx9hgQX7G)-l{^PJCbl`$j0mEvTU>7 zn$GL*tyeYAM47^v&BGw zW%m_iYO82BB%tF9`(M9XZ(BWze7yG~&YU~sCQjbIG~WO-rn}cNbq%lVCBNL2g1yG7 z)H`9b&Bv(mONGW>+2gkoByW=QaJ}#)h6=yLk0CEK<g8GO36@h$$sIX=oQD z)n&AKnej(S=BxqW0R`|PgS}~ERDS!(H_CZ<0_RKG6jJG&J;4AH1MFVG?~?p@L&n!4%XwuC zoxr*1O`me+_A}R?7`3}9g&d*fT+bw!U-x4TnyUsRUa!ISN(8+u&xW|h^jxucSu807 z`TvK-0z{_~V|EsqW z^1pR?n`c8FHLto8cgl$+CK~NXY}1yxD$<8730#j&f*kX(8)0isEX&%u8xGmZ)~@2o zR1Gur_$BX1X3I9ijg(9V_}=H`=L%Urn9u_M`@x^Xx}Wc)-8Z@Foc1U*Q-=V9kHO2j zaW>mZSm+UKG-M`@>^DJCCsxT`u|?VNgJM|ULVO@cWS;K&-J$B|vnz^i`lGA17sPv& zK*_gLAf6{K_GaY%v)%Lf3qu646Nv2egywIn&Gx4JGqyip0l~vSLO6b1iqc^zPIx~{Mf(GnHZAByT{>FrM-(^iwnbpUaRF+7 z+<1lC%zi|^hlMUF&k+@*^bu)SY;rrBjkN<%B_wUx7^D<*I|hp zulKBX%0Z*36iFeU`6th+a>)chOh$j3&v1nBsF>rDX!M_56 zHiM0)pA?EbI7TG-KSU+&kw9`X@t1>Lw2uRiN;sTb8O+UmVcYFp6WOqJ77 z1R_gMffZxEpZPeu=Zg~H*JTTXJ{eWj`t}dqQ(CN4uqBpv{XPVCz3Ya{{@$boL7mGt zbA_%G?PK!&M%)q3e>4Dr46;@i6j{ZtUGI2J=?I)zJRfp`SjuU;Bs-#-m1_Cpp53m} za>l@OFRn;-&GjlDBfIX1YbGK%eIj-9U8wP9Iu;?&(=%Ga3JD{*VV}J9KKT@pvze(r zA;k&(BmIrpBMeo!CRc^_GaY=(yz(o+6iC!Yi6U}o{`xm`FgOwm^B zRwoeC1eX}{REa53kF-W|J>9@wL&R(DJmFj>za0(#wAC%~d5U1Zso+olsEJF;%R3|= zKwP!@!jDkojGZX9Af#TZ@V z(VFcWS6J+lWXi+68lXAE)&TG>Z>4Zy$t1l$! zTm2hWN`Q}!l^C8=cep*6>rv*#H20Lh_hLeQDNi!I9`I~v-6#kVuZ!7DgQa2&9~rj( z^AGXpM#+-cK)l$vg}O$%CKm3;o#ec_1Lx{M{Nkc#l|{9*y-B&2$gWS9u7WyQ;ec1M z(s`CxV~=9lMU@Zje<|&VQdh+)w^F|j-}Dh!`l5I=W$pA{A`;r2f9AhE4Pp>ZO%V3y zHJ>Q%-tsmIx{04MX!VS#j&2bSe&9%)ZzcqLKXY-Wu>0VerbQ!gNCDn zt@mP8r|A1R5r4`mD~nf(r{D1Xy#gh5A0NU-+Do7L>JI3*CGX38@_FmbfVtxP0L}hq z5iP@U7EmCY&1S-sH)Vn0SjnEnZu)rbxV{jKgo9~+(=h!QP#gqfMJQqJddum{)qY`N zm6QX1GQ^9D(UspRSlP^xwlk{sv5A}oPbavVbHbi8z(hL5rk_hRLiKU|ZMg%rfSy!! zRHJLqh4^khA@OR1R)f(9`yuCD*;LEYYw#fr%2Qg&>-a0M6L%KtvyRdrm3{5FXZz-$ z*FME3K()=b7>xH=Qh}kYw5;vF^HWC6Q?R~}1eJBt1Yqe>vO8(t^4f9jP_K+Rwm)c&q-*&8+A727&ClK< zeox`cn~83T?vjgs);JNdiBBD$?wD2d%vIw*={(VU-_prRCf62Q#9yfds-kRV_C*d#hiVZ~Z_BgW8B|}g;X!(Nj%?sJ_ov3qpcl_R zWd(WNUEA%E(khl*k3sGK;^TgJAAimQG|?aX=h!t3L8nag`14D{9hA@O{8}yBjeMDs z(|sXP8be@IDFoNtz|MoUe&VEKz%U2E1(Zr4P9O72k~X#4UoPA1Lcfzj4T!@VZE&zR z4_$nudN-jcHe;z{a|r(1U8PeST#|~eM8(Y{^f654Ua7Bn4CiS{u7+Z@oNE%C21XC# zUiIEuJLNeg@+<>i&N>brfL<@v|hG(-=I3H(lLto6dHp;T|a z+I>qpup4(Jm7cZfP?zlf6SDrrun(eSP? zdsdO*xZv+<{>&C@V~+E|da}%nIfMeKjko}fe$I4l>r0WM_qpw1(seHt7~x;kXYf@V zpVfIDR`%VPe_^V=iC|AwpEa--wZp(^e%Z^ksO#t3t|#HHCy&um7lL5nfE~z#=2xzO zyMdYbviDMok!CcRE^gj>vrDmqVAMfB1)RpcGG-%HV-&dCLp-*(fW|^l_J!E4q^R?~ z0jkSX4*_hPs%yK@FEIcTCcID3cZItYjRF3rC)g$CM`g}A;Rv50>uWl*$L32%yuv@q z4Ey!Q`*e(#TQ}`^yAbn+U3bwhjA%;Fs;ZH%=qE;YNF*)&$lX{PvO0N+TIXrJTN~KVu~` zo~*WK!!R{ph7&GE`-tbZ_T~U$Yz1aWUHqSTOPv`#Cqjq@@2~U7f|!4uD==EiTVq^% zU;bGP_4!+3fXeu9E$3BkmM6{f_}0Dto>}D^`L`3eILq3+>!4SP9baKb7p_oyZBBh@ zkd41Uh*4>7X^w;yX5&vRj#R$#_@~zM+(7ZCr9IZQK&;{m|JGHj?w=lu4&>~{J?xje z)scDPC@R>3Z;`Lzd6)V5>-cPJ;+80;o+eSjk**H>7Ef??)KnM0WCxc&d2$Twx$pWg z++M-n`KYPtZY*!|Z=n6KnwHKRRS*;0bUsphWYPaMQu|ZUjr*$1kmGsLeDnveOnkLs z(<9;wFRydoz1o3vki#2hsHTf(kI7Bbe9?oDupyVFeM@=w_w9afE;t3BvYf2lF~4z@cs68D#u zy9zU=SlpGNvv?7a)0N6oD4;5rY1(FH!dANfwb5WIS^!VM2Zg%hzir_E8O=|8X|2pF zqF8}Llw{hD58AyPvJ@*oabfNUaw*XZ?J@T&uc-CK+z=_m*5)Lh7*#;969 zA1Mf;wqar{1u@4^6-*tVx~eGOr9?JYw%7ERnJqgEgyCPu+1M}53QjA4%NZW>dC}c+ z9u1`FL+hd3!L+~yWe&{hTCTBaX7NY{aX6=<+-Usw>Ni&cmP(1$_d;f{x6gfp*x2Z* z`z`;A{+dJnJ_4PQt2=M8YX=BMH$uK`v&4OH%jK#~vc5~pVeQv^F}o&%+RvFc`6+(q zg>IW;92K*P%`^`*UlHSwvhRhJd89zBaCg?KkYBn}E6K|__QeuPs-NC%9*Mu76CY+F zJ5;RbZ2D7FM?UmL6M}~eS=!J=AAhO_A?4LKonm*%73_*ECrewTtK5p>qy@~Mf5(+> zz6(TMbkNYlq$-Luc2a1nH07+P%ev8YE`^2}9`VWH3|p274_aI+4?jtdZ_Ro=YSrk9 z61daPeBv1ItuGpcyqqe+>rf5GUTK7Hps7UfbA#RBKx8r1TgII+hpGv=KCxbvAora6 zWKLmu#5#o@&(e4KyT{^BCHxt)j{W$b;`zjd&gUZmDI+QLtHv8$F{VHYU0l|KYGnuV zkt+6stP%)*NNrXLWCYH9QO26hqBe6p4I%Q8syKgB{;?CF=cB5!#+ZERtz|{9$ITLe zce}3*@9BP+cH?b#39ER$iZ^gwA^H% zRoQ>&?1eiMlalD2kD>$dSE38u#u<6`2Ibw}-7-uqpriik`#z)=6}lG)4Nm>_@Ea<6 zopny8#06dBg9esfiuf)5qyaK+KE|A#haS?jW$+w3wmNLyD}yIfx}s(NUK{ItbL&x8 zUhVzwtZ&V9OUK;8nKD82T~6Be9I+}cOXpt;a$THjr2ZT2<^$p-8vmu&L7E-?_Oma- z(AQS*f-^=uXoUUTh^4vY0 zCtXxgDN{%O*>HihzJ}GqA*@{7uo5!Z()at=<*BbX>m_)VM?6{N1qB^eW_pYXotw8a zCk&v3zOH{3ZT;J72;gXx2_du@h=bsY7Q=<9smTZ1?Hr>;lT((+JRd807@;!ufbpR%o^?Vg= zGGy6hwrT*kDh~fo)>t_`i_sul1%h_6Kl&Cfu9Km&PhwiF1|B@g=6jjGfC1R~Y`T;e zP&S+|V8QQ-AVU{-mPuC3n<4ig!3xqvscR3}oqtk8fM=6$bb%_R!T3F%hUntbWzd-* zr8qwTC5nBErQbRAtKq1sBU`)fgHpgR z+>jq<6I&Nl`2!4AHqP?(_#7lcqcye59RZFf#z$`!JZL|mgS{#JdYxY4`dXmcL^+fQVJw?jINV%kcNCdOgfPIz zO{fVSH7Vy0Qw@L+t|*sylHQcZ6MtQT!qqz15>M`~>Ijxn1-~SbwgKP&xF&UqBh!}I zCsp}VG&ep$d@F*_D&)~2l{_)+#f+d|l_*H!SCfm@W0+`GsrpyA*W)>KyMlPjvON5H zuBvBMLACdy(>KWSicWZBXbAt0Ulw+nM|~gcgJvrPis1`6h|MDlg=-M`0FgS7$p1|f z_-qC#|MU1M<~}t=#cL#EL?8`V8a@o}8+f-JqiPHSPH9Ol)4SsHib;cBZtG^EgIiR( zp`9r^AMn0Tvu~L_KHrri4_S<;N!S;`pg0n$D0`f~4u#07JnII#YXVgeycReg!Rk6i z^LvZ4b&IRP-tjAThvd5yfsUR=;LcUfY;wUJVPa)aVHZ^#LemapORvYJZHW3ScG!Q<;p`1K z;iJMW=Ehi^e_5dnd5tZnQ1%WDOjhAKPJBLddxZk~@iHv0l$|LR{Ngp5O)aV;N z5`_4EY=N-+20bD3;lO2~B1FC3^8G4zeOIxDZn=bRHb%VVA+9jlD8uLj#(=Z=c>>8z zdNOA3eD!N~LAkdtYkjF#zkK*ri0q;oq}#`vX?NHKM?3JA$nMY10voq@9X*F~c2Cp? zOg6|e)kueo*h&R_PFcK~!-#%FaEw~M%m{J;4j2nxM5dJM!oi0aqPc3fZe^tL-sO5! z=>;#(JqZV5yixHeP%EzyOL8ik z>)7~hkmBDvd_f8P!9qLiZvBNz)6Si?ZuT=>!@|?(!5s>%9Fws8o6TV|z)PJDcy7`@doxaxhc_jNd^ys%hy zlkn@b`#{i6;UJTT5Wc*;XD5RQ*TR21z30Yu(oAGW>1J#)Z*_^m|NL z6@Y``5P5wR|7zH99P)Y?pdme8y19`z|E-W|xwUa9b*6oy!{lMzchgBn+aUxuC5acv zd>Hih-JSPy$hi2yos{7cQfemQW*s>BitD$1);26G1#xromGq;T;HMM~t~hr_TByiY zk5gxuG|i^$D-fEz2*>7EL$C@F(0z5k0KHpy;tmd8`#Pgl?y+^p+2&(3t3vhb$I7F0 z#58LDnv&Upn zkQPY*&R(f?LP@(Drz@Ris#iRi(D8IdWXEFP%Xi4PI{G15v*Udz;DZr&8IhZ}*;hvG z$&${JEUnV)bp^m0)Ui>%45?XoCZnzIi9C^lz{sLajJdX7MEdJpG5&je@)CX@3?}eP z?mkF#-TdaRz)&0_^M{ebC`oXbTI6luY1J3q(>bF11Dv&TicCYtLU>9Ae+C0EX`KiZ zPqm=NTBs72^W72Tp)po+X)nTN5km7)DkC)8*Iy|<64(4>jw^783vL2cU;%foMB1HQ zAD#c;ot%GbTe0S7N7t~C__0FBI`%}nT*{nwT%BKd$D%fAm7tG*VfyYT2OYUVR7lEW zOF%ZidnWrzf+0k&ja0>aErrKY3m4?6;+%V;UT+e$%MK3IU<4i>+>}DRMs5UUUX0uE}g~GP-cA(ZM$cCK#a!7Fy^rp^w(M~h^@mJyS)R+6iQ-*E3 z{K!)!kzB7%EbQbQ*VV*jy8IvM+BMA0qcDP5UzsYK zQA;XaNrhy5Kh+wZ8<4LQGQsb#6l#BYVJf3ze<4DDwSmS%shy*~ z`Kp;6EyLxo?%k&CAwM76F#z$1Id*cJmRBX~HKc%7C%J|UHyHueD~ca|AdxuxRfb3LO31^>E_KKu{Kfv4pff6p!k3Sunn#F^?hl^~ zzZvrVFLbf*>g#|7fL5s7ox+`r*&bP#8Vfd(*_EogBqb$9@T@o9Sf0su5{uV@O|O6L za$DTnRn1w)2;Kmme#g%>wS4rLt*FIf^Rapz>$%9nE|xl}a95T~KnG&Fqy|w4973qW zC_1Tgt;Pph51v~8?gtaj@8=@#Iy+gQ8qb|Sbnv%7;(wko`&Km?*L*wXkQ(UGphdRp4miN@M+CQMA9dl4$q946jpAE-_*LjsXZn3aHIDQv}Njwt@A;F<8%ri znV?0U;!`BfSP zyxVfR?J=5#_>E+~?4+pLk79dM;d{tV{FK-8b?<|dv;Kb~Cu4r+ z?{3Da=OZ&T1&99oRs}?ve|GNGl)5S}HQ9nd$1#;a|F*^JjfEZP)BSqCAn%%jaco0I zZ=R2gcF>0*@jmsvm7qSKAAe#;5;Ff@c0K&MY&pE?p{fyv_ziyl+U2rpcb$Ebnk3(Z zC#1~<{Psva*THd39v0XIz3)YgHxGy59-uUq_&$)bt8E_b$66fowMN${^ojB3w@STe z_8(~kL*MAm!yQ!R^>5pd6I}f1kq=v+zB3iafVX?&f)#K^Qh$2pbq(!s*$JQ<73B^4 zw51x^=RieNuaqcf5G>@1?sSbhgMoScd5eA*@4+8%=P&bl(^PeVXT>*~d`Wegzfkh8 zR3UxisPe25M{h=*hZhBq74r8yxNwX=aiDOoWD~3g;1}1qIa8|{6Qusd*c`m?Gm>YN z##=|haQR5yBt70oO*&OBE{T7P&x$dwJ~x=OVTd~(&Hr5}$$4GWS$w*ZqM|%0241|q z-$0KGnbSa9rP!Icj7rDcCFd#)Pf858>X|pB@dM2XrOO+!$pC2CtHjduU5y^ z?|cMDv@)4sJr(kJ_6es`|bE&(J5!$MyVDTT*mIjt$NZkS|{Q|QL3 z3fH?b*Wjs|aDn3F&uyNj(Q5e$UU7IviL4(2UyS4s)LiKDD>=72e3!JRHg>|(PY#4a zI%$xg5tpo&5HEstCum?wX;Hv?Kq01RWQ`OEt{HqPbiIKH+dHvHg-6Aia~$tRP9+Q# zfehQWROLDm0_hNgE(>iwyF*eba%wREA1^dZ71$`Gtq$l*F*xXqNKoqU08$B;&$P-| z#fue~rY9WZ3v43{yK#7%qZlD%XYn^oYPlupQm9{=WNek7A>u_apvU4Em-Yoh7V3z7 z$#5}4yp9>0GQusb0T%v^{4q9S4JM>HJ&;wuBo`f|9*F4-Bu9C*r~qq893 z)Xy|46Ys+95hRJOB`@oSkKi8zvuna`on;sRe?m-hBVi{m$`W4nZj$ z-{V$oF3fWFUp!Y%VNpJif2%k$hUo5Kxmq+6jY^++r4m^MhFdLEn(8Q&Rp~s?iXVc= zDyS0?WNn>S9y2!3f#b)i8uDj9uSt+sYLSC%u2C)sf^hH=N!~4PX3`PTN0z0{$Kz!SS)@o>u*}`x$vACtd@R_1>6&9;y`4xxgx z_UI+kJHVAStyJ-5+sB~sEn`Ai)^hIS*tP+&=K%@TBq|)gUgx#bh2_cAMf^oM<85Es zwAQgol+M8VooYtyxqR7g34&N+0ryj4*9)J$X(W!G~4*EYq-6nS*;9%Ot*cz1fbQ4|6_1ob|1BzY<}GWs)z zRpYRN*XCM^wbTYnk8TvwA`9dzzW0F5F79}ukss@y&JftwFL!50aY!2d6ipeWzAONz zm4Y(%iN<0ru;OTbHPUODW{>=?VCt&CE>{PV%RjtrG>qOBq z{@oRU?i4r|+^8}c+s1z3{s?g5cS zF9R;La2j1E?QTu#I-PS$-W@w4)R_5?+tMCc6ykRS7Xu+^g+sC-xWJvQgIC~zu`kIM z%D#AwEg7g25M)YSjLF%82wS|Fp=n`5^zc!9lU{2$M|rxcD1c*BaJ9b#Ta1U{&C~_R zcr}>BdKiS_*JZcx%el{TdUW7xiMX@C~Bxv;z?3P?2^*4V9uJl33RH z^Ok<+lOY6eEu!1!>Y1F-43ei}c{#PJZSXQi&#-W=3^>m;G&pp9-yRD*ylnQ9)P&5I zU~1wT1D`k&lBYy%4O7$e+IFFQe7S@<*ks0E^o zJf6$tu#Yvr_cQ%oqCs@P`xI?0{c$6u@y@aTjbv?}_4${ky~Ws&PnYs-*^y!+(&8X{ z)Jyv~e=%{muS3SrV)pZI7rKTtizOSqXtjM3Y!9;TWBaqR6s`PGN6hZvHKXnUPG9_u zYJ*q&1jHd;vA>O^*mdc@4!^Bgxtg5&+1r1yCfToxkb(JWy9aQgw*09us@eQhgF6D~ z{iyYEo_(*a@Idx4e_MP(e!Jy?pWNqO%1xjatA|J8ev`$u9=853`dqKBRH!sb_WF>U zRJ~kv4Ln(ONgD+%r_Qbv{ZU(66BOu+n1xzZE#&TTEzGP`N&!trQRQu;tdZ{_3!TgV zjFP01@=rbZ1SqFDem&d#=4|*M8_c1lL|0Ym(Op7t%WnR+mauZ61IbL+LqsU+m^cOV z;FBGmzFrW*tl%zlzs}hoZ`%J*BTL9)&)7}&JZ$NheWhp%;F@1=R3#ADrk?w8Pycwl zuv5l2llhS#E`S}4i5z_c4sef8OX3&BHjl{j+mF!`pqAn6k}Ufl94B&;z zyX2JOH9`tZL)(ylkXi%h+ga60_KA8jae1%xI^KH{Z>Qk)gW1z|o;|6rI;fQ$iaJ9( zV%ZD=c%3X8{rP5BiV<&j5Oxi%efgE{As(?iE=0D8|ETwnWB(-mH-jU$ddjpDZaE;c zP-!O8-uPj@CLRW}>5R1x-&Y!P^T#>0(S!lUZnrdJz!jqMR}H_(_RGxTAqLtHs+8^wwD{?&*7HG{g0Bw{ln@ z5-cSn+0NzGT^tPso59ek&s`c7uU@GU)~-S>@LV1;t9#LEJUTKToWl9iP2lirdxr*K zaTk1fiiOtr%uxcTYKcjAob8|1%~4SjLKZ97ub@mlSwr==JBd62rZkEiHZ#Q?#~sgn z$U)U|Gm0^Ntt}5}Peu!Rs~O$lk+cJPA69p8MX^cR*hVMB?>k&N#?_Q_!;6=ZIZmC%XYD}mQcT>XX zbVcG%MQN-nf6E=+%*dDeG@2niavAvjSqI|`(@3Yj=00oq?#*8?s3T6BO?~#_rT)euRt9|O7Te0be8VUhKqvC6WR=I}0 zMEgPr!(C-Zqywngo+y$QNxwXuuF7H=U1Hzac>bIk+Ktoqc9-qNavJx0#h!GDbvHDc zs|<}q&R@5UlAKaYp7nP(2Uyd+&HH7`yAFDlHObkBEsTWT0(-te^(Xq5GGX8$b$iq9 z$U)im@9TbJ9GK^dvG-v@1IJ?p?E8AbYw>id{k%2i^;d2BVAUM+$sN5XoAU$SVD`TmWWGh79np3XtZRBOsJ<~}ibIWjFlDU54)h_TV#gl3nmvbJelUQl6F!fa(KP&W)~QFrt`Dd@UC)DIs0+WSGQT@CcNc#xyGiRX5FycKD^`FDqZGE+(<5>SjE<=GevFh~+lJ~E{k0R?yNB9Rxl1_}n7^?mgTPsXMP_b* znR&`TbNq>CTk6Za!Qa&>QIFCN8TbvwEr|5MG{s*$m*0=o9)es>!o_GQX!bJ@6w$77 z3j{^7I+R6@yQApCwJlTB0nzXe-|ly6gsqt$LUrnHytzhOJt&?X1#qUeG4?0zm?q!d|c zM6&Z%FHgwJIMlRJ$Ou2WAwIKyEtl~7EF6doVbn5=M)WaSP*uE1C~?*sN2n|vEp08q z8O$||+Iu1WUOmcP!3PiUls~^)1$lTd@FpsKZ;c^`pKMfzOtC2;`F4l+K`_n0_8)4p z;XpArOClzKqZh4I;GG=B>6pgI2CffIjaFUX)6divr8T2H<=yR_R&ZtOiMP@U&#OgP zng6X;CRV^D?ZUy1umhY|)KrKvnw`&Qgb)tT@Sr52FsC_IbSdNgP9VQAj97c88S&MC z3ueYq^C6$jms{XSpQTGWkx^ndygdFQ5jVeiQ5~3b6#;GM0wLMrO|WTciL^ zRbOPm8;j8Cs(g~JB%)C9EQFuKXQyyJ(xk|$yV(t2Bc=+mA?2^#tgXChTA4g(p%6xl z@hZEl>eS4StGUH;ZOc)rWhw$BWWZ`Rj4*9sE)uHSrD%RieBA#1kb411E(0-dv`!3V z7110`lV{wG{)hPfO9Gb?!9{~&k@f~~Ox(PXL&S=^3F{j#VSt|tQHzpEcJ$Z;2SMWg9xX7lI*GFbHDTYlRjvRl;1dOT!~5&3;%fCZaPOSb zhRJ4#_0%V!=%cxWow#I#0?t6j=U`;69D4jZ_}XS~k-!kW(g)u^l)>j8GXAp41c&-3 zLV275-Hlm&O^_ONGu7Q?iHX@4ubMpza@8arw<@C?>yGnQQXOj;mc5AYD~*P=2NP=!UX9^gDoUD`*HAneBFEB`Dr3K7zwocTz^m|;4c9gYq*lOvOD&SAFSzQ4cs-?sPr z^?tu!ujk`2uGpGC{3?@brsYKaeqg*+ey9b^xpQ??O64rVY483c9{8y|V7}AQ%VrAF zCGJ9^IXAbHmyCRT&Nf-6Fw3cHc=v$yTy)s{t;sNof&1$FWx+u_Bi5; zjmE@y*4D9H9OmXeB)flj?L+l9N7sAJ+>Rd?e{l@#oniGG2TONjEs*Il6^CU7`zp(> z=)nZ)^c%OJ$Xv#89@C7pAkPN%7An9xBk?#~Qe-Ni$9O+ld@}CCQtj=(zW`Z28$KjA zC*%N^CYZ%3ZM;bu2&uli>K?uIJ)zz%8FTAwfb#R8J)b6oDPUf$erk8&(xe|cHcx8m z4&-|N?$CSeM)>gQKY~ZSTlR{rjh_w}tRG(NDU$E^comiw#b;iDV~TSJ$b2I2rD6&R zl`adjXBL^gN`Pm2Q5+}cGrK5H>Mm!=Bojd6dgzVaNA+*2O00!hdcelJ-8J#DpEv{eV)=tyI$YM7daC!@04v>{e91qJamlIE zVTe;sgdHYIQs#21Unm#&aHjULQs@>%FfCdwsJhJg!6wr$izR+Du1e`E%|ir=-2euD z%0jBGIqGQ&T+z{f2+zLaj?glNy}}KIikXG?Xz*kB=OAwC1;?=)JdCjDE-58nG z$}OQx4cJP$xxR)wrWm5(F9cj;|P3KL?+#rl^8!DUO59?Zw`VUGt?9nF9kNSi``(HMy zJP^rpx$GH-6zYeG4xHw5jJtU4fOFc*nAlA(5l4Wz;hCMUN4NOipvcxj_AH?R8{jTv z{-}OD!$6bfAd<<_C5v#5{r>YX!9r4>dpg1|?LM#gZaPAUWAT&0gd~j##3~~~IKeo6 zl_a!40z(xT%%jxL7DU*}`)aM|kUwoEqT4e(w3%`YDJMjVQ)k(FhAnynsr4bMXb%D> za3Fc?c@|5QC3br6$6)$qV&wchT?U5Z3rhioa56gpIImdWYsbdZm{(`qUWkXX6ipK` zRm4Ngb{7th!Yd)1Y{=HvFW2G<$+B{s+cZ~(-Q$IcAE~5BhOn6J=_b@^$+o#ePN1?t{hYXSb^Z3|fXl^5t`eCS>CzbrStb`4!P(){p^2 zfv*}+C@U4XIf6WkeCu4eToP12@j|Yoo(apJhEf!0VWW}GbsC;e$QBIA~n8_YjMhtFRz4{PN0uAMQwqOM#DRbJ#wi0 z@ovn-gE;^m?>J%3NCpap5iVmP=nO%rJVK0rkePxw@Z&m*<|{mMu0O`lmoCw__kM+Rr*Bo`JWrZ@o*q(O!i#n z;?j=IF%USHsG$b{N_+%Oj71IOk616PYaJX^mEVH_6GPDXe z1rhkmu;F7_QKV20MnKR89xmyQ41>|Cod?WG48~v%9~x{n1$|zset| z&x)S|tC3psvDJT$*0=DJdf(`$ImBHU6!aruz)Yc2*#2r!r6Z%2;)57U;552;IqP=g zQDaEOM<mGgE!PYw>VrAAkQo1L34%C{3d z6w~l`{=}%9!4;Zj6klE@NATbAq06!}ejirz-EOC2K3x_=6g@~`nUb=x$BO8e7?MeX zm=xQ&bpN|qOuWeAEPHVFfI$`HYv8cF_AHYh7$`IR$Vt`KKM;Yg9z_+eITH$wjbxJn zal|oEM6_fSI%LoCiZ!ilylBNzYk{Td>ftq_OV;3oXP5g5$66M8S_EpPu^<#*jRR#x zg+lXLgUhhPJO#=T`JZUT;X@KbDYiv|6cCVRtYqGf=fX)N@ygX;Fl9@U9@cXDRpE+c6Ng8u`{nKHc@|_cd}X%4o*>qW&~-UCU<0s>&_)g!S%f`gRBgBoBEbtr zJG60GX`OB^E`ggIgb9+%=%g=u^gu#w@Sj6!T7cP)Plvf5eANVbGRPb=z#P4^ zbjMWuCYHx^Xej@n@0jsD1a?_)?!x<+S}uv0_Xc0wMkj<*naEo2m31 z5_5A;I$B#G$8vP@O7!iZnUsgIKezXHGwOGA-GIeEpxSlJghmP}3zJZ(GJii=p=ZTE zzk8M{A+GVU^qP*ZuKwNaJWuzW4LjGWo^WZ#d%Fjhqy2ISjAN>@liB#AyHnrI!MT?R zi8HN;((&cF1c}Yzyy9Pyoh7&a7M)-y11je99MT<2oK$G{fZ*bI57}iLO*MOafV7`G z7jgl_ywFSyPV2o=hm}oy&Hvo~Tq@}sUuAVYN zd4wk)J7=)1)Z*{m0v>M93+vbUR{LD2L?U#P$E1G1xaK?d{gapg98JVtmb%nC*54r6 zx$>gXkCtkm0-NUKa8Jp0$)7Cq@mGV)ww6&juIxlXQbej$*oBA%KUXA`aXS zc`Qx;pRnY}^r-d}o30-?fzf*1bnthJ+2*lebT`yk+@QLug)|}T(!Qpt?7dfbuzBqs zrE=`(0q%DzNjt5nT+%gaJCFb})FSrHb;jv!`U;ttH$nkNZbfdJ1YZDJEawjXM}Cf& z(weCoHwe;&kQWtvht5o=OM=OoQgfQJXkFY)sKTF$nCm!JtGe=ek=qNg0kx?WW4AzC zp{i6L#=a~}atq9}oQ{#tH)wLa(Gbj4#?2LK2oL(;kZb8-efe&ljqJeT2D0IyjW)p5 z;z|D4hvk%@5L{~>+`lK;Ja562D4uh~ZiU zFFzkUbHCcnTF_+jcHX7i<-H|i{dO+vutW7YvU3E<#%mlf;P-3ErwKZmrYDg=Bwgd> zQaw%$xT^*IniNvzxX%=}^`~!?xSQnL&lYURYi%+*@82OTZdd7q{l>NW538q!T|VOf zSD}7%t7sos(H3d$ZtPHeLbbPR^a$6tzb+|<5yFy7-b@LOK4O`ZZ_y+qwmtuftP=xK z3}}Cy!SfJ(Qo#w%RS{Ld16`6eT{=}|EM;S-)HalRN{W1&oN{h?bCE8~Jb&V|?v2#& zKfmDfz{()vW|D_>2^##ue6H_|zzX7UA$=@#nLU3jK4G-#vHmDOAZpcn#QCr50$v4v zOKWBOGh``lth!P|lat0@6MyLEa{$es(o!v}8?Q4bS3|Ww3k)R45`% z8J@e!pe;KIIz$LLN+`x|?s#%TW#?g#%O@iS^hy>nK& zF{JB+!6$BEzh^i9tFw%al^oOfM#|F`uY7cF-MklTrgkpt++xW?l-6R`UZ}$PX3&b~tz?B%55K^PcywPnBiVT&WNn6on z=$=mAriy7q-_9PR%@F1F6X-BJG+!*Sf6nfSU4my1qR!gsEZFt)knVL--UTbBr7W!u zU$;n8!0ThIwImrMoxk5`Gy0ZGVsfF0J#O>L|CVfq7UI-?5h^(iin)BfM7O_4w3Eo{iJWL>J@vI0E0EoqYKuq!j4mQxh`}JQY0F0M6aFK zx>wPW=4MvZchj#`eh?|x_ceD;j(mq9*Uth>WUsiR7WewA*{qXJ4Upxj1pZpPKD4(k z7M$bQ!XIw3EKAZb%l)14+_cfPcQ)=n!O4&`fuBXKFtraWH>Yq2-y~Cn-&(%D5C$n6 zr?)gy$S?#b3f@-p*1fIcBgmADO0(}Z0{4RKmT0B@BYpBeMBCUDn5==C>SXeu#@a<- zA0(`rWJi~WfPeeOfHxOd>R^QKJ|~ihQ#=AznVnO6_~6?s9d1!xKSkgd)zNw0vN3YH zTioxC!k4X2Jylag?Ue2PQg$T!^Og2co2VjB61tS8n<5l|Vw2W8ZHAn>$?f{f#kQxU z7?$!lF}suN)W-H)xpbTC!F)*f`leV6V_rN@zVBQSZ1fdl+vs*-Vw*rT#k*^iRbnkQ zj0}26PEDB3AbGa%4P=&&C;UFG2uM366LgUwq%2p(^AS*&ZYCcV9tY2C&t+EgAzl~V zQ&cH2aK@WGA(c3J4hIcAARvqHA6K^@h`8Ip#+wWbwNT3K>%2-TOHY|><4{5?gKoEN zx2ymib9*JrFMLx-C5|j&;X!fps?Las&-bMFjpvuKv&S^wqZ_vPyvW0i$K{#=DUI|~ z+nT&T!VTGXPF>IamQxIX&!1yT+TEd|a%i@~co1J$$Mh$XBlIHB7s&nYYVM@be~po{ z({=szQ4AGUNM3q<(C&$%z-&hCIn%Z&Hcy|7Y)0trBBRQ^FPS?-LXon$N0eGHjdps- zh+Ou6!nkw{p#{*6fXVW?R-zPzbE}y{k)u9tz;P)_;xv-;k}`l#Q=XH;gcL{hQ2L*` zn>iaji8BeDSh3WJBI%^xLC`JpHYwJdRGT0}k|!h0$N%1`?*=?|05uoz^(edoqzHdz z^VXBtu++;y?vLV8{rDK(D+){?=?u+?D~)d6SI#&^uk^yQ^rv(Q)+*bq2}PiGqI#GQvrc2*u( zJQ!S@Y3eNTTSylXDQikO+hV323hHfDr9()!#J(MMbKe|;LQJW{15u9vpXc2H3Uov> z<}>{`{e(u}tuN#uT@)i&qF1)jrAQ>FKRU#_5(RHc@&9*YJRjrN3e3H20l(shkU{aScLG76eu{Ep$nLUJWX99FP?Ani)YWP zCL}b4CCSdo0Dx*USij)30^uDI-5c|dM`<~yAq;2Ij5tG$4DEfB;DiE@j$#9_Ms#I6 z!q~sNhx1^^8EO1Q1vO?+Qb$^$usr_NxfJg+XR5gSkx)pE$@;Gz&S{O?` z-7iN;ZBo$r<0#0ZN&wIfiaiP$2S5G{WX@Nft5AgyPEF4k5c@_eST=aa{b^XgA^`+G z=spAj5>T~#sy(4CWKOdY2$SHKI}|_OXUi031BGb89H-yV`M^7!ok@(JuQX{vU`7kC znbEYOjDR9v+|Rx|Nj_3dZ3j}CpDPP0br6PAl-!XR?cCIk{Cu8D?06f%lzGg8&$O{h z8UHTA4}3;9eBr~SO}aV3c69JrX7-n=nei6xS`p~XM@)1WjU@UAYpMSuuKGF2Y41}1 z&wlmRFXoJJINzxq@^`t9N_`j7<@=fe*YKvOX<$nP`wZ*M;>qd%5htwW_5==W2!22W zd|n9+0fu|z_OF}Cm)aTNa;K!3KiLbdHs~tELlRcMjJKK%aDeUM_}H%Tha0S4WDhp~ zAwzlv%9`GYaS@?2cNTO1@zuW8ZUg~V?Xd2zjZ(J;N}$eHqk zF9IJHPzT)hvamJXRbI6k7tugZ9@D1eK7a0K%*Ygne&!MGzZbX7!z}}7?=M3t z)FMx!!1)tGGioO$uidwG1QdINoIr8R-(F3}#kjpRMH>lk9`_nqTU+etBnhzIo~L|B zVyHB#1rnn0TCa{IVJr#>wUtF-Qe;2VpGs@ucX4{_`bVU}*TzQ4xP1WPE{BANyzRM| zth=C2^GNuAlc12rx*V_tU|Vemd7O7f8VTS4-6Q@F`mP}+s` zsRR!Nv%mJw*8BBb?Bq(L*g!shfOJPsloam7UA5`YPaN)$yZaZzNV((Ib)RIazLyPM z)4{EnaYn9A`!R|0xSE;n-D^|7*d7CtlDcDGg*pv@2h8;oJ1m&0@+XP0X9_B zNiDj!SD;Q@rPjAk)&4z4v4FlSskxBxp&Xj#gBloACl-3wHAyH=_z*e+Qq+LM^lhBU zC3|vD*Pi5QnZ&WrOKOB%x2{bd5uI42{3PVa`Yj*&1#{uHgzfPsn&MLi8QMGhpv{Eo zoJt$^n^#KQB1Cz&cLuhPWnmt3;U+=!$%xFH)n47d&Ug9W26cQiE(w3kXs&$(Jl7j@ z7}8wa@;X9aIVRYY)j+e`CQesD0+=`CYG$SnB*+0GZ3x`*V%O+s1rE0_f}ZP5&q+*{ zaVcKB$z6HkeK!a%x+^Uba?Ez2Cf#cu@7#2);Y8*1-jh&z&@a;uUgzs`4O>PeMgK)8 zb^ZQt_+f7}_tBRUTe`it#M0ouCUUjHe!B-JYJGfDnJxqrlsuG~e5o9>CO<@WMX!(9xmlzb0w{^+O z2iD~-EO*Eni4UMp<00ld(bf?u+<yf%xL)-fur>_SJiuiMh)OGgi-fO{Z=3 z5v(g6rYy58U5%L$sGYKbPdOygP0OJe0#G{WtHOKw#5cu9PYQl5X;^WiE`B>)GWqt` zYkrlL4u;&LY@;-y49luy`&MF0n-YuM7t#!J?hf{=(~noKHCW~@(zRdEe@@%llgly- zKRwKU*gN)@2HtXQy_D_9s~K~;ZXgtLpC%h3ZLHBIJMLa9X9sN9^b3|s60Gq!*}F3m zfu%GubY!PrUL3e>$|!(mox=TP>f7K_0+s`a7T605m-W}qZGql1VOHmn?qJ62`}VGBSCVNpIp)RDPxQx$sn+i^NI+mUfd5xwP0jn~)|?eY*|k+3nCI1k z#!tpZC8t{hhniDqda8FWd8dU`lDLMV)uFhnCHqH zr=u@Ft!XKmthP+EGO$`~y46W0w*p{>(FV z>`W0f`X6!Uc8J`J(L>tY@rye=7_orY<<);(JREQoBb39Yik~rVYGSuJ$Px!cOu&d5nMJSl7QDjRQkuKL% z8~K#YJ;N966rER6E`>d>kV;MhyN^EuVeL84>ll*()%e||0da0{-4OemyPNqa`!4k~D1l~b z&3nnZns$NbiWE2q?n6bc2(xSjD^~asYT-V~E^-2DmO`nw_A+(ogVUOs=?0J^#3Xs* zLVdbNB%W~*iW%@~7|fw_iwObR!r2U0Usqg?2j6Nj`LPvyuV%MmmWuqH7Qr)7JGYCy ziT?ERj%IA>1=2NZjlly6Wj>33*T+{&#Lm#10=Fk<)p-qjr>jjppJ;r)s7jH~G)wx! zh?tT4Aa6Av)u}ennRSOT4lrfM_)PQ1T zg$B1`*z>~i0l2^@=J6Y8&nOJan~NvgS1;%Vr+y{$Klx%~?-Lr^s|!xK-OLh8=i*EN zVWlvFj`g&{W}^(Y6>J7(Q=sWkS#5`V z>sZ4T{sIWakKh_3f3(-+^E0dv6YnF-v^>@_sdTqk#b!Ew;j()x9D_7gS?K&n?6>+1 zVQ{XE!WsCkj+SmWGQmiQaUdwj?HF_IWW$;ifkb_g-)NC<9ix~mEqup z)!Dr#&r3I&Jm3MpMsbb@XAKI@{rt!`_6XsG5%TIA1oo)Qt`e5|_oYTqgC5Paq&|7zFqpq78fu!J>Cb)#4FdKIvCn=GFHE$e7Kw#)xyj@dWE&t0~8xCg~AHr zc#vP9HkiDkv!UYz|NIOADgCjFC8Kq2nWPMT{!d(nNn&0*~)>yo_ zRe3LDd~f6|&iId34k5)eFei>UP158l2{&sWWi@#E5VkXhReK-BFd2 z05*UmXm{fF=)6tV-eaXtw5YC*=FNy0Vmca=*eH}Xq1E`pew#GA)ZbDjSg+#$VKV-t zv`ufMUwqzQeTV$-W(Sn|rl^xB9~qy}3vO0^&7m9l2?>87<-QGFc`Yt3;~UfyujOX_ z==ph1E&2Q`@>Aa5Zr}#;^+khWbCI>%il)%&j@(Za&O}YJ!fA^?f4sCREpvZ;o(@t7 z$*F%5W%#si{0zp@qP?$6GzH!-ssA6NC&@JC%?V!88J`z(%7*^&h)92G-TXMlFZby> z40NX*T`TX?xOpTmcxmsOJ6`7DxwUWAPq@#=+N!bzxNI9i%GonGzO=TJ4Tauf6YAnU zBlNvP)RQRPYBA;&HQM867m`v{i~G)YOzZQ^oFcNM1R0k!GjSz1E^#2BYY@2ugalGF zA$Ka3oR1*pPT?VL$;7l5+|5AD$bK;lVBqJjs6VbP|2Gl)5_R^(t*m<%me=!`?+tbw z*?2+C_EDKanEt${a2^hrQLTb?75{UWzvr83FsD1x(O0_3t&?n-OdBiulqEL*jS<8; zf;8SmgPoTcU$SHahYv{Eq(9P(D@uqAna@3Oul7)fLjOp=({glZ7Z-Zv<_b3vr{}Y$ z?KM^@LL9TKbjoa)eH}1G@Mm8!U(tX%2&1t--xW#7ZLY6xb20hrs(4)N`2Ne){plk# z^lqhcPa;mQ3*>7D>w5z-#YJ36eL61`zfA?yRNB_p_pqRi)=DE0ajOru#CMUMr^o4N z^}&*7+b{{H{r1gp3r5I!O+6S>4}=GvF+UhciFT3AbB;=@(L>h|CLiLD$yKxQveO4- zYtvuYtUdiloY}qr%M-G+w3GB2+yE(J^q$}-?y0@<&8(J$gONuso&oOw@BWvZ0=j+F zrz`y|PsQj~uX-tJT+`yXK1cqHP!U5oTrgsISS>U580H5pUBo0^L$}OF#zMhJ*=|m=7ztT z)NkiFt3$x6D%xe(j>XtHf?E?(zrG2n_EEKsb&ZtKuht;I!2!56syM|+tBp77OB8yB z{DDqM0ZRinn5tM0Rl@4`6CSJp`gy@X1yvM~=~56@_w~sYhm3Qa4)_X(I=6E&2=xWd z`H~!>qwDaq1^-|e%aAc59}e&}_C;(@67X`E8u?8q0d+)$Og3O`ChgPP#Ps39P7{z+ zB=lp#pjE_VBIEQ#9))4j=!^L$__bPVl&-W%snK3>2j0B!!^T=S{x8(z8J4Y-H>V~2 z-t}tiQ0osrdZM`OH$_wUV8nO@9T@2gz?Ow;T5U7E_c~hoB@|5;pMDK%g#IB%!nOJ( zLfTS@5cxdY;-5`!8Qi8Ui%rMSXtfp9jq47Vj>Vn0<#1j3!&yzsPI1PlVE)19g*{Jm z-A8I?g~nS1WJh2H_^%NN@zZCeA(t&jtJgXtmKbkBD9RIuIOcuNG)m>c)+ z1@y9royP;$l+O=TZLhyQ-@S`>Cl*XIs7X*F6gZ}ND@9_fLM$7=9v$C05YC-qMdQiv zZ+wJag=}A3+1F||-?Ogt^p%Y9K?ByneDhmK^LC?eYhbQr|9J!Qp(0JI`YRWiz7M_=!5_6!-&YytnqiqgN(bI+*CHUEeaH1|TR^ zG;bvh)@GQ4$b}D9i*zgxho@_;kH;zfAoF`f^TElGs5koD?gLqdihFh3j8uT3Ewa;c zldA&0#B1;M`1mcnf0LO?yJ^B+n@z9@Kj_T&Pv!C+!c29ghgfTJhrX3X8hS7l8MSbj zVx_S8I>Cg#y-&D6-5p)+bf-CK3_pnoj%Vnr6IWlgd85UT_U#0^vFrCWYy93LZKdQO z&?@!Q_xwF!Hni!iR}Z4b?JW$`hJV*99R7BK(`*V}_+CF@HMM)USpS2LhrroCLu zc1KydvFQF6)l)HtelyC@ic^-CSkK4`6S6Dg{>smA{gjzpxw5mLFuVPF-b#DVtZ!g% z*F@R~Hj%uvZ_%IdJhr*5Zm${es3GfpqsOyjI!0f6BgL%ar*I&&^|-f#mvRiqruWJM0~_?UQ6gI7~gPU{1X! zp?i;EKI0otV}sD|2rjEsxgypb#{$oKTv?tzo9xoiLLI21c_7mT9ebzgcUhxBeSRDZ z+MT7%$gfufU`j2I6JN7Zv>oSMHZN~JP6LuO%%7G#d1cKYeK(@dsZvI9SKP6}#=2Moo#Yc&jwab@7kDgEw?|%r&Z=_B6??*aUQ98 zH`lzdzLpKbDUmp~`a(1A@6&K|3dIyn(AiSn_>`hHXVGg| zwuFp&a$eA-XC8O`Zn&NQl{?p#a`#s5&7AX=+FO1`edD>JwF05%ufwGlAYad7tuqrs zafOrV{LfIPwO&Vb__CG`gOSk&RoS%BFe@wK-rYKZea#GoLQk>9!*Z}#_6u%9*uep{ zjQ31S`pR()7NhNmpSif3m>BST?~Q7&eA=tIrYJc~(PC+!?lKHN-gJ#n3m-6c9=yIL z%D%giySbWCd53TB(~k`Ha%h}0YkwH@EVD9+!eP|DxKJ&6rZY*2j_%I;v%9I1ht?lA zQ?p8pcwsYcrUID@w>|Xbt|{BzzJ3QNdIKh`EH*VG1ojk4n9`lm*@B?a-Rruyb{fI^ zTTGptl?Z+RPtHBk%Ejw}HvwsJ5m)a;pYgtPO2N4QdbxJByQ`%nTvjRi!{+`<2H9jJ z*PU%gnOvf=&)R1v?;XCAH>0Ctk~iSM+%=;$c)wJ0e;a5rMdp|fCgef)yAv1SMO<%y z0QEphpIe+f!R&_Fef#Y)0rrj}FsjPK%G}{I$aTpp>GZv$y8dI--`cv}xU_uoQ@`>H zIJTG^(OtHyrA8g<4FRi4tOre|DCf^)p1fuuf9mNRU?QzG=t!Fc9w{^^-f$>+hw;!n zyyR-K%-x5`oZCZ5lj$s8V^xp{{_A!{%sa(?2RJO0^tPdwY$)+-qeT=BV zQxSC|WBpu8duJ=CsRv<;s@qj??(lU%BUGh3*?pF!Rn)J>Jo@$t`rd4MJdd3a{A#xd zKPL_lXRUo}Cg`+wKTAUadRxta<)52V7N6p)0itco`!~jm#zcg*#l3N{;21PU1Z^uh z9z*6{icaHPXUK}Z(z~LX+?wbcwDtO<708aGuU9rqu14vHGbOZkyhTrd=b6bKU^{YLk?(b?GTKo<1$$@!i-(Qp% zcJ(#G!<@?+gW3}2Pv7VQTFofl=I0PcfSC83B>Xa_HxwE2;u6xX>T1@}`Ue0TOtJ_) z8gZw51{0#We>dlnSoxI#-K`7H@`_I{ScC_RAApMr%Pc2%YtFdy$*7NrSb>M?=J%T- zq{bp{kHq$%{6;5|+<}BiM7DLwwal2h0T~|Ww;x3p*;HJDP*_)utF)mm3<va<=46%pi)_Qs1@1`Och4jvURA+Uc?4<1A?8)25<`f?xbmmM z!+X$jiZjcmC=k-sS^Fzk|9Lycqd1Ebq(H;Pu>sa6dg*hv<2A-{Kn67!Q8Ztj&+sE< z0x8B@2Fya4l&}V5thl1Q0E-s@D9Ris70k)%2&}W)s7==f<1-F#e(K^(O5*Z(@Vam_ z_>6o9As&-boF_*g5r^7`MnIF|4k((}lSDnmsJUwN36ek)}DB7x$J-ffp(y#*R*f;5Sw~S9K9l#d?{FxlKr6$F&-VnmKZncd4pL#V`b^W9+_McMv6 z1sos{6U;ZDD9s_c6f&sjF*SO6OvMNO9ha!R?I+Cm4POl(;FK(g5joG&-_2*hm5VqV z&Ls}~jNQU^WZFI<0yx@X?IX;t9WAkPvx~Isl}R?E&>>Wuv9Dn04oJ&8S_{v7lpq&OIun@~`P z`Eb?6Oj>vvkak|EHX$3JAHx>T(aN|N$()gvejEvvx%Ts3=5T=mYYBN*E;!4!S%(+Tr2IU*oSb7z{~C!|MdP1YN^H2)|> zgn){ooYL~m)G!nLyYLQA(+`7+ZIM0?akh>iwA>Qo1-DR1$`xUiA|8gx)^zLrTMV@$ zjXZ(^Z!|NWAk0K1L(CETLwr~WKSnWyV0bgK?=*M15=-mk)(L$WpK@^NKsYzYtkQYR zPznj~sLrSv-M?q}ivD)=h?F=Y5q;zw+q5_I^yJm;epr2P+VL9gRC%)YrTGWs@qCq` zR{tT7o(HpBPrv*L*x1Jx(VC!Gy?Yh|RqsUS{~eoBi#=<|z9-c=~0$|@c!37x2?hMg_Y z+1rqB+lR804|nqkQ#u@!yhI^on{C>RS`#l%Uh)}x^#G1>Ot4Mib|p0V`D;n<_B2Hp zS(~we1t!R>-8{zVJT;@S^K3h;eIEQyjr+#zahr;P#Ws($Yyn(y@4GEwrXb0UaZGz7 z@x}&q!=GT?4#usI{Amj-Af3cexzZ z&+)pB(uU~a#k-8tEl*E%t~vYbasz}48a8%lwqPO}3`x7+K3&KSTG9Wj(z1e4*xhk= za;BX?-Wo|LDjGiuINJ3Jml*}=+GlBzqY74Is@W!!z8jyqaS#4Q{k;FQr~qrV zk;BL}xcrs9`^jAjx*@ue*JubZX{pBnqkx`Wtwh=SoE805eSG%wi3O|!D-Rqb68-*0+RZL5#5&Wj7B`^bD<=I8ROEB2>S)hC{U%Iv$xE(gk z5+s|gd8W@VUF+(5JNuz5FgZRZ!<@>Sk@Q{Z{*1RD%9O=j|HkfjV6PORG<`@vytW4G zS`(#X_GY3j&L$I$Lnm@dH2vb#3M9oP1Omzv*y$3KN=A@uA$(k&9lg;f;Uf11eB4+E zY@bPXpItI^)H{|Y^ zF4i&LcYXe;w0siR(A5IyNqw7c&W7T{6D3Win=HFM~72Og@JVEi|Z|h3)|L14fzPOip>+#5dC0J@H)5w3iX@~D}nIBU`L3p(=nQyp0u6Dv=ryFR>el_HS< z+=&tHcypSJa=gA+@`RpkeiAMam-d_Yjr#H0ZBE*d;dHXBvx1!ByiDFj9l?fTjitsV z{3iLhuN{FY@x3qpn&ijps;R4gW_0hK6x8u*R&g#IpQeOUh)iDJ6;WgqPnmmYU6i~P z@i@;u;x;YUIXXyH<|Y4>wZLybe|1(5&9)s;6cRRTPVirqf&rb-Drfag8|SRFDOe9#6ITc~yVN%ybXxZHwGAut5u6WW3eV2TP6C(~YalF6QsNAo4`^73EjW z9*YhxBdfKs{ zqzt;8i&VP9l}P**sT5&bZOFj@mk!!qQZ?V?Vee(H@~Q5o(7gHc(8XRM9xhve^;|Cq z+||M`SdoZx2`Y2>qDZE>ctyTBm8sVT~ItK)nwOiXE-QdsUP z`Z{Q8QBtM3q2aJ%KuHj|!IVo;OxWHBzAZaCiqHDbZo)u&fo%w}sDcCs6-m9+J)S7J z-WGoV$+I84spa!xGwLDGnaUT2mCbt~mV{}Lq6Rh`Oz9EXpc*G5jOzVie@)SORcI>Q zIMwECe+ChJ3VChRd*>#vX}&7_yN5}g!spU(UzQ-(?1FQW%^S|x{46tg^VwwLt&nab zk8!&v^G&2P+}wq8tvQQCvgiGI8+`4~u@aYC?7h*os&Vg6jo&i4V++2|9WMX(z($NJ z`K7%t;iJ0_7l;(s}%;0!2=?_8&Y++$W-iVP;T(8_-JLZJH1q0ldy9|u! zD*)hfvGBo`Y^=80N2YqzOm#(nx_iY!GuEqJ9FrbRxyW0rI~X~M)HQ!1UO4F@nL2g- z(y^6liPLYYJ?PL$?pve<|K%X(*GVk~=oqA#(|<`zSWB4(iu|J`Sg*x69j^6hFV(uA zs}=fghvI|DP|}zxoUU-5(~^6kNAdwsX6{@a2QOWm-79`TI}|u1dy2k1_T=Q?(LTFsHi4I0Ke3;IX={8FXIj zzF$`V$9|?Z?egZcAG)P{FQj1~{*sy2ptIL~-LYU7P-}m>R+e-9Ri5%}gU8o%<4?u~ z)ImpbxXaSAOnvLBdSAYMpZx%l@YI`);tfvTdjCFCZ1V%KS#tW%{f3Kt82!)XIEj1xc#br-e0e|bgQps@tpU8`g)A$&($0)YN3^# z)$m>MtgVHIsNsh398Km`&xY~QjT^oN833#9*}3)ahE=E7ED-_SrS@=m3&OnPU@GP9 z<2tFw%ToQwy{qMX*E(Cu{FK66)8qmv1WI!cLsMDt1I02{FRld&n*uVrGVXu8P@5J) z*1H3p&Ih_899^&d6)T_0^ljnWjcOEaknX&vxnijyy_cersVEG^Dg*JFio4VdzWjkp z025dj_fgl$R}C+1Y;z`whO^FrtL>TXl${%S|1~*$`L;ZLb14Qp>@(ROxT10H+woi4 zl*R`uddPjZo$G#+M&KilQdk*-V@F?-6Z;o}!@_u63It+S5~_bYbc_z7Tb zsIu6Hv#J4)>W_9PVj;l&sY@?7g|H_RIA(r=Ib9!N* zUUi;}Pb6V9xK&=@l-30hk4fA{lKAZvbsf1b1;C57Z}q~=^RYE+H~##K&j`SS9P76k z_4Sicre$7#Pb$eKjV{&Jyn5`fUa;`*ac=W_rrM+MZ-19nRA>CC4oaz|DPCs*bhvc%L|<6@L3{7@ zqg~BbS&l6&b)!|Om#d^8!ECcr+V|Yoc};{;BAUpy5oC7j#d>DKP-+A8AGyPhR_dZ` z7Teib2ler&`Nq_f9QCWOE#|wR-)V`QU#{BSz04lv_^-dO;`vf1NE)_;^7GHw6All5 zORH=bT!u5{)ok>Ww!fDm^XK$@t~hDUYEPV=5K)#K0$R~W5a20Nh4HOv76$#5CppiI?i92k9=#9FO2S9yrCp#)e{p_tLr@`xk0cN1Gu@Y#PEt~cH>1IQQRdUy){vwukWk@0|cdSA+va5>GI z*u6g*>=Js2R&5zw5>k72YPzji%gNOl&;Py`GQQ_M*Hd`;xU2!T&#iTdLV*{x#=WD3 zLAC$hB8L>zZlp#Humx-{H9C~yFo(y4`h!oCWd~%Y^4#-RkI7;+ef?4w8slk zKRWLizZx_+PG2|p4@Ui$fXW!wzDHLZp8~D8-4;r_FO<_T_s2B?u>F2+1n;<|z>B^R zLmA&u8{9~R13d161b26f_AqW*h569t^iC-KUbbw-94*#0DU(3MZz?_{4HQ%L26 zoTMD$q2%#^IK`xGI#K#sQ;J{Fl)@J_FvXpeRy)f~cRMp>3El#BVt)`#$Q*|uS?I#y z-%rZ1CUpO5@bXBt)^E27V91c6<3Z_uujWR731buYH4 z|8U{yy3RNwx+^Y}c%&t~@@6+8qRHQHfq|XHn$mEb9&(!9<8Y=44eK&fF~lAQ4fh+X z@eBQ|5MD?HD5_kuRZuc^D3*Gl8gji24xW)8lRd|QyfJu3+3a?ujJCOPb!e_G6w$)iv( zhpL~70)MET;XKq-q5Q&f3TCSKEr{P%g!kz`1>gRPCDD&PE|X!|uiSWYON&v;$Nkw+ zgXO80wMJv#zH}&gv0Mxh#j(gzW4Xpozayn~I9;OYm>t zqpRlRz@e1KKbQ(7WVUjFE-9U1Z73oTap0y{Srop`==EN@bjfX_Mn=7NduEt2Mw<2z zE4!r`i|Co<@~G4pQWjb2H7_1%TfBCJOF9Av4FKKvLU*UxD?AILqCliF?_H1RRGv=3 zuigUpuK-0(f3C!s6BbjrS-K)(G$rF38Gn%JXeZ2X7w46|o9o1vdyR>a4V`zz=QeWb z0D%w{OLJ{0D!Be{^rldh)y3%S9Mqfy5asN+qvYMw;Q)-1CWwIT??>3bAJENx&{Igb zh`K07c%lre5XFuEJ|j>qjAa{GFieYt!rmPF^d8S4^BYT_VGO zO|A!N>A4&LCLfR7khUA;r6S&b=~blknJmBZkwgPQQI$Tez`SS>% zlMBr;sz3pI}VNHePEnhaT4P_6hm~Z zcYiWvdS&N8noGPWeRo8LGwktwXeoXfh}DS;$X?B8Z9-#N!gbZ+7`}XsoqVbePZ`cd z5RftyqQGw**SUZxp!T|oAPRPr#|*HlLsN%#L8zOeK=)wF4`T;irEI(kc~TQ_J%cM{Ywj4fo0SlCkJ`utTPwR$Hp!_D`lK!qNw{lJY-BqoWo&iA!8^MlAQ$CZObwrmS<+RC=sj)Prfmh zm7P>)v4T}9s_uzd^%J7eDeJnl%rQf$B-@MFoqa&g{QhK=56$W|fzM(x@=lF)0BNHq z;|fxpVMG?f1^H(E`D|iDkWYM$)Hw z>%72q_p44cNbnyMAU<_8pySg!1t)rEdyXZ~`3UsO!Q}`l`c8y2>QR9h5rhDX*0(k* z!7>y@SO$BI2f3baPdYs;#n1EVMpLdUBZl~QS;QgTUBz}?dF+ehXW5kfzT|+!X;Ff3 z?daj;k}se656tcg8?GPt_D2e6^_nq;h7$4+(uJR}!O{ z%f}^SwL@JOunaS?q^Xs=!tg`l| zKR$Br$L*wvB`prRGfM5mFhN4b$--40c9JhzdKiRmFio{o!ZhHR3#{5JKv1 z4yTsAPozdrn13as<(|^@YR?ugy2@;wdV(kAqX??{S%Fdl{H3?_zm1x@VV>%+CTR`y z40km)pNj$~P%ZL@U4*6Vd~(SWuhNQIq3qB_gSd!l>*S8CRSa!4Lv?Lq7?VAi46x-~ ze8MJ#T&G-L`^FqCw>`aQqKg8KS@S~4gP!j%pTfdsw)6G@sq~6cPj=Rr+G^9?Bg8Ab z*6FpC4>)Qf`;_v0ISdPwNfT!2F>1^Dp8n`CxD9iq<{#Dm6LXeud(^V>;%g)|t;F=v z>?N)e0<`sj8F$Vu#5H01+FfRvB-mJ%%edLIiV>gNZM*hg+Z9uYg2qnQ{r24qJ-JmF zLpGyF_6;b|F~wYuv#A@s&rG|%*PYKA7Kx&v5MycF%L5;a{PPzD+IL>G?E$GWyrQ?9 zj0<)QR_qIZ2n*xWbRI}}MZY8eLeyL0&PSj{KeWCDBo>;nx086E?6sa#gWy;WQ#NHs zm5e~V=utrg3oTr@w3~F_b86EdxM6sIuN#L%!us+azg}Wb7ku(kG=EDfE`n*TV&(ky z?6h?ry~A?!er!;C#{C9OB>p{JnJp+6{2rYV(5j?3%upH@#89+*mO=|?Ia>{Tt%qOI zCs6mc8NaDb`EYY$vw7ex2x3ePOkAzeTTLTZt?y}%@;rq!u567;s1NE;OR|yQPpzha z*Um>W2-#_fs*9N_0;HayKe-;=x9`-#gi4M>e|(_tv9RJAT@LT`ih@W?? ze7zmxzZ9Tk+>R!m;j;X1(Hkt_+?Qi19A+ATl+RGh=7Ptp@CB3)2mVW-;uts_ik~}M zNPxqGN)p;!HfW0DZ#&YTw~5!zeV7cV2FeSXxS|F1WM!A=0VAJBH)L@CL@hCxde!0K z;XZNJA%d=v4w^__#hOYktC|?Lu)d5>#?DSC7W4kRcep*R=Pc1>9Xt=&vbBsAO_;yr z_l~pv;e_Y2nXyvT7yjfQ!!xD3^r96bxWxdy3a;8;hFtG5F|bdVHb^jkzBYGe zx6J>$`y#WVawB`DjF&uRLw<6H$cT^2r7;KdEhDHrU(ocOr1aN7a%OXz-IT|i=hjcwMnU|Ov1cO zzpS9#$7dPN{^}%qRX|QEn$(?D>WFa+o`h!rrM=O{)0*8C`ctK)U4=4W=Fsx)x;NB^ zwc}{ml)B?H?_1k&=i)AfFzR0<4dVDaJK?|4zSBhDbVk_k`J3hl;^HkM2hmH+3F=Xv zvgykaY1L6#>uF_*Tqci9l082n|81rihYH0wmNT|6%_pcR9Z?KlsWE4-H&h=Gm{o6& z#-a%J;-iNtbfp8`nuws<=nu((A# zIsD`8pEOV-X=q~}lgk27g%L6#+FVMOsrO;4`NO#a6s+MFc8w*N$UlPJ=_T2b<{)(mXLWQh)=T2^ zRa>!90qkV+y9m1VzEsG2*czLAYv0!jB_epw=YP4UW_D~uf{SYdiqo*b5=LL=kO(>y zQgC0y&=E2+r6ChUXaE)!&Bs($Leo;j@zgnRb@WR`YcvzUt$cLh28IWv2I{o!#a|s^ zHSMuX)0%!}d-tOh<-dxn-S!~lp~n#*3#HFl7WeU z)TE{wG_^o^f&`NLH~4j9n>(b6?yQlRLZ4x6kYRgIL2E5laVIhy=*xNWhpTJ2yd!m% z58wIhT-EBs&6Cl{6k@AlD?T&W8oiBzUS6>9uWQ1gBFCgxGPqZn6Gx$gA`Y)*>(TM- z*e@yU&PUjMYV)~;R+1fX5X@H$lUM2C!YfMwYEqIkdl9icwwmuwZmZHZR!XD{BR$^R zG+#x7mtUH}zh+6s9mR+Jx||XBnekcYP0L6g)s3nZf5Gtbb7mcPRULP%T)8esVUm9+Zk6t5N5~}_MxdsdaWoGt+j$}4)dWk-$d>y zPlC$&I~%_aQ^whqcT!JjFWxQYP&>^QWI+60u;9+NQyXKkgQm1-A3={J*|1hS=ijad zlSjI~Vja@(pasC8VKw(#QD@?@6?$Fqq ztD%w7EJZ#9udoPCEO9)v^pS4^cdyq+896!A-!}XoaCFXCNCCS*e*W6liyPFr*xD#Q zb6EU-;4cGxtM!XJsXUcFNxrF(9L7V6DrlQ=ONEv>0b83ij@;*0s$RT!G&z3&+8R(W+HTEqj z3}gh)0ehAjzC&%?<<$wLOHl+3BiK#G&>3gI0 zV{iq(S<;uOKVCRTTeX+Ge>g13LiB>w=$Y)bs(Ca+ll&)rP|Bozyn`Dr z#A{dpL{|QKZsWFddfwkZx?*&qW zorQuIO`L;q<=h&`=7qni+FXN(rLKm6tI|k?OKc)1*UrZO0?MtaMEi@Z{=HupiY89Q znzx}q#BeT}Qg3Te2%THN;v6kDFu>ZK<1{VmNOxen08;*O9U%Z|^^fx3 z(EM|nE{Man;5@&sr~0<}|DxSL*h!xX_GGvo+MP@liZ*4K}PRO*oJ+Xk?G!_zJY`Ma3m(f5=fF5bSmM3 z+keXuL>Ok$#A#TkbgI-whEe|RW{?4Lu3rx+lesu9Jvk8)kPj1`=*m|DuH-ZVc5`C5}He|X(Z9VX{GDN?xy7JI?-t;Kl zgrCWyZ{)|u%-#!2x$pjFl=OCD0x~6)w!J1<5_CT*emrMbmZm|jQ%~T`tlVHo0W=pZ z_^tm;ge_yl@=$&xl%>?(VDP&cm$dYUu4qw~Cp}r>oz{9sH+;|13WKzXo`=CX|r%b%LwRMHIQBr4S{?&?>c+Jxh?ferPyXc5i(1+FzR$Pg$up zBZSb@YMS1=GZQS2J%|$PVGE5FTb}|kA5(`jtXOo1y5+H9NliL+wrcyP*id3=3e8&h zh2Vo(PWw&O2CjDZXMQ*JqzLM`2=|my!aI3Bruad0b%mcYTS?pF#1FH5`QiVM$C{2+ zyxSmr#tygs7g_uRo}tCvz+d8U;PVIB_Bgb~f#V?%nZNmMJjbf-7A4gF3{^i(qCRa< zL}?@!V)~p870jT80Xm1~SuYyejO1XnJ*38pKjpH*`K~->kIG zCj{zbFtBtpyFy{FH7kSIZ6GGh{U!qUl6?=!&%@VEKvkVQFgXoPee*;6_GKI87F)Zl z8iv5Sz)1SyYWD9|J{WF3@CoUQ9RxVY@BvaLgLaMd zZlL>bC+2uSs;rkke^)`T#JT2P903?}4!5we|9$xfm({n@C!X?lGD%f@ZI6;UgHn3R zNH5K7$S?E`0~da~6zK3;I&noZ;Ea+`x~JF2>}S z-PvVb$xY$XHO5bqScyjZ<63bQr9mSJz)7X?abWq8pbAHHkdKGGiP-cSed)mOz*lG` z!0STZhtmjR&n><{txSb@%CZPg!Js^V*CqGZ0`h|4x=ruG@6sGl?u_v;RX;oa&c^Q^ zVhdYJRa-1{?Q!|>hKTqeXkg}EnD5KCx6jpn28=ZcS1(9A4zyz|m^d~_B!f}jT-pW! z)MzVH1hs(`en}&?UV@#ijSGs8PPFM89ZJlk_5$N;L1{Vvbm6>}hmwT?eKK6bWFTQ* z9^8O(>P~8&fS6bK=3U(Q_{NrI+<&GUN(X6uespXjY=_Ctovw~BZK*%BRYcz%n|T{0|SBT2Z+X6qWLJ%Wf}RVhX=v_o7DPt3P^0YQ0X6Gphc6 z=pe+}CR71F+NpiqNc40ATZ{u3;+y-*!Hnj+jecQ@`?YPij%46PZeDlx(K31Qmey+; z`ycXhcUd=SSV1^bOXU4cra6I{A>7)u+Uhrn{BS)#TyYmb;By=Vt)#9z@-hr5PlW&O zvi(eh9a|2mHT08PSz1A74x0&9%@7|cx1ylst4PXP@n|Ca$!-RZEYeaKvc~!63eUjF zVUh(1#*g7|FPf~6130vm-r3j`Msw3~T!p&e2jEvCiogG18N!S(ZR}cnJb?SCguklx&>uqbeq8}t~G=JKb8 z-qMrs7eYP6OWqf}yLI8tV01<#Ab9&P>ujDp>DBx0T$uJPa>8d(#FNWv32+~6+f{4o z7qaBNvY({_hfQ2CaL!ien-2a4o3mk&7vg;~44aQN>=ryQZn*T?RiIP@G+6=D6EKx4 zm?&@XKKD?nzkn58s$Sb%v*T76=9JsYnOwPBabvKRmAY#>LA*=F;_^49w!=Q-i}z9loezY*J#aRQf`p_*=& zG78d%R?~Gy4^0YkAyu!tihS{DJ>wB>_xVi|zFd-g-1Ky9!KtDh z>E8CGB~n*m{dt!F{@YC)g8c8B=jQlF^G;~5uf8+y!Df@vMbDl(A;&pq9^-C#?#OWJ zN~3Oe9HM^2P&Q3syyqi!3?{m$%D%fg5_Y5Yj6EOtCV_H2`O0t2777lmwnF6b*k4%l zJKGu7x~oPjDE{oHqD#1%?2idkW3~e9$*dUMag*n0m>&1SJ6q$QzO!K`?gaIwNVAG# zcdlCFtvFGBHn`SkqLRg@j=l7uTM*xKes>%b9omn9N=_uNkJ`)e9+a-`mM|&vEN@a||)5?Nvv&>uf>Rhv%`*k2)YEJZo3rv4QSS?9GX4 z@4!<@%3HqIUL+hz5$Du7f*I;z8)KCJ)&;x0>BTa4v4icb#73q(q~GCY?GPaq5k7E9 z=aid~{Z7J9`>hx4fNP&fP3A@Sz;cE}JD$rf~Q8@IK zy!(oOh=LAkY`isx zHZ`j3lPdW6b)LJ}UeEbi%4XlxmNIO&2&-%3a4- z=tYG==##eRvBgLQb*;L$B>?%7eHm%@1IsDe8eAfPB4=a zzC4*fwfNjM;*sGYm(zg;$D}pTzIN%;BoEt`c0V=FoTfzVfzo~Y4fJdNjYqy}eJH<+ z>{oc1!>;zSP&yp%>E60@U>4E$lN~cIoz{(KSFm)=5erXZp7RTb=v+UgdRpqTP`JSL zl?sPvLjM2OM&9G;9E|7NoW}}PUS-1eT<;z7sbo7^VuCk-Y^|l}*Ju${Xm-5n2>I{A z;q_<2^9K}f@dbqR9z+RYy$(wqnOZ&;1Q+%{?R+@--eA7)bru;{%PhtF2V15$QQt~4+HWL*?9ZK(Ol>75!sP!4A~-&@5t_~`EX{4BwfOxiWMdK?Ow z{FB*VRcZoV4sIpCsI=D4|>;Xu+Smcc2HB5}^AzrBiEj@C*pz4w`> zaZU*iWOH`@y~jJk3KBEBsk;ZlN1xonaA;X}$aBZEE`0(SlY4F1DDaM`{*}LSyK?Ax zS(Ef>c6KL`pThY)Y46DjF7G`-1Y!?xaHm5HfgiDkJrgvhNc0ug!M96q;Cb5*RB8K6 zcCFu!eCFrPfMe2?ryEbkW27EB&h`Bee=!@C)7#<;VHc=~GdnWb^yg6Wq+N8gc?S!_ zeWuZvccjSQ=%?98EwhqO|2^1CPsZc3?o&Em{CD-8;(%w|6??0mp37eb;$eexpMI)2 z{T@xn+@_r!A~am}Gk?5-iRZ7iPQgwK&7IAUbIv&+{_&(9 z$b<*fqQ2m_5`>wA5o5-wL_vg9xgwlXo7eq*Yp0>`Yp0-Wd%5Qxxp@jb_+|OAeD`_Y z)>CSr^~{>{wRzRa6q%EqNK`rCaY;w)cP zq>P}R2S1Yn@;B*m*diaB^Sa~30JU{zId@NwNa=Pzf6;wDj3U>^t@{v7A3yC;TEPoQd5Jsf1V01`HY``5T~nD>vhGAU_Z6>A%^OjlJ-43o`0r zx9rqeq{*2}t3R8BKOM2nSTc2Sn{yDCsl6l)yfnEsgynP#O3@x4tJlxrn^`#a&U${Z z`kd4aU}Jv9`k(;x@cv7=LNGW18+%xhchTzF5e{eXvY`DFme4MVPHvO&dk3lH1?}0d zyaA0Y5!4;NBYrG?;vmCEf(%}h_rI|zLTuUIB#gqW@)MX`)UX->ePoHmVU6o!l$qa( zKhg>1`ucZ?< z<)1Hi$F&JQ7}d(!14V$-dsv z!~E=0hr8?Q$M~A}>(rk>0+_jVm-C=W%=P0|>+HG~E5&>MLH5nSU*8b32uIZY9nktg{p=MNovCiyy55g} z=HofPYS5sKkjzB%C)a!-5KKNiv)SRuCoGzMp7>}YkK_3Xn^so#=cdDvyqq)j4^q>f zw3#0BB9Kl2{wsO1A`D)-hNbV>@6?`tdw<~NF7u|LDVyuc*>vkLz7XlZ59c3}(t<+M zy30F;R(GO&ZgDtJcUMnwM<#>i2laZams*eZT-OYn( zg6GuYb|w^*od39_U*k^j#Ty=VhArooBpTpJ56EDVK5vptwXXvW;ti~y==$j-^qPuc z0(4Ymngdr%CHPJ_;+HPuY1oP zhmQHWHC%tpL2}3M=0O_v$#{$vwqmgW_%27^2;^v8c^<*r2clW*Y1J^HI8 zF>r9JJuBf1pfTpvJ+V!V2h#AyKgYnF3zf!9{FRI81K^PghqkO^1h)7u83K8e1vp`i zMO$!o7^%)7X$v1QYI}8`0nT-2{esk_>h;__@=f3MZ}(hsl7L_who2~9OKQlC#(yjpr8fksm_?r!7|T(`%PceZu@~B*U~SoWUAZdLP{@D6_`q)> zgQq0+J+PLAv$ZT@)+$&>0 zi_=Bbe*j`o!7WcXAqMj)49*^}%px{L1m);>jUgug6lJ~Y2J7}thV{$xhe~U|&INEh{Q_f*g?qmm0 zkm`Z}D4?FYk}OP+Rd+9=?6$BRT z-fQqWmsf6~%#jU4W_X zj-ImV#j2Z=vgF8;bA#WCPqM~KvY-7-{j)p#f?+H)+9h~s??E70Y_wbQV5t(&r^xt zmey7h-vCAI84zHqU~*>|`>I>Cv}i1&LwrK3rNS#+2g!l)%rt?2KGLcA3 zIkXJ9B>}qfMuM0wq6!p-h^!%|HfdJ7Zh?N@s|-0tcACv3-x=cv-VK?V{K~St>Z66; zK~dd*^kD8mUe2TTS*nn@d}I~@CCh(=&%xdJo#H3RorIX9bF`YY3|&t=Ks}R$@`!o| zq(?L_sUiQ`9(fkFOKUCAeQW?W355(D&Gfy(zR5Di4)y@*F89_taovG&a69>s4 z*pyTAMD0wz`&GDG&~cQ8i96WWHI7w7<3HNtrHdcIb8$(%9EbZM_OI7^BS-$zJX?PP zS(u?Xq;2G4+Uvmflx#jMWhg1T`^V(WE{NeA&v$pZ>v4nL%;iWrywnaqJ~Bp7UQH?3%O>F zeNn@IGYmbE&mQ%uwJPrQQnuXxX1!yjkDYf-i)gCw9!iUZ^knZBtluxdtuG54O(^$H zofjET9wKFdc?ur6Nvwqe)z>X#68VV#jAwQtbdT5_W0g)ye@~Pq;V2S{LK(6)<%B~G&9qJ##smGAwRWm88ENMn;WcFCqO1e`k|7NWa2Lu4x zBvKo1=KN#$1Kud@K)n`PTRwO@jj_C$2Nizv(d8Y$)Ht>DQ!bap@qj@|P>e_!aPjmX zipoS+l;?;Bn@`kg8!-yhYLnr=Jr?@QP~HBJTCV}0Y+bP^4@?%iKt^dClK{mJp8E>i zO|#X?e~45?1CK} z;b)xLYx>JCo7er-Q9|92CoR>&!|@NhYRm|em1b<+Ay_wM8o6(kcGOtX z@cZ0EZh+DSk5pmRUi?8B)Fg0SnP1T zG_K!NXPR8~+^9P;cT(O>_7y-P?z~}NmFFL=mFj2x+cWIpk~k+<)q(SaATHaJGc)q7 zvAY*5EFQ`4$nT2k2&zBOJXso#*U5%MKf^<${P^s%Y9B;&&dEFSL>d!G6tk$lB9S^O4B%YTzdIfz(+EQ)Q-$|<)AA6(f)=cgC zP#orYQ*%KLusg>*5R>gmZ5l(X+Kh`h5iV*tI%h}s_B&Y}WXLy3sBsB!g4n}@!lO@N zc%1i>1s>rW?Y_fXu?%@~W1BKBUw1~7h*Ku-(eJRU6lDp%I$1uqnTKAzVA~CKlgEKk zrGG|GfLTjS;|Fe;UOk16G*YIMRbGmZHKt)R1T)h%#qD{8s3BCh=_lMqyyYoFcZrae z9ix{1&taB&ly2E)=9gNY&-;yPbT5QKpW_>W#N2&`HbeITHGi1-A|ZszI=ZPVt+lko z2Kby8wqdw)MCn|h29`L)aIR|l_#9d&O-MQ52MNWY?X9rl>rn6sFysedABN9}63a3A<2+ua`GrnAxhnA$`u0~kxvs2r(4&;$uArgvh#trd zXoY-m!%}!H`C|Oqw>Hs7TN*?+I;0i53=b22|NF04 z@$wDC@mlMeV?Y5)QGrL->@}7Py{2Ga0t22epbf4 z>pV-IbRrtaKBmf2K_1@4AT>m9+J^4NOD}$ZC{4uat)RQ$(!>P5W^Jl}ZDK~YO%aoN z6-Ffn;8K79Ge1+fo4dX>tS8Ujl5qLWY132^<(1d=a8KO#7(#06oicA*^=c1( zpvNe<#*wDMo)K_JZN^NfUof%U;Wko>u6DaX@uQ(rqmO{sS^hiPIuyAsfj_L1n-=#A z+sywC8vC|j?scN1aJ?lbgBR$b8^#cn=t0DB3hw@@oeQi@(yl%SAxR66WGzdHCJHV& z7cS0QP#VeB*_1|!I*uOP^2Rt@i)81Dk={JnB2RUfXN0XbcD^y%QiUC)P+fwShHb_% zCK&weTyF@0JbE^i<7_OpXnVrGM4Jk&WNd zDohhf#E-0Cg5n-msKi^fim6fWW{ailwLZ^dt5Ft}oQE<^YO^Ff=VY8(4x-tjQ9+xr zxNw@)E%_18$!TfqwO!_n_49(fe^P4)JITtNA1kTBA$->V>6~VmwIW0vo~gJZ0GceB z(*G~0za1;@iB~PO)MZJsfXgDUISe1qM$S0HjfCcqIWy|Tgbcs@U)va=-l3ugPJ3yN zd^iyC+2O*_Epgri5nnKjF@G_UhA#q9TbsZjFWOwN7lw4=@fyKeZ z>T7NDjNVDI>7P9;c{Ni!iFA3qb&c_LrE-)oxf6evWhGI#7l!OW3|?#^j4cC+^C>gc zk9>TxzaI*8>vI}Hu5@B%lq-Bw4ZPQ*gXVR2AT#32OcolD(M%0P{_gT4+$5{pv zJIarSBE+=(z05uHAn-F2L-yP3-dK=n;W%4y+HMJ*CZ4VH(j+t*DGLA0reJylJNzaAy52O;C_E*5P02&6YFj zXK+2x7ibd;Gb;a&nf+@}zYC~29B@7&(!Zs0ehC#~^AUI8SH(C$&JK+03-^0lp(~&< z%`MyhrwVi^D<*F}PZ@!0^t<6fHHOCLuOI|MMvi7V1co^CztuM_qa@Bu2X$C``UQTm zp-P7H~e7^+9*^O$x>&fIs-m^j+UXLRpzs{>`Kw9Rk__oRCLipFg zHN$E$kW>h^3eS8h*`OeI8}pkBtF!d?+fDE11wR`1*(%hGE_@33u?6Ws?6j=rc!+-S z(BHKn3BEzzzaE_KLG>}7R*e_H`+%~~4vy{fQH-5cKOD>%EDy@Mv zS-PX_v<6_Z8i+KEtyWRRSNG#AVDj~3Z23U5ANu(k!# z7!cfhGW6#2n|3XCN{s?%2G&Y1Q6+hF3(9vC8ledvkqxF&(UZ2@n2W{uTKX{*PI))+ z4=TO*nq?pKPeH&qy6kGL^@$Lk8nnG1L&U_gHNvW+7TP9N+_(@P1XvL63^euIB~il< zf9mK|f1nqD5HZon3USWDcCFok89|bjl?|DEf>#rDFG!6dX zoJxGr)JUe7fAbZ}B#1D%=XCM5hwX?sk0bJ#lxaJCm&O%dI!din=NHXvVOg5zBBX1u zW)*zezhX~gUpk`Cq~@>9>=MS`L!!Y1NtzlEd8S~#3OShhAH!T^!}Z!x88^G>7+ZFv zsdVNYd(Fg0z~GYB1*?armSxho;Zrrek6Q0EP+GLl0WfXPyo5=Tq+Euf_+C~Z&p3Y0 z#TS~@nTPY0XN)+A7&LflL!`H07s<*>qf*Yyv)wJD$K8)xH^-%nmrzerk32Pd=?~vw z^=`Af=UV|BwKj+1&(*cmr*aSN@z4bH?MOcYhz*<}_TQ2vY;+z*ZN2$#`kIUHkDDGTMW~6f-C)ZTbsc@-~qw zZ63|qe6RnxB_?Kf-!7vtYDH3t+q8;gNxzAkvZ$N^LN=ekP71YlqC{0y>Ui(h za%#~YcIQQ9nIeZUYD3iXYql-AQOG2ZoFb&e!-79bSKyWB#$eH(Fje3k;r|E0jvVXTS`dZ_{G+Me=Le=dhL zZ^@*ey-c~jF?rpXIWjDqmmdmE`meJ2Ilj8es5w35e0TB^Qb&zQAqJ>x+MaIu(hBY6 z)X_0|+m4qL@01R{(`+qeX-8ionEM*^vvX2$C-%@);CKD~v~Y@I04;jA>HwEcYBrPp zE_8kJIRBuE|BL7QGxu15sa>9PVQ2XRk4Y@^Nd!ZTvud*)%VNvoM9)>pm`(FP?!Dcc{) zBWs6q-YFigp7U+1SEM%kjc4zYGHN>S#7aDPEdy^8-SmPk5tKmptB=AT!K?he0OIKx zy!=hnQ)Y>n7mDsIu5~8Id)EAeZ?p8B{$qpxt)Q){#7OjMLr;B<@yjtOc=IvuMcspx9SJAbi-{+`F2}qN7~XjPcWHNLVFnVy7q9GW$C?_ zMKf$Y+qhCJqqd;Kpo`_if{(Kh|_qpLw8l-6gVZzrG=x(%>S(cqW@xVZw!~#Tp3T9-0?jF#Z3W{bEn9gf)HkkMp#7 z{LdtKt`o;TD-%IG0fqWiecIa&UpQI1EFC1!oo$|NkvD|N6wj~Xgzq`7*$Qmi@8Q6DSoFOP8@Dxd5^j5p< zZYQ?^Oa^Jj3g2whN#zAC%uECz@bZ~&L{!^wdSC{B-5XOHO-ta$rG*&!kshbdP?Q*< z$FS3SEdlY1pvY;s$EcNfzj=U!X{wLC=y017kkwA zRGe>j(Z5g6ecKg(;vE(xWkc4REZC63Q7&f2epr(91P>pBd;%>bz(iTxR^XAs4^F7` z{CBayP{TMjsZ($+;4}n(R(sV&2;7RdZnVKzi0th}hvmk4+6AZ@QH5TXof$ z#E6EYE$RV0!2Z8`PjUiL3Po})yD6i#+hBSXbRz3-Ii>^AK^#z^&na0gmgnP+$1_@zz2~lV^*ZcXrXco`U^A}TF*E4+rYO1u1nSwxRfomz@D6!G-YNtL|Pb@gZ`-nWBZe1-)r1l3o_Hk zb3D#Y3GAl(%7<>&1cO`KxhIv{Ykgqy_S&B9A7*~oWpm8-yD@G%uzVVhi;|2*kecD z?H?r4hxBL@Oqo6I1P^Ta^LKE#OsqgpXwdRWvHMuwZ|v{W(?>~kwCefrZa}vLTl?P~ z6&^Qlo&ZK{8pM3e5szY|Hh+l@mg#uNEE2tnWSEbAR!HTCzX(1zFY_$0ap3oX>?LUr zfhs*h2((LSHD?|8Iuqo(o?4tjz!tltwFK8q1sxY9?uP@RM{Yek&B|rW8=$Sx>HyE8 z>La-W>UuqevcsNVcU{;d*UGZWyMz{_Szj7L7=mNldR2Q)hBune_=5;iQzLe!Jhc&Z z*pI(jQ@SWE-7zaaWH7NZSE>Fv@`+R{rTW!dfNJ$Q_UnzKYpBi@vqsG(!n<2kBoYQY zzcu-s%Ld7rU1B%sx*-2a;$s&7p6vq13ijCZ7=gIHLkwS~j$F*H)q45pYedOK2;a@@ zoLYiyiH@*&V#?l7O1?C2QI@8C5br;O8=^scRLuuiB21BVys?_~h&AHu3;$njxo02x zhgc(Q2$Wc$Yseh8UY)k;$Cw+{>(3j7dds)OP_HO7p16jS;U~D;id&8RtkoNE_h44 z`mGPmBKc!3;R!$3>EJ$k|8Vq`+ObnT0XGM^(21=x^xO(KEP# zX6i-_fC0U2+xj{UdWVqr6#B0H?eQY%h&#vc3F~qcs}Py3WZX7=W;)+_Q<`qDyVR44D#>K{VPmz zPH{^@$)c~?ooGH0iVzrSSXjcRI(kBDY z811Z@*Ae#txsgnZx-(y&(4bgMebHb|Wl7bfN#MjUxAQmarv_u%9K1~TtS?U8I_wVt zPYc_628-5Kx)vr8ru6FU4xY&SIzo;3`OL}w^L=$%L9v&fg;W+5C1$|`ly$z766Ah3 zi!b4ZmQ-@@J{2%^s%qp0cL~#rhi`kfFb=BSH5{;d+9Y4iNuLu?JLli+v^u9G7_eX^ z>{~yP<7nXN>a#rLo&Rl>`ifT^rA9Af_dT*HVX#rMVQGJ_EM~vJp*bau?!>xgQ~4lueLOGES@`7k>AtX4QiNarg|Cxh);c*S zP8h)1H*2d~b~awEm$_C6*m{lye?sb3zm8k1Vt@Z4UFEJ5$!VLG6BCwsW+wu6&A`6N zg=`BdY2eI6PCx6Ym-^DZQ?}AEtp^2f$8KWwL}~c_3Uc;xM;fJfZEq{EsBV>iJ`zX7 z5_uLv$c6ATg4kfvDr7LUxMPDFb$mk7P{s(crdLp+ulL?0zMPupRbTlfXg>?b5vrwZgQgBfHAIG_?ivENSW7RRUl(GE1J^pQv%k~n zZx$-P2w>S#kC1`bO0PeIirtAD$fpy&_N_GH6I~?7-f5`xa-}oKsa^hB40`~tIiPdS zXk1Lo46B%#QT>)#q-2yDH79kR%LB|+fg{ooXBj#3Q!oW-6#$L88e-htC|6CRRj^H0C)?>@K8L4;TE zu5kmOqYl60!8zv_miv?|p$SPGm{g^^8&xJkT5+_3eC^m{tPzYmq=0MG>k=pHf>D~0 z+)<9uo0N^gyZpd{-*ND+dzO~R;?;AH35Ma1=WCHHWj99U6*OD_hVPkw$MXd1dH?3E zI?lwS4NM;fE~?mBYg4T>UhcQDHBBBta8zZtr$S_f60PQo!^VbDefP%4b$(wq@RHWM z_l5WTSsc;&_YQQX&t9Zn{xzx*=!)IR!G-4zM#KoBv1)ICz!RiR+o9cn@Kdk$7(I$K!)oiy$Eo@~Gl};0 zz*(|RuRxRBfi8(&kgL1zmRng!%;9uwQ;-rkqnuhI^TAo?)&_Ob8!~e~|5p>k9FJ0i z^?cwr=nL)t&mdca&tO$m8GC)F{lt^0L+Av#nKRpbr&Q5i0x#Z=I?ntH+g2K+{Q@2M zV~JaGO;c_97G*OPg+u-YXoF8(`Y64`C^LR?2XVs4byWOMt-ha^QsE!D*np)L9IeQ{ zv*#&)5eRW9Ibky6jI&|ndP#2m_{_MRFd>USB})cb5X~(M6%hK?t7GdcSY*CpR{wEd z^2rReG<8ow<%W6GCF7h&6Ka3IrKy~+z5Rz{0}7ix$+6^H)6H*gv>IcG+x*Mt|Atps z!=W^L(AvMZL&CtBO7kKwGeW>oE!=$aP1VauL?tPrN{(FN1+E0qi=m}z@vcK!@6f&igLV5)__&do`; zn&Ib;+@8r-%==2QO|~>hM8N^W&kP~2ks=9&Xtl8IovKqWsc9Zm0HP%6>?3Zvr za(dx(*UrNQE{b29+X6>sUW8(rh0RMy`+`ljSDTZt=d?LOquompT``&2s}Ut^Q_^jLxZ( za350$5tDlZ2sJE7zZ6-DIM+?>7Jw6E@7T`Maxg1h+GTv=Mci(-#ybtI6WR1#xv>y` z?t`Y`6BToGznk_V^a`~@F0Wnw-oAz6bs8mwqo4#)(j)Gt5BcQ&b1IoN`L50{#GO-K4nwjM49`&XKS<>vYYf_a)h{C-;y6YIL_=A-3K_!C-m^9@tfKHU{`qOUYhP$t3G| z{~rKgk*zG(JD3MyKLe0kv$%&TWIHnNI}lq}*StWN?>Rr35Ui(ITW=*x>{As~1#kf* z)OmL&z;8Afcn`Ug@i`d)rGql~)KOaZ;Pu=xz>p?#0hl{tm`DCk$ga3F<3Y`toU+~C zYWP$Tk!O*BU(lX6?W>qS5O<(f4W%qr)wtn*t{igf`9~vF7`{8Fo`m`dW5VFYuV6Vx zqE0GyC3X$Xlv$|6jaGLE$wWF+yqM1ob~<;=iuiEUfp$Uk3J}PA7EL zgR?X4+IR?K&4APs^q8*Y)6pBS3EOn%_Q%>Q?0 zM@YgEXW+$z3IgD(_+9n{`RNIJzgXT3!2+OHW}8WX3aIGG(81&vkEZaa!q|N#SAV=d z;|W~jMy^CT1hE71Rg&UhDWg|^Lqbjh_kWtkZNi>Ee0dl~Wc8*sBL$+@<>06^BYr1~ zq1EIqZpLA;`}cTy%)|E;7?ouo2g3p^mCYmJD6Cq78)*I8mAh&h|#z9Tfj4&?3* z>LPjGUfmZ2t?O1Rr5|P7cUfwV)~+P~75-%E?$%=b2+0APbw30v2I-Ude+*1o4y17$cz7_X4hz?6~Xq0 z=d4`r4!|$NTXa&Y5$L9v)Evdi zs)6&D=36K>=zew!dSYN&o|E}siACm}5meb3fYShhBo#23Cdv>0CZs1##H!j`Zc61d zEEm`1Hr3u}pII`qa9F$^cB7fE%hhFoXYmWQ_xI;P-W@r@j?8AHEN*`2d16L-{!@;M zc_GsQ;q_Tvu9H~iQhwf=O|tKh)ax7hS}L?^AAVEoV8!}3!h+-ugrXiICKJ*C516x4 z34W@+j(9YHRw9tF{uP);8}jZG67_Bp((w82UH_vI`_e~0`x6<)VV48AXki-!vpp}C zo#7vYXx1MI)FM1L8IA=>aR5=<`|qsLL`v_fV3=&o)`5%m>*ReyH& z>JRR3CZVd)-Sz37PUSIt3^yCMDwJ&YgTj&2#bFSh&9zp}?-;48<^#eTh9E8XTEyk# zOn12;UeOY;Vpn0?Ejl|I8JyIl#f8#e%8|^QCW=H6GVd%oVtDSr^<`mhODwlW6_u&| z*96|E?Vp96=#K9}`JYw5rj_dB|Wl|x~Fp_FI z!s={s+i8p(3;s!;lRt4L^dc?m)4kT&vP!25tcDPc{Gjgh-nY+}kMb(OtB?cs`?I9; zd!G}eJ31e7HezfmRp0p}KV?{ph_<4C;Mk-L4aG2xESWor2JnCX;#qStlA`>Phmoo^ zPT%LCHwe7}QT<`6e6HPOfKGgA=&HXWOM%$MGTi7xkq5D0%p*NAk0b&T9IE4_7JN7310r7Zqg&{ug`SE6V^-TM*EvhH@mE5 zu8wd6TY6uH1`6uLES5Ee-q@v{Btln3fQME5AB+zB$nH zjJ@~$o_~;{CegT=_|%)cZfk_P(Gm0zPmh`asjl|z+$C&zp^a|r#~uo>l@($rJD>J4 zT%9VMmnBJe#|k}N8f^)QfxY!05@ELK5Dwp=KrYbxgUk1+2%{wkuN0UwEfP=mphD*T zXZjSztD;T44&D%yw)<(Uj>BzA{foiy8Th!vZ0%+WBbeEPjU5M#`HRq8ai69^Dr-f& z>&X?E^-6UF{l;eLWD&cpyj>uBkW=c|WKx5NtM=#SCyUZ-mx5h< z^iGLO9@E`c<0vF$P<;8Oy`E}ud_zp`+eiM?ZbC&;RnZk&@?2=v{M+r!$|KZW+jn$L z0ppa7gk7$gy4)v&4*O1+V`GtgU=Mi^2&Yd?#jxPW$nz?AidbboY7BJMQdhHWG@DGDdvpDP@= ze$!pJt2PZOt=V@_LJ0A5p%Rfpf z%!&rspifL6y32*S^jaH|>!Z%&E_qu{YhIKKsH^DYQI}5W@^qx2E|=<}p}2Tp$|IzM z98^>C&9Yo5FVl0ds|fA3;b>$3#aTk{D@w7tqh(e+9@~H)a&&i=Kr)iKd9N-G{~nRZ;KA zByN_q60?fSWgyvp8cxVrwknbWx+itPWSYz1W?^L*r%hrD22y)+wm~Ka@_H9*Qjf0x>uD4cl(^}9DG-j&Q5=4!K zKH#et);j8#t%LxAFMpN%D%BH_%rv59z8k903{M=;P||!ste}WlT`1AH^7>i#lfjoF zd{M=VhRL^gei2b+mh`c(FOkDrp-gpc=&94CeNDM1&KmKD69ZHaJOywVIr4`NI2FmJ z{+FH)=&5Uck6_lIsYG5iF8fs5783OkG%)2BJMV29*ZSdRHcD9rR7f~f7nlp#@=}+AE5mw=6VYoh&NYgPkzhce(aOz%g)j-nN zU-c)^tC;aT=_8jp`%4Z^DlKej7VS80k&F_fg%ybw{3zNN6Ja+V2@FvMGv2lRqh9ep z&+!D&XDV;jdyN=A-|7MZ`t4M5w5?V_*q);GgM3BOjB6dsB3<^aJr_`~bYy6j3NMq`@(aTk;L!GkZ%x4Na>Yr>SQ|f@~2p@$}kX~vAjyZ zj`xMv_qV8z!WXr^~W<|JkU*j^JGIPV3wY4N_C zeQMASS`rbj$5iLNU4CmvHw5SohNe4(j=DUD%E(cKiOu+t-^L0*64mZm!86!+%a!~~ zxrRM%H+2#!C=&13kFv94c2Wo;x%6}3ZJSRvy}qyrBShDcp|1Ax12QB@b-=c@&kH$ z-hgC#WAD{YnG*Mgm@W-qT-)zXx!kaoK07@s+qDXaNF4P|fB}=v@E5GJH}wowS5hqU zn6c|qX|V;shyLaia!Z_wEc;QWTn?LyW!60K5AGhK!s-ZYuT5z4c|$n^-dZznT9c(n z3?~*&gVwJ^-SI+)I^E>m5CC=+&p&_nx(`3hk>zsHvCJYcQwRn_OK?Q+v3)kRiCiv6 z{YLuP|wAK;qu4*Zrx~W#K{DxS0I&v1&G!`L1BdbtuN&S zepTx>54m@OcT3DBvxTM!egr&w;@ItU1eLTnMk;+t{46X-t^>u2h|1=e4DJ^i>Lzphz~4@TERkUMd7h)od0)5&j8q~ zxY7tKX+8l{|3!&dhxZyv68IdG-r?Tm(}M$~p7<;TFchc!YBy$U1o@@!Wg#=dxK6c< zS56FJ1eERGwDGZ=v@!!AKKGaMYiD_-&ar{&#+gkYw%ubV#`}&9)SB5D9AS>8Vt+qo zut1-h^Dxjr0oyo4r|F-Y!D6n*NJ)52_&N0cz2$SpbQvqCLCk3zzL2HK-^<{*cVdQH z`$AvfUY}1-vN^}*3_|>*e?#a7oBW`~Fo~+Fp|>_1eg!70S77iT-txWa$D*7^QNPd& zgXFV(v=Y$Pz|}eV5spY&+(qsnW3~fzzCA5g7QYza!s(`Tq0i{+sWlty5tdrGH7Y(z z0~*3a5Lk|!r)?_an(T5yYK$mO>LLGy=u(AZPw)hSw70s!cD+ze%DKJK$JZ5xFwpL+^|744g)Fp2sr&C_ zWW4d6A&JVQ%(Sc`m3U19_pSa%`PvhUtNp#>nVA;Ge>FNlvOE*ET$c<-`(dLEYPk#8P&RaHuF9~3>XmMPf;y=bJAt-s`KfyTE2t#=4_xoB7wJJ%m*QB*rAQ~vI}5bFfZt@ zva9G#SdLCm_}NoouaHyHW&5$JOM6*-E3N2H9&c@m&c$6+T1*ue|3pCv!<6l^Dk8V@#;zl?_wWqH0q4}YCf122y{?x_>F0!IA zmD04`_K1M1@sEaoiQ4LC1r9Bk%em#P zAGK2c>79C;ZV{PbJj{vIB8O!<=s&-O)K-e0_%=o!9gpJ<1MbfifQftC>Y9k@n4#{K zFDH{Qx~BdzxqsrYSL>A8FMCL-4PEX`h_;OEaz4cBmMNvX+T7~IlQ%fLt1wtPf#$`R zar>=8=Tq@^Cua7)@$3FFE8WIX9?9h45iJ6+dF^%2*@L0b7T~E`&lFdF`S|mt?mo1& z_XK;2O%xP`!wn`&pfr_-WeUd@s8@1>KAiVG&oJZ((RV$YRoQiuE#x@K7E z2c%7MzC11xg<&HZ-0_Gn$w9c09y`8t`^#FXPaL_hdY>tS)q=Bs)P%f+U!9zSh7l{H zp!vZzUk4$_<1SnqiQH;{wqX$M6RES$n#T144294>&&M!>Q;_g)pK3cW#O0&<)9`CM z=B&o%0JZ;%pf+9GF2r`qXa?=EmM=amYQ6;G)6Ts+TQK;1~u_pMyUB&Yl9xrRzVKSxsOalm$6#k!8#a z)k=-I_IiC`qLC8%_e#B~pxtN3x<`s6Sfh`=$#zVm&KjKTfW3orH&v$BI2?Qt9V+iY zs*VRc{_X!K;i|#&TEkH8avFDxPs-ZH)ofovsm8?Bgy~Qth_JWf4k=1H$#0q8eH(kC z(lhB$Jw-dIqoMJDkOzuw7u>E;Vo;~x!I)1) zQu*xC@43?nWIg6oZ1a&9MR_&1N~hITEq9o)d6%R~78OJ82%^2+*}G1H(~1HV-vp-A z^s$08{$#_b9GfbyYTZo{__vEpaq9$|Jo1=#QP0Rg(sw82m{M*(*=~ICL#x3K8U!&r zD;7|-8-rCk{cSpNf+)cRGxPTj@AVddcZ!(pA*=kMxFO52jTr5LxY%ULf8*_Q^oW{Z zbZf#$hq<3&c!$iE7{aB1$$;w5#i?4WC-WgObRyJMy>lO&+13D;?kCiw=H;9-e|H-I zu1q}}U;_@uPsPdf-3p7d*0#@uiUOD?%G=ZKTTH(&?6cXkFpmiXn=a#FplI#KdHpKD zPuLyrY@a#93j#zhoe(xUF&8b#j3p{$Fr?wdMdi4iHn-1Oz^yWePJ9uRj_T4f|CH8) z5hiv^FxR&N@?8;^YHoPpvPYeu*IjIC*Ad+iZ*?WQSHP)*V&sWCfD?gaM|qe;a>+S@ zTVJnz2ACVYxar$U#*`|&+4wPxmgLCKfHPkU zsu&8TY`X-|bo*r}pbGx3I$xD}4t4a4`mrCNer1%(TYNZ6&L4H>65Y;~Qtn7Vv&7jkBP z?S3=i?L~VKc?_{wN>R?XAmLV`Y7WshfqDccgzz6!Ka;a-%N^3NoR*hbDM|*lWesoy zDyiN3`vXjasRUTR$eh4unjtB`TQ~IKU~EsH6ZuYCDospQ29WymFKLl*%0Kr* zh^utdCj*;@Ru>85$Jv9*U-G&tQyrW?YJxG6ihuj+&*UQHk zn&5FZ;kRuycm30=`A%RQOY>98oN`pDV5qU}^-&6%oolyQ@@l$|(J6H3?3wo}VP(M|OaDE#DA7j5OjQQGCFQ4L!D z7iblH`KN!)=_Dq{oOf?8H5}J5L7AG%C-A!fJtdbU|C2jG>qce@q69o3794z(R8d}bLvIk zaJ@b(54tSR;|Lb{H^?%mx~L-U?%g4F)yHK2pqb2^5cl^k)K~mKDT(0LLf)gQ7HqUT0HzHv)6iK6r-rP0&11FNu{nDTRrzS@?m<}J#eNN| zGjj?VV@cuGfphkLCQH*GEIfNd5xXv4|C*6ELsDK|7op3G%+N$QJj^Xh=fCrPVH!!L zS$q$|)aOpbKFC`gyyiYydvo6BBhw-Hnjga8YBkrI%~horO)Sf7aThJ7oAAwtnOOlv zc}%y(=Vw%<7*$QYwPCSc`Jn;eU*|44?!dXdgN5L~9>A#dyVy<9{nS*K1Zn~_Z))g+ zApsS9()SiO((1dkcq}83TAz)>tkM%|L|B_>g6Q(Kkas6_Eid*K2}wQv`S8OCIUv3! zF@5h=H1ZrDTk4>}jhe4gl-oK(D>JVpk!IM9@<{YcQ#Cr9KRE@f5+5DQwyf8qCZX&W z?|5*F^7V$g{i4bfsVLQ##qoi+8?03h&zLFcMmvBA1aqHRvsb zw2S3onnR0MS_Vd#HUcw7fCJ@e0nysux?>q?nNB2Gn!qsF@Ub{z_vx`ZZgmSn>WExQ z+SI{Zbb7L7(Jj`9oR;N!vXiY1D)e{&_|TKP`}3?CE27&Qld`h|e#mE%?_#fs zf0?gen3dsAs(ZX$Y!i6j>Rz4)sY07JYQ!(oCSGmc6BSQE22=7)*H)7-8bL)kh3`f2 z`_tF_p~bn>MBQ_ldi{U1H)A_9P>Qu~ zT9G$Fynm#ik$%hS@VdEClITyNgvI^X(ST?2hs~4+Q`TSOKC;m9Xhu(xFhKbHC1Qmy zzg0qr@sF36soAltQH(uR3)6NiQ1-gf-Y95CYw!s!!?8s1OH1DeB;15YAL z&jHhft&X(xgD{Pk2Hf&@LlW(F0^BG~&hEW~EmZbO-Cyo#B4^ZD(S z9nu)5ectXojX=@c1mnb53XNcZ= zWSWTx>jiH3)=itei+x+uiN7JxmYo0>@*RE^{wqf?Q*0p#+DE)Xy_U&$79U~&A~GEj zP=b~G5HuL!GpEGFeo6k8aY6+Xgy%!ea)jMmw8RL2Ua1F zz~6xRtn+%F+CuvV@(o_F3`t|l&U)u}7USkr1WLvNex=H=NEVob-Igi=^jj2gV!arW z*#Z|FP>JCCpQ1$}OVYsAU{!fT%*qSu>T%eoRhZUW;d-@m{k_76)6-yq0l&c6n8PQ~ zXy3<;8ed2pA-gJc&miOON|z>snz*&KoXS+6ZoI7|3||cBB}uLGY>G<6GaDb#p)xWL z18~l}*0DoyhbahvdxoM@8;xnnF9Bp|wbeVIzjlo3PQ9sHr>+pvSZpaPmqkJ1J?)C6 zxtG++u%nE_ssaDPkm#$X^~_)$A9>)}{TH4Gf4YrY$Hv^J zZ|bXM7&G(hR3rH)O8sj#Bsp{Cn#%yZ(}C z?Ni!3y6-e~AsA}#lJ#RFq8+R{;MX-z{1Q2>4|1z0DA9eTvK}kd^)vmz0l{jXurrhGd-{4fZUyMGXU+{7k^$omCEfN#4z<+lIydF&I=dFGCoSva2KBMh9_^h3X&+Q1gPqPX{fOsD<~R9M)6hr$Is>0QyIM=&W>rt6 zuy`MXB@{H4NO522>ImU3`6#Os&GV*T-bY?lL*BX}FUU3=^AbN`ovO-VFPq!XzOI2i zEKm5N>FA!Ge;M&ENVYG^q^bB`gPZOc_cbKqTp}0SIYncqA6@<4PBE7vLh>83Q-3ld z4+$-_OZeG&!=H|jtKE&(XexvwV)6q=tVe9pvHYU7!D+D^>#VKCu^9RM?%cssSxMbU z7BHuth~ri>q#HKj{=IW`Km-h_)=gP<&aobRt1cDUQfBrx;F^Z!_u@ZrisJ`m%`BN{ z=4pv3?x;bcVp-Ph8q+ul@?~q5+byl=24XL>*skf;%`io-zCkZLeu?dd;9V_(vhAPQMP;Dx8HxEW@AY2J%lJ?7wm; zj#u6#^BLX+@bmN#*ZQ85I4F3XUi<_}?jmxOa$kF3;DZRz4FCN20@uu1@L53U9%=d# z*};pUVUZKtkOr*NxV^)xw!~R=9a}zJfl~l|3s|uIf_ixPIAi2ZVXY0CyRzTY)J=B< zy2}faMtb_h@9!D?e*Got$PevR<}slJSO^OCZ2{PiOq1bP%Pb^9rqjN#Y16?Y`{~yT;iXU zKnYqA0b=fm5q?PFCjE4LaJA&a&}KaQmB$ROgb&pS^sOfCX{6kbaH#vR2Qi9 zE@<$R^8ms{1=_-L<1_KdWc_XW}5t0jlsRR zt3UnQDPgA=Im}X|VXLQYNTUIcb6Pp^k`rX3rm_r!Z;^Veu-(y`H7pIqR(k~vhkn!Y z$h-^~ISLUhT=>K8tEP)IR(Ov)9_s*ns z=igL66F2)yAvT{+ZdkxyKPcPWdTiK-LMPm=WLz)smi~iDfP+!J$@Q~7NuQ2pW0$z~ za)E7lJcc7QxWa5^VH%>lW%{NlYL_9K0R_?6m3T-};g|A#FmVb*X9!DTw{;$Dz`+>s?Mjqd;wApZNY zl=nhg0UbL-wVB;Ta1`=%G7e?ju8RtlH>H=3j$)yTf{<&cDJO6>FLjB?@--UV-tv5E zhFItaef>w6y0(r!8wG!Q)>JZgAj?WkLM(+K5UT$9*)H4GzK$X#jIEzM=OLMUZqOe` z?6V7hw9}}tLJ^&N{sk!%vbMreQgq`rRB1@5`r}9a0}4KC^K=$Anbt=-eNKEh&G!7$ zaifBsel^ADPoe6-!vq}uEvv5_^oh@qSG&D8X{{oQUHiFbl3;;sa)FU@HEAhy*mEv+ zw|&y-6mK&t+pav65VZO9M8jtzb{lDCHf8f75damoQ#4IQa?#*4y(Lk273VM$4q9Ka zJR9mkEuCM!1cUOQXhn&hMF-);1{rZ)(gP|!u+m_!K5O}z5BvTi;o;JGDgm1wG0Hdd z08iUxt_^)X;6Ip(Mu|uj7hYBTRQ~~;jOa14ms|B?e=6pdhn7??zs1wNN3}Czeo1)s zo(w1mB*z$5oF*_>0KwkYH9DqjfSTABb`X&`6ms)6A@9H&0@WtV_2ROs=@?f~ln>}u zXZac059pYLZ%r>$6xNd5qX${modO`l zs|~2DPWAS>L%1$^lup0Mpx{_hV_Q##P|mHC-=y@{eACAI3o(*d>#zMO{d{cJ$TT?H zPSHGBS36cF@+hg%+xdw4ttG6$v3N$Bep${|fN4Y24|1>|{Eum_(|FCs5&PWv-MEAI zhAV+IM=*pMoPrlVL?-u{#Cb-092PM>nR&U6;7_19n)BB2X83qIy4ii%GwG1@xbmFT z?^zDK{cRPpX13tb))Qah)o^U{xla{E7v=*x3wyx+hqi$$MYX0_I)TY zIA`vzWpMW@mm<=nHfb^VwlrnyFZ2}7{({K^y)N%yNnk_DdZ{*MV-wNV)VQXe+}yG{ zF|_p0A)doL+JIIxR^)9@0i2K6+%~Mt3z$B?%JijQH53Uad@fwwxE8fC<4cXnJMK>| zHlhMF2ot$?esdlF7)2KQLFoiuMo%Q?b*?msG$vD*<5#JVI9}m;@&62Iox8QM_27ic zqQjKrDb^$F*y2hEi-107=r0pcl^Fz{Qz*rBMGd8C4sfBX_R*yru>~#Ka30>yyt9+^ z*3|^b>^Sji_uC)p5ZWW=JK;-J*xLqXBP4NmO#!d8EVEj3G^G>&7BNCW>Ua$jPL!zK z*;nb>zbq!?>hG_sG$)Cj*3*(x^-S;L>yX8n?Px9-Z>!Jl)KJ~e>+YrBw`me)vTnR9Od4J*KI@@bQ1%{ONJ+m_SfWCE@jT|iPr*t_>pR9WB zsC|gnXj=8(2Q#j${-10xYFD1#wdFhOC(^$ULxDia?0eiziTw-CAWkNpeI;fnpE+@< z0aMetSmQ;`X%=LI__uNnA9IFo3?49!D(QW7^3{wGTT;m&#klfhzpuI-R7CE_8(amK z13bmW+eI?8{OTkRJQZ-Z{_2Zt>mJT>tzY|dD~|It{Nv+&wfqZcX09R z13`N*ougW`#79;p$3y9OuRp`Kue1QR_oaPh!dGg=5&D2geHCcpwjf7CyXPt!uFV@! zP=stW8fb0!!|y5Jib&y3H6i7iKI~U=km=gg7~lOHmzNhbd3#iEo=4s~EH(3UBM&yq zfvN!HpOC5+N!U$+bZZT~=EHMXOje!R-2(|KhaH2E^veJzpX6;5e&ppRc9}evyht%} zj4<7~QFD3xLsnvK?ao7r;&f`%^4k5T;UR|cX1B!-S~Y8R?$q%BQ|9#;3ABw3aYlXH zTzUn#i!X~`cP zCaK~Rh<*v!z%`TQeuh!a`+$}7ti=x8L_JqRPMk^pmk~`xYVJ8fs5ZebFQ~fOmIorW!v4QQ!VhvuZc;*FYQWo-4&36xAHK%gWEP7>JKXgw zkLd*CO%dT6kxMV3^d^EnsM4=Hsfe1D3{H><)QIJEWrgh2AEnj%gDY$nrgi3Yyv`GC zUSCMPq`Oms^Jf+kgb-F1UFuVi1Wdil;k$POxr`@rvezS_ya{Nx8Ca6uoL4{8xCMHu z1Jj7XPVl<=^Tt$sp!-f&VlDe;4M3(L2I`Qzg28kp_9LLG!uR30m;bLc>OwK)`tMPw5~JhMI-yL#M%AjN;Bm-zyajH$PL%Dqr#b|_^%;m zi2ht5o**;0Dj@U3Rjeu6B;l0!CH-A8+l!RW(ngheH!FAM^myNH6LJvInRl6Ive0i! z9_ABDw1iXmvmN&O%9Xx6H(W`l3n=5|1j^psJ!lUETPgBAxF23VcIJZr`pem!ua99O z-;$8u3o3sla;1D-WlOStOP*dmN0+hFwNDw>td<*c_}O#p7_fdMrX zpW%>G8DO}cvf5i1)G@4go{=JtUGcXqdK&zbhX+$QO9PR7S8fK*eD|C7>%L z65|LuW_9=c(?icy%}MWAuS(x3_pk4XRvO~FVgSL;DhxXdtFs+_2!{AIaGXwH+5A?& zYXRlJgGwkb354zwvOnC4Q)i?B9XxNUjGu)S0A8GEH!0<=7D=CnCytMT1K#8NjlZVw zz_;P=0^BNv{F4n`kHrEJMnji}89$6G#dH6-g$W%oPuwB&_neHBlFMZYR8Y>@fYlO~ z7#1nOFt5b4(5lZq)>5FRo3zF@KlLtVfC0CkWAB&+^IWqSl6br;?XPE`cqw1Qk(yy=v@4n{{A>#8qIy~B=+yT?Q?R_7 zQxcYsFO(20DurRaQn??lJ0w`xyVz3|*pW_}&_QlQYVWgz;A{3$`#OL=?V&79Gzco_ z6uPW1vniGiLDoO4)9~r@gBR-XO!8euxYssW16eE>FySGpQ_|WJX6>Q)`-)(j&EN4h zT3>pFn6r)HVuCG^^=+=s-uzTzZa$(Bc39=BU$_;G_K?(i4T#dr3tbZ~hCt5u-v115 zpjWDKh&wR5iQ~$6GyV3j2Ep2rY59lr<}>Y~8l}4DV!Niu z%}BnPj@%0sj2c^P9qEi+S`}!!*JZ)1!Zx*__S@HFZdMtPX|gTnAC&c9{K0}Wr$Cef z&b;y16t;Nrc`}{?4=&K4i$lP$NcA&BjkWX)a`b=mzu=XaO*0I^x#DyJ34$sMW$Eu1 z@4a)<5mqALXcKq06mWg0tcg69-4gkQ|l{wK(hCUmmEH-Bdt0i)* zB#S`pQ*BAw-clEygQS1^751fjnwP>38Qo{Wih>2#5%d4SNq4zD{>qM0nJd$o1w=_? zIiKxU*XO2#U86=2Z1lPGBip3UDtC*NXoS;#C+Jjg(S;05YxxVaEs9+Bf!oliQBLCl zp~vEdK(BEV3*4lgOK~Oe@uMwFNoB&W<+B);4z#Kd%l9mB+zlFU4a<+$ z=j5~=s=9@$|H3qQ6PGWpz~(mJOv-NkK1*BphCVgQx9E`|Yud;)25SfJ3!(fSk8XKh3 z_FA6@v}L1;0QCK{vr)Q-TiQzmTU2>r!^g9%LOsngy&uK=v2xa~dBw2jdMG3N+K|6@ ztd#hwdX9bSXPm1Q_-`U@_Fj#7wOYje&YXbMzT#D!2x!8=z4zWf{w1o8NCVdd6%&s{ znc$`v2H;TNbL;`l!!E!fLOgCp$L~$@XnAiQ7?oO;$Q{B~*P6%C&6}_pf3^0gsmk|A z+`bK=uLq`fJ0eahl+SJbdp?uvb^Wr?=ts@s0S%JMJ(6{p$90H8#G{@79I0U@FJX-J zLhh4J_*QNq{1HXnxh{s5WI^T-72a+ zgL%DYJI2c2X4JP%hTbp9K7E_2GAv=4go<7va=TvUrrx3J^heZTu%Qp_4Oqle7Kgrs zo^E@4hA6`-P{}dEBI-*x<+Y2~(`$Y=R(NS+z~GW|FD~>qlnm_l+tHDZ*5qSgGx%a9 zQx<#suaeSa5VpaKpe>p%uOO@~AMP>LRZ_B*qvbX4`&%YfdooK@`;T~W41B>+b7yhS z!zz{=R!=9%%tM^3^}ah7{PP4LEi95>w@sSSH9v}((%pjuIpun+0f=JR`?O6HU}A;9 zLNlFe;aH2K5XLKXLwJ_zvFDq6InFTPhxPzd`$h#@xNLmOOAVwR$5UzNVVYI(hR4^$ z{9MGv86DO?I-)0=InmDAQ|)VuQ`qq@w;|1${577=0tUz|`3=~oT_qd3w5>!uKfn;# z*N9rQ@(glU0bKuA%L8pZ1=txBeq z%#tSgQ1WW}CeK{3FeEd5PhkN*@#y>PPdKV1 zlmxxoxz7F3j0&?Tq2fHl-fp?Oh!u|woLs8wN$*kZVk))h{Lb$tCu^l3Zf6-~9Ufp@ z6hzr?m^B##MBgxqT?}f!({GF{`@uzQK7HRb%Vb}l-+FTAEUl7;osjFKC>`xlldsEa zJEXcZl+J3G6GT;RZ`(BoMS=~M zrX@Y(23IDZsuB`^=-L|gqkiW^!HUy8$xxP849u`b;_`(PZ%8c$ zEdOvQq&(!V4Ar`f2aIoF&c?}%vBjY$xvm45*wK$YJEZc;P`2veJnK|w7C~#B0iH9N zBwYJ_*$*4bVNSS0Dy=I{Q~K*3T-8}vH%;HJzXyF}*}jqs>VX4;UI?X}Y z!`kou-wumi4sohpXlk)GmWX;eB%bXeO-Z6zb( zyEq;Yz7QMoxW9m#XO7Qc4p`YEZpdd7oTI|Y2gzB9tddpGE0!(ZbQJ!=nyY@JSGfB3 z)lNG5O>KPW=PsDI1@N`p&Z1~B0Nj6J;#@mgHgBO{eLAwi^`PIadjOw{wrL!tJdTc| z>0`JI_w}WTqR?O^8v%tntX$Mm)O@IGboNz4pCUd%T-a?k9C1wsq12~M@IMH$T)frz zb$ZCMFWOAi!i{vO&s4fiqxU|Wq==ur5*GHY+|^OvMaqEMB5~5i1+&^J@j6rP0qdms z#c_a^7P~&{SSthYrhjM7wb$Zk`4-jX76t7*^l*?U%(TDsrtotUJAfOJLl=E)u!c?) z%d^*oRZl>h69n7TX*7ucSI%CDRH7c3Oq|^aWvgHSH7XAC4flbJfh@@>f+paYHo=0b zC@UItl?kSww}1yN0qs|3pdCUx|QqlkK!>p$2C3Blt7hP2YO)sYaDjDZe(l^Vvl=J$Z1l; zU7RyLYI}gJjIn2xf{D8>8 zVSzuI;~__QK`lX_ZqDdGaUwyjB9Jd|w$v^z-Gk@VmrLBm!ew2&;Q&|r!v_*2y66d2 z3tfzQ{Mg+WtZ#m!GXsu%oL|_Po+X(DgMtshGuQ>a#hc!{;Wy6|P96Wr*+qpws2k zi1NX`19$_4$z+yERJx3;UoV0;th6E7?iHq5VG%mk|DR-wTuwkzWJ;~=R|3%HADQEm zaZ9T+Fsb`((rz$LeSbvG_2&m83`Qz~xAk*B<62Ts+FH3eU^LhmH zETU6%<;^;>k)@!Cc3S*f^_^fC-%)h21p*THi5 zW^X?4oH-#!Ff_R*y*7mnYZgk5$Kr_gSy%`JgO@!b80=KZ)N=2cb%`V6$gbf*TXdrE zenS$@L|DiwEIeWGV1UW_5{{vK`)pf8LwgIx^zF7`4a)@=)b=&K1^hC$Ga;rDpv9Li z7&dONv0rXze0fHYklnq}Ous=Ic9TokkE$vMWGzG9fzRA zLP0V2P4{@qrQ<){XH4i%t>Rm00*%xa*z#e3{V})-`^;-*5uco3wvOce%Rbb5OZTs3 zo9)7Omf1f9(&O{-5`=qV^`DFX0IZ=<{WqlN$kGc6_4S^Gw6(ZtEnf+5$n8Acg_0OrpMn%(Ndh>hHU?})YK9> ziss)I&9h9w`D~zClh>2Jz|QR<2DWl&I*2d`I48pWQp)PPoYv)|%A!Kzu-7{$?-_|I zep9JB@0|$jb*?RRN>yC&Io9A|caY1Wgc1n?##V8{k4B3gz8FOmJ5e@1QEu-W<&*E2 z;M^nq@E_kTqPl~5489iQHLZ^3p5yZHcKBxj3bFjLgHH#Q=0ZrsE_P9ZWb2WfeclT1 znzEnYPJeew6P-++fo)Z8F5=ce+~x+nvc7X)J?DH!y}1$lgcP41 zt}U?_(vg?toF~dv=Fg)K(JIq&B5#?~zh#48Nuiy92${_%P3?2bT2m+LzYQclTVyXz z$DxzTww&66dcFXFK9E{h)I|49VN>9>*qBc`bdy4Y%+sT<5^cAflPfWIbF}#4z^aF` zT~UezMb*J#Pb{;+uy7qo)$M`i0CiV-_~T!rHYuO23h^+pu{mDKpCf{NMVUg1i>4vs zR262>P)@DFatiR>k5)RnU-dK=Qi6HlH0b|sJAG#YgZ=ztq7HsfZlb2j{HKqzzM}EV zdH>SEdh1Qrxj{K==6QOn#IiT!quRzq+4?<&1c+dGM3C$L?e!P}72wyp@U9NmQEf0k zXM#t}qEV*N-((6rgBV!_OnB*CWxZ8P)N{7e`fy{~$o7(tj0||@Y_4#87iM5BYvO@4 zdS<1C0K7E^lW;Mf#S_n)-*1LLWBvx+hjQz5M?)z?iE19q3rGF?C$#{B>7)0p*Or8o zebAU!Gk{waH_LdEeet|VTJ9vo?uMRLCapYpj3chJ+mtaZ;BUrtNi?a8* z>f#^D_6yBZ2yx^DV7&h=W1|P{aT00maa-wa%2dF9ynL$i#`rnQZXO(1-%!xotB6-y zV<=&_BW>SgRCO?cPSx)^cU#>-&uZXY`uhc|=@s5DK|oYn8Emoak2^ZR$ib`2Vi3+W{u%%6_fqEJ5Dd|C%W zMrR~!^2mrsrolxTeK$-9KjzNM0iUkC+%!wB*!kn~YZ9di2BI?_6b}%2+Oy;mpyL7hfH5 zKKh8t?Nbg~9G8i0)nqC(Uc1dO%e6brUBUp3SL+-?1_jSl9L}^_vn;0$DECIe4?wx&0U5(rQkf1)% z)xBR1w|ypmqH6pd=*hj=_slyNLh@7-@;}N5#@7mY_hoq(4Yj@K`{yL{C-GKnumy#U z>ibd5HB?Xt_H~WMQkbZo#j>=jSw+YS$$J5K?=g9sT5BG1#0hZre$?;0s5jyd)*@T1 z#06%dDJ6*tBg{vGfJf<%lpj-^!lp0$AsBpF!F<`PaoWkig(sA3RuMkV8V5)o_~fFQ zbaINMe}&P@a$G;)Cy6$94JLj6{)=;tZmF(24K3ut*xGk&OOu18f1LylB*z9OeK1&@&I8x=z5Q`oNY`KfZf%#(JeA{G6s92EJ4pHV^@a-9ae*#gm+S2e8>Y0& zO=$WGYAoG_A>@yd7w}~V)_@os?J8E}NB|ws^fahk={TF~@s#LWInzo~D>XWMS^2XG z(%o~siu>r4Tyq%pG-=}A%?qNJu!8mXegnwLmu;fXJR5F6W}JCS>0*cpJ#y_LC!^>c zpTUa&WO&A$1O8M7xfsf-C`yI0zOh^(u>03K-X49|K0|Htkmv(^$uGNwSB7s2$bQ2Y?1NH}^D5`<-tbA3E8ENm!iP|%-=PFih^gdHth z_p{X~$lby4!sj#=%`odoPjYUr8YHNl2+V_I;#!x!=0V`S2J+iMPOHy)oB)A0Iof5XQ_e%(T&B&*A!O&Jj_QMgA##!{-$IUn=*wu8fqD7;+t^ zhPG`9q~v9VuWxsvSl;YjbQPq|bg5eY>_8zep7QYl5f1I)1c`bXxMV_^mTQM)6%v@z z=z3`}#(9p7ABO$iq9{H0f+Q-qd4W?f>-@si#X#WEZ`cwfc01ZF!py5iS(N^Z)c4?H(W7OF^Y&M~p^c{ew1$Q$$Gf$vrm#q9QEAGOMw(|qXx zGb>NNxND4?7mo1ptDN67omcv`y_uVDvZ2zLsnyu)#43FLiFVgoBvzl^$dhIDr1c>V zem`2z+p3aV%ktfsQsn5Wef312`O?1uWlfwDTr|#toRQRJ_9?@IF;V&oj3DwRnP2n^ zg*c~ZltgR;t{4E3^~dv23a*Me*4CUKzl{z5!DDdLb**v0;r*X%nyyKQS1L$-HVhqP z1d?!mPKS6GR8xabpfN3Gnv0Si(6x__*gX%x$oO_g;zmDz$3rImE(I3xYWq#5kQis! zr;bv%#P#g6$##fxGH=Xd?)i?q<>)q_%y@GGZTm*qHuhrs;>VcG^A_*b<+M~P?$lBb z?0@RBFl$(Ho$kAOoudiRnL|geZD@-&{NjY4KW%-qTIT(~vr!t@LjzPf;{;Kp=U8Ld zH*Jn4r&;y;XM&uj7iIcG&E1yjxoWQ;#hfQKWeSTe5&!+Txl@=mv9tBNPh!d(CG-q- zqdH`1W3&o#JhP@+NcE1`q_#1bzBn8+r=>l&iu>^E`TfAh85dCcPA$U3C-po|>L0#5 zKz)ZVQ>j)Z$pA7meS+Gw=no^O;#~ZNCDxxr*BfVHE$iNp)Wr%E+cQb>poYO69C=)?`yGOr; zK4+WsjHTJw9>NRbTqt~STAF(V=wj&No-EVf`8P6B&Epp3V9CdS@L`0GX9?(+KC+wV zZjA2<3ZFF8^u^}KK^GT`wpko>tjZA#&Oh&$#o?f~mw)jdmy)zEpCp}o_IMS2ARD+` z-nLabV`9)y;#>BuC&9^7q}Q)Za#zA*R*H1D^;9!lVJ_|=xRh0)7a33H%M4kpZdmXO zxBWO5*zY1PHQj8TNHh1+bT~_+v?b^7cMeJ9i_*`a&2{X?!X-$k*S9(=b#fg}8X) zZHMlPb+3$xOr;)tFsUnikqghYs+`}(GUW;Gpv~0v1VvaLvR1wU9$C zoN_~}#Zz7qSGsqNz*&cc0glWkDwFYVv0^|Nt6(5{bgh2y@fE>!R6Aj?BjY!Yt1Go5 zBlXzzPT%?%;X)R&i=dwQaD>3(aMz`_kuQctv8h~#ovj&t_$2pWfrFs5F zJ|AFs`+9#pHcBQbl=_u$_BAmtL2ZUb#PT?P%0!Ot`14#XEICF_{t6{f9t)9T?5OGZ z6+J*|c_hl!KFc^<*uJ!pMS2zSM~OPg6B+kLl+wd*t5rXa{Q!Q;DP_L;)|5^U-f2CD zKbhvBj?FRr6Dzwoz7(=iQPA`DYN6ub${F#OOns!EM8HoQqZa+5vsHX1U}lGmJUI?7 z-p~nl2IHBzhWsMRL9u_M49n@35hb%%wNYrMQl)4nWL{108JAnof2R@H_yLWNP94fz zb&*Yv!PA>IK7t|Jh|9kcm;!cf3D$3nUJ#@Y%zxPf`>ixT`f5LlG)E8^DAEDyU2TZc zw^3iNx#I=mF+D_i)s$<`4#RpN@p$;eYHdlS^^2B|4$wg5og_s4=po{>4bKPYyO5Mo zq-lsno$FMO9d&MsU_r{9-e}jSGt*lL&{{HoTy9_qr8MaJXziPu0WhN}rDTdQvjHs? zm@9;~Tx$Dyc(B~RaQ;^5-f_t+prf?_B*vvGtniyixk)H}36B^)-8%dK(~2pW){sEZ zb52pG5^&6uy+{!&NuO{K+2^6@%BX31p%Ca17rq5$hTARvyL=1buW8t_bq3uYk`m6k zO>?Io?uldtuskPNTOJyiB4ve-_c#H@2LO%x9se%WJPF_nrb?W(`gN19KDLGw74M=G z$3HMpm98MD9kB)Oftuu6|F&uodqZ|4C&U=8Otrc^nqZO|Qjb_}ZOT>8JiXX%Wc=@g zLyvD!jGSs*Q6Da!vApzhv$8kX$@33C7&R=)hH?z%s_PSEMI&5i>_55)d4v81_f5Fu zL(9a9Y^U14{BiV~I3-%iFxZjM0FxP;`;|hhFu=`{3jTBZ5xCqAS5 z&Ib@-P`gc{3ZsOiD;K9s!W(LRBgQA-$92w2JaNP|x$Z0To+mFf?LdA#&3k$F#Xy18 zqX_>?9tv67ohGhufhH-b^1pbE76~LtsR+wB$vi&(Y6Iw{y)~yTJUvYfv&37=d`n!= z1B(S=0f#!Xj-QcdRge^n%8j|3Nv zx*SdLnsC>H1g@~oVoU28!_apq>(Ol!c;Rou-AShK1)iP+v$k(mLn0q*UfdUADT=Er zx)ZBBE*MKOfatGg1amQeT#q;l;+A0E=O_{hp7auEOE+rx?1M%z$@w{g$afrmJh+-vp@UN ziL8+xjyvCKjStz8qZ@Ne=1P_Xq(4Nqdg3#)#9D)GN6!$elNDRUx>sVj8ZubFO~rn& znY)pBn#!lDC$q}{o1eH=zCm^HF`= z{4IXra@>WEtGPF{uJ$o(4J+xpTN7m*SZl$ZlE3T#v0MudI+=G+4Y+)oNxGp7lAKCp zzo6aHyv$V*3bhXpG?>p!F)++er#X{3xmqxr)O)aq#_g9=mn49wnKuVZ_4^E8xmpG1 zcOGfEc$Bj-RONGIDnsl0i?CU*8hHcIJhYo*XbGIkVrxib?978+^vzG1YXE$ml=Qy* z7lnJwJJ~)-tB}$xc#!blkeimzpp`Hjebg1Ly|}qt;m~JjB>C8ZVEnRPW^4&|2+_oK z-%tPyrKa}B)vV#<6M#rJwj;sY7$<2rkdc*()C3}R#kdG#g>VQICx@Ot3@pVGn_dm1 zR2$$SAQ%u_OC7SKf(OJSavy+4nOPtk=Vvuv&-Pql74&70e=nyunwY?Gw|?}~URYp{ z7ESks7ai_0uL~zLiV>R)mvxG{l97$bWJ1Ps7D7=vzXY@WNi?OI?8KC=>ZeL3TH^52O&yMCxx}lqWmw{5sNQKUH9-{7I9f7x7}@20Fhp7hv!gn`&6v>$YSVEQ zZc(lzSyxqwB9-#^-HfZt$!>Oi&P?*}=)`w>Nywgg=+XZ}2 zS7TEb&*)H^u8?2lO7}djU!AX5PF1CZ>6M)WU7s)L0-O}s{&*obSBTwBx&CF{+YaoM zpK+IND5(6~nDVuFI<}X3!za_D4t{s1!(Xrhp1zTI z@(vxvnM3&d<(*pmPEs?#^pnHDp`*PrRxq|D6b9^j3@r^$L0h{Lz}XIMo~Rx^+#wn` z9QLvFXzNy{~OJicwebR`)HT_XI~Fmd5qr)46y2A}1a>-g2( zKpvXOoMakQ8Q=y&|Cana1&1Yr8 z!N&+62ksYivmbWgUlA|2umq1c{jg-U)dl9dF>WxnePhR2b-`<`r`OO)DJ@_2-<8TX)E83{OdAKjh6!8~yGP4K zG!g&-%D)rR(p372x#s|S?;J*%mh9-pJMZpYMrX1OVJN5I^Yv?+vy!UsoiO%>im!<6 zVkS2Z(uO4)($8QU)Rq8kelNT5vCm4qBiq-ZRnwc4vWEJb(mTU_cU(lUi(FH(d42r? zU7e-5AY)nKx~otK2RLSzwc>-p2kE_za6Ya}j-EPucnOuy_N#xg!GBf=QWw1`EC_b5 z99^HS*%}X{IG>*a-q2w+l8cw_M+@+~a0N^u$3-%s&q<07$Wq#--s20{fse1<7On2Y z&soS^C40|_;%>Z6d_M5GrfmqPy<;pNGqbn_x0S0JMX^uEAU>a-ae>SHp7Bkp3y_U5 zrrd33r@Fj%cj-fI3NL42JzA{$UG4uHKz1fckFh3j+UV};SiTOjX3RfC>X^r0hgN1YUD-~j)o(7&hCYFiH6R>jx1%NUgs)GK-OTpp%a@y+KjWp*(-+d!X2gnchi>S z6SLP6e{tWrWq~+Rf=G_q!F_G(Tcg3vi$hX?V zH_J`ffVLc7(ZC(zvq%&^_nH<5sDKyJ*wDcQ|MV;lRWQ{UuWhX3OGkAcoy55|^V;J= zAGE3Kz@!i}oQ0reVMJ>0%hXYGoD0!kWBU#JI)nC(rj1m__WIERD}3NNMAmN*jwt;8 zRNg6$o+_?i*_gd@*-!QOTAiL0xM$WOQm$Ckj_~u*Pv)GTx1Q-`M{{V=;j=5cOTy{o zXcfgCnv0m?Do^T$&T;pi$mxZ}I-o zxB6nhyCNG+P=d3(q>63PoQX zXlru9JMzK|2zre*3$>qB_9|xN#UQfp0vD4W)mzKLHp^mrI)~ zH)H=W>*!i(Gtys67P~-qa|b=;1NM!m5>ko=*p(}TvE%C6KtIgxFpv=R`Yz#=8Z!f@ zOFT`-Dhf!w0;Vi>1}aFIb)|;=<0av*-Jb=#=$nQ2y!Vz%xL>)%kUXiE=pcs$&^$IO znr0%H=vkg6_!D%l!ZggAQEDa#bvdj(J|Q}mORdr!h9emuMQR0-Ho;tY{ zGNae7I9c8PJHVLcJk<{nrwPb)A5OFmzj}=^_*zdK<8LPA`FyEoTOD{d|D$#U|6Lbwh`Uu@odKq84aNR_1LzbDhYxeF8KlY~@MFL7t z-3vK0uCcJS*b?^Zk9>HG(l1)7jeegSgl{O zR#gWtr^H~tKw;b2^zD2(F>#l@oWhXz+_v50Ui&Uqpr0I#Ue$MERNYs|DcJoR;{l0p z$fNW?AZPD7UJapkb0G3wL`4&)sHGVW=sw}+c}DM6i$Gmhd-9yS(D*rzD52ySZuR=L zsdJDoM;^YOX*Mo$WZ9#m`)Z1m?h(Gi0)HdJPa07zlYnP+!vgC4a*BR`*XL-;rjESd zwc|er7E2n}tx@W&zdZ#v#VX7>zJa<0wiLgW6}@&HRXe7gYP+hL-Bsh^#*RqNC-pGd z(Q{sa=A?vTyXRPApiVMn;quv6l+NSL;IfC`f6F3&SYj9!Rc24 zz^K~9g0+>~?cuQ_aVxvc5SGZ`L#KCFci)Xh*?~G<0UT4w3tV}wIv3a|;W^blah^hR zwK0&f;~ji_NKwP~Iao-IYtJA04bH1@4sUAp!Ad!7eS9+~26rl4sficL%!FG{gsElicGzXbA(HYIN=4U>LNtR$3 zrZKM>7!Or~5D@UVL-KuWghdmPaP54*i?q=)Sd%VBVZhUp`tK7w2a$2X@f{=op6PfT zX?~7yGSE_rB;5D5LF3vzgsv=>^w<<4l(d(Zbx1rG%x9f~@wCz$?aZQ$F<5AD!agW9 zU=lC#Znvdn=aYXS{F4msw5!1ySS)q#ay@w9^OAT*!Fx|IqP%i`FRiLFR6p{N+><`% z!$#Kj$8!GkB$RNyx&p7=x^+#|r+o$goYwz~8}|u*$bkGEl3JF=y6s5?3Z^mTo#M}# z;==ak%Ir~rdw*hOcxs1@zQ2NwgE3%(v^y)ZV38T0heVe;Ludunpd#?$bM2PbB?M@w z44S@z>E8U4R;UH7?dSKoLSHb|#+rk|ulCeV9N^2JZgw2vOfPP~Ime;B%SGRdTD-%* z8&TiStq_dxj9h9WIX}0*J#=3)fMmi~ZwHU>;AfAVWaK_2XCf~$Rr#9kw^EN#@@rm!{UcY|O-3lM^}$O~ ztwXcr=&&0*cBJ279?S4wJ!%B4J%RAdNoi}~i5w;O>>bHD(_NHB% z0r&g0#2>x00)o`V^5CJ+roUjPSJF#dm3gI-jgEKb9oX@J<=?3qAv{!mX8hO8Ak~rL z<{+3UWrsEw)Z#rmUOKRtVDDwbJ{R!b>-tLL|=>79s zJ%it?7DTGGA(_HA&eY;RW>81xdEt}8MDQ z6!AC~gio^wtNL0pzU&q8_-DtXGpE2A=?bP%kE2d4%F!G0nOpxfhd3IG+7k&azP`499^3=IC;vEjp+zujXPsND2}i?WnV%1L+Oye~aaM&bIQy z(0XtzCm~oaOF*n2$C!ff;k%L&~Ay;ZN7U5~-eSna{1%7n}?Qh{f&3`B&| zv|O<5rk$W}?DkZg+H&pMp(OqKTp>r$#@4cqu~G?X9q!2h=16?eO0Wiq`H!t_XAp?+ zzkXjt*&X(Pd`!s}TJvJCIVLU{OgtD-2~=$O6IK2B@!@Od2ZSzri&tXI{*fEd5la>* zFvDr}!DDk)xmluBCC>M%3e&o#dRV?RLcU6htT|5DOBc}VU)GxOQElgB^bHg{$Cvi> zE1^I4sR2QOtHi#u)fTWHP5{xJa=eK?5pDxn0`_2)K0pm*tr=RB$S9sDdX!@YIr>%SEK_&XKGlr%Qf7M~b)WpQ0 ziz{j4=qBLO7Ad#yVq$8efztPb$r=3z9>724&nS$#BI=e^g+^(lL!AirS`0RBVe<;g z?fTLWK58V-A*EmtaU9@^cFi(ak@z|;6y#S4fb07p>dFaPjCQ_D^3;_ev;)hiYDiR`~YGsHzK~$;&VW1$=?+YS(b0mc1LMbQ^iNR|CQnI_2bE{3mbsey#Eg zy8nNy;hkW66^U1Jy@h;N`y(cFqRGIX?L4PmZo5lZ1IX2{dPjQ%O0@B2Im@~=eKwiu zw;A5Z91#ToF{`Vq%$7u%`2)e{`$EY^*KT3({q4*G>;8QnBJT_H2Lzf_6`6M0dwsO! z;0J@5!HLx9dx%^R)`T+iJ9(qdK>*xk+2LLc)Sd^P*6 z-E3g-UNJWKcI>q3L{VZ^rzH{*_sz2*T1K$b`(##u8m#?fAV{VV{0c&K^2FJ&x`(#< z0v4q}jgZIXOWbDQ6!-IoO-69gK?$}<1$p7z0WRy#SHDe8v?Flj!6a9Y)uFZFes#m~ zrM?2Ec)+YryG@S3f#FL%Hy*t!=#N%`V5&y8OjG3*B{P2O2`zqpbZFbk^~*Ne zusp2Jt5#6*$Bngs0C_#s#y){b<3O)V&6838aa})DK)o?3+q;mF8&4#OXi!Mo1cmy6 zEdBE_b^k=99+Yd!T0-CUPu$MG@F5tfk#%WYj^z;~`Gmf3U6G|nF1eHSG)#xnx}J?Na> ztMAM*b%idgX76(@?(bbc_Ve7jDBh-;CJIoWZ%Dv>CpDA}G!XapM1+;ckz-~c)@5B7qmB=+0%qL(HI1`c?+RVuMF!^5>#nVqjUZ!fK}?@&^UMb2n0VLQ!F z5yhUWh*OEJkYx~8DZwQ%uh-uz$RxFPfWG;AT&y(S!E$TFmmf=f<`jJSj`a9JuCmsy zZA-kE*wZHMSg(+k?TygK-1qM_jUbR~*BzzRz4slY4KZk=j{(erF1A|Txy&p|_=S{) zE|u>B;>fK>>hDV|Iy58^a?S+D_KxO(!vS0yNny}#fKPShr{EK}R7Kj9zWFqjFA{F$ zO2Gj_31L5qdxLy-WQRxw8OMCnL^K?rB=NDFA&P^QD=sExujv~)11pm`I@3LVkgEx_*K5mKDu600(hBng(1U!1|Z_8dU?{GH16kB)GSn94|1v5`SJUU-+G_6hFKxwyV0z z(@C$_zY;yA6MRFNV<1AZesrq=5SBwqT@@H5YgvbRSI>_KcHf#h zKNV9qG`cTV$SZ^se>8 zLcRF*W!XI6)LpLC{I**#j#{C$Ael&JoW0w=n!EWeoKs%P>7g4|-4z_-ewUi}gldEd ztxrr2oiylLpU{J?}&{!$4H zL{$l^^VMcR>JrWs;s>wqPOtV_~ZJMuS1 zEvRRw;brO6?z4}mNf)=i81kc^6(G)YrMtaS=YQ{oBMjD@XcbVU2Ww^06@zK-tZSc~ zx*AYw{x-cod(~y|>)2JFrhBAneQ>e-2{rNicP5^txj5^hKP;4s+<86S@nWk>s6r-} zygdWAVygE_K)d(UR`_xo+BlO>d&Oe~j*0iu4&)Zzx~>=$?e8z?4|wA`{37PnSzi0Q zzJ0AaFJCcX?58_shBs{fWk?g1MHlEO|oY$sU*6QKx&^@POS} zbbzXz;+<=C$YXF5jwc-qw52B_1CCAnKj@mCEr7YaC)*jEL7^jL(CHXTgKU)U9KZ6h zII5m(JCCbB9AZ;0>`aq=NLT#n%m#NWLj@+g>mvjI$LvfzqtHb|ER!6MyiDM9ZLMs) z)Ab)o9@|7~UX{!>MOx67%#=BI!mlr;G*Oi1xxP^&G>*ob_Zx3?>@SBzqCQ*+>@0vK zHom@S6tY!2Cs@2q*ycRF%DF3^%3EFCkrw@R=o#a@Qz*>$3UIQk+4uJLavY*bt7oBE z;Av8t6>CS0Qt7z@2hVrk`R$_MPnY@JS(Tv~nRYTY%3IZ zgKMBEC$0aE4_i+f&x6+E!0^rHHGD2wcHRsB*VTBJzn03cG}G+aAEA^9f-22Ar+ff$ z3<2tf0q)J2#`D{W^|VO^UZU*LF^?6p(h%~$&ntnz!Z=di;gi0x2Bpm8Om>pN*~vzD zb<~s(cBImbts&4qY8eZTags~T?0V^*&4>ewxyR?6SaX5)+LESp1RpXJ$Wwo1OO`0X zD`{NKc?&k3?Ety<^&V9CUX-T!C2{lLl*mxlspJ3d5P(m_dzZ@auA4NfThH~XFdaox zzydEfQOHJaKk&}%``1rbwpTMxuGf%7Tqg9~e+#UrTlD2<&JJy0WZxA8lrx zEMEo2cY$F@V(Hv%lWO--65Xm!4OpU3JHr#}eFbE0Wdj{Q=$k0KrTuqzdYYgwCU!>r z>)R1sqiD!kTUlgs=5{>&@Q-HS-Pxww{UOIvJ6-wt@g#}GHakmw(KBe1i>_NQnticG ze=oS#1b|${eia^QtzsuCou|~MD#*0iPrrQdZS2-pLgQ&av#YS+PX|eVUg{WLJ7(}> zIx4H9WBPJ-uZXPQ~$dNnuwv;d(Q@M{A4E$h}OG*&lyq2&o$?JVb0^cY`NY{|0QzB8e zjhNQ;rhUntrPl8LL4?ns0|mb$#G_YbrEYk2+UgZ63rxDiytE&QYJK-16tdZb)@tNe z+%Og^CqVdW6{&!P#xK2#@l46A#(lF_CBA>WaF&W*@hiJJ!&#I8KSei{S!8i~;4T1fXNi*vnp0D}e|9-dcFLDK48S$k$Wiw3l@_^Tuts*;R(6+LH{ zf3g_Egzm*PNxSNsRDFN>RpE;bxu3op$sr0?cBa-3UZN!Xjl>-ERxSjl-=C&8>cC@3 zU0M20(Cxc{Xt_LKvl6n~8TsVOW%#N}1)(@5vtM0P$5)2(GG{Ng_@JNd3)Wg@&>}uI z9VP2cN1UtQwx zD}ntlSx3fIyCW!dXDOb_p=Q41q(3qPSP@%cUNTBLHh1ONrxL`kLb6{MYwqz%MdM#{ zJrrmtyfr%(HRt8EBhPTMBGGcQC11lKa2CXVGxbD+_kYPLprXLhRQFS*&@Ts14AX-x zj~@$%K$W~U>oLXaLcH#W2%`CVVS*a_|2}gFUQHb(lWEYPwK4gJlW-o@*POzjPLMj{A!Nzr1A}6+>B=lSW~A zQaxKdjgc`cd$WfB7WY8`NKBF@G_H@ewUKoC$-%MCA9>9ypn-V3f&PK^{h@-guJF>{ z+g=?iyoZF<8eWMIK#MzFRP*+6Rz;SJ@x{Y$D8?=6)0EfKl-e+#GhNL?pDoMUfeGK6 z`zpyt_AM13z6)VP=9`(9OMgN|5U+O=5+J5>+_cQ3~0aJn$mC~M7?|)ZY$w~?D z=BqD;5*7RDtsA`(VxzNBhP^gzq(171?Z$l*_^ch zG*s0(DJkzp^oH7R+S%q^lGFCW?1&WHPP1$0Bvrb}`FU3k44-@AN zm;m^7_PML&0$zzxmYTrXGy~Am*0cbELkVSv2%kUyvdvS?)in~jKi`GJnk7<9VD>Qk zm?Wd8d$4=?6m^Qyae(8H#k47r5XqaY*7mYFb0X;W1>zuhtqJ?iIp>$_R!Ug=vwl~3BdeqraEm3gBNtp)cqb~qkNR+j90naz8#KbBmb(SS6^dqxsQ(I997 zuBsFQ&3KA(jS&t(#nwGu)Vepax|Z#_1Wc zRRV}m=G-NzO&SWg-ntEhPrOI5HlcPBa+(D#=N;WnP?UVl4 z6dsc#daBGysQMU$;nSJ5g^dJ@Ov1mtKc(IpfCru4nmTi2;*dW$zg;XGF_ly2S|kmB zdUikWkLu&pg}Kef9#(b>fZa4axjC9HpHGbWwhbSq&b>Ffi4C$*?^UcA_+s^oohBoN z)*x>k0KbLSkLS_wQJ=pG1W_8cY}Z&G-yNY%nE7ubmSXg^jwHFB$}gwC|7VNurRz~0(W8KiTS?~KFv}X!^K?F#Lpo137~}_^Ia^nU;Qx{ z%-y}O4d2hRnGQNCNr(7XDZtHhACbLX#|bC!0!Jl(!8LN_F0gn)JdK}$0ec+bJsvwMX|ef}nP^Oz?(*^Qpv2O2qco{zyZ*~7Z5qqqM|@6l#d4_E3B`>Z zOF8sI9VxHRI3mCeHKgP=V*NTgIMpKu;gGLCld0K%ZXTnT0Wy~f^!u@xJJa3kq%yFa z1FJjjfGPv+#QocoGEfUBodDFs7Gl;$@Bs+{ zW=s~0a27*AYlCEx3EDX&_L0u8`j&Ga(W<7ECBs&yB_g~f5L2yb?ZO#qO*( zr7PBESrj7~eG4D`hX;`rV}%nLX|sn9Wt~?slNR16D^qV;iMS#^Ua!{R!8U%g=bK6N zMC(a15ORQ3^ckv%TuUPxZ@qQwixhRfsO$i=Xn6tf9x0ad!0^;xK)48byg{WV7_ZHV z5W4Z(mp7xti*aqiHT9*T`G5VE(QEXyBtW!$M^V86uFoB3yu>7G`@~%c4ws!miYyMmdzz$Aq?C7VPiE z#sf`3%)pzZ4wu?2rIPkK?Xk(46yrx8%Q91=1{{c`;(gMMIr#fFiC`1;W*6V|bzy2k zq__361Zn<5F6SzZV6T6w^3+JO)h_VgR0@(TUPKLv%$N`cF z^Q?szl>16JsLg7{h)WIeQ|LX^^s=%+;m(Ec+M&TT50Z4fMA^Y9)Zz);zSfIk1+?y| zx9ZrpcFkT*jnrsWcQDmbNFSo(#WjL^HJ^ZJUS&M)CY)Z3()Y)l@(VKQSMJqOr&_WhfaAPBKa?vdk8;O$9?nY4zzlDCq0DRCn5*yi+Cbvh~3i5)zr zzJgbCn%gqhhaZfT{p7A#kkO>OlxuirI|+g5Y-pi)T-jyR*8nL3A*&p+EZMXT_iTna z7ICP`cH3N#`5zgivVKxRV?U(2`{UR)yr%liF`Qi8(QYIl)$R3;5a1q}6anmUX)k)T zNp7rDxIIy+`NsM3bkLbT1VAqFut7P{Q#~#-koyeka4pHKpqexcXN*JSu(0M#dk&YH zzf42L@DZ=VWXwg_U2IUqcsArKTMNLJrz)S_7Qt<~!LJjga_Zb8RW5f3<8ya42QL=y zubgl9F`jC=o2o_0~ zCM~TTa4jDqIT-5GlWQEOQA>?!!kYuB#lZ4u58nfS0FOn8@I4=rx0LdC)$t#2l`N!H zls(^D%*MzOtNR1q0^fe6x|MX{U))S(p+g@?=*M|{%MCK21>ESD5OzwO&*jQFD?ePL z-O)4Z>Fr6vtEh`+WncU*IzG61Fs#OpmQCk1HRp~MpT@=|jI0M*3RKLYj=$IpnNv9yvv4Mq=@G`5tXz6R z-@1}8r?Z4=To4yJ1}fwoD6-W)RR@H*KLCR2=Umy^*MIb-vvqE$4T7_2A4La2_0o3Y zB71Vh-q%QGIx9))-u2`Ik|ybrP^>>!5j{aQo+wU3Y-PR}tH7N9Ma+?lGgBvcmFN0j z)y8u#g88~FE0bNNMz-LOY4mZ+Nj8T=$#Xq#^9-^O2}!%S1c)9qzfQBlRv(oPntWg` z1-tN3(*Vaw?_<_{uyp5RpEh&uKdMv?R&~>6y*Z5Otf+9zWhqe z0sqi5k5aPU`yi9w6@dL~epFU{Td!@Gy>Y;v2$xt}jtQ5)`O4j=VYxpzrs#QgvWfeo zc+Npj{3t-u?fPX*YC7{cXnx83N3t_h;IUBJydg@4wrh4K-EoZi4g68u#gD^2j6-kQO2UAklZ~M1M^91M;#! z-KPWznOcd0rY7bFSl_V|_UsIMvTE;srb%^D#@NS}Z5TwDe*^aUNZR}T6rtygRB_5_ zxMZYmKlnJAytHnJDcg`gA=Q6Ts`0!z^J#&i@7((ElZ~29%qST&n)>`g7qg2_pGa-x zG)o++rD%kjX)z|0E0T-Ix|g@D3)!D8y*Ce7#}WnNqH66JPxb1UjV@|!n#>E4;t@Ch zh;p=6871cE6ObdaPGe9;#Fk^wvu*bxz9Ck-tV#bfgcoFZjur#mbuF6CqAOBMqZJ*} z2~KmJc?jwqRYHah{+!lWaKCy&TLr3{-Q@HUFy`BLw`tls;m&+IfMUC;iNZ8jj4^7; zNC`awqwu*aX>A>kX?x{-oDEI=HxCzonNyR_tz68QV`W6 zJIq185t5jjg>r+h=5?Uo(hp;pWkvnAo+_>gczG+uMZpTFGb}i_{-;LGn301SqasB9 zqFr(DH1K22g$=JRPcqf4;0WCPJwM#7lYDA7X@>2n?;TdP%OuJlrCPP7T-b^*$JS2x zVJ*fVCe#CMCqUNPSmHzHi2fQik(Vq=Io!xs|=nu-!N(-$^6CD_JFzNn_15x@|rZw}X~A zpXC`nBa$6V)k!nB;Y=)G?~_xluI+#( zV6&@HYdVY=kHu7$wW`ZB%4z%~*&!R&M?UGuc{5y0y5H5XoQo9?0u_$4F~d+~WJVW= zXcf#OpwVHHLbXKX3wy1t zmziQn5WaKl_scE8rkUTf>p%*AL*oA08>aUSLtKGpm=phynlgRk0Ben`b&+&1VJg+T zCT ziXHPWo4d&5&q&&AQYhN|?KPh}|Fd)9ULvdw*fS3SN}dde@OOsUe2>6P?!8lu;5RlI zvy}u>f3_J$XKCJooIQkKWei<@cAIehI)nn5PmQ}s;yiZ2wHy7o>oLuo90q1WcCuuUOheK zJK`Quyu`%lGj07yD8WmEvV?R)%R&%hM&%1t`CEzoqJhSNR(c_~)V3pw@A8q7#adjt z@wehNkEcHdG|aT0+yZGb?8lq;vHsUj8562x0@GCf=Ik#aYvi`7U78GsxorTto*g|N zd8(B*PASabF%T{iYN&|Q!fRCst2sVgoxv2bb^Ph{;l0C5b!w6&ZIXI6ikK&m@O530 zc9M=TA7ScnXM}ibu*$2NejOYfnIOsk6Ppt8N$Xdu&cs%vW;-{T8)3hfgvgT}E_WshH&rn%1bc|L8?QJ2sT+WH zMf`{4u#WzRy;Q4(c>G?^a{bRSOZgAd{v88iUMd$vBw81U_phDDFpX4L((*?lHU;>{ zB`}nnb}#1748h}y`b<`A-fvTH7-I|~D%}x_SV)=qa3$P-f5`vpYaR4OyLc=UchbRa z;)-mZHe^z#Cj95_9oeG#Bccr^ntuf*a?gbv4(XG#*Vh3`v`_C}N1rEiYVkpf*aC|C z^vE0b$JXU{9Vqm!aw%y-=Gl#ye(+?#2mI* ze&_n_D|a(`EsTZ~#Vov>GMm6y_t~sa*nAFyU&P{jY_l@AFSgeTKa|grb5ZC)(?&@cSed(aSI)VV4pr5i}EKYHj*$jeNFSrSTl!e|eP5glxOv$R|UU zRX3bgCA81@Mn;T1lnw_=TZ22kr#3f5iCsP4$?CyS487Sx_=D)gJ==Q_vlw&AyH__~ zsnlJf;CGcKNR#P4>9=m$rmsc$pepJ@lRkNP>m-L?60%IZa+dnjT;B|L^LCN(Qi6#a zPcq_UOwR6|Vn!$L*6zy>lEw;T8rH&A_U!h6vEnBC8)8HQZD zS8u26qw+4*ltB1+6faHk8e85!;C<--Q)1Y_JAzBxrDUm|R{^f{MrMi6JhDs&Z(l9f z`W4t58+CeY5wpYVi%bme2d95Pk?3ixn6T*`-Ng3z4%~L4`8P2Ee*I{%ShsicfVQR= z9n3bp+LnMnww|DD&Xb0viv}4+HMMUjqoaaZ+H(;@RZd3_mWSR)lwVfcPCE5gH!Vqd zHnTI;HKQ|a3y?oT5AHDuLbCw)w)`vt$Lv(hjXueCm}ehbXG@6^(Ri3gsgO~V$yTyK z<=UdE-=xt>dw@SV-S#BtIKzuFnJPsLevDcx6OZu9xyC*lLPBrz z`mnp-Dx+#Ik_-3KR_J;hF~>k@#J{KQa~2>fH)~<|=PNG;MI~Uh_GquYIB)w;%nEPR zRz)ZE*w`QG!*E#S1FXFIS(MzQ|FT)rFdTVnEB`?IXlFJkcjrh7q=V_wt;(f;K@>>+ z-nzhqSz?df&^4rcLB~ET{D3n?Risktby!6?or^Y1ovg7cZ>vJR((2OCrag>YZprNS zN8z2%j=2e2_YaG+Q?Z~=N_?E4pyRG-D!IXN_#n+8PTEI)-8RhnYPJi63Eciblws6} z$w*G*xnf!^8|~F$(US!p$tRRyHWBS3P7Oi>?BL|J7vfqg~DswTiK&N&W`XaOLUsd4W*{-Q5t56bG?j_34i zk!4s3U&}OIdscu_T;cavACyMYV}#Urz%e!3g3&Si(LWL|>y&V?543b`OhphkYoy!H zOYFSzvdKxZI2V1kd#JlEUk2x0_-Asy+;)CQ!zE*<{)t)xJMPp49YOh=rPn4ewn%Ns zmy=lLX%Wj4H8NCRT*y9xNyNMUxn>(b9eg%1iu?(+gkvCEJAGUhM?{t-n(~%Ae9RJ0 zB4aQp=~s8}ZnJ{V{^ibBo0up6xMq#N@jUIy0h&DvNm`#CiF5QhmzYSgHcSdICnddC zb5(tB7S8WWSiwacIwa`KwcmbHhen4pQQvDg9Edhh@W#W&R{&+s@^&bNBNDL5c`nmh zi_M523PE=SK28gj`uCqp^nh|NHR1%$CpGm)UiYPRO12^`MTrOfI>I@<7-bxBzxBT% z^fb?nNQsZ4GA>UMtRrV%`S&a{UH+iix|Swn(dbz=|HnZn@U^y$q@;)(p1q+cF2HZP znV{0}@qlaA;?wbBT6d_Ze(xAo&07;D(8=4(hbYL?&;yu)*h2!`f{#``(q3QCBtqsl z7ry_YFU7abv4d_YrhER=mCF6ANj4I*n=4G&w3kVrKr3OR4fQq;@2mZt==5D(-;KQW z;6VIf;z5+wwF%+}(K~W~L7lI_{bvwQbIt={m%|DDn$F-@X`*c2AmVGhx7reWxa|)* z;MPs(BG)+f@cml^_Py&Dj?4z&P%M9HTYV#;!{aX-h&*?KyfG$RsgTvt)bjP$VJ9<1 z!eQL(aJYS0c_r2?oXuk$&B^#L{=*!#<}1 zS>KNSDD;?G?)CgA+PX$cr5&7I88osTu`Im7#9L7~0tv&8!-M~Q9hEqp2uO=|!uL1E zw@E5s%!yO#c;V*~Oie`->^^6Uzst;QuL(NJ63Dj4JnZYmoK+K)b`Usim^z+K?+{md zcS=|&EV%8&HlzFc)9=up?e>(Io;YzSs1P0YzNS55lM7Zo5cPV4ut+|SzJM%^;S~pZjW7w$j;K~FJ2aQ$Whdcjk{(Td#8VwnWU&^=-H~)i8x!w0~ z8}V`%kZlqXV{v)*fLa3FOip2e9aWVYqD5~N+!xyBhoZ7n^BvMugE5bS30Q?LSY9Gc zDq$zLT)&UVXE=Yi4D(5PfuEtjp!Hx21cgh^xZR&*3hOzTYf9;m;CFzMbkv*a04B?Z z3G&wj#rL9uI02Uh=O=@ZY1xg9+a5R=$7;Ot#Akne1V))?t3h9Wx%*0J6(>VlZyZq* zv_4bgAEG}WY|Je{9wA-$GK{?CZKH7MvYg$&SumI9YNAn)AMD`18=nT3GC&Cg2hhK} zjxa3xjk&y7NqSIyZf`%t^)&dR)g>+i+n7MbrOPA@*1EQlHUU7Tk-tz&2@61`F^w{b z<(k%}Z@jXFplU5uI|HEgd(M8uT9tUQeEkT>V{+oi4!~vyDBbzpCp(tHHFS-y@@KCj zz-MxjhTH#gBx)~@&#{jQz^W*7Etp|ifEQ9cON^OFDSvEAhA$xloXbp4yRL8T9jdd1 zkGa;nlE`F2jvICCyeVd*P7JkD*nCGbNe2z&Z^~XD?%U6Bdx>_V+V_!@PNCAMoe3;5 z+oJHt?QhK-9sV+?45onLiJH$kuCqxw=|PpZc;{8?=_I}QmaX0vYPF6X6dMFc5E?P* zXt#Ushi}sR)`3h5=dONgo%xs|w0Av$(E;Y@M(VNQ>KoI}CoLQ)eGy3T;5$>7~NfH)QaWMwPij#w5%2=qzE>qNK@0TZbh(KiA6N`j@$pC)u&pGY_auTI|> zom0tjn&piwtC`q7#L2`Nu4w+K)pi{v)z1e$8{UD{S+O@wtCGyUd?(^D)_jdG3io z$+AM7ps1cwI3ytK9-s7GQHo%SFB3n0fsBYie0%92?;# zLQL;VmkEkj1}iYsgl1k2zsaTN10v4F@GI_>tXyl&x{=8r8^cV_S3w!>!58ny91i8b z$~O9uwy?B1>wQM5**G48VI7%v*M6oM8Bf@HCNw$qzLa_U9I$kH*(B!pjdv~PeysWL zYSw4&TmM=)elnFGecK5IO694|a)>ez=k=Zrpk73T`KH9iRGkJU&{JzwU?*t|BW}!0 z(dkfg9k(sMx{f>n?O{r6FEjOys$?Vd3k{;rJKU9u3(X}5jNbVW(wZv%L>}{ko{p_; zJxOti{WKrtM2`45k|QCKqb`I!@q5JKRaSDgpYiq|afc($U3O=R#eJ|t^&i(6?-amw ze*R&WcTy<-sbj#Y;KuFX*a8(b87?Ei2b*@4`fzutcKeJy#%l%o>R-92?b9!!cu)l* zs#R;T1ko~|Ue}A`w-p5T%3@cqd5?_~2bI!3Y=E*CiDbku5onQvI)`)+og4_!jl+$JMl51c+MB?vjw@4?^nutf6F%-TY<0)avi) z{=P4i+F(MllV~>G9I@J?vsM_E(>x+@t$5K@8Y`+ZMTQt^63Nh$OBny$Y=It zh**eJ&)D8A|HwU4kPdc{$LQ9(GXXmijfaz!+G7YQK zA@-o?9*k0y48`WQsVoQyDO=h`9Ywo<&*35p+U2D?FVmPM+zH0QQGX8YNjBI~SSM#T zM!po4h2~gAC{r8I_J%0)tz#m9J+w;)lL(}Wmi2Q3hOT}lPuJ!&TU-NVUkqx1Y1yT)6NoL` zYbStHZ(qoqqiE-x6ri@zAYL%Z8jlz*+T`YSA1koi0Y3?!$Ox^~ejuaAdkWK!Z!6cL z{DBS@scga1n=ezy#@bQJJ>2*Z6>~C+&ZwaG?JF-a5u;W1n(Y zh%;P&HSG6~*+XcWNU&P8)akI!JVLXJT=UIwg~edA9#VTR&FwxXbv_7_sylyeO{^UP zRuvllaHrKm{V8Plex}s+C4S3!A`fyIbK4!2qhnB&9^C6~SIPTeH9k;UAyu;bd z^M!;iq+SRB`!vm^H5_UuZ?8a5n(d#>Jq3E*=eJiH_+-c^&8`JY>&=0JR60(Wcg^@a zn)dJ4x$Bs7Z5N6gLO#^Q*2E8R*M`58q8md}!tODD;n-I$=3fCe{j4hlb3ysmH`|Oiv8+Fc_Lv;zU`2_T^*T3{VWF)YG{c7EfQ&#EF49nMgbf5bMRgNFrzut2`Fb1FxD)X9unYBOu*<=sR z7p^71b++hxoqrOkJzcZeRm3t9vAu`PaGkM@Z<`!=`^7lXY5#QMZRJ0%V`Gdj$}$Dz zuB)R-oYiJ+!iy~+al!WQ1A&)>`S*;7g_<v?#e%rf6r z_?(UF!U9#k1}q48JWqwWp$rSl*D*kvRdA~-oGKU=m%V4^S{GZqa$TxW@N*5jlfc%> z&J!;AbbaEJGy{=_B2vw>ih)Zh=eP@oB3GtclbpwtLU0)QM7}LhyP4sx=IQSqV@NSq z2xp*3iL+41R%$iF!ImywYLA9-kd_K>H-@$BDi8JZ?fk?Nj z?GSkLhxTmbta%?7$1D)7^{yAlkBu(42Zs7v1b6TWTlm}Yi9E!Bej1`aBLXY@)mxqY zeKCyI!a1QG$}3sETQb5u}A|gbT`3=^ozXlr5OARXwEIIH!aw^-UsPfJi zxmjk~r@pKz@7q;UL1tZ4YHZSbVRmI#s29H-Lf|=`xqH?UfzU-h>BRzo?0qF$3>!IJmCYvR9ri*9`F*IQ{!`1I5? z_6e_q3a?L2dbsuh`wj+sr@8@;{drZPPQ;82EmLJ|YY= zYsm2%l>Z_qwP4ls=`mh`H?U&I4xp{}J?R=p$n691RQ}@`OMvE~%fAqHKM94}y7Eni zE1!$}6W$UHg+9SDUmQmA%&WNx-M$s&UTnzN0md&}8ZY8ZZjt^2>j!(6Ouak1HE-3l z_|mUp@B=_E`NU+I>_EPDrzdBI>9qx$h$@ZtNQ)hED9vUDo}$$1eWq9U+5h5-hza~Z zRx}B;KPbcc=^z!KjmP)Wz0#i~t|HJkH^>{2!|T#mbA7ft$uv#&v=vkDUeiM4BPq0+ zY4Fpez6Cw&{3`pidvHU_7c*CzJ^6f(5RZu@>t5>R$c5RP4ddCs&1^7#ls3nkL;6Uc zW2#p=tu`MQr4E|(4r$2Tma{!Mp;B7eKPi7w(7xCl`8>E<#S^Z9n)NX{B zE=!W0wG@MJhEKkh&SD`h?2=*rzlgQfoPI+}saM~GMTzbvvwv@-Z6f;YYa@wL%)y1u z)je}iks3K+8%!^zlzj{!6bZ*7%yFShtv-odC29n5!CcdR&!ABTsTS$DXxH=+#OoSe zInjCnUD4PwX8tGS#rN^HzO6IYlZ{f8!rkk1j?Jg4b3^OorLl4^+zN+-d~}=a(VwX6 z{3A(r&s_FyIQ95kC{v*>NHOAYBy+O;KnpHa5p%ZhN@n^>K=cm7If;&7tNZq1K0);1 zm7mZ*N2%VfpV>;YypInxmxMJ|W3qpeg7x!mo&Gw_%4Owd$q?{&Zi$!8Ydntz$QLT)_MZ!% znc(C-T9=xddBzm43aN2W^IG^Q!AuThOeIc9o7yr&i`3NUgD)8<`4+s6Vb&kNVxrVn zicFe++m;0Hm+uX%ce}p^MvecgnP8vl#4D!y5%KR4G-6%sv*-l(*d49!u_8qQc`i-7 zfto!$c><^Xy_+`F(s6G+2@(V|vnM7B^+cU46!{L9 z2#CN;EN2WH$A)|bd|z%KlCdAQI+R%=CwYx(B@p!2MrFDMvwezR?A7Pt+#=cDoG&o+ z48BjV!Mku%wD2BhK15Ld0}YjiK7Oxoaz}mMTcR(!$W?jjeJmk&Zm(ZOIYVB*r)iM< zJc{pGMfwB%GiijZ3xG@F4F^OKNY~L?Jpt3g)9Xjc+ZL+LrKWsB_q}a+osI6$Tjnr& zhm=>yUrERPXyUoQ$pt@$4*j0G?$+V1EnI+30`H@?IE9RvZ#TX0pcF zN6(~6kNLCQwSDRjkEbRgcG8!0#(#lKx9>$c4=DKBxGH!kxlgZl9Yzy>4y0tJfWsRN zp2V4V2>0X^O@#$Nu<*RGYxn%vu!C^xbN`F0?@!;?ydiAOZ}#9C!DBr~@bCoba1X(R zR^!pcIB_7v2vUD{@hAf|U>6N=ykuNCnLCUSFq6@Id(`4}T0Vh<9J~^ta)9z^{2qRU zRFv)1_~}X1`!uAm{)$KLyk74-JYw3HDz*U9k410N;DBfo<=7|9umehu7lhHE}deAj2!0bvpbE*M*!~1(yAS24*lNGMUhY z@cGoyTTW<5B%i&E8s!9BSlNgF^EQWfGP8R&Vd_O|O4QdhK3BvbUQ@UI_`&@iibNHM z_C6ht$~bLBUij{W=T$kEPcFzcGsA03rMlV3YrP~NK5i4IzECJb6>~m=OS%#wRMfm0@jzXi4Es#CFYuM}W?|S9@7yLog{8dID8t;Eo<2U)&s&a#b35BYS3RUq`L&LsRx5VeP>P)v+p)O z&2*Wq#+9}C-$S7e_yaxpD~5@N49;+@_1JSo5XvwoL+)4&;}MvBH$VUQN7^tGL5fTu zPUS+#TQqRw&*?z4@cLX_W2a>^KR$gH^>-gX5@D%XdG729?=^ga z-%`5g2sSx;1bb>PwI;%{#i}$S;2>S*$=dq}X&q9dw-$}@^t{N4kBFK@@2i`|`)$D6hCG(9oCZ0b$jW{k<)F$w^#J-pMhUC^_z@O3TxEw_H)NyUQqYW=@ZG83m+lzwwT{QYoy$3+?mdjBl-k>1hLv-pi<_MnhP_UnfHI@FTE^y5SdC2_ zwD=0RgV1jqKf-jl0#;+#|#|8KCCXx`|(`~Gnz9wkz250RuRl&qm$2c?n!s(i( zR-~%9`7kp!JPr3ceSa?ScRfT3<+eW&Cw5V4SPVEv zQtq6e(SSwdrFk$7s9HN(uWrmF0BMZA>@ia3;%FSMTqR&zuF)Uxjp){Wv~Rq(wP#iD zmb8Qe-F%kpOG(H&U#04Jkz|QQTwIv?H}cOx2c63KcU%mvm7(R~ zo7=B2IsL+yfOW-w=WAWAc~?@gB>}-}ktdH*es9h+9n^j(cas?Blh(Ju#SN4Ap7FCy zrnBbmDgk|H_V}d9-NUsWMEI$8n1fzRGt_3&LL~4E9w=3thSt58au{nF0z_n-=45nc zyjiFzoEFH3t?fby7qWeC4NBPYKh(c;v^bqvo&3}i65Lfo;U0jLm}k+Rlvt~y!%kMA zFLG7-LMH~v$aw;eaa{w(sRU65yg{C;4u){xq^o9ow-387*(%{NIBzgj2g(OGZD|=3p5^58i-hh(&gy%#PmjWAl~|G z<#`uHMC2(LYDLPNd-uYk#p%-sLY_KG!76)g>d7-H@#FdHmjTBNYfG~Giwce_37}s7 zt|nY?UoO9F@LNQ}Hnom`@(*|ZyI>Nu|3dheC-QXcKVu6#++Sf%aE+75yh=BO;w5nXokA`3_Dq#YC zt-UvetBHvh0jIr)s`hB7qB1_@i4J=xt1e7$h1EoOb<*>#2oDbrun-|jMGh2*^0;c{ z;&tDnZp(F+sK^DP!aI`M`(i07#~q6cp$nS*Dwgy9sdX!ghZ2cWk9(Wv!B&v^fz=pU}?7w zvyR9HQm=^w>5vgS6mx$c_$-3qC13sYJmSJ)j2L)UljDX$a!JEIkOTY}lQ zGiPt&p2_tmWyB(`@-Q_jr!qPGH|n9gq0=p#G*lz4U^*6Zg?V?ev*^uCs$NcOJ1?bG zQna7W`JFx=7X9xT-r2rW{kBE zRO*D6R44kju4~q;U+o7mDp5n+552$fTs>Q6OYWl#!)x(gx}xl<8BZ52RFl`bzD_`r zT)+{HsrVTMc-&34tEaEI)&!KBKPy(NCd5rJju# z?wV0ThYXoZ`R$6lIf9#k`{QU+=Y^hh{w!{I$2{{H$LIM}Q{DStaH(*95+W^phWpsf zaSO5xO*-ed)D7dQXLJ0u0c@>m4v-r*-H@7kLgC1a4LSTPV*(ZA2kXR)%QQLiyssC0 zZj}+_geGAjkAseo%*;t^!$dP_p&W(7>XdK4&{L`x(KXOV!s+V=S)r#SFjuQRf2d{Y1fZJht2xte|xK6XnZiyGdTM3R{mm1zu}JqJ^53iG#;cMdjc6^m7JWa z{-Q-6y#m4DyRsQhhSP~L!P+3O5bx8sk?H3bQ^+~Gp2rY~I0%IKO`+ZT;eYbsE3y(l z=l_)-ZQ6fwG0>QkzP@lr0Ay0k@k>DD@TZ!*iJM=I?T3S}tQGH3>|DUHVOOGL z9KL0aKKKv0-nDadyy{Xy=R3}n=8A$yO$NoFPB{;apU4p<-=ty=wT>(->S1P<852bqTF_8?#hzuJBHhYR)=yXdaE z%;X@x_QTfwJ67eAvQp<*iv|$r81{`&`Ul&rxZCiX5^vi=1dUGWU5%XUN&fC>c{XMY zhZn5A$ZvaK$oUyn`&nxte(#aOIisKjRmIqeuC*hS=E&e3)aaaF!YVbt5Q@-eYmGc< zCneTwcGqM#<#10ed~C<|JA77H($u(P(zTqCAA4SKp0=Q* z7!_|4iU*YsFk6q;{W*Yrr21Mb%);fa-q-3kam5JE7*Xosl8A9wTBGRFy6{XdF~~h?e@Z@ zk+Z#;-Qg>g%u%*fU*dQl+X>AI(^IY4ZO-WiJ3|oPu|PNd-vWd}(MkoW~yp>Hb!^qHGdGp%Mo`g`@CaFx2% zo@VN(?GIh^qyUd=47uoNt$*Gqq)Hs=MKh%Kx(kx$j&otj5r1E!t0~MAr~ZEzZOLtl zvOHpk-BigOrX+%cMQ|s`;m?^;Ns^TRRdnuwO#S~KkKFIqR!K-qZlglwGIy1Vav2&E z6<;d1mb-JC85r)y4sSDP!v1GHvm4% zt#HzJ5C`N*T`wXN6bJc7=g9lnMq-pJ8@A(^N3l#BfY-P}*@JLYJv`%c3GfsztjFP& zb#IClWgraoNq^mU>)x(f29?X*O3k`!zUW{Yl|{4O?ioGb>>ToMgR~jQzU7*(nlbpOaaB>r*mZIO_P^U4ouI>BFTKC?*wy*cohXYPD)A05bjT zc-J3q5Cn>xP2~4hNh00GzPddTFLl!1+EKEN4o8J(0i#IW(qZBcM!1BEfcQTK8hvv1 z&d*+HXaOoo*&>XZfg|qug#F8P`wTw|3ybkLrlMj5m(=W^A-UG(rCPkyQ6z;=?JMt} z7JafKKxgI}moE3?%KJHHE{?kv2CC=pJPFCVOh44JJRYt_SXL#pfe~fZz@`jSro#mbjeFl38;ZJ(*-ABdq{;T~~ zTdzQkW+s$X%nCeUmYegn6N3IlK=Nh_HA})^o=M@lv|Oi~Nh}qg34fb7#-)9{v2j4) z5S29ew37z>8OP752$Fs{h^ZV~D;3xmz>P)yi*0YWI?Z?F*V%l7SqZ)Xj}l)cSKo)= z(5mz%wbCVlSbJLA`U9m;G=hW?P^o|?anR%Bi!EaHd}9ocDiqY*M+|e~YXe3KS!`4G z`LhX5Av#BVp~D$EN|poU)b96zV&#Bc;t_K0t1V=j zYR~l_FZ$D}50?S7^U2!UD>@EZM;k5-d-Bs-7PvBi+SRF~m9I9Hs+jufxp&TP)1P)x z^udt!C8?CK>L&q>neOo{x#=mNg!YBim%of=9`Ahi!v0}jEBqFX#-DtE6+EipzjqHH zncO5F4VZrSxc*pI)>@ATo^q6efE8}0`WwMaLgEWqvb;bp7WAw$O$xQ#7cT8=MhW-Rzb3Qx;!;xYVf=~9oK3`# z!2hcS!f6c4OCk;Oj$Oxn5k5LD!4)yS^#WC@xDg37!pQH!5m?jqO{)e{?ZT>_s3*)? z9PnBE;?gj{;_A);S5$pf#oz>JD$VZ~*BWIij!PU_r&fxF2Ndyj6ACJfkPORh zqHqO5A9+b*=8Tf&?YWtiJHq%UF7n`j3vE6UE>e?73|mFyojnwtPKIqFVd( z73+fMU8yUaTzU78AuQ#Xv5aR$a=@u%_$zBWi$~sA79m&c_PMEBJT;Mheecf8r~faz zMn&Esv<=g0IOQ9TuhG64=X!O*^qjwG_`~%tOz^kNS0y8dq!3iT)|umWb=bpX{;rlO z4@RE@Qqyj!i>UQFa?i%i{|o!)z{ocix^G{wvS{C%zRN}(egQMZ{n&;7J-?KcOQ0V7 zUEpwc;kQ-FB-J|?|J;n#goO$+iLWdo$>&&s-LWcDDIi}27 zWs2<%G>@&BOkSdh-KyiL#LZwU!7;R=Cl*M@39|}%qx`7&O;4!uM31OM85rJ>0g7NG6aj%Z6oGP0?)NG2^-*1 zc6I+0Q)5Ye>FcWinr6vX*JGUXZ_7PnkCDk2CJ@^sEQA3w$w}l0>q%0JT^GQFE+6hO ze?9gBs7Q__JBcH1z4oCP=&rRbO8vd_BeOht>%f{aWJ52KVtT%3i9{xlKwq2;`4FL( zx(6}D12R08!9}1i`DAx;P5es^?2X@>_>sVnaQEc*K^s|Objya-vo32ZOl6^bmnQ3= z9)X2=;0;-M##4Lz%k6&=c31Sfg-X%w=pQ;=d(2eGSgtqQ$q(Z?1;>qSgxK!g^usW% zhJiL{k`#pFhBBciH>*$M26+OjTwypz0QSMLom6r@hgA_ZFjk_JdyZ!>Sk7Pr5!Flc%egEJKw1H6_`YYe*ptKf*BsfbL zMH-h-BZg?0XoRfmB~QQIoZ?EuDbXg>zgA53Bs@IDl{+PjxfD?lBH`VEZSn4i{LTbS zP%*LbiWl|%;Zu|N0|9=*Y?a3bJp1mKJRL^1@!r)vn;&8GnL${UG$ZLZYbr!Po=acW z@>gmB9>0sXh?1pe^JUIyF{VSm{O?>w5?-Vet7^Cn8N9UjlFL(F?(OVa#&bJ@U@pzi z!d6N)Y6*OQm~jtyVGnOnWI^?Ts(oLgb}O@j)=Xd%t}Szd>{}fdlFp$=l^{qqsVT+d zYHW zvjZj&@Ua4*pBtBya*<+RQLUp(r&MO1V*l!F1Cq_2`38E9&zU+NeA*OrS~EkqRM4yG zV0tpYXRL1RO?I{OPqoDNO1F%<|2W6a7GCf?bV_D)6__z$6!{w(G3|U$ZUzKbRaYtFE%D1BaM0kSn0#T62{a&C2e8q$eySSl~O=f+a(F_ zo3JCsnQFN!#vPLgWjhIzcz+m(k?Y;3d;3Y!8$moh1+ta+#QVf)2OIT{3lu7dk4RL&QIo<$*|)=qrS|Eo`1! z1Ohz5E({nB#;6whbz)u?4kkUW?%{Hx2z*`t_I$GZn06S1SmdqS7z9+MzaFh=;tSg| zKmw}U{zt*kmh6TmyOM9(<%~fO9o_zf;&<|sslGkHjrV&e%%A=?_XljHhL|68hd#2w z5;hpq_w+COEWQzJ7V@??Fy1GwsIaO?i_1NFG^k z7`-xF4&4gDS=9o;12icl;?)&>+*tFW>X`kfvC=F?oc=*h)?|8dr5_!b$CLqYNS_fN zjSQi35{`%M5lB80GphoP9bt~dQZvU8iU8%u_#QX(e0@2V=jnL$G_dmQ4n;X`Wx zey#wuijL&82)MFw6AC1(^Zh{`(QE#K8Cvm- zEL6TnuWJy{^60eEX11NIP3!XM)7wsOo7FTMN3-01bcgF34oqT`mvx-CoqoS)2-v$m zn6bH;#>XMo`UT+K(xpY4w8SLtZ$=fK?a_RImmm;3q&QM(LC$AGVCMWz#$QHGpXK|t zxl6msI~<%4Gv&Sie1r}2b6cozacK(Nl-ckA7ocjda7@)d{bruiM2};dm3e*YG-9cg zqHs{0LCZ=;CRf(EVd_CX-@#8jHmO5=%&;sE;YoIgB0Fn+=Y5`?VrO2lG?u^TMq1m1 zA`nGB4j1Ga&|eWhejCBmKwp$v zn`s9Yr(07zhBtY;qx$zOTh2zZgrHKV=aF#eYqcbsCSon%X&I@{v?l-$(;Tnm-Dv$i zWWqezC_IH>4&{9hfP-IJ_CzGngxDWP&OBES_7k84L2RSdOXcLf{#2C0B+gigdLV0u zZA;Ke&14*>PGG{G#;z74pi;OggyL{Cu^*@5r_yHcwqN`B$uVtPi+n$W{Rhvh&_#QL z%^dWL;|Yuz{2*!nvmSi_;nJjYaqk7&ZP5gEwb0UpT(@&=grr4IT-KJj`Nd;NO6R{! zTP@Y|lrxkyzg^~}$Z0ocxQBdA<0cgjvMMN1opM_ z+4WZQm)9g_%#ZjhSbHsBDTOIfr4uUt=ep{9EAYrrWT8xnwyq_)bL~#~@U&^2XqYUl z8|MGGaQTMkBH&lfG*hW^Sc;{Iqd%eCF66#qR%#&?k_S?BIqTekb?(| z=;HG#D2*rej=*^ zVg{t#-q2us0Jz0GYxvIoMwg*ow&_T@Sut4170HsP9KpcB#QO+vWvLW;Aq~7h8uBFi zVt+t`&RvezggzZ!vbdqQnL;+So`Q|pI_1wH*~O&{ArIpIeiuwsC(yZLjQic=tzX<{ znJTe6;s&_V!g76PARjfSiyOg`RWQu>TRTTE%#*>$Qx;BORgFAS11Ey43e|-I=bs>Q zryX!oJP^}PDCU4yM4^O`{$CAo>>ev8z7(W{Nogw|mS9ay?fiW&N2lsrY;1#s>a~;y zt;v}^SKgl^@LsfUBGW)CoS0Hn_?$M-QWw56hT`<3hO)Bz&r)A%`7>V_pCFnh#x+lB z&c8X-61%JRhrr2X36QDtjneGVLPRmKn}f*N8ljjT3+^`&9<|RxIus##<(Su^bLM&t zc;7?OHahc6GjMT27`9RkyTAWp+sMML_*GH)>)T>rSi0i8msCxBR+_wnM-R|4iLGXC zlP{}SGW6g68`NqmW7|d$v(MTF=BZ{Y++LnL z2DEB9;A!VnL``VsDW=z1eLwhb$gL16RqykAMl!yq2z_=W64x4_WuboR{KdCvt=@(; z(Q=B?B-%u@WKkl|Q)f<+5+Xm`nZnd?j{-wx@24?!U?&`uGO?tYoJn~pv*i=5J@hQ~ z12e7K(K*?!;lC2xn$xI%qO4fY#5(lkmR0{Pi}3aZ9dAH%lYjeg@|z&Irw99-1oN+Y zx-V_(dsABzH{UTzbcmpVVTURkj+o9Y#q-7Azh{n}$q)}K^1WNNPw`8wc}mB<={DNQ zas2J-MNfymo9<_x+drlv@t-a_qZrRSHZyAm;pF`armA$P99Y~^z(&lYVN(h$cE8L) z;H0LhO;>SHdxnz!Ko)4q2Yxr?%8B6AZoeDZ5>k^F*tL(xT4LY;K##JVI{=fNb&K%~ zBzY#zWqkS1>IdyMyNmVB>3Xtj z;9>G48UdfyHmBSTUJ^CTgRg%tzf3tbsHJWxeRj0gSLeW;>KxjJU?^^&(F=VH{&I`M z9maM4H{n~n05o;Ug?dg2?DU)xL9d)9lz(b zow8VnRT^i_>Lo)%H0$_o7krwNh1_CzG*x! zu#0(yHiB_P)pIcr+uM5Krxt}VGep0!7(2o!&N)zMd<{Fo6PYd{?y14?p^y2UiAyhu(c*3YJ{PrY*FO`Qr_bwZKJ&HYWXeUICWC_Lx z+J3{%k`YQ(pO#*$9XPD#_f&6HPTL?&LaV6yVvFiR*;Cg@SVPFEo7bpn@KEa%X(RO; zCRA89o_~;iQ-=YYl!AET`fx)Nv%80yn0ML<=LY{gfJXq=#Jj!N586;(p@f)kcRX?A zqd0a5Te&6n=e(CNbxdv7QkQ2dd3%7>Nk^0mfcxUI&NE^qOP<+*{Bcu}^~2T&p!sDp zIR3hs;~AN;#Bya?>aB-o1R|l^AwRI3~%sX0PcV!QJG zgE`gx><3aIw7)mZpx3@^oxE+xY7FWb&1yOLRgnUV@7210Ywr1pE$5}|L}9w}`h%#M ze_-r8S3uVUWP`|8`p7RZn><*HP(Mm3Q4fEZJv#cO?jJ2>ol8cbKJUW=-)XI3>;1G4 zZS>wO{nM?zpXB97QTIKxt*YEW^lGwPf5ybLiX87z3d()KDk`KL4Kmw*^ z8lLZ3mRrcAM+fKkw5n!zW;-5pK;i}R=gTNPrIj~;@+YUi>)dR8l=2;l*@}(1nCG?U zvax!v1P~qheXuPr`c$WW)w?jjeP@a8M7Rklt9K$)C(OTeqsa2!k5!R%tD;a=#3%$e z+$SI6_&8KFa0dmGXH{D)ILydx*aRInzPxW2a^VsFlb}3(Sfb|07t}??%ahOc6(C1T z2)~fIr70#(o8BwlA5BtrO841yC5`Gn@B{z-!?#`w{yEeh1)9Ga>p58^4v1-qV+q#U z3eqB!Z598#LpQH(UHJZ49gFttP+31cXvL*j0}|P7ZHwfuT=ne(Vw%pk-)Q>N>JAOa zr7yrg+Vq@hT^2ECAZJw!<=!@P7RVsdi|51-W}C|%+L#j;-&q3IF0xd8vmQ{tWd0vPoH@=+RWDodNROsK^*p%LsccsgSle)FL z&6`tW;Xacc$m70jHwp~Eu3zx&9%5IjH~X90GRLv-ZC!oMiNeG*q92vhE8@_&nQOmVE8taDiZ-Nmi@NN;hkty$vAR}5_i7hP`HimVw%CJb=^gt zQDQRxgNgE9O66Dp+X=Hpsk8$$%G|>RV9=JC_gTYO61cU2?Y1D~%tLraE$?Y+4GUni zd~%*~#n#UQ)?kEKufMqq13GM+aPdrF{ z_dw!FVXeo_YI%=h_lM;W7M?V|J1+7F2FUfh6SP+;?R>%ci&LO?Ay2R zj>8M>N&@eGm?}_JK-yw{k5T1$qM%V%|GNs7sl;Rr#7Lr$b_dSkJFXN?ryb-Vck%}1 z{&<76&}O(fWzM_yel6+cYw%6SgU1AiYSp)5%+Oq!#7#!QbFsk`H@P9ME?yuNOJq{x z0hOnPKT;$dBTs zW$bW+2!@1XIk8`5k_$X7f8QIV7NAg17j7znTRPxne|6I&>`fM~I=*%gsMIhG(yPnn z#fQZOfC8UJM=DyaBa3a##^pp7m5P>pQtA=&?M&IT$B;<8?o*7gSH3lgE@>(|JK}8) z>hn1|JU7(V%8$za7hn#muYF!m9&;@dNUk@)?6N^h^;XU&f)Wt7`Eu*9Wz zbM3SRQ3sDmJX{58nAau0jO+oJ9Ur?~CmJHP)W9B4?<8f>W-?~?fqJIy`V*69lgjO+ zqZE!dpafzw<^mNZ_SLC0r6UH9+~PkdTIw6Ja(+sqKM1V0j~OI{seW0TY;`?+&A-(g zjtTreI=Sog2D#VwM$&IOkwY82YC%=4n=0R!!ZrC)eJ>=}uW#CNZyI?(|YD%i<3 zdX`Hm006+)-w}~8zM_yXF5*a~KI^_yRev>Yw4~i}q(vV@uuVems^kzN!*+RY8oO4# zg7f&yED7MRuUy>Op0u#3jFUT+7V7ZB6?fl91zg|3W%u226ON(q`yegm?nI!_ZzW>wi07wl?(M05t@mj|*FVbq+xXKk~=NY}8 zz!aPw1(8J>Q5~E!h)3pAoaWBl=_p3B@a-eulU9jft;JzHPJQ#ViCtf9vKVf);<#LP$jDFA9o^K>wn-mFQpKw*ZNX{6%wqpvYg#G^jQJ5?>zy zPd}ihmaCSpv9r5^HJIN=`_CpSjf$L{nU;>Gq6%06fPx$`Dvl%6$pe)D0B~~lbk|Xm zr8j~Y(?9)&oDC%a4Zr~qGlzP(zSPnJ|1*dGWpVxW@7w`^S)RYP{+BBMdm*-^l?N2r z{DAzwhPt|YBA3zx$v^Y)bp6ZQB6$)Ehky9Mzq~tgfJk}DU*6_le91pL|Ki*J(b3b9 zL+Xqn`4=|-jkox3{J)QjQ~{tt1^&YSU-Go_MUEc;P?QA#{;ui2tp8`N{v$&pLk>X@ z>5G#8$Xtp50MRR?Jmo(!i);X(H4*@zSpJWU`5gd&9{~WgOhUcfz5jI#02LBPQHIf= zPvDpi&#nn%NVTa!3}+lE0u&N(#V6W6rpFGh{!e1-a{_DZJ_XJ89`OJ9^JfJh2f)I3 ziun`+3lkF)8yo8x9yvZ9E-oGo2`M2tBP|mX11&v03#Skd3!4BtJw2}spMZ#%q@*M> zkF4TLaYZ2sNwL31P_VJF@o?~{@$sp}Sm{~C{-5d37XTq98U<pM(3Jg7CNK4UC zZpCb%)X(J(bxbM8oEuMvz&#~v4FarfxS8!k(cUls`H59%!lsz*;!>E<0hn+2iF1fi zbWo5M?P5^M0MoJ-cCj%iH~>dt@C#hbH+_{jfHyTcRJIlflA=n1J@A&;R|ig8ECePo zI9)*w!4TGjmXm@)MfJ}1Ek;%rro~%&)KPT;An1u2#T0-a1rxoe49E`v(0rii%c02n ztX;;B3IlwpgS1FM(e?DyhjR1=@E`zX6lDvBQVil3^e8xBfH^k+Oa(welV_#J*hvKO zV`MQ;W#JIM=;N2gAkvj>0#U&uxNO@K7a9{x{&nWJ>un0Zo@e9~EEQRMZ#s+B=o@WKj62HNunITqxVT+1UtLv%@E}5FuhFZ7(AjHWv@Q=-N zK${4&(^q{5YtVgx2_U9qk}W}_0QNP?i5%XUG+#UhZ|=P3E3O!i*CYkuDB#+vx}tij zDbhU7S6)2)0ch@BO(y95+KmGce8#Gzh@_apD3xPRvn>%ySB$dFK=jcQ8>3aiA$#3n`u!RK`nnJ*-NzPsqW_^y66 z7EUmQgZ|lq{iR*c3pB7^-Sa&qMdLlf0+^F>RKc6vMqw5CP@TS|s)4~vc8EFl=Pos!nDHW}=@^rNsiUpcI-kCpyi4yr8xVFI)x zrE0gHuG1#;u%CR9HdO?dtE?=7LR=ZfF%^KQC7d*NhpqvEKHaIi`?IJf%TfrIs$0QFbn_1r7n0Le!hmNwAA2>ibZeBPC zBb!E<^kHST%A6_&SQ3IBFEiTTirc;z;1OIA`Lw*df9}ar8h)u1=6m8>yXT)yU8AHU7rOR6%Q{+#Jw6c*~y77*$ty0>LIBh zB5A1N64>YR2TDci-JJ6P)?pzBy4oJuak&E2lE+81{-aiZLb5T$gY? zY7yJmB;Pt6RArl0%+IO+PDO9H((3VP_+_9-m0Gm&3SMLwrAYcrS4Ep+s<160 zZC23TmT`+Kr&6^NJ7wfMXi`lVlQ@^xBGG#Og|$6P6I+2-Dc3V%P17)~ zctOS)eR*Iz#!G!1Mqw}VLfU-(raHHQ`7$4JlAXNfNu7cIod8 zZ=zU%PnZ=m;Szq=0}Ohvh~Kfd6PweAs#xs;=;fU@f&0HC| z0?e2)Dh_*UIEP&^nZ8j(?}ZMb%J8n&LC=D8EA=|n?u^iUzTk}VpmUIjI@4KqGFO>E zONWJZBgigs94A9BrYa7jLS2-{lRPO~HlsFD2WyCvP%hWQirE;e30*H;2yI!yBd9L; zC;8}X@w9F(gpw}#f(Zlua-xApo z6U4=#J4<;XW zIcc1!SjgD0V;-+co2Oaf(G*!Z2dxFzypJy^x9yZ)_V8QH%WogWwRQy9s@GRqaiZho zsM~WAea(sZk=8z14BA%BR}dxGAqFc9*~r4|h#lWM^!{r5Idc6V6F_=#P$2TGTu?^v zYyJdo)1i_kjf0857*2;@fEOO`mPl@4wbX=CSx$V*`;5k1xbIn!Ik-M0E4)aq~cPfq| zlX`|&xQyB0LI3*FMdyvPSLUSUhwp-${zqiaFd)YXu6|x9QBxEtL zu+vp+`;k`WMW2IJs`FXf6;%OMrJ@upC!aYR?d?)^x<2|9F;-U;hUiJnSMBn1C=Ov1 zk%CU_Co2lh=7)~kL8hkC%TjXSjKyxF`rL72-{gWFM^+3eq@&ti4K>oQr&<>XTuV+Y zjwu#bHXy><6=Q4<(E=|gj4-O~l^E+s(ciuWw6W+iw5SDXe<~{;U7)RdU8<|gk zv!+>~`o8;eOoHhw`emo3DJ6Lu@hSc@1N_Wls2VIliKUU*;MUckaAQiRy1~d+6)?> z|B_$NtsZOlLi z>%TLdyI+2Adndk7nEw%9X{=$hSYOOL#sKt$P#BWSvztg}+wES|rz*z&B8g^-ljsGr zQ3Ub~>1|l!>9(ran44U9=y93nm47`3ZIy1=Et)jMWlHKw@E)C>$ScY-)g~p)SYh64 zA!@f@0u!OTPep^U5hfpU$37-$I*@;A!Dmz5o~8UaDcG88lyEtzf~E&}DR0%#$fTfE zq2g82D5u4YPOmT{ixHgU&uC!IZtd-h|TQ-5vV?IW)# z#jh{s74(q`>AD>n##W%B5-bkHyArAwJx>&{>W2Nh$JvG}N0leRcppsG)iy4-yVmP& zlaj<&a8AnZCaByvbV$DQaBwh-uz*5Q>)QdO3_wf(_w3jH)B1%%4bLzSJC3Hoz!r$0 zZamNF@i_grOVFU1)VW_ryTnF>vk0^4?l|R3sx8h$0d#R^Z5~jHocm|T*@N348Qw=c z$nlzM!B1MFnx>6~wX>kYg3GgC50jd^SA|8lW<_Vm*T_3NrESgkw`KtoWB5&bP@~0e61JxzCWe^0AO3cJPYN{mo|hfYn)=WrnEUYJ{xCL4qK_dL+58-Fq6wd z-o_-=AJXdbaL*XG7G%xATlg2G6q2TE&JkXNl_G_OuYKrT*ot##4oN}k1Be#mp8VZL zQu-=X<9Y<(GcNA$>gdkF87o8He6K<3ag<3}TLMmv1h#jLyut9jiJj{`7lNx|kFmPj zI+o??*z2AVFQ&A8{m^cj_tm!FrA(Q|E=25`)!AS#Dh>`I2i%77kh!@7k?%tQ2hAxW|>tN;FJk0msUZE`mSWewZ8v=Id$; zl?-)A_RW}+DTXS;5W0*?d0vLBS=Y?M@>CdJvSr`0m0p^R*3=pATZ@0|A1f+*r3ljj zo7jdqC!7fBm3M8<&YZ0<50Mq`9T-YUu3VT8PEJp*XVnRzXw4#zTQBC2R%OI}!p(vx z>mdnvy+-XT{)I`3wURxp784-nI>M@!jUby9-`{MjOAyIPS2YI1KwQwL0^?#lt#FXm zD?2oWm{=a!mQtHC7%P0UnWboSR5_usV$EB=)T#_?GAi49cbW`>Qfh-d+Pm`w(Q$-c zyOI!yHSY4^Q`t`4GUVo-hjlrol%PpX&>mr%E?}=(qOoSFP&G>p-tQF$pkOZ(m2yE? z1c;XKDndCg<|%<>MfQ1QYu?rQKMHnz$hEc`mECPJ+J6XN%oV(@arSdvq3s&>c(W6= zWGew)kP^%kYm)VN69Je=t~w72VbkYryRs*ge_0jL!TwBJR-Y-YGO1Y5$htt-K{>~X z;4K!Lsx=I6Q>Cmjh9)TmW@P^Zb}&A3;<4=c66k@KN>-vy>fu2N{V0+8N%{aUfcfmh zW!J>Fn2Na~h%;qNoAYb&9qzK&O!lZsm*m>qBm3h1wZ?2a-e{WCnVQf0)^1b9$;Ok0 zHj|JJnCx@;SxVyz7xq|N<(WtUDN|+U7aUE>(-m?1zR#v9XGmU_utGCc+LKaHJYHaB zjq`eDjq)Z4@z2mUmYdNbqSN=T&b_xA+rCk~L3Q!7?X;?csCFHv%`m0}(M>*T(x&Gh z?EWCLjMX!i*Jv)W8Lj+!x}UA@x9dqGLR~*jny)UbM!81q0xlLxl|PakKqxN>Y2pY; zK%<)0lN)uzO~qQh=^fPh-5T_iA)zqnKPxDnIIhT#&CdEi>IgzlBf4 z&RNjB(%GIBGy?aiEZr)}-kMIzzN2{*n`Dcwz1|rUEMXbKCAKTev9UhW=8TiCN|$nB zTkXF@)8w-me^1(JBlgpHtChvWWpts&P?IRcZoHhd-N+^$DH-(N}vFW=oqesJfNCKg$k27ZcwrmacJ# zFRYF)Gj`C@P-MW46RMc{3YyR-Wu)+Wl%WerE!ir^@S(ZOch*VNPq7=HAMX@DPU^a- zwK3{=Z5TgYMrExLM3deE-?GfmgQ?TosZOKrlv!_GbkpKxvgBV)^E&$JnH(_d)Ql#I zi($QYy|{0C9n{jc8x-NzeU!?_1^KZ(5@543m~EcEH{Jf8XM?o2%v1o^h?P6kqOwtS zVyl?PBf~1<*Xbh$UlGT-*TjC)MT=12H>o;})FjW{{Zj6uN|TG3oz0cZj1Kb_=W^-x zSWSgzxwZ(Fl9DGvs;pHXy6K)8;wu_^{QO$VL+02%%QcXj>8|&U$6t7$txz>~|8wH` zc=otW!@$?ZLL0tP=AV-b6I;)T{Js?oX3hd}UFg#VjH)2bJ0+erZk%zcW>u$;>(VpYggOhW62crHR{vHLUgt;28?LG>Tt9ppLu88{6>?X1>3d}+V ze1!ATJC4%_WoX;H6fY#Ot)35C=-VY;ds&}ec^UFpi4QmqXDkp>rSmsq`YpbDHLzOX z^ZL1Pro=~USmD#+bl=&spxbwP^s;3cSBb=qSCiuDviAi^uYB*uzWU9+v}2^np4q9B zZjjP&(Wmt=Ni7H+s}Kr&0g4x#Z7cdv-}=PG+H;mHQot!{BKfA{Q<{u?`& zlD`*OYUKf-SyT6U@7#o?72c!uAjyZIG$vzbs_M65O*?agXvHl-0v=nnPL{FEAfvh0 zHir2nI!RgcUE+L#;T^lHghY8cXFsHXC2IPXA9Mu`Zyg&tAbEo?qe%|W0o+A#q@s6Dyp|$cL;fPtI<~3(Q!}r_wfmi!h zWwg#S@YR+w<8;=*e3~GS%+lR^GEp0;*W{$`U#%@_S3OFx8{G|3s171`)6-|iChGlu z*6huXPbUg;rgddo3XIJ-hz?{DQe{#OY{d%Y#&nXZmFsM>aNIKGF_f}u z5wXs0<||CPx&D%2^cGw1b@slK2xWQq_eXM`Js)m6cr0qS~M~p)ut*2m#NV zP;huao)_uvS3CN}+8MV|&rO=39}T$_+-M$Yeyj== zczT{+D-xDKG9+x;^S(Jy&wcfZmQj*E>pI|y^0%r{wsYrkHS-R2Tc5UDl}9!26D5|Ats=8&EL!hb4bjk-dDx+K}W*VdDdBFxdhEAEe%e10Q%AHVnV zk5T*q$X{*9cbXkM8!8n*e(>y_OkDI?iMWoU zOl|zY?^-rX|4ZP>uSXNYVll#-2J(Jc1d1$Iz}i7S{AT+=Rhn&QsP@3vXgEB+aoq-S zWzGAkD8p1HZb>77Y0JR-Rky*-E!FRa7ROixwy%4kt4F3GvgsUpo)rV|-?=Ns8BI4A zT+onewJt}S7MZ8@x3=0|m;?M~i{7^+jgPc-b^S2>?vMEeI}16HGQ%t})zFcyEY9iQ z;Zoh-fXN@dCAMtp{fZj)dt?incY?hQ!Y(@Nj_QVq76%*WXQh0n&kz}lEqA|DSGk3R zqBnk85S-K;^Img9wwP8ACmj}JxYM?Zo_+43eYo04-wSx&&K$5j>0@!hw58iXnqM#& zcw{zZWozCUaLyGFRELgSYpeP0YM_s$3>5|6jXnF zEpg$Zv3g?>==*y$?qu~3z^jl^G=OYUty9^e|1m(mbMaI#^wWVZ`yfGU_4@;+^|%@# z*|DLzd$RcugAf-~xz+gEtOj;Dy_QZs#^?D{4~~_6$wn*TtLgAyNIbI7)DVR%JLvNjhxV5@AF4EsU&@W_K|S7(+_xyzi5aP9M}0E*U4?9oYyHvQ z7T;c_uI{*i{eaC`jVnKFn6=L`IIg#WK~{c*2R;lC+M$H>O$qDR`9B(0 zj;@~PZRfYI9Nz##kco$?pGiAy z5VJ5Av8@axSAz~u=%;dpu%z^VuAOlCS$*MXY?|Di3|;=kP5V*&aozFg!R80ySYI}x zFp)~@IM;H#(QzeQd2?)pvC4JegTGp~03&6R>l*|4#;S+>c%=V7UP~~BI4g4PdGifM zZ(-i6T}4U@Vw(c~z>3JkPAXWd!@ujYK<08#Khk!AXPbby%NfPKNBB6E-fkuX1%4 z9Pc|XtscLQ@KB49?Ya^NH8ErhSl@o?T48lcl{`sv*AQ1FjjcJ7qgynZm)UA~o*4?k zTV>Y#gr+fm1X<0MN03t(R)%lQwt%w*>=lb8&h3RLPn*-(zZdJl2L|}+Pg>7tkNQ_y zYk#k%+^^(H=jV4Hc^?klOfBfR&tyKN9*$XeWm$*mZF8s)`n{s2t)xpVjLl&q5`+^^ zhPlmku+Qo0suKz*C&JA3m-_SP&zzG3SGR4rzh^pnd;eW)4-)S$V%gx~D-%YxK-gYN!9^?8&G-#eJ(%EpjZUGEKe- z*$LfD2GC*E0$AgERla$@TpB3rE6*sCO031?=V1mZUZPFc1~zUcY5Z3~Nxyg2JGYX_ zi$%O|8XoZjy+`1yz=We@jrcf%U%({T7;W}EgDjA#zwnabTZvU#*`>NQ$4Vl+ zm+h=*SSQWf%j$E2hc$0jXQt0}UCSrz6V#BpZDGrpG0QCsKRM)J$Pp)oP-q|5-C208Igy7Y7L-Y)ISa{z-{M<$F_^kg`0Uoq+F$}c^z_8!Fa`_CiFH`MtK#VS@>l?y@E%#42z=erz>ZMkf%z5eS(^|4reGLA z_w2XeesCq4v9VbD)q9<9IDt8Ot`q)%NpHTqM0{n4*ai*27;LrI`@YGImj zLF-=!c=5(4_@g4X1A>H=u97WhI3`u2Uv;#$=s}c9ZUd;hIs>F`JiIJ*qGDh>?R-PO z>V3)jyVvL2s0r>8UgeCCG`7daUaVFt6+E3^ky1wP(kq+RwZVE4rfeYm5voB~_bbrR z)?r|9!)74qb=r=&yqWOHOlyTu^!%$*A8Yvl)6!-a1w4Ab&c{;IgJ`=OvTuI?kV0C~ zQd)=(4G+9URmNLi>d2z2vvVo;UTPIWn@XlU1@~$XyZf|XyYCZl1`GaB?w>-sEunA# z(+avL-3*}J3-*?px{u>k5cg$P39b+P12{e4p3r3cfq@ZQ%jX%~oGEa;N-5FRd3sN9 zd^lA6OHDUIM?Tr?4?t1sr?c~?Qi}GbG!m_h;hI7N;L0lBX64-PlZTi~M$;SG!H!r( z3OQ!EsxH0E;HTX@lf!D*&#sv|+(rz15LelTM|b3^BR_*32LdSS+FSdJ!z7Wh9+ltC zzkhR6fO6DjX3L+l-Y`bmSTm%Pb{FgiSsHfyuwYr+tB*Sz{S+^!m0luvCcN=9XWFs+ zbdNJ+J;G~PK~buWmp9svOCkU<7k3}fLAL^JeUCp-a;O1XqkGCTk{21_J{Am5D5?yh zvC}B7R4kQX-u?sVuhAe1|2@ubo3Je_vAXx|y;5cR`&^(g)6bsObqS9C5k0#q*PHXL z9d6A{`CEapT=uzX8T}s)93jumGH-TN?Q1#frwt<6r^86en{DvQ9p3Om|$shd-e|-28E;+7H?I5`ma`c{UNNl0 z@H>Id0l}m^{7n`kgl^G88C98)5Cx5rvS8y_pnl~O-QPL_>0%-ICY1(WPKAfMr4=eK zJs6az)AKV8)4wZc4Av9h z?D6s@dj(JRWCpW70&glA>=a*tu%#&}pLf?U!DTKxkbA9DYKiD)z{=@?eGt#j&&Lr8 z!ZLFzjj5?bVq&dqOmp_xe*g?|QL&9@g$dfKOD%yo$r?k@2Fe6*q3+?NJzW6p0GDoj zUge-X-KBs%wcp(Um&qSMRcixN!(x=6m@cQ6S3Q1bcftEpj^n{(R;LN}{@t25yTQr) zM@j*ygkCd7^KO=5wu5jN45LaHq9|Xo%JU-Q?uZ}8&{|` zPp+cLWQEuEaH_DM7*T*=;5wO)A(Zrxv9w@Yt^06}p{|IoP&-#LC4Ov8gXrx0Od>0e zb0(^zj-WF*`xC-6!O(%Ts<&e?dOdnWx6jaUxMDa}zrm)LRr=E7yR3laa3M}nR6^`h zynW~MOas?@nk?k zVfpD$0O?e$&-WXx9b>STqc$>l9ISg@nDzjZQNcqC2W1J^SQpQUTq`(@FQu}o%NCqG zC6uap#bT+{Wg%41Z)2&}y(snIyO~SP^vo?VTT~#?@u5aPl6}Z+CCpTgaxOo8fzfCw zT%|mLp(aUy8g6ee-uy;WqP{uq$fuarel#xm*RT2|qEp>nx6SETu5I_G5>-oc4lJfK zOV322SgINw9V$Wpdg+n%D$X#w)ROEm(>uXtr<4{6S@E1crq{m9 zEgye9Sml&hh`(Pn!37w?$*A1~^V!)rKNK?wcf5J|)IvoS^6f~3s>^QaJ=FV-rR4shm zz%zD=sVXJDadf)P+rc0^7LuBy*kw8+2n5pr-dALMHl)K6RZjB^dc2yr%pGyX zS*a>Uc14pXUnwA|2+nKUX@1V>WMQU{d}duaJNS_kXOQ+mud?s8RzG8DCG6f5X@wjO z_9U5c8_v>8aNV7@7e>tadHWRTBuh;{!LM{$A-7*P?e>8OZNvDWnl(m8buRP9H_90Q;$t}4VF^b zSD-w|D8@;b^7Bjd+GISgZsWEVOON)2WOgUH`=OMhtn?RSl?Fn(WahY}p_H2bPTY9* z?NQQ~1~Qy1uh@9Um(o(<)}pp)UK}s^XgZfpH_FJAC$Ow?lt@$wEe}MqyJ#zvx?@*# z)jiuScQR?Vg2BsR*w5J(d6i?8l(*xo;V<9KB$4JnzMoghrj2EE!2cZUf${cbk#xOUmxwV~6<@;bPY{xk4UNM+Nl>}SlDJ*?f~e8*O)2I zVhnjT&GjJk2f&9|T?40XDh-(IuHvS^b@G}e6H_wa#bfTLYKQ42}VueV02~fA)jn#4;+tg!P4Yl81q~V{{4d*R=d)~~`THBXeU9CJ*Lq6F~qk43EJVv=UO17!vw%P4J6i{Sb3kHzETgpVY1bx)V|1eGgYsUNf4cUfWhEcgAyJA_4Cnii{|AuifVF*k2$?acP ztB&0~D#uJ}Oc#yg%ax4t7z@K_^Y`osWv&=thw>7u$2i_{odFCqZ93YWuw22Xr6CV} z`R6uJlkagmLBc==IK{b^SxrpR#PT8ToYFQdTfkIt5{46$dSr1xBy|VF8*DfBjyXC> z88LIri53)oh>2z*p9^Z7Vd2P=B2>0j=o){_3QbV2ny)Ko39F30!Kl%!6) zeSyVH>|nckPf9Y~W47JOP<-_?&wkfvSad>$-^ygJu+_{EXg};$LyPZDuvi7p`Lx7bJIdzM zOt+=2*-_&5^h}opG-@TC%dUG_KATw0=2MSFH%g#|FwQ|{5C}1rmiacHmSz2F5cCNk zY7KLCPcpQrOXFrdeQ_4XA1|e8%5ISGyM6!};(U!cyp*iZuIvc+FsbpcGzi0FBGXOS zpr*JiWi)_mG7Z6<`$q=L!l3v{)hfakzQfFLje#qzZaU{R9RY3TWlZ|;zA!J~{Y-L? zX}tWBa8A>V*mqZ1{l7d9R1Y%;>0wKbTcQ?&B(wmG70jpxBum4R6+t| zR2Pki|HVsUZANnebXhG|w||_COp*TU?2cpnN|Ip9VCV(YIYLF|hQmvTPXB>sJyfMg z%51%BmFQ4pC*q@wxBE%3ui9SgT)IDIeDhI@%F3n1kEKI37Y%$D)711&0<*Jw3%MmS z8Z>v0hS9~lT*G)l!S6*84NL7G6Gtszla#(jVe1QpOrE-T5Z_umv!}l|HY{kn);3qX zrIr*(v=vCp?HG)gcA(`yRAv}!7gy_ax^->z}hY4DNdr1MVvyJ03w}jWZmp4NP-M;>h}}g5y0!9Q_HcVw3Sd#}&nK z0e$wpSWe~Ut!`TN;Cf32bY0F295P;viph z>j|N___;l7uFzh-RV6j3i)c+`JMSaIQL_?0Tw0~W2zd*Rj8wSy-NACi^A(trM>=&R z(%M2%cx`uX$@KEzYbmrL_J8oCCw=t>3b*q}8jzJnJ`~1R4#jx606hfseWHWV8x@ z>Wol#$CPwQDScQX(Te^&j8C||VcwRA0LrWxuot=ADJ)(Y^T1?JN2&vru!txIKKubd zQ&#uoO)Wk&vVYyzxIEV?{t&rwsJcXIQQBgLMseCjFgLZOY5r;dggfEYwzjf1B?-&- zLvhF}Y-J;8FZ-6ohdA~kOh1S_4=$^B&5#u=7_WM*$(SUoWRL~gD~-8_^}N)AOCiY) z&#$PFIjGMpOk*uVfhdGbq?eFcW`>E_V)`3%I}e!;eubDwL_|b$5Jk*cl}1KZafG(q ztId2^BAL^$w-)R%1LB8ZVBiT+B|v`B@B|g(pEo`KIw1i5o)Gwfs4s|K zYH6FhF$%m1b%mkHx+CiU{i+8;22}_WWuQ6?i9-G%5H1$Wnsg+k;?y7!-e4#MZ)h-3 z9T^#ha3P7s3fT<*D?lp$ty|V0>93-}zm@*>|F^=wy zp~hwgu*->SVrOv0E}MfW+s6MP6{T~Ny38o;M3R++dV$*i^UzFw#d_PPSlm$J`NNpS z>^PuD`^8k?S|2tM9Y24``{v-NhXgwuqX5TiH&*5Vo~avEI|uw{!e9@h-Ln>PK9cS| zU(96wF`UHK;75|!{T$}=n0P)S5dP~q$wj+{oHvzJ3dOlU*Abg?KP(I@C^n^9pkSe0*F2v>m;=E*8%?V&@%N6at65EEE8R)K1_~??P%2W322O!l_huN@EdLwefiB3dM8OYCX*_^dSK26 ztEC`BVx*OwAg@7P)V0^ku=8AXnziy;sm&fD$2gdoqZJqQgdk8r3JN7_CZmP&hAla!ju8i;2=q z36PgNz7$I{ERN9D)s_@|&@@-ZQSP1#e^a4L?OYvsa!lMyU`J)nAF8;)ey@OqEv-+1 zs5WF#O*N16{9ew?sV_A_eD^kg`-)3p7brodaVjkMR4g-QLz0Wd`If*p`_MeoC`+ji zeAx^EqLq{hU&$vH{{W-9k(+6K7~QJAHwsa04_7(1?y12pTUXh0VUOJK(Hj`vP|!Ol zvv?k8n_nQ5#?5-3L#n6f96;#V;nWzD>}{e|HP|Ha;{5I6g{Gx6vG=}bPdE)POJpd{ z$VgS2Iu9eEra>C`v?L4mZd>Qr-hdcTkL@_TL%!#fXnldQ;T!ulC)FC1oW23V=xISv z(=uBb>AR;fCT7I7f4GMLQ0$WdT$YN)!1Fbm}4yEuW}Vku0GtMebD!R?L0@0a4c-7El;yEY8LvZVefU3AZD&DH02 zoiCSW-%(~1s)Z}Q?ZH(~fB#}z-(&23Qs|d@xjz8qeaTiDC62J5*feEtyx;*88B0Q` z%^*3Y3iOcOPs4{)-S5Ay$9#W@d^%{bMtzanRqzF`=}zIv`{iFLAH|zaZ}maX3_jj_ zQ_BJ0BF9HKoQV1!v|94Uw#slBw_Kl)jcZex>qw^bVoqae7WYT7U%Rp#>kQ8v=kr?B zT76RQvf<8S5vfG;7!L^7(Z?Q3z7LRR@Gp1oE6sF1R>SL>$Es|NoUR$2&uDNF-~urt zqs(Unl@Q2E(!fR=D9P52T9`6C&+BPy`+&Evk~X-oM5xgb9dz6{H~x`#;kD~vned#? z1Hf4L?Q*;9HJM1F?eeCWgaOSgo0KOy`l6AMQO9FItfYhThPj1U(=~;sZUff4J^o6g zoSfRZhMOF<&2a|P(X!?CoDb)P`l#>pBT3(E+N&5%8;C}WamZ$!m|4(YQ)}qvq;KdL zVkIO>k*XFQRr8XvclIPLjnN$Cqi`vNofoDjF=RE29gz=J8M|in3<#&`tJ_X^k-oJ2 z!S7%?ds@R;!&f6vm1kw}gAeQ0(SiJD13L&SH0@Q9dqYK4y_EB5?jHb4EDgeOauc+q zFP#30B%FH814AT_jWbK#b+XTm_|39=mPzd|%C6z})bgIcc?9QmP1HJ4B3Qx9}Z<5U!FzYBXZW#?An`N)X%8?^jy@!W56;ki?>n8j7c`5P8Ude~$ z#8gIA%fY&=#O(Y#7Vj;~{TRby;eE#+*p~x~|6CE-k+~255XzJP`t%Ql5cv>9fV>ul z!VvWJJ=13!r~Lnw_8`MhDg1g=;GTs)_g(_O9=N`!t{1>E5CWAOWiC9YJ0g*DX$W9i zlDVYYC&s^g%4%lW8C0OO^t)#}#3uWickeG3RCq+UPwVpG`)|3id%8!IkVQI=qYLT5 zKLFQ1fH$Vejbr!Z(4#+q7Z=hapHf18Jt03Q4Ph`mC%3u|`QTS*bN@8^8VPq#?@?3v z8frd{aD1Hng*R|7vnVqqncVmoK6cNt^0)sVfYv|d8>CsYEBwnR$Qsi8BdXbv%qrzQBH)G>|Zz19#3!Csw!fyCUf5Fl1!gR$jfhCc!l@Vs+qPV`hr$07>8g=U9!+Lb+>M7O^{en+?$ z_xMcG+uJ44EmhufvF((ToN7z{jD5J0Q5mG}TAWDWXwarek#@Hs^^Ao%KQMP+KAoCf z{Ce9?m(ioh%r?w`ZANI@MW|14Jc|}P!7ZvK80)Ne_i5ySyyG62&r3lQ-h?+U-&Ny}>UoYd>xE;bxz9mqrim57qOwMZ5UiL?z-Z2|n(GiyZTXH)Jcw&BACT0gFK&nToouPDU zYGFonh1^Ze=o?P=7u6IzsE2ACa|*_a7w6i}M%ngL zWryIbenvtg)PWDgGG$^5f{JZt18s}*RD{JvCHhcdP4-iEw#Zkk@8ol>$R)FTBDnBw^kzG4wGU)cm$fMKW>?e*m%~ zcg=mVr?*Lr82dSO?s}NMfr5cQ!rohdQv4C|?s{lH?tM1Xe(dXr0(r2HDAl1)Jwwd^ zP=c`BH?;bFy@Okia0qkC#VPAb@z5Ut2Gdefv|7R^^h%)PG^;Yz4zb(@{^h2EqlJXP zG>JlR6)C)XH^&31eh@O)JBD9ZuO zhpRSO8uO^sBA8&-8HdlZ^&uI}djdh*CxiatY@CVd*We`P!hT?2R!H%a9JZMEbM5Q+ z=y1E>*kNiW$*mZEhHN7GWf2qRJ%qQYE102Ytnx>LZsa{fndRbv%@P^hSy)`5o@N#( z%*-ITB-&_^y;14jBv*tp{5?>v;k!N7BbJDYQGv{D56#guiQGPTZ74`^{a~2vW`P5r zZ4fKLXRwYlIvMqbFnXdQSGYia#e>Zv0ipm6v4D`xa5wf1A01~=R~Q|ILl_1xwI2u_ zlr^Y7r4l(&Q@`3IWU^%60F{9)3u)NK2A(8|+);icL~zlAzkHv)LFM8PE4ih*x|8|L z_B%AM^ZV~CP!$?6T}+Eg_BC^p5E@^CdnWax>Dk4X9%8iFYrbJzxoL}U)`{EhN7nu4 zCbN;2Wy|?k!dF(7Q&VxPIS`K3#9kPFQB4G5+nLb3S5_Z(IzH|pQwqKG>Lcu>SAs&6 z5GF1C%>+|7TdYbzv|xVg2o0hl)Z#H*U;2nyns#j`naa#WS*o);Nz#cSPS(hy!~UBM z<_i-R{OG)F&jM^yqN0oPP#Zn=dPfD`*ukSWjm%u-Kubo-Q(dTD_;CZ((2O767j5Jw zDRC}D*CG1$qB(c}gG((jci~jhe#{O&Mub=I6x>YKbJMed1@Un;B_nD^FLu+{)0|QJ zlqH@`VZ_m;2rjJ}TCxh_kijC3W@cifHVGa)v7*@Eu%wVTvnG;OaU6(FwNPI&jr;VW z(mqo*gyhvEG_`ALHOJPCKTU>v#5t0}7;nx3cLyQ}$&YC;j#?}&iB5~y?-L2#I2GYJ zie`3&ufoKMinX7HiN*;Hq@)*N7_2K0T|2^q+pM`WGc^5x^*q^O*s}Zyjoe>C9kuHd zD3@Ys`Y^4qZi%$cC75DDL6XT!t@5ODL>Bd|_}T22lIv3^{SjnOh_*GSr({c$EkCa_ z!HK64uR0ldjk{9!AEN&Nh-8VKXFHSu}@%qw} zQ4{9Ave%jqeXu4@3*B8M?s`RP@F*l)PLSB0jTVf_s$HU2Q1*$*=^#M3Q3E1Sp-O7& zpz_^Lc{vEnfkL=hQ4`@S6en>hcK9qIacSsr`cznPJckS){YzqkiT#tsdmteRGbNE) z_%KHK{~+o;qnc{I_ivOUEtJp+H3^~j-Zcp&^rA=+ge3Hih=7U$p#%t!(7T}t0!jiR zAWAO*q=*Fs=_o2_L~cX`{PX=iFP`)EoH=Wqb@p7dXU|-pNhcXOq#c299!BcG4Fc@~ z#{5B0nmqs9bi39iwb3M%;Y5IVq+>{dn6u-{wAGLSH@?3y8l^hDINA8TKN?>SrH^s* zWCIDG`hN^07kkz~0o_Q%kRJZvn!bK4`FUYoU;bZFJJCNjfv@z*)q&Tsaxf>gkrfO) zR$l)|0XqTarxPMc`c|nImBAk=T@Naeo#;VrCfB1`!C-=$3d;eK$`7n5!TEs3ny_VU zal)SzY<8`7+=e{?T4t81=>0oFNY=Z&o9~IfHQ#y0gG1QHV+-jvf29f=90Os$Opu)j zYxe6D`!T|^&o4j24U6+(D%b7`_?=V-nrUMfGgOj1-y?P2lk4jY`4=AP=<4#gOBLmX z(FSskyidkNG82Cfy#)4=;LnoAc`G8TgY3#x$9ih`?KREa_=D4prbYaCT6O5wJLV3H zc8<^CeaC6roTk1A<^B`a5pxncz5nT)GN3P=QF29UJuR8wG-8u=3v(-31-Sh zgxRj-K}N0HM!72bGx_;TqkRqF0aW#6^RdL$@G9xIwwZ)KMwWCXJ{W3;bXi1D5(CST z#V){L=Iz>Gf2-t^PBLleje_o`)29UUI{P&qZOi&zO2g7P_$*JUFtgcAo-pka&&S_F z@j9~~iO7DFbIXT2@7gn2Ig1%)LrRm7rMNVCq$lj6N3pROT}+h=9U1mx6JO3yQx zBO5S1%V?+Sc`Baqc+R5Za0K`Y_3V>PWH>n zG}`&I?mL|nd!U;`r-*cvHFlg?sKm9a-M9Uc9k zL&0#yj~nBvfeXc2-vUs(=x6rIj^fUmwZ9QTR|>MS%UG)b4M3mI@YM282J&5D8_it* z7|88_1y*r+t>`^dqI_qBiWbzNG`Q^vCJOhVrd?Z-g(NOX3EjXIBfm1WXzYOp7I5Ma z4wwkSStlM5k)?>UIa@ChQOi=#>?cPqamI;7Qhdk`#Zj>LRfyE-K0=uGB~)*25{U0cF5%BR&W572uv|HJ>Z56$q>BcH6{8&!Rq#c=mt~ix>6b=jU86^c`K_7PM@?ed zs$(eFxU}iTrrzp^xWqb8UbBW1wVrzD$w4d*iRD+~Bq^gdPN6a*&A`x#{y zyuhZVrl%-*U~~e~eGxlE$i{HyLbQuEV?>t1AAyL;2NC)A#I#`zL6RO z%t_d>u{WsHc3q?1DK*SQJRgomSbctfK^Ea#ulp7vbV<6KeeS!)0=C}Ak$X@0BhoJh z-ZQkzyS0QtF%T2cSwqGVT%>z|?ePx**z14lcfm6HuS zM6Gw+><&t%$fqY{zqHrjv^-^OJlwik5wgHL(^9kP7NhMMN@O=lOIGbGeDy_SX4pd$ zQ;R;d+R4NKA8YhRu3A;{)u;%Md`ev~vMi6b<*vSy$ztb}HeZ2e4;q{3R_i{seUEgE z-T+SyxS;f}eB>=B8{w_41|dC2%8mQ#ajCsO#g#l>-zC_f&4~V|e1**sZ%lm(v*~V# zMVij{@l2DUwdXVMP_{f|*&Ul+V$+_j$skf&*q<6Qr9CuQbDgO@AFx69QTS^f4;!Ay zAYBM9Nk}6C;A0DhB1{3>+E8vi%_#!cJ#gRD$YHTuTKIzW(V8ja3-4LA)Fr&Kri>9_ zyi0LL&P8j@ZsOhmaIj!I%OU@ZpnD7TvP|Ktm#c0LCxosd&1$b3$9&ge=x>a$rzWp5 zRACyQtZ+Nk&y_De{>RW-3igjyF>y0FA1fNw+7J7CYPB2A)agPd1Ru&s%ip#95IhkJ zRdC~rS{}{fmA077Mr)X)+^iP+h_#ljs=y=71-Z8YXs3e!T~$F{ewq2UZMQt&_Ys)G zcQzDA+4dL$F!F0I;FN0yP2L{6rf3|PxdjWBx3?bve=h6 zU_E;s0NRR`l!9HXUzT2|wW;Ha*BqhxS)P zG%ZHum60D?)C1R$((E)h`-LLE2Upm8=6_*7a(MvG_W4fFraIHJlZ*wA@1esD%Ar;< z$br8z-=lN4whr7BnoXC&+jC2AygAO}o*z9W+UL|l;Y73geS<=kx*f*@y|R4)nxKIQSJPHDP16P)t3_3md4P zrY0Z#^bq#Qd(yhsmz1+)Eio+XyKVFH9|LRcoM*r*XMgQ8PnFyn)n7QPDZw^f_N`T2L%AXISXw9I$LI*32#Tg{<1`nx4HOe8&?(O zqxzc9Vdq1er zyN7($*3h~GL?Q^l^YIJ*dHz5cURZF|te*`bO~&e!Ek#-uMrir)yt9p$7(0@1r4?n6(|6C%yCjiIJIIb;W<=JG|_a|MCKFffwsYZKC@F zM>6zSy>?Cs)efB}`qDG%ka=@-XaRzzlaQXe`xk3qIkTqWu&O)L;98aqn5Ae^LGrwF z$&`J|UG}@ig#BJd3Ub?W+VT-I$hUO0q_wSMG_cSb5_&6v&6#v4Uh*l8Vr5&T6M#>1 z0J|ivUp^7nSS{~*oFyMLdCxXe{;HbX)7P>+T`KP5`*uEXm&p}BVD<|>T>0RNugHW) zi76C+IhKn5PrhlPyeAG+(z)kRTf7p!T3F_V#uwyuO89mwHP*2{JWH1!HKy|e`3^zu zS}!Cn2!t7xyx?jRr+#|0F(c!q^^4 z?B#(v57BioO3G}n(~PC>;ocu07iXT`*0oc(2W~`3O*WEVH6O~&Rh(5@vUu4a?8Jq< zda5`m0c=^K=_*@LCfB6x-(uT^HlS>`$=6;^CoTbe+Supoubw8UU1uEV+chv9i^(mr zdGF^u^W;gQoXoa)>CeAegUXy!k%g}mzEOY+X|DYmt0nvRCzx5lz*)(@U58~SZj3(k zce@nk1nV4Y*X?X$YKJBUi&#rZq2_1X^^F}-m!eY1`x-s&sdvovD?`Dd_a`n z$^G<$=6~4+k;pHbFGb15y={+I_PW%0{g9Z_e8~S)`z{AB4_Kn1O#6uzyd4uOKG3kI z7gS->*QU>F{US}MWXH-_)?!n}x*YiRZuWO{Z=M;6ARKe3ebpj4E~}(yewM7Q2n&5) z+UB=Zt*U$kZ1_4Yk+dJjI~ZJJ%A#ncwmqpabU&QzGM^bro%Ef)U|Ec)FulZ?i>d#2m$a|;S2l(XLGk^W$fnHkM-6AI zrchvk28ZAu@m+R0@C+nz6_MXb&T4CaM*0~D)YrF{ z>R-0@?GCs*ZwDzZ5bLW|?v-E>-XD7tQMZa)ipED2^fKR7=6YJDdCF&G+SdplkfMH` zzFSg|no@R^+@fe)-P1_dv#TE}eFAUV?dSiz(YIZHZ*}Y9QKIzc0>*y~SYMQozzO~v zIZY%aYBj0Z*|bH9jnkep>K53xj@56I-aO(lQOz&6JUzIOnh*EYFPZO7 zQt{u6p47fh#B}w&CB0jwSr0DEiL-suY%|a${$mi&mUT{ol{Si|-=@oQ%Lh$unXC5A z8gr5m`-+jBdrsxXcv*`9V8{DIr&ny_qnKO4+i{IvL!=@DS(Vv{o(g{<&P+QW*GBKU zfRdc^4!G*p5Nz&8O8bT<)m|2HHIsEInFW6+70)Ne-PbAp3X&rV`?lj3#+P0ES}a3} zf04?7xN^_ym&(v(xy;8D2 zZ7;mxoV%M{nC>fTi1gMyr|#l2x>^+4`A5vK^gxF9$2OtsvfHG#o<>daKEjj8VM+@?CcRZ*_%HlQiWjBt?0 zU3tg0!mL6Q`b22B$!}YT*>len6?jswW^)#KhOzxoZO7@eHUyn&l&3OH`A5z5BiuiR zeKwPqobQ+(dHiGGloe7!J!uq}gecie^s|RULCc&|O~_YZHO+|yeckP{oM}G=hjinnSzkT8IRQtYh?cf#lyOL~d4k%Ob>Y$*8J-k0ElF0L-3kn@pa@-YA zIZSLKK3Qt`4Cy4AZpNgIZ>KzFdU76ERH#f~%anxvSi2L=uWW&TX^{a+2S> z*M;&_8TvRW`1YfR*7eRsYvqX=Zc}7YA_1||w?u0oNenF*U}_XR_}$@7t<~P1-};w) zAc4glX%6o_d3p721JfOpz_Me7EK$vtORE9qRp(tklJfuPd^rL2i#+8&=%?PVdgC?~K6WrE_N4Lz?dt;yc-ZTl2sd2HOVlS?iE4i;!viSmGk6z917mDiTQ=Q{YQ<|bRBxFU6)N4USQ0#*)}q(MOb1} z_BC52lKRZRlulu*HQ1QuG`pXo%P`NX4R0b!Y7lG+0U<&ah|Ph=*$DP(B%3{jzI|&0 zXLfxRb)AL{X5`E7-<9 zr2C{`wSRT|ndA1g=Wm(SIN7@I=5CRpc*9b3q5tOHBI?Y#h2>}Dz`gm8%SLCrU7=P9 zciESkR3h+wrF|O_?HIHZ#pJfAT|hqo-5e~y#o=RE2F(cGDd~Tjz>>a5v9`rt9{#+V zp(-(I#Zvc&SMC7O_Z|6$b$XUzruI^Sp-c@@ZNVl!NjMfc3TtG2Dr zRwwq}91(T4mhjD^xpPjdMLk&`cD}SIvylRjF?)oX&0cxCX5&DDQfBg-;{sf&)sHM ziA^!}M`}^{aXIH7$J)$PiHh0!{M31sy^tZiV*YvCbq#3SZbtc!>BChmR6QC6+)ErW zy-+{Sw_T$4Iu5S0(3^-O-VyNHhp4UoK!gXC^H~WHLdKmC+`MGnzIRCa8VYL{@_8)4 zDaMUL&*_@M->HHiRAdfy`N+MEk~KS4ZlX2+j9Pc_O@UH-BLR+rvPu;sEy^hq8FV_?5Y3;} zw;wP&I7eWgd9QErSj||VTIoG&K~vwX;gS+Z>-ELfYDf5*Nj2!p$75?(% zYNyINpwte*lIIRyMQMFPIAc|}Z)?+ivT8W`PjXB1pIEURmGA3(;S~YDsF_)eD)dV& z{1!UN_Jg{`n-~zrU&UkF8R7nfru(Ar)6y z46*vhK$V@7em!lO@4ZO-G=;k&v}Z2OiJ;TcWohaBgN70igd;ISU~ky>ZVuzP)HqOA znf+1vyU;kL&PW9SPo|EeV_v@&I$kt&FU7JrBgu!GX?~9@gN?{7=XgHe%HO-PI4MZl zAK5wfTA6R*0$C3eejWy9R=83vHhf&5dmziR2#?;i{17xyTf++u=5z;WZo}$lmk*Q@0tOuO0&JE&I;a8U}&rXv=amyOl&6y0ES?_pb=c3auPY4O}@*^1Gho z!gJttnp3x0oVEg=Mu+Y0%cmB0==W|~=a(K}Al&0(cS;YTEwjKA_QeCRIMwK4o^B$m zTbUZn9a_2`OLCE!kmPIkP@)`BN}5a6QgscXVTY9?JI~*8uE^5$Joo!~sPlTfhQAn{ydpFuO=>4ag8g7+ZFk`&|@#%B9i`V!0H zLh8E<{dkN;Ov=7Q=JKprg$+3YOwf;pzKIt-#0>rwKVG{Mu1C}X z-9l7;)cFCqAxJm6hn95pl>WysyICforX-jNT@g(bc1+@RkbVrZu^CsB-o!3EmxML) z+!l#MJjGtj7qH0w0=ONFba#Dw!AlP>P$ikhC6W9FpO}zz%9iaOk~xe{t$nmSpFiS^ zjXRV_%8mBl4#81$dCYX)`+dpCIr6!6EE=z|O$2V#VG`CG^QYs)o_6djZ(7Cglv{7t zle|Vt-lhEqN2Iam97oBP&(UqD2em0@+0#YRVT6(?e1Y6{%>=i813CxG5~AdQV+HkR z7AP-4YZ9?Vvk;yvksBb5F9IidedG&s^|<%6UKlkFFyFGa?YGSSe#cFS=v`8@%UJg@ z(`_jOjFG80K`Goc+0zERC#u@zGt~3UTg?Id66UmO^NIBkoA5ija;4Qi z?(^SA^Wx+>;m;~TpfwvTeSFq`v>(&It{3YT9glLTLIYp$1p0Ez!Pkf=&8ftX%Bzl; zNl7&SGyXXB_A}W6W~g2`)J(}hpNRYw$|128Qx$=+AX}%tpPx)+Q=v0Pi^@IUln6>k zqLf3vMp8_&Z71+O0zDy4KIW9hP^`rP{5U-g@Us%o+B}W)3b4foorO|SVy2LjF03sR&BQIx{w0>h3m;7uHgY!_O!Xl$U~zsqT#;Y&1@N^X#Wj4Y}Qt89_1m# zIWf=f!Qd}wFFbaEg2#?k721&SaHlc7X$>vgn6Zp-9wfQOw-tZ6h};e?kz^LxqTN&R<#YulqO_@xs7 zrQRz`45E5INNZ9m%-QiDfi1j9f^S|&uqAspIt+v$TE>NvLT?mdA{@R2a z!R*g61HI!ag|g)uQY(ivtuiE8-wmPtsa3osO)QX1e7KKtRV}$nWYK<_%#A zyzL+JyZdpOuyCp5k;~w*AW^W>He6l!V5WCWnhNS$r5i{)FLDp^T!#ICZ`&;(HywiE zR;bIU`TJtP%CCF@6iE@(=W5zl?J@P*eu+rYnEE8XpjweYV%(W2F)+ME*!Cdn*GldX0|%eX@G z9mJum9l~MvKg>QnfohYDC$k-dmtpvRr*@_$;b9 zXI8H=byqG9laY!ruJt*}>V>nrijywfd z$uZpM4;Es6^@2j+x27YbvP>B#+0#TNit)15v80e$XxZA&u0*!JhJ0511ei?%zyZ0e zql+BZ2s2kj&TnH{nE1R~NR4YSalM{Lj+VLa)WgE;p7{$#(27?ip=?lSl zLx>QO41iKsC)j1jP6%>@mW+3+LAb zQDUJkqiVSuIQ7Rq#d?0w3_^P3muQUFPp?KxCTXAGARcLdEH3H?agA0m=dTby_tGR! zO6z6px1p>$vUt>P#wpqVZZamzm(Eu2&V$S6Pg$HFO=2-oK&kIO7Gjn}$Bfj703SLz zsEsM*1fV+)yo5>lsav0s)fZkZ7$UFyx}J=^7BF^?c4KFtM&l#(5mo3VXR(HEHlD&u zDF8I*`QrJQhDqR{2yI8=df%2fR3q56z}o^1jm6!(TX~&$msja3bA>kJ0Isu5b!R&z z258%+bsoiOIbx68yrZk4Hx!p<;j=k5)VI?StDBPRDrPHyT=0kEkqWZ_d-QY?=423! zHZl>Bq=NkK_cDDt@Rd$k&CH-%fhwVe)_&&lL|}ejb3ygxEEAmH#cfyw+bs0VhbBu! z!G?N%$`PdtI<(|WLDElkx#4?dQDQqBQ%IPe}=>jZ^(rXe>;sBily7$YCVMVdu=4Ha!hptL#p zI*J+nd@1l#LGGnY1d$pW7At*JzprLsQ!v`;nMI`63>tqZ>@| zN_~^D_y)2XOHXk4gfzEFP0y5~`@#&bl8hF4+N|_ws(zLk>)ynliJj1yrO1wMAS*Pm z+TBST$}U_jPMoA?@gXz&p(JZre0D@CG>pS9SziM%E*G^)hdI*!aH`kYBUWd^MwV7B z%m3|h;o73tqr(7kHZN}!<^X)NcGx6u^*9bpvpc(ZA z0xEba3K60BP^=O;y~b&XCR?HtaG;|jJAkb+Liu^ygyid#CUF8DlHE|Z9WeqR&|}qV zWVMb#8cQoym+Sg@g!zP)dhq<7{C2(^O+VR`qQ4Z7Je}AQu{YFg?-No$O!vee}o zKq!q;XjUvQ_-TeS5)XAM! z`*oqYcP?&gvp5;q^JAVGm8PwGlWWI3Ru{F5$UZfa^Z=Ixhp`p$oYbkMGs5Vwz+nYA<;9&mfJ;DiPa7i@HX#n#tho zWvWFnxe+{QSD4vC0zA$is8edkkQZMF&yN(k^W`Arr$Vx&R)F?cJXm^w2u41K-9sd> z?AU60=E?;{#YNOZ|B9ljA6ywwkz`UE*+#0%ty&Ya_YKhzC8R*oWLD+q1g%m7s&5Vw zOmq^&XJ`{Ppi}s8PU|_o9aXjR^`USq`3inGk`Ct(KNqo#2la)5txE8f%+hTtP{JQI zl$h=SvWus@a)f}Nm34TSB#ORU2=#V}(T2kXg`kz34`^8=IrYTs;`h)6jjR$8joT+& zlQ*gt1FG3xQGrv5f-(oA@En%448E-du8jTYO#YWF6G)jN=c}16%AqI8Hz5TSYW$^%?KF&eBTTm&VXins{L2}z zz(MVgKx&k2nDc8KXM@C#chU$hzO`FdE=UBv!H-V@<1 zJZ%#ui@snp5*snoVCQ1q!pr2gQFuoOGuRJ(o!gH8AVNgofo%b;c)_q|uOc5AlZFyw zhLb!2ExET62JfX%fiBwoUr?YUp4U>5g|lKS3>8*z2gqtPtuzVpmzgsY07V=s*4?GUoK^R;oy&;&}kY<`~3uIP_S(T~c1bExE zd{;^~yIZ3OL*nH#8$ZZ*>|@q0XwT3A2HTw8i4*5GPglfcJDI}{H3=_@9pp1CuVbuf zf55Uj=(rlSK4iZ1kJQ}t2xu?s{xV!;_G+@@e1Sz02YaUUi%c)KL`~;Sq)qZ$kl*i1 zDzEVDx#d88ep?aJZkj)n{FRzt55l9~qoY)my-PbTj##E)t_)Jc3kOg|tgad2M+h|~ zPLK7`dK+?tzn6J+V=GZ+lLrLRnKnb{SlTd;%57p%{)HOeNhqj7LfU!$`3DcZ zg!6)spL8^ncu8g?)F%CkrErLAl11dTDkwf*-%J(f$+L4C%eJrelX{ag z06nYb9h13*t91qPDz_UgN@w9RQu6wg2=kPoH=ANl4| zhp~F|aEAs6inV1&&>?}0?rMD4pYvmDl@Wh=oywU4$OV_q(r-m!pY^1NV7FjwXsckv z%-z(H`pp1LG3X@^SzbyG8p1BRn_-ST9~E*19hDjqgtX-kfhREaf`<{VxLmy@B(7G2 zpBqN;J3L&UBo-||-?P7p*z4*deq;j*A>gd%87JhDQ@7HBmr(U1JLAX!o~$K>1sAy$ z@~>(zvLv5PkzFXURG`Ux*dmuRU4t)h;q2eeTCC!oQpB=36NUw~g2t}Bt(SXIyxw*o z;60YH)>Pt%^>Vd&gX2h=Z^!Eo`fiq)=uO1LiL-ISDa1eKU3s%n&PI(HyxM{Ianj9m z{M3LEDhM|JpO-~zTYrO%532-H8>MueGpvlFABeW)MnEe?7>ViwBRoIne=v=V&@}kG zgHugrw)#6kWae#F_~4;1Vu3F)3&O+_ODwd9&=JtupczCrrkW*?m1>fftvfo+St`h4 zs&;219n!!CfPQd5L_vKzMI-#@UrE=s!+br}2d0@0eFx1(F*@nb8f>jL^DMsGfa7fQ zLd*vx&cLjz;pFFXN>v;P@$(qx5-M{unT?-Tki&1tQ#`+f=aQ7F+_{|nk?M#mwHopy z;yF~b=!bvK7~A036XuhBe;!qA&OKIcvHI#?#0^rD2s2tWQYG`p*8>h3_S|lHp|6X-cQZ6Ud zVSwBXqo;hIr?Jg==g&OFj^_I_r{d7#>a~xB01!8TM3S62*-)MpYE!CZ`4Lcw0?D8( zC1}_9c(eh2L-X&Md6wGD7u4vANcITx)P)bomRzh2dtIud>)&)-I-XKJ2jz5qKm;cV z$~4PFh|-OubC`bBp#3*NpOq+0fb1dZVI{weODO^GFD6;3gESfrd25p4ZAf&~73uZh zLdYF96lWq~4oidFK|vlg+t#S<&41*KSmQcxP37bZ!;6APU+{VWk*w-X7#9tk9s(0- zdG(ynwU}LkeW_N7#<0dE&IKYc8f^aDR657#FN3{nr&1nu&B;3&EQ+{gHI5^5xy5KT zA>8?IYV?tVm82sn4H;#y>x{@XX#x%v2g;)QO#*Tr(OnA-oURWVe)6vov0b;2}vh!4mEJW?W!4sUf zC9ogCwpnG`&H+pKF^&~oF(1lJV^Dp+D-`9fG~0XIJG zGbV;$qG2kPxh7Ma<9MTjyP9Rk%3?*h(|rao%%w_kFEmmRD;Lmrkx6}pe4`aWYy!dO z19oJJD_CE5UWVWAU?ti$yBVmf%Zg#ktFaCCkX$0WJJ0APYJVzM3T{P7M+aN0YyRs< z{t@=od}=x89GS-`r-&F?^2dHZP|IHW6AGvF^Zqc>U=JFQjx3TU3m>RjNm*gjl>2{Le9Gq^7nu&qz+kWO8U4j4~~$OkcvtqaZ1FNiRu$N3{6<(7r?hBFqBzJ zcam*-NbEBNTwdbWz%Km`ih?QHG!bG$s#AnQv%;=%8c`k+p7}99B&U%bG|6l-y~Jw0 zVn`HB@|rZ9Y5{K+$a#mC2^pkD)+5v23Hz@`J<$1RT@_YS#(T-8`Ev1O)LCy?s)5!f{12 zWfxjzNN;jY2u6Ft)DmLJV=u=QrI#bp-j$ zQ#%SzE^L@d-RbkGBbY-308H*NBDp_@CO|8U*m~?80)1;NZ*5<3EfqA)y12T+lcEE~ z1>6R|&1Afh&GsQ)^hA=8_E^KzFe{hxMPg(J6K#|+za;%=3?-s6S^Zc@$d9o`$%+eK z6(?Mzp+f~0lM=tt(tWVG^jl&RkO}f@QCFfmS)^D`cDn?6TTOJRp)VL$Z;^by!wD${ zl74oLho_-^4DN)8fD&gG)&@|NMc7sfRW3PJs(8nYXAkOkaEWx_qLP(XHFIF13PWdc zrU`L$=;bB?(#dG122@NyBr{ukKnV`(;36ChXf8Aot&>CYHn|ML_}cLo=g8Ig}xXLE2 zBhRmmr28!D%tXh{f}28op*SmB*=cbM!EMwLl`_Jrp^;x~&DzG`Dv;=tB4+#PecZ#3 z3}Bk$GhrWJfh+eDg@cr;A5|w+iweIM(!ZMPz{KuW&w5VFOWH*o#jIh8NH4q}7pBgh zsxi+5H0Rl{V%p;ge8}W@Ky*aTVzC|!=hvG#t-b;D_%Du@pTEfOgi?!Q@wqG%`F=L~ zK$2;&9Gc|K4eTAP$zWi_$+f15;{9HZxTCnPtZnAoTBKZ}TeD7tj!i!O_-0aUgB_YA z#rlZn9|N=il|XG7a=7$Mm{r{Z7#$}jC+<6QQLK-fW$hnBUqEs7#l-ZOs^V%IPm&F1 z(z&NGEUGdYmxWS!$n1CKHJZ}VYk5OmTbEpuNBDU!>0Oj9a=1^dF9V7oI6)(Yy*`c} ziZ>_aa1GEI24>C;OJR2R`J|W|$tJ=#lGua2qpluUvRW1j_X#N=_@&19rO$!QHF(_g zZiz9S5=C_hJNLG zMdr|wN@pL(2$o)%yS_em$9s0_+N1l;t%hIo(I55#n-GSqo%p7tnVr~XUT$Q&0O9&i z*6Lrq*!#NE2WM3@U7lyqOh2W64|tTGE|T&Y!pQxo)Wc1(0?pt|<|euI zE_$JQlWZ6)g#$B-6>99bE z2|GpgRQ26FB^(C7{ur|H(xh>t4C>yYJ!`Jt*w}zOW^?{>UuimMStK(q6&z_fpP9Xl zPCml)zg>^eJa7#gxiZ2 zNv1M9#m)OmmEs|Xs&41PVp7f(JF^Dyqr%) z%!kQ`R?&h+RuwfDa9N-#UB-`9D~oR23eMxGr!+Pm}eVTUG3lS`uC78G2;@s6U@Q zyg~jpo*!6!&9Wn}tlfm6X?v?ig4e}?-AxeEJ|wM<#NU#we|z8IcM#>*@~Q`~FsIND|txXx|TC!Yod8&O=w6)hD!^k-@YEt9CKLdSKkRtni0NRkYbua%V z1IN}y_Klaebq1W2IF1L#RNkB>pCYNU`woe&iW0;l$1{~0+5d81Qir$lHwQpd$x6yk zlA|?X_Tt8@&NNePRCm%KK5G)N$#|G9Gk<8-{`$b%pXr)$pdw7mhTQ)2LVnBr%p_Kp z8W?T@O4A0`Fj=-{UOaYY`q?j~VRz|OCB=F`^Ze~fUT?1Sujm4$38!>djZZ}VwwvcJ zFx>uNroR|j+}|t0k}EECUvrb$L5tiK=HseGd)Y7}EGyfB@t1wHo}*i)&9tPo($%0SW%c zXFF5t@sf>EuibkwFG~OWHXnODaVqQ8@{*x7clRGd=uhe3L+y2pR|VWV$^B{2+vXta zz|E(}KXR3uo_kF{^`fd^?=hC)M>I>2R@S$H9G%MSB8EI9Y&x@IZ!Yg+d zGrybIOc3s=M;C#*_M0E3pJ8NI8af4kzq!p9N_+-$dw!31HD+Q+$Yo0s64Lx+>vUdY zH%$D{F#hK5Zg@mrpAOXyKAKEx3~lC9KIArk;rV#S8_6)6$585B&J#(7S3GPHD^XkbcaeyM(ytfN3J}K`~ny> zUrYTIG2J?<1NeYn%Zv+k_x?{LOQiqp;)ff<56#Gn$}cA$f4mq6HS}4LrQm)J3APT} zaXmh@yD${+v@SmE`nn==dDZGTGk9xA9PxZSDEmcXXTTC@A~~lh91zd7cys7PIpJ^Q zU?q(2z^T{A=&(a)_rKJQ|CCUCi8;iBU~QJi5jTRA?U`!SLAF!3D%`yZ9!XN8u|D;?gSowh3GJWWx2GSUvON+vbn6>)mgs z;+Hrw&)U^0-UuALD%16hu$5(abW1zaXX!MwrB!~lQc6XwgVGE5K#v-YsxlEfth^<4 zv8UBN_m=ALbDZb*mJ8o`co+Mw zI0{ml??^AIYE%jftZQi5E&GC&x4O6=>?VDGFIYx@^_ywaNH@%|NU3MyCEIb|^R%V) zkaoTfuyyi`UiO2DXA!yGy+2ZWbSpEHe1aoR`;~3Gd=uBV2kw;Xy)#dbWNs*Yu%h!+ zcS+>>gl)TRn1yc}TRNkW%~E&a&#rGOr!pUSg?$&BJ6Z)>83w}tJL{Islm3cP6H3P5 zYu4e3+4EdiXvG`?2@}WRtIM`sY>P&PXXQFfNe|p1s#)bSp)j4-Y2RnnINU1qq^l^wx{Qp$v zf1p5~jozQX|1scJesR-Qd;T%tP1mP?>R7)!%A+e)K@Q=|n&HRiw>EAm9_D>hIH3DY z#4Ly}Yx2FB+yAUwF4;Nt%qh-CFtW%0j(7y1@LsDuT?qP*;gT`$;!WCxjUM39N%*0# zTF;A(&A%5etR3ik{`fZfd)1CW5%a$_W#TsC#uTC1aL@X0nNq~15U&*}{Dz)h?Bbn! zkp17-1pn3U-mjUP<`Eu3^Et7QWf7kdjY*5c4=wj!BA=WMfD#@OAF=l^Q;ZF=_cI@U z=^-9;SILFf}+b0LRA2Fxv zhH)1bEkg#S=t|%B6Iwd{_;2goR=d}=?!kp82+*y&<2N3 zd`zZiXud^Q7H&$-6Q9Qx7K}$FfBZK|4^L<2eV)xuY@-Y?e_}l=64Ad+Q)hk$i`@!c zkywnLjuew@G7bLJebA5PuX;;x|M;08>pB!M{$J=4ub_|(PSou&g7Y5(s5V)6;(u># zXBfVJ`(`vxjG!lVGClJ~=iN6YChqr*l}v9Fe&(7)=1twGYGCZdT!=#L_2G8g>&RoI zKm8Mn64sZz*{zS=BduObRNX`Up``eKnA&u^5V7FJ?K~%V3RvvW^FJqutniGe-1sbw zR|N@eCfKjFr4NZgNM20+)R0B6YOKcchL{gaIZtS!q3NYRFA?UmZ`-GbN*A!u)iw;V z|IIVE(X-neNUxe-)6>;2O9Y?!Nc*0y1N6CUs2uuZh@)Z=K-ryDi>srnk-zt1nHDX> zI#;7~3iEVhr!?sf+N&z-rq8AmB-j+MCNS&|znR{s@ z0a+q(9mpXYU3rT8D_P~R=Prpli^v22{|Bf*SHGvQf#V>Lw|w=V2TQE|vdceIc&`26 zgBT_Aj@QTJen-F7UzcRglHbn`t%B(30tb?qJhK_F_ym3#XX0HwK|6hs>k;HTv#tvs z3*(oPKL@ME@Z(8!eU5eI;4^$nzuR^Df4)Dx-R=I_AG7c;^q2Zu)I>Ht+1Dk!4MgP(?0J%k@$5V%WSvInHvH2(iPGH*}C2jAeSv(4R{Tf za5}-B*_XG-mkb+ZKcwB3_W|2y;Scd^{D3{%3HfF>MX!;^AT|s^Ytaxe8QezY+;?U& z9^E~b!+eepk`AGnkHGvF2=&|#W;%5r+>B3N-TIVvuE!e~?qGLqn0F)5AJhxs3HC#> z@lYPDkn(iwhl9>)2Cuaa>J?Ha)k8YS}>D`;!5I$|IqWD>`2gouX zEZ}{TCM;OpB;#PVepBRHn#FPbFH$+a*v_D`Vb$t90o*qPZ<4OtVkPmF&e}(gig)oO9`cr>o_Dam6GEUz+i_1zaGeRK?Xzb z4rCjgj1O@bOAq%v>OQUde=^u`9PT@NfbtR4&zyEXc_-Lu)z@YKtP0ixaN!|_d+NxZ z*f_!O5RZ_o3{wz6ChY4xa>dx?{5M#>a5mP?Gdq-dcwHSVDV|-U^3K49wx7I64u~D1 zf=Mopr8~X+6v!aXGS1Qa4JD)U*kBS zDQ!x%vtwU^nPhMiea1P6=j2$ft0c3&4i75z{RANv>JmaCF7|-7NEgPTZ+8 zIS41BAJSU(@Ob>6nDu;vs5_4n@Um`@?nh_x$50NxW2pU(;777GsQgG-3n2s?FhO~G zv%N#HzQf4;yo7qQ%Q}y7yHB^A=MORM?~t3t_BkyhfQadMzUSrl@&CjCCJ+Gt z0s;a80s;d80RaF2000315g{=_QDJd`k)g4{(eUB%5dYc$2mt^90Y4BJQRH33=(({L zB4IrC%vy#)s#7>3=PC4qDSpOvXl972TV}e7-JxglAwZGx#2upXoTg-c?5dW_)!|(m zo>_@`H)tyq`$qDI<%rRFeWHeTZqY8jGMrg`po;vgMJco8D#7H>`Pg2&;u{mFADCWN_Q3y77X^2WW&QY35 z?HsHg@JRkdw7;_#AF(M9!D+Ft${u6dR5)L0gJ;fI0rsJLSYGf)k@J+bXQ!ED-_FtD zXS75iHMA2v9IQcGvc2XmOXbBDsC=jXsukNuwDIq}Y7g3(0QL$E)lS?x%k!DFdQ)H6 zDUrZ;nY%f>7+s6rEel_GS$~-umG@H8|)o`t5Sfa^^jc1$8cHTDTH^%#e4sHQd7Yu=> zF#zm2-Nk@X!qzQC>Q;@1QmlqAh*mDoh~+hih1!^$GDHnB7>wF+h?Sb=R&)0%*AAn@ z^9rZF;#sDy1uE2To5Ui88<&!hR&FhfSsdenB_2D1R#|2VseFw`)8+!@pAoX-bY<|? zc#CPR8bQxZY0eI&7R*A@LYWUyN&~&F=GWjAOIE8y~SyY)U;a6T{-muTPwQ>oep}2 zOy``y$)tj4qr|nmKX7Y;R(^8pn#7?!K*Fo)Eqd#@hN|@d8)AblJDDhGiiLMJ z87?NcYdy>ier1h)H5@wu#LDsWG(l9Z-4SiiiIAQ59Wl)rh4;S^2G0bxl&+;_$1{}8 z8kJxL-{w$l%+d;+CQk+CTY1;0R#x0p0qQI@eFV-jR4Y&1(AP65c(cTE8Tsl69&b<$ zR+)j8uTWby!~#9fHsvet@i0N-^C?^yi+LC(n_eMJU!2Rjr9X+ATQh7@{{S+Q}N_wc2@`=M2)T;)v z@exSl&vAubu`kD{wmZ}g^#lcmBc_dU9&V{M7rr30al}zhRiCK1;-R9Lh}kG_fMwQ9 ze-L0dU3rcWvA610m?d98^9&4rXBSw#T*lgk;A>vy8@>=A|@ih;VMZ zf{s4rlw-zYdUGhI?3Ar#V(nMxh|y@~F7W!PfvjrkR|dL)MIOuo@vb6OFOrv>)?6S>yfNmvlJVFzV8tO2r^$#lgVnLh1Q5xQa+{uCSTtx!i^0;fF z^B08NY$+vV+(Ok};yQB}WwY}P6|_z-GRhcw<`m}%X zlf269arkTfx0Mla`N@AfuBAb>?KXt&jz3SHS|HK&W8O zSVe<>hzoRYsFb$9HL0OjoEv~>SQ5d-#cZP|H!_zg&lEtx%nc6VM;NK4j~vb_^C`;n zH*K1WvigFI_FP!oxnkzwLb5E;Q$_y(% z2~{-Bk1(>Ayvh?dL@l=bMQUJu#NC=|QPG2&g%;>8rCtjTD#okk42h0bBAg}4*5e$4 z5DI4;HMj>z$1f9;IOVNN6}4A>CPLXB@f;B>*mp0TpTu}qV-O~`mOSVfrYkJPUnuEP zfWYCpjJHFKN)U5(*5ONO@kFaegMuxpg0Hqxa+@D84k4p=xY=RHm}$y`6v5CHO?*oe z7`Wbr_ferl;uvfE#eprO<_fFYHm_Esklif1<++caQ;FzwZ-1#!5;6ZAQZ{RH-N7YwMruKTGdLZ zqJQ%Bf;Y>K7+p?J)TP6p5lt|4a)o-&a_=vxnh*+X?xitT zZtf$S{q80V;4@@5i@*T!G*Id$RTAo|0c&aLhSK!{-Mn!Gp_|-pfoQx;H{g|boM&;o zTZwj3Vse{G%FG(3zc8D4jz>H|ny1XXZt)IM<&wUMM|i1Z(`D{qUSoPt^UT3^#_Go3 zbGAzBiGI#=0AlYPz-`v0-I&w^o68ZQk%^!ii?ZrfY*&~nf}7$19i2cj0@AAWFjgt^ zncz1L{{T#-T6=(63!Fs@U!2OMJrsC=LfWD80kbRU^*I^onRYY4Wv*gp9L#H#JPB2X z`GjTzcrcoRGo_`wa!bOl1Dk?1uFzMA;#&fP$EaumUR*^NGsj4x_<4Ah(#oT7r8{#P z8#vByb1NKsK&>)43~)n-abdQ^DmtRDK*5ed%xFPeR9U59xoJzQ>KR?9ekPhT;ua}& zJe~ertFBN6^mB=f4!Ly3f`W!yxKWF4 z{M@5+kT~utf2Q47u-lNrt{5zAn{*lO}L)LLAa!_*YHXEC=K<|dA+0%G!#wMI*W zg0DSYMKUb)2e2_XGYUYVW;{bQRJa!Xva))X9O7?#fvn3|m>_L<;sOR4&ZB!GAyt8h zgPt*+Lh&+&t6POEdek<0BT7s4=5RTd6=&R`JML}C&gSgA>Q$7&?JasBcVBQVTEoPo zddv(Ui<_KUYY_o+%b0?mWj0ZVh%~o&>KAWaO#z>9*G~*khV1E<*>}}S)5KE2n4;NL z;uhrw3RlK_%v)(ULs4X=%gZ!S<2Zv>znN;%QvksGSYZfys8(B~cqRs$XEQZzoaQ8U zB~nv~R}%9@apo3LO4=2r2Hl5+*(~^mdo`k6{~@6^C_xdsZhn549r%|#S*gfH*QufHdztJmTtF* zRkY~inVNR^XExP4%o4Mh8$%L>R~|0nu}=7a3!Wi%lzWat$GLQ<`j&7XGT^1+q2h-w zE;lrV@&6urE?MHCx5rdVLMHZ~@6M-yiK zLt;igMF%ry{D5J1im0Y&Dr_;D(>zvcWaf)LTV2Ek$p{ zz9~JGDpIkEw1Y0M(W!%*=P5%*5A6$vqp(Jig1SX)OWY+?&p2}^mutJJltpB?x}))i zCZait(fY+Aecs^3I$&E?PZ!Lrxu;X2^Lg<*!!Rx{xmR!8OfAQmO6M|*b%}*k_?gHX z=ebCD^AMqC!iWZ5D?zpe7HO*^nt33r9qtGV12F{|#-kN9uAngKaLv>z z*%WKI5DKkz66h2Y^9p6ls>D#M5FxmgJ8a`kYAdF#hbCgQP*5)`E!5q#T`&SLGS9e& zB!Ey85y`gW*eTZ)aw)sQJl%|xaGHX7lT zlQ(g*lRjX;7$qpS<22p~qGt^93yOwoIH{MhIdd2^Jw_K9_Yg)3D#Mtz4b*rE+bp9l zS(GapbBLi;`-ukJz;V<;TPZaN#j$ZG8^iY(j|O1H#Moz1@~;Qt<unU#-QjUlBFm`VjE|3H+nMI^9h8s&aSHx#3 zX!j6G$BBk>o=632G^^1lgs{CvlE#^JEQ+@}T8bjfHX%_wO#M0`K-#e6YHWwm4dPl* z8*%!S0aOkBBLonvHQy1r8H*0ujU)$HN}d@@wp%lG{mPIu+gHs-Bgm?MnPm@#equ3L z&9PeUiU7+1JnHy!3=a5n0-jC69S$-;vmyXCrfK3)u-)Q}LPX%*d58`S+`}g8jZ4eP z&Ba$Is8gCgrb3(>gINaVPng!+vERfE0&%Hg$lc0p^ZSD8&v=~Eh!hp`606_^&y*C8 z>UwxPZdbtg;$s5lnEHGfj~TD-HZ3i8j}Q^Y`-oUY-nA~}3(d+0eV%2FS1r`K-=bq; zuYolgc2ez)j~?G}HEw9`7PCXwb2b^eilO--kxez95aG(JxLBL(+)#kIPM=*yV6f9= zQ~=-HOwgdiD06ne8UFxgT9;TEN?rDWV&~<=FkR%0CDAc>y3tW`XPWL5YOAW1L04A= zfzw(g78-b9yHEuTuoaVS>|s_Zj1d?b+lg0GULZXTYp8?U4Fq|s$cV_bOj7KYmb6ke zit1V3g*b5p_FJps+{!uzbA)=7G}^bx6rmMay>2A5I^Q)c?ts_NGK-BX4}pq`s>>Wf z<4JTyJAl){Dub0XxQIJnaXJR>2WohC0fAnkGuCVvSPJi{h&$@#DvkHzCM%Qf13Vg7 zDiq(`&>k)~upyY0Ykp#=p#R1CW#B(ESEwNBG zMWH*R?peF8BB5J#r-@^0?gLq`;sUG1@5HvvIjM9D;Hj!=pW+$^@Epqk!x`a?7iMzD zCpMuAzj$sGSnGx%EWNm9j8fhDgaWW{9mH(17?yj!BTEH)ZYvXtx;TLrv11uQ7TVq* zVnMc-jLO=shN3DmtKMTvY~@|ciUo5`USeplFUOV_JFNZrgbB^rPG$t!>G=L7tqP^c zY7SYJ?SO?^8p9t_0lre+_=4noe!rPYE=0#Q7l0BUCT2pIV(VJsyg<`v((IVhimjUW z^(nNlp!k`xi_2W%C|V+^dNcn3C4?pi1X{OF?7k%|Xbkx#3Lc56n2j~Mg6+M(a``YD zx|h1Q+@L2WD3}&l-aZr_QNUP$%}+;F6#D1r2ua4m`B z6n_z|YSv$}IIn*bg5?a*FczKgR^Swkc2qZ!UxX+E=D6Y@Q+!_&72>NGDCGv7#kd$! z*D*1$4K5P3MrBeO=Mhz9w__8HhAYGr3UJAPamg3Y7jOWmwJ1wbOD~TMQHn0JnU)}y z#_al*D4D{BE-`h87N3t%tD(lnKg6QK2Gib|nD&C#2N*rT$&-+`%|x|69y7#mVVm1r zd|bS>cG*V|sBRqY7$^P&qK2uF-X)C}Id>R^GrtcIUAhTwiryF8HZoUKYT{(2RfWOA z!F)!qJdWss2QICdmrIbiTK@njg%HOh3Kf>$Jd-4sA1ii8Ay_83l%RB(fE@J#z)I2U->b~GS^VbRt_LE7u?F1oh(&Rqxg(U zr;|_*w_M^GF9GXtRL#|HqR_f^1P$i%8tr$c<93ObdZ~2rAK<+x^a{{+&$B zt$P2Y`m?lPb zkK9#;%lesS%Boo7Zr#8tBc4fNO%sFEGCMw#9EA=-DT3+L+zr|d>)dE<&Uly^&WUyi*W3UPd;>x;|jo3G)uFt$a$b`ovVN>LX&? zxn%{_)=5j=0^LQBKg!``ny6d0j-#x%>NQbdaR5c`h@}_)5YREyuE@S2Wu}ZquLRfM zF|mTGt%z&`+%sz>{7sfBqgK1~0-f%>`j~0Mp7XeXJi7RqmJd0UpozM9o6>Ha_bWX2 z3nZ3k<_4R+?kfiKS~})d6ztQ)%fk)LC>pGLg$hGYI+sdP`Oe@Bu&7a~a2%U3!6*vo zx|S$a;`dNY7y)k={{Uc-L6Em8FA36G>y^!3e9I14t=CzEI9mWEo&i)PYXf`POrQmx zpBE}nrqyQzd&89&U6>FlCmmH+h#&yt0d%hAHiJ43s9yj|2aN6hyMjX3t9z+!j<>$x zYYLRTW5)ARr<*BD5LK43k#Q_2U1YW|Jr>&fhA5ULmFhL_^zIa1Gzr|`ho^=Wp|#(P z;x{Pc3@9iS(}`7xxelCxvwam1m!EOGPVWrwDnjIhSOh z6WjnPf5(Y*pw06zDR)`GpuS}ei_29o8ZWuXCKCSu5|$i)1gy!6YFgQ9s-=md zv_oRFzo~9$`InLZ0NBt9zc(qvvAgprb`xXVWH>faDx*BAQP?$RCt#<}2DXP;;%bHw4bkZ!Uil@S$We zb$4GFGv-vXCjm~{{N@ROttbYwm;yq^i|52rPK%=VEC9A-&oau3ZeUQL!#{e63bvKzG8|Ri5gMRdc=r;mDQ5RTlu; z8kL|6m>{*id5+hdeM$*pNMe!;-FRG7oiJNAqqUIfmL`!)6?h3}ogsEx>H>Nh>i!VPA zOM16H;mVsG%k~TWL_242Ye*jAFl;N5puD*JqS)9s%o|%(n#V9uV;*5f428;Jle7NB zN>GB}(iCu&wgJIrA!8Rtd!lR&u03vG7*MPtlLQTp4-mn51_%4*BTX_XtsnasdpRoh zf>ehFvCJHp09TA-amiq%cBg;D)__GB`joI>Fx{PTqAg)|#~QkemsZ082)eTDulqzo zfk-XkSeTlnimhRP+m6^4>%=K}T#GvY0I&e2MHa8r1yhF@E0?k?#cJK~RZO>bnl7Ta z3}E?}Ls-b)GTL1=ZZQ)Li}waHP@>${p@`m`Q;CwbDTJ2N+-A6qU{OH#?l>(xK-L$$ zN-whTh<+uIT}4FzQBvr20c#W@*lnw}R{>4X?gGw?wT}=S$3(?mzAVCKjexcbnMe1E>Z}42dgY^}OhPX)Dqj`IZT_-a8ucJ_0 z10V7Xn%-sDw@-1#=k}>ZFK#}j@r=Cgqk!Ekg^U<6EP2-K^BqML@?zz0$87Ly{l$(> zbC@e`y!e$*7ns=MyN=kVu*amNO5lTZbX-9gc`O74-J`lS0V!-bJA-lyK(|fHFTk9{ zfW;hyY!xZkOoFG8xUH%M=T!hDAZL?(!ogG-E>wY@1HW;=$uzg|2-^i%+r`2K6xHR< zYF&}Q5M0$%6|6d#<-YjT0lQc@p!N4HL0}hqDo`k>p|?IN{v%KcV5V;F<^qda-!NV7jUUfD^A=s1s1M$ z?eP^^N{25#;8jszv-yWbQYh8_6}uG7TmIfu{46fv1%L5Mz5#1fO2$02QIQiS+~`A zl}QUFJxdTYbG8M_(-5FhUgaVKo?xNfoSZ;eyS^X~W@xkiM$++|l7-(t)D|Ic7ZQT2 zTz4p#=r!Ur#TU;pa$R2jW1-eSm73Re{Y5fg`2)_qK~%q}!=+#93B0{mxK{)?%&N;V zpQ(#FH;JI4_|X6`UbBO!oCQ+rZXdX+7g7gUjv%#Q)Ni9$vO5DQZoXjxm}0+7paaQA zh=F#L>v81h$NZHL zRz{2Mr(YLQn_>+usinLC?l0vtL_y(Kqwub&*BD{ zvenjZUH}ZV0=NqQ0A?*GO)XK}bW#RT)?Ne9p`HZ?JMe8j=$yJJPIc0>U1acgXcME2nJER@MbyjON5wf*;>NcoR zt3vAKlmG`ELyH>$o|%!RQ2CAF;e5qFg}4h@-Xh*m+jRnkILR*3RUEuA>|_>+uApY3 zZ1ul<>8S;G2= zT2&Wm#2i)Olx>_Cg@Eo{hn$c$W70Twua2hay7P4`WS)q=dij@Yw>+XZ=G(!#B- zP3}64%N5&Q8q5?B>LW(3{{X05Um|L3yG;{f8pLUoym{J#!mrePf8{70kSp?$QPL2XPz2&+`V=sA!5MRvfKB z5e!*z3L^5xsabBBL==Zi*xWa=<^pnva9EH_$4|d2M7BxDS|4j{s>jt zp`2?q&%`Z-63>QIx2)Y$SndmrfHpIij~SU%q*?$`hv$i9ZOt-^(V{S5WzMTKV{EWS zm@>TI_YnZ)&AQDu{_!$dVmPk#>vHs50!$At_bR0{HZQoc0v)Zf*Wz1xa7au*Be$ql zL&D7NU6x-nIuw8fah_#w7zy&8B7mzC`Ii<3U!;ACzoF`<+hLBA{!xhQLAyD zOb}RjYuqfk#-NqIG{6g=w^@Jz$m6(IORsP?;f*8}3q%J8ImD}$*GDrIvS1o-xoWD1 z8m0tLIx4nrT*O=oVCd!+DmSm?3QZN$8TpL^V1WV8W7*>?VQ1yWE7 zx3<5;YW5a|vpfAuhQ%o3IE*V7hWCN+Z}Acv;uPL&%p_i^X|V+EG5O4@EmgIcwJMF%E@*S+Wsu^zi^FSa zdYB-%!Fh;84s|sU(TBqsScWinm?oEl7sM5AlG+uU-^@qV!&-IRN5lD*#Qy-;urGO6 z698uhwG)>f*`|STMLatCmQ!!QLuc_3q`x~c8WtDAP*PpD2qUxJw>+(#-r|)RHptKW z%)6!MRSUcE^h?A=yQ!E^nLJg;QB|uG#}J7p8>;3D0@y0!>&_y;rUsm6pHm1>FaH1| zY#=7TXfo(Dyq@J~Xttmj)_q2|b6#v>R>}e6hre=_$)LAa&9b!yF?@LbZe+a`mmvkE z0vTw-{Y51MJp%!s12La=*233 zb3(v{E~@f8nz@ajKzo1kT>xac+U@&_H%3honyWlRJAj}nu~+z*F%s->_EZF=(o$AN z&&(T?u_=Gpn#JG;SlnR6CWc;wUMPs?9r@}Y!pPd(Gpmrhuf$e9N2t*vtxRX!6xq{J zR83mpQoaG6CMy`l<8dtyuorE>r~ptn2-O0I63z|PYnhZxgC=7sCTi{`?YZ=6Kh z;JlHlu`sypS)`$;fn~eYcHvqB+zTtL64o~N71NrO8q%N{Z;g0>X>#?7jg{iD_X=rb zN>4S+Zs6{{%cWLvxBxYFe-KK(BStyj%(u|*xH*2%Y^av_@fJAvVJJ5L0N5uq)nV#t zA(j4NWczU%4m#Nkh0u4HAZP%_U-7vbi^;YD6s-$qzJP^*$|_#$XRWaDgd67?8;#iNEe=4}mh{vgpz4~@r4lolXb1)EaU z`IZg^%NWHJ`L`826?Fv)cD=F57LV6aP+|nX=3)#h!0v8E-_{7Dg}na&u^E~S-A3DS z%idsLLtR0T!tJU3#8^L_&W~G-Rjf-DiZ$~q3=cfwaw(RG14`;)DnoH1r@;I~S~kwf zl~B%VY~(8+66(=!iOvvLw&qdjJwO9%j;@9-`8Nw0KQAzCO2O(OYkn$Pm}cDmrh`Vm zGX}1}$JC&QY=;rcDSX$=Yz^9cY9nL?v%w5w-p%BP5H^lwg1B4Epwz~Sidt8U!)nxYFC0E#C~~kW=fU@1Gl5}BMwZ7fWU>Sr?oU0u&4_X^ClR!thj}icGP< zLuZE$B8#P1Ddqr>;lZzB`{g|FLDLcOTG_QP%{5UuZD zY^iZ-sXG28C@&glJM$W>bXjYx*-%>*D1lX2#4P5c*1*)ggG`;vl>h>}cLB+<*A&h2 zUAP+0Jwj1&$^%zi{{XQO_<&$|&rsNgDz5JT0Ibxltc8AYQu0eS9~AlD#Imq}C~J(qK45@> zfV_gg-!Z*G2UKBuPvSIjNCn+}KOUlO6*TU~`SUWG0=CofGf;4TYBU397m#aJ`}vIv zh>ph-65T73%D(u8WU!Y10B;cDvl{-BeAUEP> zXO!W7_rMz%t@ z<5N&O#d(ZS*c)2$1%*t5ajtJ~l3;}1$|~Er7QxnDnu6c<4MVF|8JtdE)q->l)T{k4_4~L$q49RdO*~ zfo`_NIN@-B1K?J!xtq~Z4s)yPFR4K-pmJ5Z{$)fPRhNe~+-0d-HAB^Uz`IinYP%B{7ctC8jKi8O`wq6^8D!vMTaLpLiV;`8JR|hTJHF0D@ zqgur^Zlz5HYVT0zM~z(AqQYTh#^Q>w<(A5i7Z&GxvKWhww1!o%(G_skSG3_OZm)?_ zJ8qk{P+JAks!%z>{lUs8%v8RRE4Avr;sx0E9)YyQYpCge#X_e}kGLn2RiA=gE7OcZ z2(T57=}HbMz970opEsL~KpAO$(+!|q_39GEn(w9O&Ixo(G->npkwu#MI{)9Zx@4@VNQ!t>=~U^r3W>@ z_?0WWq^xLviC{*>9Tj-)rQt${-O=39^D$~M14C*Yv=#pVU)*y|kpq=)?-u~b&{@kF zDEo_IQdfrVJPaANYgxyM>(Qfv_4druP6F|?d_=U#O=#;i7|9lDf|4j?(^i;G0Vv5= znweE?iz)NEU?+701z{{SOo7O)&K2oEOxaSL3^VaNNqM%CrGsI|b( zZ~p*dEc&V0wp z354spZQ)o9ORvRdqRlqd;xHiz*SW@raS&0?Uoc9{Yuqz3cH97hA2Nf9?)!sIUb7lM z0hN}RX$2dntjbB<4s|au_L`RhDzi)%VZzi`4OG&YB(C60z(H@vE!@EHwqhl#UJgjj zA%)B4J1#Ofy3D=-i^YP<4o?VY+<6B#c&tE<6PC=xutIqm#}Gx<4|wx0S1K`8=UvYT zR9R_zR*gK;{{SRJBBK_&3*AZ-!n^m>pbEKd_2Op*g);eL1Vvy>w?=3kotz@O~2>BSx4(+V30grXbiryT9=py4VWU{J=0)b9;cK(9sX_#+!LM9AkO> zOG1HSo8}u;WLx(zD7_eAdi}!y3p9-|#GnQTCP>QCxpSGjwTxycws<^1Q)A9hV%j$c zEv0yWP`1v6n3B+FK6rs$n(3*0V$I^=Q3|@a4gu5Sx$`D79V>ti{6(tzKsgSu$5jPDq`s`XH4s>>uwlN|lv5H&V zgMjDX5zUQ_llKyr7z%HChDHJZ0FTd@T>)mQwi{r>aMg4F048z;mb#~3`_#MvnnR+$gGBL{E0Wa0=PS_XS$Q?N80WGQyZ3Wa=9-jq8eE`7CQ%?58Xk zO9#_KU%5(yh8)EeZNu9DO%%(fQ7(8$G=UAexs^w~2gh+stn&W=Fq$E%j4bc4xs<_v zCS@FGPQZ+;tX|2HZJ`o^giQ9$vqLEXlip>J6Wj~DAAVw5pz2bN>9gVl18iNwiD(w< z9LvSp`+_K?_tb1}136*<3*^m1xS_*{QKz-1)O5!RdG$97TZt%fRM)BDg7E;MTg%R7 zY$(K5-O}Xc3Ja5|k_%1y_bo$1m#U0X70tQ$i!cYu=5gjq@M0XPl;l$zS&(dL*k?>M zTNQP7xQz-F8s*GV%NNjlm9#;4^ZuxdZ?JuBis&umZ!Z4;EDeRxW?W|f0H}l|3v}7G z`h^ET-YXtt(*u1PDX4lb*s&P6F6AIH{80TmMOh{W`^qBzwTfn-Kwl{*7X2F@iTmw z9T21@tITERmIcMP-$!G$XHxiu<)HBjqOxzqwzZ!=F4S)fWd%YF@b9ZeMFdd*@$9@v-`LT zPj2RZvnjt&Nx^??qA^QWUHPedHNg6TNnwM>{zPzT+gR(*#4sqGufTL}XQ`*}{mi0d z+VQdzB9Q+8&(s9;VO(O&;BqfN#M!uX60VDscBH4t*Sm!UB`oY;2Mk?_VcU!NV--uo zZ+X7Ae-X8(C3P_|m8J^1Gco~1C}^^?a<$ks=BeNNQm)Wl4u9Xwb(a-9(Yb?3k+Z}g zw7|8E{^F&QO7Olut_i)k6la6<{@}a?pw(&He=S0RmP<@HAKqXESsoWy#lKM$6;l*$ z-}5m6K>!V$4)g2t5wTh=ptOJFP(XGq>E0t$D<1(IA2%-JK#dO|RB8q7byOPhK;T%~L)go~`Jn}hETa-rwo;sL;X<7SMHC9l|VJT9Ijw+Yh_ARV`A%kOW~lR zpSUDi3Zex8Op!G$j@zy-TE>kxiX!fntI;cilK7S^&}H&Phk)sLl+knt?x7kLCnlW# z0KO$00>zEB+)xTe>8I~AF@dJ*m(Q4rD{0>sd4}r6IN~bVYNh7&{yfSVw}S6Kh%G|6 zw<5FpmC0q~*|%P$mW-Gf_x%1M7Ok`~tp1~6P|FK{&*BOcs#R7CTff8}((7n9q6ArL z{{S@ppd*GcR%mqsvL~NQnqw@Wl%q!<(*!ILvgxEh>`*9L1&v5H2Pk#w4&hKVTi=WbK+AZ zC*S`7AVolE;k@``p#{8oRANH2Qw^*u16zw>v2c&5>17US`IzRzX}vdDzn{z$g6Cuh zdMsDbU+hZJ4$cc4M3RmGZN}o{f|4c-@f93^$&#h8ptd;w05Z1t zf`ic>09feffA%LqD_V2?<|yT|7`>Iha|XZxOR57O?q)Wu0jD<#Fc8DGb;Q?c!ce=> zQ3qtxbzux&zcaAfU^&hFL$Pkf0_mT7{6k=*MJV9k{!HFf{*GVy2~Z$c!!;Xn$})Vv zY^8`TzC`*dn)0?u|_4$pi zqW4@PfLLRYEBTo!nHzZ4PxlZM(8BJ)Da;nv*@qFQg`;o8p^0?tw~twvKvmZ5&SAM^ z;_~D73lKDEk553Vulbpih*e&e5*AFco5WgHuw7sK`j!z((yM>WHVt-|T|dXvD}l#+ zhY%{zTV8os!`S+kJp6uP4F(5Jqe=`J`IUv|WD?S`cr#In= zq8%1iBl9OM8}1s$mw3GM5hzM4a)Uf;I>c5gZRM#2K~ppm&wdr3p6*yTu2sL+P)!ORnGWs zXNV(Y+UkbRxBlEh#S3~{Q7aW%*bV)VEg7J%z8{!%J5aGdo==!mY%Qxe&SPSj5+%6m z8(h7K$IBursP*>{*L2J>X{8T+X1gbb=TcNS>8 z8gkPW08oNpPaXZl6^kmIIKS!yLXhy=gAX#vMFkn9zs<13D06n4{Qo$8`V|vA25_`0OK{Xp;{^p zg+2F-!th09Rs3~K;VLY=^wiq*cA{0a61I~sXL9PHr7dnT0Q4RY^}=W{b*~hi^+VI` z-^EA62uC*(f-o4}qSAO1I=W$u?vhd@1x6dh2B?I<=!OxJqX&wPk`WFV3OYn?Zrbm& z=O5TlyWa2XbFSApNAXqYGXn<#51U=?v5Kr5_;>gzC!pGdeslE%)D>$^!lbJoO^_@$ z?;I$7VnuZeMG_?y_;u9~-LKZ0hV__o>fJ0lX(u{goiR5k>Pa8?dlv?Fx70yzRk&yR ztOy*koBa$qBFfbb+iiv&%%v&4qihq2uG|yGDw9fQx_=}8Gf=dA{O%CLR`C>ghU}?$ z*u`Eie{jei8odfL=sQ)ZT)n8X{gWT@Uv_&JfMXx|({Y$G{C2dmw9aF%a~|?9u)fxu z>3O4ovbJpOJ(llC=Xy(Io^^QSG8tbw5&l8fTS;OI^Gj+?h{7kO%Dxy+x9d2^EIv>K zuP1`kZJfS$x<7qhLCxo#p>Z||Wdcf+MY3>l2lO4>S85ZX+bpgp-WHTw=KhO^dfCZ@ zPZDjCb=Nu%v5x|QM!yLD_78d2a8s_#J-^S2imEcEtS_&IBN}M~8XCvRGWJ5!C@C|@ zgknOZY_Kr{jWH~|M;GG#KY#`+dzHP#YQp13;&d|B8u>#+P_j?)l)~Nh5NT(^uFXmQ zeMEtr>Dm7P>%Dnj0=>UA?-quQ&eFNO>y21b(5Wjv&r{!MMD>JWE%iH|Hu|Q!0mpeg zuiqi90d|TTD(`SLKBZ^IpVO!A0+ZIEk0FU<@z2iQ-+QoQ@~)o`)eaEK)OjsRGF%+L z>_t4Bur1(r9{DQI0TLY(D%9o#YXG9o(0&&0V@1y$T7SRSyOnDB9mxtfw$pQnxa6_< zVmk07D-9AIE^k)o2H*1dm%BUEk1d@4IrG+#Qg^wgy|pZ(_gP+X|CsPBcrPcQf|Er<$VQ*&T>u~^f@(d&&9y}=7HV(}3)ZFm!~m$Y||g#Y36 zFiupGrYA6MZ6C7pinoxMqDtfAiUUp(k+zO^%?%t{LmD#8f7A78CMfKCwKKPkMw=d4 zv=_Qu>ABhlG*^D1+es0QAqohIJH(`7>2A9YM`Mme9mnm_^K>9P&?w%rTy z^+BtrAQ5F`Lo(4sKy_tnb^5cq5V*X>y$SsB~N>Hh%|zCF-a);b}HuQs~A%f9#U zE~VDlW{2?JbP3NTHFKU#S2OvoaT%x0z|t^~Ugd@V>M0Vx@4zn-wv6Qv#H%mtT_YS| zqWu5O4BF=3)z|f&4qg@k+i2eYvUj2s$87I35jnq`q}brOfk}FmmfhGddk4>7|Ea+! zMV2lreq<;}FgAvsRUWlsqHgQD$R%`T259ITnmy%x%ivCHETZL(8F5+9IRaReCNL+j zH~Ph)V_(H&2w+Zt<$umo)8*V24JT@!&4#u1m&PUiTE%0&J0mAXDGlT}tJ8cALi#0| z?D_VD;Fvwt3Acj-^OSqBFw@Xz1TLc>3$ zrTmesG_0ZBKY=(pJ=KofWly70McMECTjbhV3@Kb4r5M*2(dCKE28Dm3>&c?|O?bfV*O3>eGe}VI;_#>;C;4WOWs^FZWvs z(?w(9ZwRUm(uI^wn0UMr!jcQB9_9MX7+Kr~6&bARXZ&DG{4YTiYRJ*rg2~N=mWLwJ zSU~3cpGoqmFK+rIzy?~Y`gx;HnM())+iu^}{s@MgSB(+sf7yO0+QQWwsH)|k))lgL z&-j15+_#wm^OgU8W+ouYLH@LNEN$2p_2&ikNlWY+B;NU6}WQrJ!^}lrmG`!oFuf6Oo8}{x1`pjg`GrBA5aD7%Aj^!z!DR&_^%Jn`oUhbRf44+xH^*16{+akmb-t%(LaKq8IT}3W=93O1KbHccH|A z$>H9lw-Ig7RsHIseQvp*oo6Vt!DQO4>LljZ?>-{flB7PyA6$o9q_sD$n=)0zI9wh@ zoI}#%0QlkVol5T`5~_gi(Yz;K%k8&{PH=R4#nvIJsHp#lMqVKSY&RT-?GziaBf6P^ z>Ql0m7h;-&!mTMvs7k3eE?y6hRP zG;F1lmreOsZJ0^T_S*wH=$4fFm&PXsj@0>nOe-`CAzI6}@Hq zO>jdZ$EV+ObQyt)oI$QejSoRz`KKS2AN_Q*xIj)jtv_s2WfPEpN7nffrW8@AENe-< zB+E*g!HyeF49uz%{#=c)Ke{fnHyWSTbLJ)RzdSkRlsh^_l#RG)rd8M}>aHzJH<_16 z)q7W9Wx0Kilu^v(%LsJ2TZwnD?YfSB5hTv#+Hegrd|6}wyAf~XXxqA{#7X~#A*i^*e)NpuJJ?$14=`Ai_Z*@E&S?OOM)F>(2?LxWFKBR1%!op zoG@nz$@Tv+>g?(@zD#foTZ7fu+{bzFDVy<8R>7JG~Ih7WM!b(Hcce!%!4``P`S~T zY49p}J@lT2V&Mz6^tXQ#s#`2zO-H>C*Yh0Q?%%-LKxNtZ{=2w9Ff&rW6iOfGi$tfjW zXE+U?go@yzO~>q{LsXQ09pL=AuIVgDqg7vH@+ne5$M!@)NXX2F;e&oMWQSrb$ey^BQ#%>DO}_h{|cNy{_l1 z>HZx4jsNRmnHAhUb|wn9)JwR(ir}flxi0gn?27Vew2Ud)>y4iNC2~2g#$@pAk)1(y zoNpiD9UYSC9sCw|Niv8TtC{X1XeFXvxFJ_g9j^@)! zM6jd{7`}(twzyRvKKAX+>jM|8JnSXY<1r29u@o3YS~x|sfQ@-|PpQjsLy7Y9!||rC zdQiGO&fe}BPFQJr*&>Rk5MRF*>rV#R$Le7Fa5@b~ysw0b5quQH!ndSA+AOSyaQDN7JH=xe~`87F_ldpaYMoo zP8r9}g4PRy(q)>prRlR1N0=RFxYu1XTW3n%vsL539+YpC=~ZCSnV^9Go6X?j`|03SxCRnmP%3;d5MHK|~ol4EKB%SRD_i8K|X=4=8~T`T;iP)V~u~ z;dZ5V8#j7iDXIv)6FL&0L$7=>DAT$?5TH%KDq7LKuMCV2%5>k>@jK+5aN!7w!Y}<_prkVV>^!@oFlD9XWX@+edB7B4R4UkUeG2^U z$nKGvzgyt2wJ|(!F##)OE>#Wc7E;5S>yPWoNd2FAaxjHOp{>;7Krb$Hn-;iXtwKeYU7V#{U2!6g>+g*5{g>(n+&7^Qgv z{}gA%PXh<>w0kH5Bd0lbhd6S-k%E5TV}dPxiTTVh=jY~8Q)E@@0Xg=!8YwItLwW`A zyZC#E=bL050rbvOs01jceg)&JamDcX*y4vFyN&1uIw1j-Vl23$E*sp`iy?o%K+@P_ z&}J&WIYjM|m;`S>sP(qFLC}*!knxJ})hwL$UNml1cMaMBXr3%AP=7v2<4)oD4EezqHCG~&YylVw|G`5HJ3F)bEN1zuf?h$y~hRob)gFKG%Z&hlP z8QBW3G=kdr02+d4PkvI#dYS1u$%fx>45)W4>Z-X*ULyW1i$l(O|CK~+|1ACr$WD>3 zK4R#7A;kPvT%P=2nQ?&}d3P~ds8+eeybspNRCb=P+V{+i{_h@V;jw~dD89`(kmFZ9 zTAqyoUHb5xpseuqtk8y*GislwuEfQx(6h-NVJ2SbHo)HSRS0H&r?!i)>)sn_w6c^g>w~G3)P*Ajs*6ZTkn?s4-hU=;&exN zu zw(juBuo3X{GV3Y!o^i|q5eRUeAvlcddyNcsf&ysZouMYA`^-XWr%cv#v*q$VA4t}$ zHvTWciBm-%5J&WY74Es*z>e^ZEd-!UYZ%5vIe zhCANJQK+l$DS~@;4Y@!4V;Is7M5a^9;1z6D|ASqZaDApL zllE7%qa%igIppeq_kanE)t!@94@#AJ!jDhQF0l4c-NZ@(_ZVGAOy&;8hUvUdH~zE*{M3-=-Gw@-3KK_ zIlE($0*{r9vMF{!UbKi_C^{M2d_y_;UGL6>sI`l$8IJ1!AMI09Ql!Te@ABxBU=~s`BXhK9%podJq>MS;ADanRTvY z_X#1ov*~v@cVFA9v-4uvzlH%Ko;A8xCQ|@Sn!QtMuzAH^V%;03hRO{|dew^YC>2%u zk(>a!`iIiSO4RISWdVI2VO@@}xu8>JueQfS%o6 za{hmnpYL$L}(kl%tgbZDOnGnw!z zu|R+KVAPZT0ul#CcBXsq_F{U8p$l@A8ATHBZUB{l<=<48?7_j_cH?$%W;%r$uxS6_ z3A>zg>gV+ZX+gV>+9lNcX9f3;Xg?pO(7z&~(>Q_u89{02W~7f_b9Zg?YAQ^&D5ZQA zfeXo>S~iopM9)#t6JKzP4fSa}q4`kQ=(nD?u)PL(R$8f0b%m3QWbgJP4-C5=FkpLF zwR2mo(bRZqQSf5~LA2Z*D(_)w+3X!iwTk`9D)WT*gjLZrM=g1n2#+o;+3}-iOsFd8f_t3dc^3tm`_1%&!y{Y;fo(j)I;;?N!tPwA8c6UDhC}p@h;cOs z=efH)&Id@QPPHHz^Iw0(!G0GcX!_huiavbf;z=c@@v)jfllVrDC)hnKy2!H7isa)b4 zanD(4Axni;4)7pg_mfOprilNd?`E>&NTA*P2SIjs|CiET16fZ)PbDpVKt@2Rj zEWme5PYZEdqV(B>D*L8mlin1)+msOd^wB)Y` zm!dOH5WG~9)vkcM>lnUs;+UWyE#d5gt5uV?yGC zZX!(pdHYxpK6;9ReTgB7lX|hxE*}>8+3zQUC9K-yyLqSDnvVv| zS5WtNq#X_$$JIX7kIWOf_I@!+Ji*B5+7{#JnP(G0sC#@ni<>yD;onBp-E*gC+bVWe z6ntuQ-)VLJxJV)oJWCQ&g)DL2L>H@nd1o2y?e@Z5a*r*XE~`~J=PN}0t`9X&ja@G1 zt)S9x&EFc#Rkz2m&QPf`x!`TPucp!uCZJt9gZ6hsucpd=7;{X>u!R? z-rr=;<}_7E$Nd%4wd0_FbTT`v`r{B~0a$p^$Tx|W<^r)ExZ~98%bkRyWYG(c?h^&0 zgNm;%kZNYaTq7w>)~eR5`cN*8?e?soGmQ71+T-OGvakB@4@5O19+^gRIi%Bl0q|0f zu4PskYhlgg^6!&0z&ek8B#5KsnWWN2h zOpT@tzsLnZ>`$0qts5I=w&R=r2dI}86gpwy;rQBkQ!AbNRjK2Cxs2y2-Ip7vS3lh< zlbuN(Txw8WSbc!(T)?SJ?cYov)$ssT)aU!?AKbAzK72MZpHm8oEOZ$dpA9A^N(V;oJX$t)Q5G=7LpW|UG*2a zeBGz`0Ot(qy`vLeS(Oim4nyanfEtb$Kwj<88&e)#1j=Z~O%xa_1sxpCj2X8Y~Zs&4}N78A_;!bXM#FD$B6`tc9 zJE`ima_1UP!)NvRYMJOZem8zM(+2bDtnMGW&0XaBWON&MC9pul*wYidIF@|Mf>*D4 zt$};6V3$@95M^E}JU4vRgZjrQs6{*Jm(D%Otculbdu|hOz(tPUs{xyGkh`#A@c7Qt zL}i>2Z5L^YCW8Cd9v0MSwnkmM zX?BP2)5f-I^&5-OTcavo^?j$B<(DatC2`A^=jqgfL{Y_X>M~DUbuz)yi}26Rx^V$R zg3sH#`#%!mRqtZN37wK3Ilj})R5RL+ek@UPEKi$e=TG!xN{ zkO{5AVWH+Mf<}fX!Ky`^uC3=b0@}xKRy43LszCQ!cl7YQ@LbnwR`|ta)Yqxc>&HwL zUtS3sM0cT54pvOKSnd>;_dCQaPE-X`R7is00k=2gL*@5^6B!;)`@PJlJG4YQ=0@+w z6zM#tt)r%K+y_YI@w%t?NvnL}(tT9ypgTtAXb3B4oew0*t=%R{rtwdN;cm4Eo5+@B8EKe4 z%X_aJHjA2WSML5XV_umj<#i~m_byNcXQ$c_LJumz7|AT|H>ludjzOupQW3bd6WUsC zvsXNA7KaI>3&%NA9Cag}i~4I#^N&5UUkZwUQqDHlZD0}q_;lcq;7mVy9&g$c_`NiZ z2~NSztD7eO8mEur)2CjszfnJRqTqLPU)7G$mVOU=V3Ht~=Qqj>QY{|8`ii&&(Xl8)5D%N>6W zl;DD+eLFEnifKy<*`*%Y>t{)f3-Gi&e|fH*{K;zop`cw@um=NIcto3%5O97#5#_Wp$5r3c;tjyxaZ$JK3z@HL)V zXNh4i)zZ~>o&J78d`-5t3~K3pT{1oQUV(q+3IYg=~mXB$yKt4QsREzX(7^H{^J^#1z0i7oc6YBAGh*NicR4$ z^S0&%x8AGwvI7i^b_Nq3;$E12-FT8)k%nz{e8q8CObh6ze~s1*=Rj?V9YsL`-SsII zKFK_u2j&wG6X#dvs;`uC|1VE;|V(m7j8Gtrnb@bc&lY@KDrs@>yi z46DA!ShdydX@$Nl%X8Z^Zo?WSyAUOUNXE zjfdEo#n?k*@RhcC%nNj#YyssdbUG@cLUgVHaOe39tZxr2P@lm7&E&eC;Y~l{^zk;8 zup#9nw@XBWMGR-#KjV5}wHTbRrwr&VIVf(Q@wYqLp{>#UxuC+8nUh^?EpGTKus36W zmlf`znD{ZQX54A{%`lkuJ=zLjYhxragtw8o6i1u&&sqYXF3z#`rTKMP_daykP_8Dj zEe!(8PCtkc2g1I9z_RkNf3B|$4RubIG{jFvi-x;%Lbv@U zeom;pjbwI8h9ZO9pSPz77S+q%>>YOf)|MUvvsgNYQiqK4JsZ9CU;WuXVO5`sIsV`< zr>2?VMuPg=DemZZ_u~Ezie~EPV;*R*>%0D~tO#?u0Uf4p1+eN0a{)$9m><3M@nM3F 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%0D~tO#?u0Uf4p1+eN0a{)$9m><3M@nM3F z|H7m5JQ^a_gcXPWEoQeDlUx7f^e;W5x)yEbbb6;*mb>ET6)n{C(`CehO!}^R_KdkQ z^lIE}npbBQb(01{cK6e+a5YD&>^oC`-SM&YCxm((L;a(o@T{u-JQ>jx&Noc!kR(>y z-%VAH2~|SN{R+RHF%sEud?1jWV`&-Llidqn7V&wUo*ykyZn`T0uI^w8nUbZE#V8Li zhkwf3#L9N>ye~|B#E6#-9>Suy&D}@zq&~ih5oR7J&U}@dkxP{R zbmUC5{LS5$_O&KxnrNv3{$;hjW6zfp#_fo%3BlI$(df@MSLtWP$H$MAL%H?j)r<#y z78>E{Y!H4KCEi<$&z7q&^@Y*9Il&`!W?DPNGY7qSW@Jr)NupRxt#GTW9MPpMdv5&M zQ`F1f_*mk|;{d)3$07EYC{|W?VHsI8pFE0w6(tJvB z4a_Z1uZM394B_oEv(NS{BRx`cPX!f&YmBA8nb=1Btcn6O=f?PSO#i0Z5p>$axGO`v18ic0q;<>+Ab(JS5mbem=D9Fs(wM9~WU#@=l zE|%5WB)lGz_B3yv6H)kljI-IJzME5$7zkQ%RI;pDbk$LkwW%Ld{^-r0)NKAWk8U%w zcJqK8&HxRTWALixcxwyQ&7SAOCyAMvjmQLK#`7C&xjm>0wF#C1*f&UNs}Y|k+t$71 z_oZ@X;W9qrEp$vZE)hjP5UY6~6jL35c^WV-V9hxfi}@=IEDldRA2 z%zWW?0&=E-9A`!dX^VgBYd}?gN1IkpfU%s)*k4 zSfu>dd3a95pA-7kvarHI(FMccUc9Na`Bq%+I1@z*pL3vB;Apb{XP?*^?Hx+{e&_xA zeT04fdC|9~8KsboQG=v@F=V@1=j7R zW7_Ssvo$R`2 z*}3kbYG|C3hLoVd(vyKlT$;tqj8wW>-InwZ9|%%C)8}+s9}Tm_i7;#R+ROfni=948 z?kMtO6EdD@T#^zZLhKXx3(Wep$hKx#xB(-lyPvDa>occgdSRZ(QXYb=e5Ys(dyDn=hu zvD{F~zD5snFLTt(iFYJo18x+DXFDyU4cN3o{=ygTQ$9?sLGn?S{ar*DzxQ8lRKXs{ ztVv3g5^FFz2Y6omI0@K-4Z1^S^~2i=Et7$&+n7a(KNAz-gs5z<0#Uv+Nw=CkcJ%-+ z3QQwXF540Ds|)3G#6}?+*k34-dDYP-;2vwhL(yl<-am)oKCnrp??of}o%=M_>fCZP zOo(rfn(z;#Nn8xO0=gL17sWPLU2-dPOWyE`7VQ+H?3s;k-DUwF6{qI3G2mJ|UtE-V zsHM8<=%I4Tv~G+g8z?l$m?xCuJ!+P&J5IULo)umzC++ls#N7Tux-dCMaT|%$f;$J3 zSbuy(q&@G~)v!tiuc-Xa0ytr+p6(VCAidjlG4Xof_Nz&OZ9;DY)>fuDgel66bT6Tt zqXR zfiNjN0<}qIyfHtDJEd)hDB4?g$`N&X)hs)?<1`B-qJ-*UO*O~4j2eGQ6BaJzJyz1j&o-UBcS%yG%x0gWtz_6#KtZp}Rp5C~~HqUqU zcq4{a()=DqP|MfY$4Zvrwfi^rdIJ`E*BqlbW9LsnLgz^8Ax@DlnMSQV8_5$MwQ1gH zOPo{VMapB-wgR&>LWGO*0-}&7hH4hETKj>(#|9LyVoBI)@}DPad}A32HE&Y5#Smm9 zLzXIuy2$naa*hz!YTy&pdW8Op*Y7aB$aStF0Gf2RZ_iYIs4NJ{Sr9g5pfhVTiY0PO z^R2+SqVkB$FSMEAuCax)FTIV{URgpEUFsA*;{*kUur)`%$gPw^_C3-NM`hex3~N$5 zqQT^mqRJH6dCABVI812jJyLl@#Q~}0sPYR<5v6!M(jIu?W&`)dxa|>QC7a5-PGt3# zd+_~gMxK3OmF!vWuD`3(e_!7UpRRdrD^!{Ro z&OU-Di|!hl%Gvz95bq(0x-CK0he`XP7g;}(Cw^qFY-LQP>aQI$+Ji)53y*wJHe9Ca zKF$0*4qgt;g%c9V8DpBvVVL$syN^~K%=11TPCdOzz95IUn(u7k>W%VZJh6FBEPV z+e4YIX2JO#_z~Mu+^2vcl@o=t?jW44@LTu8qrz>NGe;| zdU-TL|96;~*|5prL)ez(x{vF;z1+Hf36|MDRM96hFrrc?%p1|2OO-YF=Tc6G({kEU^1=%erJedlz4ko!eP{y{<$9e$POaE%Hd$?`iUpUamU zenXi`s^3H)xE8*Pp*7jM0Ms7%CrXtk@-Kte&6ae-HaJARPm~8VkWB#}iPlB@NJ?a5 z72AM?WJh>aAF1{}$B8?~9&bnohM3?G`;X(iCumr359cq$cw3Q*u8a)ln(=_`DK8cg zbNlo7B&{2c6(D9GK!O4Pja*{s^FQ;o6tI4}32FwhQ1#tZ0jh{Y5}dR3M|$lHX(M9T zVV!j@E^+Fjtm|KJHx2M%&I0%$gU928tGW5ySLXH>9b*1ZvR`wndo>ezglr$d241D) z2%^E8Sl9DywDLQg)lyeEe9v;&1eWbgzLnLmi9E{F^hvu!*}e@XiUy8Af(L9`0W-}g zqmFE}R$Z4#EO-9CY*3UXTNbHC!)J@O>4>HKJL$ZXITEwO;E=ZPCO~DY_ets9nZpVK zFe&iO>~$1-cQ%gNE|=h=NDFMPchDNx50QNY;?Yyb2e9Z@H^v*+GO6>AI~nA);21ka z`)8EU?0N_%4n?1$l$m=jl+2^;}0J;A=Iay8~YHQLu69Sh03+bNHR98bX0en2Mxy#GU7u3E)PLIpgSz*8?mw`Q+L8#+p0ZXv@wV2^YkZomw`js2(g7Ta%Y1dL&2vnm^vbi0{HQNdDZIC3 zkr$465uTkK`KC1l{)+xQ|HJqm)Up(FDDhZ^%0< ziXg5acuEVq&MvbZ{yCC0jPzF;Bm1q7CeN#z@cZv8i?Au-qO0a&xMX^IO?aP3Y_E@X zv-lh8LO!S5>Nlx#R{HM+4NOY(p2y1n09;Nh_KNg|q3_PqV(uYnjPjlG3IoZkzn&5L zX7JPu-{|u^vzQh4DLP~TWW2V>E^0YaNF0uLud}hWN0sCB4&Sp+B5OvBdmsZV?kd#N zd2oXu$8z|f&-WW#Grv4YykWJxREosj{K93-Tk>=RkjGKgcEtH8nRnrYHPBeJ$CV@& z^4`O+I#OoVdmlLBNPr9!UK9g}yPvGBhBY~}x3M3)9V?VpWyNBUDJ^g+v|E&Pv+F}5 z6O3+Yz_9g<>}#>WQ~JzBl(-Ft#8{^fkC?fV1qx}@TMGJpGftQfh0bvP-T%6L#=&<# zlc}Gp;JS*7Bg&4|8o&_m+!>+QNqbnkOBJF@Q|UPNhOX(7WW);}=o4f^s3p5@2&aZN zQ#Pv>^trL7eqD3`l+h#~DP0rmAOv(q3@qjTOrxe;US-n#&4Vq+m&3Ttw`Q%GVty#- zSIs!5$fZoj(4oPWf?u@kvdNaowCOLN@AgKQA|MxtR(F*GmJn5L%VE7ikF=DIpqDTB zH%g1C)7#?>cJ?wqPs@Clsm@DG$L+!sD{H6$F7x)71wyoz)BfjxSEGi73#@wd_^9AYX2S$l}W3=^99{szgA=^gj2z0eRM{zqhSJhMH z-vTLavTzLlp5-+x13xo8PDJvbA!fqp-f;q%T}|Ch-g=s`xwiFZY?X`)>B4}BpsV41 zDGi^Wd2h6{n`HCJqPF3V5~b6R`3Moz7o}ifiG4QtD@EwcF;tDTuS!((_;UB>5v}j7 zYPtdAJEAVW#a`81p7=_4)v>YHf6RrLi7{n9z{M}v)(CX34G-C^_t;V^bCr!H#MNge zLr+oO{zUULvnswuE{7W@w9thqSew||Y4>t|9CiPNxq>uX4@Z^OrlpXoSZ{&r>5bPi zP}e)xMy5ATa4DF5P1`cv1M+SLzx$os-ytq2`rX$p9Dn+q429b8zCMmu|2Q-WnG~ff zFK`-64KoYZ)6|k}1fgOC`Mm27?g86Y zQRxlkz8)pn$0rCiS^U7IEC;40qO|CC2T|gNOQtt!pvH;pKXJt-x%^3S;R}lK3mbd)?!m)zDVgZl>Fz;KTl-*B zZWofM)_2&gP*I+|52nCgg&A6=x6JC7sz(RNDjX;#2j(6epBABxNch^# zo8OBB0?bA&ch3scn0?D|0vrcA;S6-MGn=ylT^Q(gskmLq(q+nvnpuJoyyXt#Pf6E@ znen>J*hT?lNiu%_KCb`4>jK(<$%u5zKo%T#gr4E;YysV*77Z3?Fsf)NE=At|R3>LL zqQU8+STbutB;lLriO<8#D|B$1p?5fNSa`y zo$veXN!rg>z)#tEoKXdmriuF+4?4q{RgoU~R06-q3D&37oB2eC4tpB&GeVsEB(~Ki z+CoT3ceId=hlQTV%`3t1cDKT=lH-pfxVFfXRfq#W=D^nwCx|zuoZ%I2uuZGuGnA=T zBOK2CD1sslLp+?w-t%H*cd{zC{fPgCQw_+|a!8FhhlA*~RKTx(&4L-^y=ffWAqmy$ ze&f1pshLL4!(;0_y!d&1zl60GNhn_>#TBy$9*fkTau=+Ov^C*&MG{fSkRe3B#cRnB zu0tV`75(Ac2asTlqun|XzO-R(R?yd%qf!@DM3f0lw0y?v<$En=GV0LXT=i{aOdv)a z+AxjIDy#%RZt}`3iVH;V!$cQM??>Rd$8~XMg*%N4nWlWxU`zQa@~EENz1gxC;*PCp z4zk+FTDqojeLk$+X5}sC*{fAO`xc^~n$AyX3Q?N%=+jvIY~ka9R5n z8L<=^TIZ+jtr-!*$v8j~&Y2nA{5u-F0sXXjq)-)?_1UaZf0svbVrjOpMUh|CfV=)_ zlHL1(VMVlHo%6#HBK;PGR!7$b_G~h&%Rw4O-72-ziFM<~tIeEH(Z}Apo6`6Z7zcmd zm(nyucIwJC{kfr{cqeabp?#B}uWpd(uk4_&{y0Zpt(JY?HSnIeuGUWJts}^|W=#d1 zV+@x@nAO28;PaLl#-v>wYcE!ZM`w|nkhFm!?c%-i zCKj@p!IlWZQDoAeNnG^Pzm?W! zA2r1{4zI?o9~porAADWW)M+0w)05YF6E48ZS~6G1<9coUHJ1fl%c5Nt5USQ~JM)?U zj;R4%2(!!Es##nHMG+8?9MtY*+aD?cyFw>G7BEe)`CmqGSH1Q?@9k_`+ zX}G#%9*jE(f}u4KJe75SM6?a$3PIGDet22WibI&{G%)FfhV|(#c7Vzs-b9v0#aNy6 z4|*TBRA z<2x(1CmJV$L&!Vus*80BmReV7rR`3VHN#Gao?(N!+XpxWLNi}$|2(0k5+<~bCn6o7 zR#Mw77L$=odo)Ntsz=ANLU#&y^z7m`akcpORU-d*xcI8D2`Zowsd=%vvOQruZYzxX zdt&V3T}&@<=od%W!IXt{a9^f<0}gLBAqAa!?Q1U+?Is`YE+ufxC2*0}>f=4&Np{Vb zBlPgxB;OXqw`jHy1AK$p#nJ{QMhS?;&=F9FVE${wbDO&i1cooMMH8V^YzHU| zW=SG!yoYmLj~-GNgQ2niqrW1g+c)o76W~_)8aG|KliO-nb3fxY!J@bmZ~JQqUqR}) z%w^vqy3oy;A3S#XAWH^87Oo6seX*=Ze_`8KBx!JX!UK)>hx-n6c{5X3z>O$!gn}&> zV9@?&imM8Z(@lJ9Qg5-t{{^2CVC|&1!m7k8yZ9oJ-xn4cx8R>C6B&GY?6V`HncxuM>^usdV;_ z-e6O!$ihOitjtI&VA-5YV0Q=uZxGu&9I!gFX}!xxKK(!x9xiBL*^SKIOa^nwN{r zS6Taj3#!u<>J4$y85?Jdij59#RHnJAgNb^6<&Y?3iFVfhr5-n5a`+@x&+!p`XYLjm z#ql#K;HavIr;_OH$Ed9eFvG+TNm-g`7+oDVQFvT^XyERlhUvn9NLg z@exxw+@k1BZW;?+{Y-AVzwT_!mHyOJQt&d3_ZITX%Lu2$QukHVWZm6r1QG0A7l(-8S3eE-3xAmA4N!bW8jV8YfX*3@N13R837%Bn%wiyGiSaT8ZOm~8xCkyD zVewOmqjfS_NZL9yO}~a@8^udwIGPr@+-zGh5w==jd@HEfuIeCb)6dLM+m7bL8|C#g zoBDx82OrFK&|ioPX^7IAAS;n&_eXJ7^BrNLZO9sm;_nfSft0^6(BT+vP9{BwAY$=l z;^(=8yEiVv?@^-Iwm5-7AORa=yHv?CVUyH$Va3MDVJnrmfTeX8CxRSQ5!AVvuI19L z-LZ7}jZ7HaqS?$1IoumXv}*iHjxkwvPkv>_JyaSl^^D6}E;Ad?y5rmhQQ7@GK@_2T z2Db~SADuwT``n^C{{XR3Iz<587hY-|?0Y^X)r_$Q2CE)oi+lbiTG9Uiuw1S`xNHY= zJ*#n2!`!o(NI6&%?ZiHEvmHy4;N&r)8mDE(k_y4R9FgfL*&Z&q?mJfcBYC_L2xc~J zv8#)88pNhkk27M5Q;1Z`yhE}70Mb&%@zlr`{2rsWA-YCkG{6wsM8$H=RmT#_Ry<0e z*fbs7773_{8ARBFcR1nU6CVybL=v{{CLja1)F?#fF%@2Wl`N^`s^E$j)MO)`AOa6~ zmkdU(bSa7;mBhHg{;1+7 z+&~!T47*JMRTy4*m9w?Ydz?e_3X7KW%z56w5fR`Mf$I?NYa(N8c$Kp(01Hu2Xj248 z)CG?roF+#wBb%JH7xmmKf{Wr{X&I}jm-bFo@dg~0MM(Dj#kTgtJo=QjqPnm;mNUF@ z26BGkT%s;JmJLf(a6w3BzMyJ@UBeVE3%haREIdu<^Oy?N;#F$9gGUDuGN{U#FI~aQ zznJq@9^nFtN(AAARLv%Q6OR)pi0&Pt^)F3oIfgk{W>yan&Re*a4V7A$xwFh#%W-TQ ziI#PnguRTw2J88RW|;ezc__qt>_2&kU4;G1_N$i)Yq-`@lcaN5$NZVoDMQLAZQs<% z1MYrY_Y(`l9Mq_PD7au%UVrRM4OxVg9}!mPJ$%GR8J5cftLo<%)BH_?vS273If@P| zO*IZVuf$NZLl}W&zfgUM1h8`}2gGtRH!kI)Hxw1$cNaBKZkMkUZF3L}6qc_HO$<>f zeD(Vk~8MwWq%v)a)#K7(tO7_lWo{g6h!KjODk!iuQJ$H30lZ_GYlU>KW z4yV?c3^1r640Se*L<$=5Ef}KV6A$~QWNN-5kDvPzu>Sza zwzbPSZ$0^%Q2oRLrL)gYcP(!3;x~9K>NTxmcrh!@4|6Hppi*7b)P3SuIk#kQNth{^ zNnwn6mlFVTUGwS*%&uRr66_yP(T(Aoqa~2xo}u+y_bxYnB4Y+|DMnO1!AgV}jtuS~ zH(p`fe^TuSYypbYx}OZ#tD{pTu|!5&vz*FHbayhLzY?-DRfqRJ&7aIvInO`z0V8#TcMx@KnVu zRwe|(@$O!T_1wWG^wfBqTXw)8F$D|tae}TcSMwPA49Y5tRx2{wOx10COHi1By?Bks zI*GKa#^9>U&1wL&9^uBdFvVl2w5=Zzy`6OxoxVGiy((X(JNTEZw+~PGb1e~ElVx?k zhy$$u0N7z`wqP5_pNMSi!n{{Zv7Vz9%o`V#}zIbMa=pxf?-!`1RIln728GPUMsdHHV>h@qn=8K(%47##W79J1yi{GB%#M#T z`Kg#qfQAJPO6bka>oW3O<1?dmxl*;_G*_;ovcmd`pb1LRxsCfb91e^RQ%|xLHWe(R zzZ}G)+)EC-2#YjhOA5XZ{Di!Lm_5)^>2;sX{O|jl`@>Syapp7n@ADTW(dHdN$9Lj8@tDDZv{n42uQ-2FvpT*eLq=fzDQO23VVLs&0C|QX zv>AkE>oFZIokqH^P#Ko_j)I&f2FEoGZ;aPbQlr*8k2AnLbC}_WG1?YBSwPEdcf-}g zIM2ik6pUKPk1)8j6H$-u5}C)jQkU^FNo{$U3zKkLLtio5<|az&u>on~+F%0PO~f8} zcPb}Yg(=9m0;_jXRZ`mXrfOcherLWW;;z#2vvIR87>I()xUsqO4$W&+!zBg4qZySs zxyB}fo+=9SZR6B9T-1D+CU4Kj5n59m!XljFAO)I(O@NLVgvT3%${*${d5%?=D=oYp zV;s@){)Dvq_eMok(Ya;&;Cqvj&huJ;}Rl{}b9-e~W_ZyTHH&fii%v@7G#gE0>RM{A zxUj7M0PJM}*n1`S4^!uvoR(gOzlg65b3fpZRaW(J4tB-*i*`BYCL4aclU>TJ&C6P&FEK%IHz`unxq_r867rdXAdGvvBy8f~t<<$OVwrHJEPPVsD=Iu=q<#Ieg9~f3ACJDxs1(K;E%F zOT?(h$pLqDEHrZqIxNLL<`(ZdlpOfO2Gk+_OWjwZG1-gaDk$qxmqV@8{=+sVXqC(e z+^Q*b$DpVMNN-o&)l|5sh_!VSVH-W9jG(oQnVIadA-YnE~*}HIdeL#-F(b% zbjN}caz ze&W&2I)G!n$EA02)~?BOqs*yp^?In8rmw*kcF7egv;P1li?60pRYWc};to^7E!S^Q zQNI-_i^_0AnRL`J8? zg@UtA^S&iOs9t^|3#y#PB`r6Zgsnf!&X&Q*zg{4-j$B6pO|AZ8T3wXGX?Xttk>&lx zK(A9LIjwv^sdK~hKu0-)t92h?>*5+tx`10PoxrD15&q&0sr!p_>Nh`vU;?jF^c%ks z%ns7KBn}DYpzQraWofAG!_@g(jfz*)0+unkva?(Jih|9XH8Oj=ZG1!|qkEld#G`d*qj>{{Xp;066#NIwj=9Y8OpUqu@M`= z9Hor~`Dd15rC;U(qN9U@*AZrawJw31bw4^htCRSdFwMYLrL}!^2H4MVD`{x@7}TvS z?xllCLr(WDj%l0m%ZMGex_2`a6#dSS1Mv-q4a?XQ;wIFc#+8YczW)F-ka%FO$5@;r zigEJOn)O# zLZ)uNQ!vr}#1ReTsJeK8Xdm`3p{S(QztU6&&k&*I{{WCs1AZe}O`p^Wfzz*1D%+eB zHbF-7hw3z0ml5&{y7Mneyqbmr`GvK@+Grwg`Q%o&+!)CE-$S?C3p2KXksOzh&vg~AiLHj!JNEB7g$Q#j;3vg

6r(b9|vhIY!|?nq{NW zG(Eq-03~9XN+eZLX$#9{K?cJpg}oqJ1Q+Cbz2VdRf>N!~F6)RB%sH0GU@-ATiUslF z2$?lPX4BYWHKd*R%>6XS*BK1vWr<8BS3=9n`gxXUf(p*FMe}U2OtA!MbrV#sRH0r} zL7+gc)#}ElL9S52=9?`@3`Qemmd_O^bUM9AreblW@Rg;FJlFPF-fv^pJULH22$FP5nlDriBhoSfl`B&r#@ zfDTHACz(Uz45?iGFpUrmgRLx!3JZxVPLs@^t_Ks>A7<@CJy63?^iJcdTm?Qa&_NkM1ZtS)$Cuh`x~IG~o`F?EUu9VWC2nZ@{xcmw-ji{>gnvm$eV8`37*!0Wlh!pj)^wV@97O=U^-D*jF zE$ZDH?-Veowphjh``tjtWRrg5rW@~~YC+<}t!3cQ2dDO%VV4L_)ELPLOyN2;a-4}# zFypQrsuS^Ed)2?>>o>yLu002?Y@^;|+`D@kz*z6?aOiHZ+5O1B(cu{8QAYCq4L;AV zV7*M#mLn;dr10L|o=m;w)CTHBw7mKi;Al&`h~g-v^RWf;6yAZMPFkA;`+b_|TU=iPkAb6Y zX>~+-CWFg7Zl+ct6ame+^3rg_71rYr$-bR#wzu!^u!m@K{}I%C5r5?IJEw{8e=dSyY8^QN!9x?C!M^aP8TR6I_A7>S4vj&cif4Hl> zIwL6n#JzuLwbyD>0I1)(?B08=zr6-Hk(p9asV}PmY;aK-Yfd_>M54ALti@Y2W+mJD zh2R-$-p&mHV0!_r_}hXNw41$~srW|Dvxw4;Uf`JZ{p%ILXdkC2I|S8bZ|rdPeE&7? zPAJ;1{(&2<(#z#gLEq#(g6r11WtM`gsMxHYz=MgX$Os!>h5@*`lk=XWl)55N22pr;RZ$Gy?i&ANJomtBjLpWV@K?M}AS zzD)L|7=X47$Uice3b#?zeNj%3%M~Obas}X z|Ht9f7>#?gK6kJJ(Q@#0QLV!;7G0mPZCdczf6^!Tb@#ilh^6+xs;RjfnkPY1LBH6? z2g>6bw#7<1DS4eIO6t4sj1=}gQ9T-sWejPW>N{$ih8j;@&HSb$*(GI+cZpN33eMeu z`7$AvZlBzs^~pFzckNIRN}rJbJt@uUskc|&E_zdb<2q#ild!08R9M%MjEa8%+Hokt literal 0 HcmV?d00001 diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/posts/your_posts_1.json b/friendica_archive_browser/test_assets/test_facebook_archive/posts/your_posts_1.json new file mode 100755 index 0000000..e3915b6 --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/posts/your_posts_1.json @@ -0,0 +1,147 @@ +[ + { + "timestamp": 1577798240, + "attachments": [ + { + "data": [ + { + "external_context": { + "url": "https://duckduckgo.com" + } + } + ] + } + ], + "data": [ + { + "post": "Great search engine! https://duckduckgo.com" + }, + { + "update_timestamp": 1577798240 + } + ], + "title": "Your Facebook User" + }, + { + "timestamp": 1577590323, + "attachments": [], + "data": [ + { + "update_timestamp": 1577590323 + } + ], + "title": "Your Facebook User" + }, + { + "timestamp": 1575129131, + "attachments": [ + { + "data": [ + { + "media": { + "uri": "photos_and_videos/TimelinePhotos_NzMwNzNlYzI0YT/OWRkMmRiMTVkOWU4ZGVhNGEzN2RiMDFk.jpg", + "creation_timestamp": 1575129121, + "media_metadata": { + "photo_metadata": { + "upload_ip": "1.2.3.4" + } + }, + "title": "Timeline Photos", + "description": "The sand mandala is a Buddhist practice of making art out of sand (days to weeks) to then shortly after completion brush it away. It's a reminder of our impermanence, and to me a reminder to enjoy the journey as much as the destination. Both are equally ephemeral." + } + } + ] + } + ], + "data": [ + { + "post": "The sand mandala is a Buddhist practice of making art out of sand (days to weeks) to then shortly after completion brush it away. It's a reminder of our impermanence, and to me a reminder to enjoy the journey as much as the destination. Both are equally ephemeral." + } + ] + }, + { + "timestamp": 1574803760, + "attachments": [ + { + "data": [ + { + "media": { + "uri": "photos_and_videos/your_posts/OWRlZTdkNjgwZjI0MzExNjFjMmU2YTBj.jpg", + "creation_timestamp": 1574803743, + "media_metadata": { + "photo_metadata": { + "upload_ip": "1.2.3.4" + } + }, + "title": "", + "description": "Y tho meme" + } + } + ] + } + ], + "data": [ + { + "post": "Y tho meme" + } + ], + "title": "Your Facebook User posted in Some Club." + }, + { + "timestamp": 1574803309, + "data": [ + { + "post": "Some thoughts..." + } + ], + "title": "Your Facebook User posted in Some Other Club." + }, + { + "timestamp": 1575771550, + "attachments": [ + { + "data": [ + { + "media": { + "uri": "photos_and_videos/videos/NWJlY2M0NWM5ZmUwZmI0NWM5ZjY4MDYx.mp4", + "creation_timestamp": 1575771558, + "media_metadata": { + "video_metadata": { + "upload_timestamp": 0, + "upload_ip": "75.171.6.169" + } + }, + "thumbnail": { + "uri": "photos_and_videos/thumbnails/YjVkNjhiY2NiMjBjNzIwNDJhOTMyMTQx.jpg" + }, + "comments": [ + { + "timestamp": 1575772044, + "comment": "sudo rm -rf /", + "author": "User NTJiZTk2OGJ" + }, + { + "timestamp": 1575772171, + "comment": "Machine?", + "author": "User OGE1NmJkYj" + }, + { + "timestamp": 1575799409, + "comment": "Woah!", + "author": "User ODA0NmJmMDZ" + } + ], + "title": "", + "description": "Neat! I'll have to try that next time I get on a Windows machine :)" + } + } + ] + } + ], + "data": [ + { + "post": "Neat! I'll have to try that next time I get on a Windows machine :)" + } + ] + } +] diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/posts/your_videos.json b/friendica_archive_browser/test_assets/test_facebook_archive/posts/your_videos.json new file mode 100755 index 0000000..cfb545f --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/posts/your_videos.json @@ -0,0 +1,36 @@ +{ + "videos": [ + { + "uri": "photos_and_videos/videos/NWJlY2M0NWM5ZmUwZmI0NWM5ZjY4MDYx.mp4", + "creation_timestamp": 1575771558, + "media_metadata": { + "video_metadata": { + "upload_timestamp": 0, + "upload_ip": "1.2.3.4" + } + }, + "thumbnail": { + "uri": "photos_and_videos/videos/NWJlY2M0NWM5ZmUwZmI0NWM5ZjY4MDYx.mp4" + }, + "comments": [ + { + "timestamp": 1575772044, + "comment": "sudo rm -rf /", + "author": "User NTJiZTk2OGJ" + }, + { + "timestamp": 1575772171, + "comment": "Machine?", + "author": "User OGE1NmJkYj" + }, + { + "timestamp": 1575799409, + "comment": "Woah!", + "author": "User ODA0NmJmMDZ" + } + ], + "title": "", + "description": "Neat! I'll have to try that next time I get on a Windows machine :)" + } + ] +} diff --git a/friendica_archive_browser/test_assets/test_facebook_archive/saved_items_and_collections/saved_items_and_collections.json b/friendica_archive_browser/test_assets/test_facebook_archive/saved_items_and_collections/saved_items_and_collections.json new file mode 100755 index 0000000..d057b82 --- /dev/null +++ b/friendica_archive_browser/test_assets/test_facebook_archive/saved_items_and_collections/saved_items_and_collections.json @@ -0,0 +1,75 @@ +{ + "saves_and_collections_v2": [ + { + "title": "user1 saved user2's post." + }, + { + "timestamp": 1435620001, + "title": "user1 saved user3's post." + }, + { + "attachments": [ + { + "data": [ + { + "external_context": { + "name": "external title", + "source": "Source1", + "url": "http://source1.com/story1.html" + } + } + ] + } + ], + "title": "user1 saved a link." + }, + { + "timestamp": 1435620002, + "attachments": [ + { + "data": [ + { + "external_context": { + "name": "external title", + "source": "https://source2.com/story22/", + "url": "source2.com" + } + } + ] + } + ], + "title": "user1 saved a link." + }, + { + "timestamp": 1435620003, + "attachments": [ + { + "data": [ + { + "external_context": { + "name": "Some Facebook Page" + } + } + ] + } + ], + "title": "user1 saved a page." + }, + { + "timestamp": 1435620004, + "attachments": [ + { + "data": [ + { + "external_context": { + "name": "Story title 3", + "url": "http://source3.com/story3" + } + } + ] + } + ], + "title": "user1 saved a link from his post." + } + ] +} diff --git a/friendica_archive_browser/windows/CMakeLists.txt b/friendica_archive_browser/windows/CMakeLists.txt index 8d0132d..f1e7f14 100644 --- a/friendica_archive_browser/windows/CMakeLists.txt +++ b/friendica_archive_browser/windows/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.14) +cmake_minimum_required(VERSION 3.15) project(friendica_archive_browser LANGUAGES CXX) set(BINARY_NAME "friendica_archive_browser") diff --git a/friendica_archive_browser/windows/flutter/CMakeLists.txt b/friendica_archive_browser/windows/flutter/CMakeLists.txt index b2e4bd8..b02c548 100644 --- a/friendica_archive_browser/windows/flutter/CMakeLists.txt +++ b/friendica_archive_browser/windows/flutter/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.14) +cmake_minimum_required(VERSION 3.15) set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") diff --git a/friendica_archive_browser/windows/flutter/generated_plugin_registrant.cc b/friendica_archive_browser/windows/flutter/generated_plugin_registrant.cc index 8b6d468..33bc361 100644 --- a/friendica_archive_browser/windows/flutter/generated_plugin_registrant.cc +++ b/friendica_archive_browser/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,12 @@ #include "generated_plugin_registrant.h" +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + DesktopWindowPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DesktopWindowPlugin")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/friendica_archive_browser/windows/flutter/generated_plugins.cmake b/friendica_archive_browser/windows/flutter/generated_plugins.cmake index 4d10c25..431160e 100644 --- a/friendica_archive_browser/windows/flutter/generated_plugins.cmake +++ b/friendica_archive_browser/windows/flutter/generated_plugins.cmake @@ -3,6 +3,8 @@ # list(APPEND FLUTTER_PLUGIN_LIST + desktop_window + url_launcher_windows ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/friendica_archive_browser/windows/runner/CMakeLists.txt b/friendica_archive_browser/windows/runner/CMakeLists.txt index de2d891..0b899a0 100644 --- a/friendica_archive_browser/windows/runner/CMakeLists.txt +++ b/friendica_archive_browser/windows/runner/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.14) +cmake_minimum_required(VERSION 3.15) project(runner LANGUAGES CXX) add_executable(${BINARY_NAME} WIN32 diff --git a/friendica_archive_browser/windows/runner/Runner.rc b/friendica_archive_browser/windows/runner/Runner.rc index ae84d4f..03af09d 100644 --- a/friendica_archive_browser/windows/runner/Runner.rc +++ b/friendica_archive_browser/windows/runner/Runner.rc @@ -52,7 +52,7 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_APP_ICON ICON "resources\\app_icon.ico" +IDI_APP_ICON ICON "resources\\fba_app_icon.ico" ///////////////////////////////////////////////////////////////////////////// @@ -63,13 +63,13 @@ IDI_APP_ICON ICON "resources\\app_icon.ico" #ifdef FLUTTER_BUILD_NUMBER #define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER #else -#define VERSION_AS_NUMBER 1,0,0 +#define VERSION_AS_NUMBER 0,1,3 #endif #ifdef FLUTTER_BUILD_NAME #define VERSION_AS_STRING #FLUTTER_BUILD_NAME #else -#define VERSION_AS_STRING "1.0.0" +#define VERSION_AS_STRING "0.1.3" #endif VS_VERSION_INFO VERSIONINFO @@ -89,13 +89,13 @@ BEGIN BEGIN BLOCK "040904e4" BEGIN - VALUE "CompanyName", "com.example" "\0" - VALUE "FileDescription", "A new Flutter project." "\0" + VALUE "CompanyName", "My Social Portal" "\0" + VALUE "FileDescription", "Friendica ArchiveB rowser" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "friendica_archive_browser" "\0" - VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0" + VALUE "LegalCopyright", "Copyright (C) 2022 My Social Portal All rights reserved." "\0" VALUE "OriginalFilename", "friendica_archive_browser.exe" "\0" - VALUE "ProductName", "friendica_archive_browser" "\0" + VALUE "ProductName", "Friendica Archive Browser" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END END diff --git a/friendica_archive_browser/windows/runner/main.cpp b/friendica_archive_browser/windows/runner/main.cpp index 9dc8adb..2e4633f 100644 --- a/friendica_archive_browser/windows/runner/main.cpp +++ b/friendica_archive_browser/windows/runner/main.cpp @@ -26,8 +26,8 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, FlutterWindow window(project); Win32Window::Point origin(10, 10); - Win32Window::Size size(1280, 720); - if (!window.CreateAndShow(L"friendica_archive_browser", origin, size)) { + Win32Window::Size size(915, 700); + if (!window.CreateAndShow(L"Kyanite", origin, size)) { return EXIT_FAILURE; } window.SetQuitOnClose(true); diff --git a/friendica_archive_browser/windows/runner/resources/fba_app_icon.ico b/friendica_archive_browser/windows/runner/resources/fba_app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b1e1c93ea24f0ceca71249cf56c481005f819777 GIT binary patch literal 165194 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