From c9b515b97cc306e6c4c97a8137507c1215780eff Mon Sep 17 00:00:00 2001 From: Flummi Date: Sat, 31 May 2025 16:40:25 +0200 Subject: [PATCH] first commit --- .gitea/workflows/flutter_build.yaml | 31 + .gitignore | 46 ++ .metadata | 45 ++ README.md | 16 + analysis_options.yaml | 28 + android/.gitignore | 14 + android/app/build.gradle.kts | 44 ++ android/app/src/debug/AndroidManifest.xml | 7 + android/app/src/main/AndroidManifest.xml | 50 ++ .../com/example/f0ckapp/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + android/app/src/main/res/values/styles.xml | 18 + android/app/src/profile/AndroidManifest.xml | 7 + android/build.gradle.kts | 24 + android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + android/settings.gradle.kts | 26 + devtools_options.yaml | 3 + ios/.gitignore | 34 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Runner.xcodeproj/project.pbxproj | 616 +++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 101 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 37 + ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/Info.plist | 49 ++ ios/Runner/Runner-Bridging-Header.h | 1 + ios/RunnerTests/RunnerTests.swift | 12 + lib/main.dart | 39 + lib/mediagrid.dart | 78 ++ lib/models/mediaitem.dart | 17 + lib/models/mediaitem_detail.dart | 33 + lib/screens/detail copy.dart | 82 ++ lib/screens/detail.dart | 164 ++++ lib/services/api.dart | 33 + lib/widgets/video_widget.dart | 51 ++ lib/widgets/video_widget.dart.old | 92 +++ linux/.gitignore | 1 + linux/CMakeLists.txt | 128 +++ linux/flutter/CMakeLists.txt | 88 +++ linux/flutter/generated_plugin_registrant.cc | 23 + linux/flutter/generated_plugin_registrant.h | 15 + linux/flutter/generated_plugins.cmake | 26 + linux/runner/CMakeLists.txt | 26 + linux/runner/main.cc | 6 + linux/runner/my_application.cc | 130 ++++ linux/runner/my_application.h | 18 + macos/.gitignore | 7 + macos/Flutter/Flutter-Debug.xcconfig | 1 + macos/Flutter/Flutter-Release.xcconfig | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 26 + macos/Runner.xcodeproj/project.pbxproj | 705 +++++++++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 99 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + macos/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 68 ++ .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes macos/Runner/Base.lproj/MainMenu.xib | 343 ++++++++ macos/Runner/Configs/AppInfo.xcconfig | 14 + macos/Runner/Configs/Debug.xcconfig | 2 + macos/Runner/Configs/Release.xcconfig | 2 + macos/Runner/Configs/Warnings.xcconfig | 13 + macos/Runner/DebugProfile.entitlements | 12 + macos/Runner/Info.plist | 32 + macos/Runner/MainFlutterWindow.swift | 15 + macos/Runner/Release.entitlements | 8 + macos/RunnerTests/RunnerTests.swift | 12 + pubspec.lock | 730 ++++++++++++++++++ pubspec.yaml | 95 +++ test/widget_test.dart | 30 + web/favicon.png | Bin 0 -> 917 bytes web/icons/Icon-192.png | Bin 0 -> 5292 bytes web/icons/Icon-512.png | Bin 0 -> 8252 bytes web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes web/index.html | 38 + web/manifest.json | 35 + windows/.gitignore | 17 + windows/CMakeLists.txt | 108 +++ windows/flutter/CMakeLists.txt | 109 +++ .../flutter/generated_plugin_registrant.cc | 20 + windows/flutter/generated_plugin_registrant.h | 15 + windows/flutter/generated_plugins.cmake | 26 + windows/runner/CMakeLists.txt | 40 + windows/runner/Runner.rc | 121 +++ windows/runner/flutter_window.cpp | 71 ++ windows/runner/flutter_window.h | 33 + windows/runner/main.cpp | 43 ++ windows/runner/resource.h | 16 + windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes windows/runner/runner.exe.manifest | 14 + windows/runner/utils.cpp | 65 ++ windows/runner/utils.h | 19 + windows/runner/win32_window.cpp | 288 +++++++ windows/runner/win32_window.h | 102 +++ 139 files changed, 6008 insertions(+) create mode 100644 .gitea/workflows/flutter_build.yaml create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle.kts create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/com/example/f0ckapp/MainActivity.kt create mode 100644 android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/values-night/styles.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/app/src/profile/AndroidManifest.xml create mode 100644 android/build.gradle.kts create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle.kts create mode 100644 devtools_options.yaml create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner/AppDelegate.swift create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 ios/RunnerTests/RunnerTests.swift create mode 100644 lib/main.dart create mode 100644 lib/mediagrid.dart create mode 100644 lib/models/mediaitem.dart create mode 100644 lib/models/mediaitem_detail.dart create mode 100644 lib/screens/detail copy.dart create mode 100644 lib/screens/detail.dart create mode 100644 lib/services/api.dart create mode 100644 lib/widgets/video_widget.dart create mode 100644 lib/widgets/video_widget.dart.old create mode 100644 linux/.gitignore create mode 100644 linux/CMakeLists.txt create mode 100644 linux/flutter/CMakeLists.txt create mode 100644 linux/flutter/generated_plugin_registrant.cc create mode 100644 linux/flutter/generated_plugin_registrant.h create mode 100644 linux/flutter/generated_plugins.cmake create mode 100644 linux/runner/CMakeLists.txt create mode 100644 linux/runner/main.cc create mode 100644 linux/runner/my_application.cc create mode 100644 linux/runner/my_application.h create mode 100644 macos/.gitignore create mode 100644 macos/Flutter/Flutter-Debug.xcconfig create mode 100644 macos/Flutter/Flutter-Release.xcconfig create mode 100644 macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 macos/Runner.xcodeproj/project.pbxproj create mode 100644 macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 macos/Runner/AppDelegate.swift create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 macos/Runner/Base.lproj/MainMenu.xib create mode 100644 macos/Runner/Configs/AppInfo.xcconfig create mode 100644 macos/Runner/Configs/Debug.xcconfig create mode 100644 macos/Runner/Configs/Release.xcconfig create mode 100644 macos/Runner/Configs/Warnings.xcconfig create mode 100644 macos/Runner/DebugProfile.entitlements create mode 100644 macos/Runner/Info.plist create mode 100644 macos/Runner/MainFlutterWindow.swift create mode 100644 macos/Runner/Release.entitlements create mode 100644 macos/RunnerTests/RunnerTests.swift create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 test/widget_test.dart create mode 100644 web/favicon.png create mode 100644 web/icons/Icon-192.png create mode 100644 web/icons/Icon-512.png create mode 100644 web/icons/Icon-maskable-192.png create mode 100644 web/icons/Icon-maskable-512.png create mode 100644 web/index.html create mode 100644 web/manifest.json create mode 100644 windows/.gitignore create mode 100644 windows/CMakeLists.txt create mode 100644 windows/flutter/CMakeLists.txt create mode 100644 windows/flutter/generated_plugin_registrant.cc create mode 100644 windows/flutter/generated_plugin_registrant.h create mode 100644 windows/flutter/generated_plugins.cmake create mode 100644 windows/runner/CMakeLists.txt create mode 100644 windows/runner/Runner.rc create mode 100644 windows/runner/flutter_window.cpp create mode 100644 windows/runner/flutter_window.h create mode 100644 windows/runner/main.cpp create mode 100644 windows/runner/resource.h create mode 100644 windows/runner/resources/app_icon.ico create mode 100644 windows/runner/runner.exe.manifest create mode 100644 windows/runner/utils.cpp create mode 100644 windows/runner/utils.h create mode 100644 windows/runner/win32_window.cpp create mode 100644 windows/runner/win32_window.h diff --git a/.gitea/workflows/flutter_build.yaml b/.gitea/workflows/flutter_build.yaml new file mode 100644 index 0000000..886af20 --- /dev/null +++ b/.gitea/workflows/flutter_build.yaml @@ -0,0 +1,31 @@ +name: Flutter build + +on: + pull_request: + push: + branches: + - main + +jobs: + build_android: + name: Build for Android + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout repository + uses: actions/checkout@v3 + - name: Setup Java + uses: actions/setup-java@v3 + with: + distribution: 'adopt' + java-version: '21' + - name: Install Flutter + uses: subosito/flutter-action@v2 + - name: Disable analytics + run: flutter config --no-analytics + - name: Flutter pub get + run: flutter pub get + - name: Flutter build appbundle + run: | + cd example + flutter build appbundle \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba6d238 --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ +/coverage/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..0158a6b --- /dev/null +++ b/.metadata @@ -0,0 +1,45 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "8b18dde77fa59ba7f87540c05d1aba787198e77a" + channel: "master" + +project_type: app + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + base_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + - platform: android + create_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + base_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + - platform: ios + create_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + base_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + - platform: linux + create_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + base_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + - platform: macos + create_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + base_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + - platform: web + create_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + base_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + - platform: windows + create_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + base_revision: 8b18dde77fa59ba7f87540c05d1aba787198e77a + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/README.md b/README.md new file mode 100644 index 0000000..0946160 --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# f0ckapp + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..0d29021 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..be3943c --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,14 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java +.cxx/ + +# Remember to never publicly share your keystore. +# See https://flutter.dev/to/reference-keystore +key.properties +**/*.keystore +**/*.jks diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 0000000..edc45c4 --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "com.example.f0ckapp" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "com.example.f0ckapp" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..7f967f5 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/example/f0ckapp/MainActivity.kt b/android/app/src/main/kotlin/com/example/f0ckapp/MainActivity.kt new file mode 100644 index 0000000..ee2acc8 --- /dev/null +++ b/android/app/src/main/kotlin/com/example/f0ckapp/MainActivity.kt @@ -0,0 +1,5 @@ +package com.example.f0ckapp + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84rT@hh9qO>QU(SF$r9IylHmNblJdl&R0hYC z{G?O`&)mfH)S%SFl*+=BsWuD@4C?}XLR=Xb7#RJ!7{h04Zu=H;^aq4w44VZJaXaum zG@>0o`I5 z6U6gpN>(hBs@ovlyiK}omrVN}&28UY_JdsVcA=Cl0|SF_NswPKgMfg5KtMnO2sE4r zf%}pIPku2lFue41aSVw#{PxUsz9t6&hrp0GdlTMw^~h@f`fs1s!olsWbZ#C0v7PJ9 zExVjNeb(Ol`RU07XFf|X@qSK7qke0_C&kUH>MnD(8u-mi5B zt(&|xZ@%@sBNk%nt_5+E&U1QAlyT>>sMB2Zd5T5*R3&Sld5=98o%0qdm+@@-JjKB8 z(xcUiGOB?O=e)LCdt!o~wXBiQlFwyn4J{(JaZG%Q-e|yQz{EjrrIztFmwg@gt#&=FffMC4mtWmbKAF&qdyqKXG0ipk&vT5 zAmZ%d{SXF=bCKq@Z-GZZ;tV#~j83JDzFmxd-Hahq8AGNqhE8V;o5>h9i!po_WB6=l zU2kT?Kvt(bR^JA;;7+;DUGlvL6sMk6nsrHO&Q;BA-wby`jSBSdXJueu5G@Jv3uX`y zP*5;1FzBB@fBpXR=g+?ff&5MV!VC-yOFdm2Lp+YZy>e2h$w0vMVh8iNMNLhM)++IJ z{QqCg*LgRGXKpKZaOLSMJFo8MNc{figWv3mbJp+w-BoBm(|-hT|4dcbJ2lEyX!??Y`jpZ81*D{;rF6b`?;0>>pbJRKPRw2)?8wK8GH9> zL)n=k&vkA#ITl(SSsBW`??>AG{pM|AK2Jc#t6>y4N#$)H8ZEGkUc!`m{6pbTImMF#2{f z`gJk-_b~?aGX_m$44TXsJQ-wH$W+GA>5O4B7{g{VhRtFOpT!tHo5?tW$tsn}K99+{ zjLE&4*|Uz>tC88eNi3sZJbQ{n(LBkDd1t=Sn-plsE283-d*czTa-zm@iQD#kujt@|Kvt4hp|H z71QJA-@DE-vCc=}m3vdfeqD}l&W>B;IduNM%M_}RPx;yPVrk2E_T?&?d+vqXsA}xF zGk52_Ny78;-$vOoENNLjTll#WOG?YLuZ?eO;uVxk)@?h*_~6>qo(~l}_f@BaD>p=c zm>yaWRpaQm|`^KGX?!;c=*_;KycpYksb1 rdBk${xlomwC<})`ozHbP0l+XkKcl<5t literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0y~yV3+{H9Lx+13>Rhybuln7NS3%plmzFem6RtIr7}3C z$Dctjh(SM?K|h4SAdJB{hQT_6!9JhSFr3jep3y9U z(L9OKDxJ|flhG!d(I$t{HiywRm(ebd(Y}z;v6#`Zgwd&#(Yb=rrHawDn$fL>(XE!z zt&Y*Xj?trm(W8;kvysuWiP5u}(X)lotC`WOh0&*-(Wisaw}a8QlhLo6(XWTmzlYJk zmocD^F|eO8Z~|lCM8?2Lj6o9_gC>F8A3T{ccnV|4RK}2LjG@yRLuW9C&0q|h$rv_^ zF?<$d_-uBwU=HgjPRC?Uw`?x2A}+rQ?!a2^kVfvX7VhwN?#NE=s4niP9-inPl?69d z7T#1{bVqf`J=LWT)RsR~Tk%+JQT9|ZQFKYxDR#LKT37?|`uT^vIyZoR#b9vmDf()v(?iz7_L)oF78 zkJJ<)r8pUt8M$!5-N#*39u$gn zR>-(G$wg0`aolam=a?PG9$oC(GH>-!X0d*^l*gJvuFJp95x7~EvFLL3EEhhxt`pq; z%_lBC*86lUSiR`uj?O)w{s`}^n&Wz}@?RH+ochG+^SU~oY!t72t=ZWjXFc({Ty9i< zoXX3Kohi2Ju9xPeP296QFr{gETuR&Xh?K77YDUL{MQ1+I?2fS6ciP3jaR24wmqlki zKfgU-wdbO}>o1>vX;$n~9ltDoY4ItEi|?MFbkSNqMRUkMU-}~Bs z)+NdNzgg`VE)XKX=tVT|2z5{L4{YJjHWS*rIm-E6Ws`IFvdRnm87H fR&jd1QhDAN-h`R^uRUjAU|{fc^>bP0l+XkKAv&s= literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmeAS@N?(olHy`uVBq!ia0y~yU^oE69Lx+145>_WOc@v$BuiW)N`mv#O3D+9QW+dm z@{>{(JaZG%Q-e|yQz{EjrrIztFy0FA32|j$U7=vLLgJC#>aTJ4T9D`W`gLwjjbtZ#N4x^eAqnb0LmM5cOIHO54qe%>- zNi3sjJfm3xqeU{KMGB*38lzP@qg4i@bta=t7NczrqirsuT`r?t9;018qkTT3eF39G z5u;-~4uK+6lW`UY0|SF-NswPKgMfko7&thbzyBTz-gcI+Wnf^o^K@|x zskrs_3VX0{ph#Pyi^G})N%|2R%{L?-ZV(U%Y+lqcfu(WAio}U)uIrV(+3WUaecD+A zmQ6SJem|Gdo_Kp z-*x@+`J3Y19B#kQTkx(t_`-K<>p6dn#rh_GuokuWC9d+nXX1zFdIcZVw{qEhc&=6O z^|eUFqwV?=KCBk6c(Pr4!l%_@70=G=P581}wBp75D22D-njfy%?{qk*AOB#Z{bq-g z`q2+|)-Q6ns2@Io{eMN{rubzF`u|EA+wSjG@UL6#aQc1N1oQe;4(H#;OmN?SS>~@F ztIeOC+&g|0i+=ccTfE@YZP5>((!~ot`|Cb zb^PFdrt-VXypJEaJ95?T2$v)Ws{O#V4Ednvz`|Pb} zf4VOe!@bWom-}e`tT2YtP3!%mny=z+}-K6mV2ZEt5Icwo(g z%Zr!wX>UAuh9QhqUj7<;)5IBxDQpH>KRz6|eoM6P*rQ_`EdPlXYgN?$U-3W2|NYf9 z3~H?J-^u1!lq%j3KgpL6_~F~TxcJXA&m~w0?N0Rh)m167XXobE9?sqiHmlnth&$|i z@b&H6->;epMCgPeb()B(Tr|RH~O+1PwlVxdT!ROU2OGQ3PvhLeQAwP zO|AMWqpQ}lM;-?Ix_3Z(ZoZK*%HiZ|EUDeVf^rGH<21r@EM zSf|zZ`p5aNP1ut4@|gFs0GYW>Kcl68^QPJ_Y + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..cb1ef88 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..399f698 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle.kts b/android/build.gradle.kts new file mode 100644 index 0000000..dbee657 --- /dev/null +++ b/android/build.gradle.kts @@ -0,0 +1,24 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = + rootProject.layout.buildDirectory + .dir("../../build") + .get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..f018a61 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ac3b479 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts new file mode 100644 index 0000000..fb605bc --- /dev/null +++ b/android/settings.gradle.kts @@ -0,0 +1,26 @@ +pluginManagement { + val flutterSdkPath = + run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.9.1" apply false + id("org.jetbrains.kotlin.android") version "2.1.0" apply false +} + +include(":app") diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..7a7f987 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,34 @@ +**/dgph +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..1dc6cf7 --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 13.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..592ceee --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..10c9c59 --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,616 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.f0ckapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.f0ckapp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.f0ckapp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.f0ckapp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.f0ckapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.example.f0ckapp; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..e3773d4 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 0000000..6266644 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 QlAxuUp00i_>zopr0K8b=b^rhX literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..7353c41ecf9ca08017312dc233d9830079b50717 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0y~yU=RUe4rT@hhF#%r?HL#tasqrpT>t<7A9D1^uYdo) z|M|}tKKsk>|9v-q-Td@-#@*lDH-5EW`xVx|ck=Dun%lnZzw+$;uYV7|{`>yx&%T#` zTCV3itMfospaXP=IqbwD6@ zDPzzip<9;X3=9lqo-U3d5|`&rILX&+z{6^2n0tA`hWFNg{@V-13-F02^evt^FXuh) zqioI{pPd!OAH8$?v)QG6$`(O>hSVxQ(BJuK)l44>|gSF?_b> zwr?MP{mVP|^ZECG7vKLax$yJ*-~WlHet!D>|IN>T*=K)lIQ^jZ@~?Ye{(b)a|LvEb z0Y`rP`S(BO#1F%r-yXdFthWBGQTaOk(zO$A{%XGZ>(QGprd1nM@>VcS~)W7Xv|RU5C* z4t{O;f8N&}_5C+?Px*80;D6b3eMw0P|M;#gk zx@(v(e(d({O*>zm_z*O6Wr4j%SwPR!NVNm(*@j`u-h7ytc=jp7AC47!Ud63vN~@W4 zk9lFKoRQ+XxagJud84C0HTRxRdr`H|an>x>GuioP5(3lB4!hnxQ^36V3Geh@-1Dxk T&il&1z`)??>gTe~DWM4f7<1Pq literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU4rY*ulBNR#14B!IPl)UP|Nldd{?Od^jWK+7 z_^}_6$A7&2`ESXC-;cljn{xa2-OvA`C+~mt4X{jZc3$W9B8C{Hed= z8_2kPWxn6Pj~%=4X!F-+NASyf5FAZxGq=O!5^k+lS~S7VV#{pC1U0k_eAF zuX?KD_kORa=N1$CWGvF-&NxWE?3vyBRr9XNl}WExZ3&HbTX|*TT9=^kZ#xzRx$7M) z5!!ZfV*j>M*0R`*=`%BhLwcI#MPG_O?pERWYQeo9ruU@XcD-JjuiyAPBk}yt=m&PQ zIA_2}^*4&+*^6LLD2H{SDEiagFJZ4~EVDNPH Kb6Mw<&;$TA1m_0; literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0y~yV2}l24rT@hhD6`#whRmmu>n3IuK)l44>|fnbK5t@ z@Y%or{ZBpp^T*%+w?6;d`1H@($A4l@{7}eQzVzYmx%YnOo%^}{`JXAbe=~;7y!P?$ z*Pp+g_J4QW_uXvQ_qN?PtCpXxTz*QX?T~2g4zbb|j3Lt)JsX>Dzf@&lV5snPaSYKo zfA-u>z7_)xhrng260+ZGzyG(t93(6({9^Sz^-01^A0|DrpT4+9{++jyo1%{2kqc=b zo*DCBJYRnJ*P%Q9ns>Y;JzezDj)XbsIUTqs(Jtu`m>$FBl(s|Cab3xdkj`_j<07ZF ppWQXd?cvEPwbtX41?Ao{q_1Z2;nvxn!@$76;OXk;vd$@?2>{PTh06c{ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0y~yV6XyV4rT@hhHI(2q!<_&rUm$fxc>kDKji2S#_-vi z+rG`a_xsT6zZqwKvP8~3`S$PDXMff|`7`tGZ_h(Nu6_J_{{7#nw|_GRPd@hM@9r0W z9)10H`NQAdo4<5+d^>yZ&F)K2Zhii@#fM*(E;%XDen_%)pG4yh@ro6UE>#SM;nKc$ z`xqD)K6|=2hIkx*d+9k}lYvOv!>U&fOCKHB>mc}j*Zd@!a^%<&5i#n zCKfF86I9jU=KQnrT$~y2$zwKNkJS9Pi$-J#3Pj$mPJcM}i0H+7>k#Mdz1t32i=GQ@ zD%tiab@lP3Q;jzDZGRif7M9%7cE^9I*TJ1zO1omd@5njsQM%OTKttNrb{n&Wm-!jCiA8qYje)|>)qN5lZ4*q+~oVBQ@EP-#ER&*jILX}Yu+g|nhNi^o=~~} bK5y&<-lE%Whh{M_Ffe$!`njxgN@xNAiC*)Y literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..321773cd857a8a0f0c9c7d3dc3f5ff4fb298dc10 GIT binary patch literal 704 zcmeAS@N?(olHy`uVBq!ia0y~yU|fnbK5t@ z@Y%or{r~y*fB3Nc#~&-be3r%RWdlx#l~KlQ+;U;oT^e=l5gJhXq0MAI(D z&>0NIQD1)lzy0~&q6fdb4&9f@T*l;4$6yl6Xb`Nr)u4cZf$@l^i(^Q{;kQ?^gPR;g zjulRc6*pPO#u2r$(tESc?(5(G$277^%Vce^HM{lZ^R$`v`z6~JpE!B)q~hAOjisFh zQ|FmwwQh_Hj;ZF^wDsQ99c64=Z{=-iR9%{*cR$GMwKN*wfM7b zHRXR;?r`zY)XcSeubx{Fw!N%Kf|*74%r%qj{PPu^+pbSZkD2$e`SQD0J?T+S4+Z!Z z|6b9&HTI#gU)uvo?$w3zb(d~^m}?fgYVGNL){oa6b}%cM+GWhX=1-6CY)9Qdt^OxR zqL#^;Etr;9TExaPuQ01wYxDNKsWUB33(f7!*lAIJ%y(_w#gpOE4$+}!&RcwR`}(WY zE@$@sU4qQVzUbeo*cjn5d)qF*Wmnxj%>=nKEG=uB=b7xBk=^RHC1UowJ%_g@8SnL- z&^~diP0vErnbX>xU2B#x@0xykTGNI^L+PL95)Xebm=OE>80W4ZWtYC!hT0zHn9X>8 zpUZ5$z8Nj^Z+<7To@fO+TsY?$nRvNmHU1>MW?}RBB6Pex7q~et%bVKu^E>0})Hho%K7*8M`#J Vrpz(l%D}+D;OXk;vd$@?2>@$NY7PJZ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4rT@hhTRGt@eB+MT>(BJuK)l44>|gSF?_b> zwr?MP{mVP|^ZECG7vKLax$yJ*-~WlHet!D>|IN>T*=K)lIQ^jZ@~?Ye{(b)a|LvEb z0Y`rP`S(BO#1F%r-yXdFthWBGQTaOk(zO$A{%XGZ>(QGprd1nM@>VcS~)W7Xv|RU5C* z4t{O;f8N&}_5C+?Px*80;D6b3eMw0P|M;#gk zx@(v(e(d({O*>zm_z*O6Wr4j%SwPR!NVNm(*@j`u-h7ytc=jp7AC47!Ud63vN~@W4 zk9lFKoRQ+XxagJud84C0HTRxRdr`H|an>x>GuioP5(3lB4!hnxQ^36V3Geh@-1Dxk T&il&1z`)??>gTe~DWM4f7<1Pq literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmeAS@N?(olHy`uVBq!ia0y~yUE@?@xZ~!3`}6<6t3NR(eq8zR_vG8Z zjN!8uAG+;!;JeoLZ?As*JNo8t>4l#~=YMWE{b0qz-wJcCGlow4@caMM@Bb1{{?Oa; zjX88Oqkj*xMf`>*e;Tj+s<`+wzuQ?PgfBfrx8x$CQvpt>#;t-U~ym zBcA{NZ@hR-s={_X&GvS?l==g4&(rp|Nb_%c|R(aICOQw z50)p3zZ<=X+ob4Hh3mhqby*bUIz3PYcqwIfExqk)lbCrAWZ+GR7a{D?%{o_U349Tm>d68jv zR<$2m`K4lmiszkG?Mgr18cx}DX+;$S$IkV6Q*0T6e%6&f=J+_(R>bh_MVYIMcLjcP z;4oT!?y_=wOUPMDjP*8O z`u=Io>B+g7Z6Lms~bw&sPR@y{3(UKgy1-p# literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0y~yV5k6L4rT@h2EJX#9xyO4JP+^*asB`Qf5_1v4B@ji zw|)Eb?|;OxAHV~PpefT@|_OGOqKfe9>_vP0=-Gl$NwtbV?_%;9BPqSU$ z7=x!uZTxChwVuIy%9LBb$}j%B^!{)8g`Y{Meuy>iW%Oxhuq%+LT*c_$%jj0eXc+na z#~%jA3I=)Wo*Ta;8@34)FJ%mzz~I%)V4lLD<$LAB-}CSOo_h0V?)^VaSAM3Q{*ip@ zhxzXBvYWn2ZTNEa@wNz!q@w-CJ?x#{b+t}WHSZqG^It%xX z?~~MSdtEwx=eeGw`I>^(!nIm&))lN=y>8d5Rjb$SGVqNpy&4)0BEFy7b?wXzs0Y|>|Px^$-8>1&d#`b z;>DW|>`|E=wcbYmq|>^^oBT54Cb7m$lANBRDZY7Hspqo2LMxt3I`dy&=WCk(-A!+9 zsz%`Pt?s+Ox+jXzmX65g=D$MniBlVoGv|MUY z|K$VAeexzQ%Y5Le_WkCI4H^R9R3=wj+RQ&>ms&EvufOfO@b4)X_ev?&yi4de+NC~y z@#F5phc^C8c^=p6e)v$Q+*5w*boCRv68D~}tT5Z>A2Vw)$u1$lLoLd0@X^L;Q@J@#Y1Y gvzBH455CXX<`VnX;r43{1_lNOPgg&ebxsLQ0IGJ#9smFU literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmeAS@N?(olHy`uVBq!ia0y~yV5k6L4rT@h2EJX#9xyO4JP+^*asB`Qf5_1v4B@ji zw|)Eb?|;OxAHV~PpefT@|_OGOqKfe9>_vP0=-Gl$NwtbV?_%;9BPqSU$ z7=x!uZTxChwVuIy%9LBb$}j%B^!{)8g`Y{Meuy>iW%Oxhuq%+LT*c_$%jj0eXc+na z#~%jA3I=)Wo*Ta;8@34)FJ%mzz~I%)V4lLD<$LAB-}CSOo_h0V?)^VaSAM3Q{*ip@ zhxzXBvYWn2ZTNEa@wNz!q@w-CJ?x#{b+t}WHSZqG^It%xX z?~~MSdtEwx=eeGw`I>^(!nIm&))lN=y>8d5Rjb$SGVqNpy&4)0BEFy7b?wXzs0Y|>|Px^$-8>1&d#`b z;>DW|>`|E=wcbYmq|>^^oBT54Cb7m$lANBRDZY7Hspqo2LMxt3I`dy&=WCk(-A!+9 zsz%`Pt?s+Ox+jXzmX65g=D$MniBlVoGv|MUY z|K$VAeexzQ%Y5Le_WkCI4H^R9R3=wj+RQ&>ms&EvufOfO@b4)X_ev?&yi4de+NC~y z@#F5phc^C8c^=p6e)v$Q+*5w*boCRv68D~}tT5Z>A2Vw)$u1$lLoLd0@X^L;Q@J@#Y1Y gvzBH455CXX<`VnX;r43{1_lNOPgg&ebxsLQ0IGJ#9smFU literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 zcmeAS@N?(olHy`uVBq!ia0y~yVAuk}9Lx+13|zwB7#J8B`2u`GT>t<7A9D1E=C*H) z;j=@J{`mXv|F6IQgO2=&IQHZBzyE*!{&PL>{onup^Y8s)2%F_~=sR=d9G^qq{SW`p z+V+jXXNvfSZ@>Tib#L9a>e26_^FJ8^r@J5ce&+2ThTxeDp))Rh_{$zWx8d?njm@7l zHoVu`^G|2{w-pb6&${#L$M3(V-u$Uwb>`~FziW=&U2)_NW5`qn&qMB`24#+=idD}_x8_(o4*)?CNVfwGdUJ>IwmuiCapSphbv|xvu7=Xbq+(+ zf~60BGss#!`Sx%1qu-?$e)e7evGV90uJF#RGe0f%eAnCl&8}fHgOaoU{{Kf_{h4z6 zSM|l8cbG> zMNLPAkFL)0w*6=q_5Sy-fAL4mPb$6IG<(aY!_sQ!<==iucxL{-T-k>jX<-SyQp z#R{dQBx$z^Ek~a`*?c$o*qe7|@e^h&;P5_iwBSPS>`QO={XN6d7ufuhukT^74|rjl_yi}BVQujiO@Z+ewc z{Nl=-^u6a+_p7e2&y@wf zidf%Vd|~H5p1tSN)*ntSTX%hD#<$olo1W}mQM~uuRlQw(d(X}Oubnjay=!4<;O^?c zt_|J0uD$lV;QYEu|J5SN!1cxFbnd)a)cJl<>c`kCOZ%2o-<@^u>8=X>S4rYiYneN5 z?sv=Q=(_&GHAmd7#Gphatv6BIl-tOk=l%vyBf0ec=)Ze4YOdC7F26HluX**adSAgi z-G{=(rE-gR^?q~x8o=^>QK!je4HMNz7gG-%`E=&Zf%O+(TedI!dB@&Ge{w}-n&OG& z&1HdU>B}xoI{S&UcAsFY+oywPV`iT;I_zM(Kyka_^XqOYhR^eMq!_DA%Ze+L_>^S4 zRP5R0pIZa>T3vU2d)DTa+pU`n7wboDpJzPdwdjn-15;*2mjy07o0yTA=CV|( z^h9pe+`Tiyv)I}uRC~-jcyX4g%gUWU<3eUX49~sZrV#47GO^}Z-14(FPqgQ4_FHpR z?AhgfW$EG!gYYHSVolQRf}~yURFq{GKTV7}+g&}^Y~9x^t~`B4*x-Xa+1c_&<50Q9ncEg1Eo80#25z7>KXFc(yW6FYtBT^DfI^ zWs~IzW-Ch9A5QG+O98w)_hxbX zlJ?}n6;BIg=e4DM-g`JaVC8$6m3IwhH7Cknk%+6A=DFoof*hZ<^xyV~D*-lJZYAVx zwL1JyJ3zTYc|#EQQa!_buaehS-2Q7xeh*mb&id^7<+Hv9-lg@2S+|{PzsM z?y;QlvI#F2SmkcK*~Ncbn^0F=taR$Lx$2X5JGxtb&dTxqdd7XL*|OUQFZ0BJJ#n856zR&t`@EmAb-|COc)-#jWZA!Ylb?g1;}>^>|v;8|S*7c>13)dGvmM%KVlI_6ZU9cxG%A kTD{<=Z4D~;^po}1tFt@5&(mDRz`(%Z>FVdQ&MBb@0GqsRX#fBK literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..84ac32ae7d989f82d5e46a60405adcc8279e8001 GIT binary patch literal 762 zcmeAS@N?(olHy`uVBq!ia0y~yVDJH94rT@hh7X<#B^ekP?gjXSxc>kDKji3-KmYzm z9Q&cU?HgnG?B9R?HD3Ao^Y8y3zyJCl{*id{$BXZO!;bxMJMf(?YOeR8?_LMLyYBz~ z>c_uNzy4kQ^e^W4j}=GnFoey_KJ!y=`!@!^sUb(c$4uJC6fu{pELMD=)go z;5nJmI)l+5`0MX~H$MJV+5NZX($BQhKNx*GAAkLO=Ix*3um3!J{psrCcNXiPt1fwP z;>x`R`)|(NeJyUv{)CCU{W^CrIP_?R%>Ki`z-VBU|KG#!kEGuHVBD`5rWd+lL6BCZe$9rTtxoN|*?X|d3 zy=dm?(reNOjzyndr@YE~QR>?EiOyFK{bk*B??9Q-p{{A^9IGPZ7wtUOqxNc1mHrm4 z)9e|M@9Sr*uylJFS0t8pa8sky+m7`GlHDeb#gQA{R{3gjKfZbQ#HPjfSEqLOtDo9j zX_@`_{i+#vlypx;7ZuE`?fFflOFflzZHLd|5oL5wg&HP?c6K#)}Hk<`lGo%a>>Hd z3m^Z+zlusL<&V-W=8}r~yEadKW|vvS>wW=e?^x+K-`p4HT{7A%veos@#h&DrE2h$V zXKoyqUB2Y+cj5i1b)si`&RTHiTkK&=;JWp}ech9H)3h^|PruI{JJ&-$s#bZe=Hi=6 hCC<$HDtVWg>A&sfRbjFV85kHCJYD@<);T3K0RZc2mlps4 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8953cba09064923c5daf2d37e7c3c836ccdd794b GIT binary patch literal 1226 zcmeAS@N?(olHy`uVBq!ia0y~yV3+~I9Lx+14Eiz`gc%qZIRbn_T>t<7A9D1E=C*H) z;j@E}{`mFxf5fpLfByad`|sbs|Nj}nW`!O7;eF`)^KX9>PyX;c__ z_n*J)(Q_F*C$U7$dGhU_#@25P-cvR`{j>eqAGZVF!~6IA{QcLuW~1)*Z?VUJh;R6& zy5%cl==8eFKb5z9)7bLG|L}K*hRqk>|Iyy_$7ts_#-PcJ0sVSAzA<_>F*sKpd;RCw zt3Sp&zX|3nVz4V=G))kQY-G?2(%$p$*z4bne%%aKS$97F-TUHC>Zu=$J{{kG{{H*p zd(!lS0;$sl;(Himtr?`vBG3JQ_w(P0*MC+#{M~!wSLMZ@FW!Hhvi(YM?=Fk(U0Q{! z?2G3!*!M7mwlgR?|Mv2VU|?Xb^>lFzskrra`s*MmM}gMr#Kba|WU&B4Ay-4T#R^AU zj#OM%c~<9t@4v5+a!Az8GXh-}m$T|a|7~3GW7YYE+Zo#uCBUdd$@s9q17^)c4WT>A z41DqtGwb)Wz7rIBC%!D_3HMIs0=Z=!Q^L>%`L6x#SzynU_IjRZ@V=m} z@_cF0niS5emz9EFghGl{Ua9VgzdkXU=iGsN;T+$(U;PsjJo{exs;yw)+v{iV3BUPz zy!*wx1-JAU%vSc)Uvyq^)$i{28T%HqKd_$lUHtyV8u!~foh^gDD(zHX@vZy)i|CIs zi+1h*(YJ4N`4)+;`PNYl%q}LM<|;pUyJqUio6RSj_Zxjsk$%Qxd{e=m|Ipoe4(ko% zThf{eyed5<*g2J}kDgjRZ}T4I@ALO8bDJM-oBf&V*mowzkH@{rT-HCZ+IxXVPW8;1 zxNkBW;~&p{QG6`Crx@kYpo9p-kN^uOkm&1 zd6IiitqkE!e|Cy{JKMdBocbok7uLI+pZ4#X{@bMoO=Q1hE1W%aalv)&FHXkpmXFRD z$@BHZWjxbyH@RG&rvGN9wf-N~>{sDMX)_ixFS*K{{_G65=R3}3$!9M_=1f1x^Sy=n z%wGR*Iv*x27STE`Ri&CPc17Fnnd$?BtFxzHd~#K<00ZS&M z@6*iB#;yGN{B}3@28MHj0=l~4r_&a&-|duKk|*4WARa@^dmQenaOCj5{km)M(Qi_FD>e5l-+A-%t1|1` zYnO#N?aA-GJNI*5`TnaH^un*$e9x(UzUOk@vh+(lS-v%}zZy638NTVqwX4e8rv{;baP(zxXR z`Pj_LJ5nxZm&}S>b0$q^%Cl<+HcBqDOke!*@on{vgOV9#McmdKI;Vst06J}e(f|Me literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmeAS@N?(olHy`uVBq!ia0y~yU|0^q9Lx+149+L^++$#1_#EI9;`;yp|B$0UG`D?Y z44)l*^FJ9wruiNI(XswKW6)$KzfNY8aK?asmBsg% zy<5Ki{>$i8#%PzXy8JPdWlG_~V~o1~55N3nP;~h6``@b{|D-m4Q(f_l!Ds5e7k?_Q z{+W08SImhYGjDv&JNv`$(2qOMJ_yggGiUGht_>Gj)}GItb2x40AqLy-#pN|e85mfC zJY5_^DsH{KlN~HvkdO8n4q7p`0N+2 z=AKrCJ+0?lr~Z-MJ;Z|>U6`g7H+dw=I|4`7OZe|h$_JE`;g9fRtM z)f%t+U;AmA998r9@x`tgkD5deU9H)aSo`wp`+JeR!Yp^vOK03#W*_d8cdvEQ%rz~V z4<*d^zKhn#pTk+ncf0o7kE3isM^lci>F7M1TkY()HeYdWW?9- zDN0$#GiyHo)92=UJ2$UfpD|yzHS5ftlxwReuw*cF`FLI}k=43-&G=a9vU^{yr(Wiq z5utYMY&gG+$61rRe6Gu`gc(2PHIHrI)HC~@(<-OyX7)x>%lNL&?mH8mZ7q55=9Q@P zq9OTKM&{S$-lxnFHvB4j^?BOS7-tPm;e|c=JF66m8JDIcy*6Gm;h0MXGxJG~quW8O z$G+F~RcrUYJmI3T{ANi@oxyrFC+Qtk5(}={S6w!|@#|T*aH5jds- zHyV7smab>)|6HSdPUO~mZ+-1stqx4F3T|Ka`ic*udyL`P${nBoai|2SHRf7>KDhn1 zLb5_{1ON7%Gusb8Qs;oqPF=%=Yznl-s$KLky2UE)&_wSX<0>b%y>i*WG&? zj{P{dykkn1tM8du*0-SnrxZfc#g4w4Be|1juCe;>-%EoXWi1wO(wTg2jt@Vdn4kLs zrQ_F>i>+k&re4-uv0}lA8nfA=kAs&R2SoO&r}U|%&rvlgTIAM4r~6P4HY zi;B!#pLQy8#aErF?;MJAYER1ard>|jQP1}BoMh~jl__#^eQJmATAq!3(VX7C-feTz z{_EXJe?@h_UiCO^Vly) z%$wJ^tJ*F3q3D*!j3K#yJAbE_Fn(R&bI)OKX6?J!*UHu=(dw*7#KWV{an^LB{Ts5B8|zr literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 0000000..0bedcf2 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0y~yU|@r242}Q* literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0y~yU|@r242}Q* literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0y~yU|@r242}Q* literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 0000000..03f33d2 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + F0ckapp + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + f0ckapp + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 0000000..308a2a5 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..86a7c3b --- /dev/null +++ b/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 0000000..2e23b83 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +import 'package:f0ckapp/mediagrid.dart'; +//import 'package:media_kit/media_kit.dart'; + +void main() { + WidgetsFlutterBinding.ensureInitialized(); + //MediaKit.ensureInitialized(); + + SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp + ]).then((_) { + runApp(const F0ckApp()); + }); +} + +class F0ckApp extends StatelessWidget { + const F0ckApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + theme: ThemeData( + scaffoldBackgroundColor: const Color.fromARGB(255, 23, 23, 23), + ), + home: Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + backgroundColor: const Color.fromARGB(255, 43, 43, 43), + foregroundColor: const Color.fromARGB(255, 255, 255, 255), + title: const Text('f0cks'), + centerTitle: true, + ), + body: MediaGrid(), + ), + ); + } +} diff --git a/lib/mediagrid.dart b/lib/mediagrid.dart new file mode 100644 index 0000000..af3d124 --- /dev/null +++ b/lib/mediagrid.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; + +import 'package:f0ckapp/services/api.dart'; +import 'package:f0ckapp/models/mediaitem.dart'; +import 'package:f0ckapp/screens/detail.dart'; + +class MediaGrid extends StatefulWidget { + const MediaGrid({super.key}); + + @override + State createState() => _MediaGridState(); +} + +class _MediaGridState extends State { + final ScrollController _scrollController = ScrollController(); + List mediaItems = []; + bool isLoading = false; + + @override + void initState() { + super.initState(); + _loadMedia(); + _scrollController.addListener(() { + if (_scrollController.position.pixels >= _scrollController.position.maxScrollExtent - 100) { + _loadMedia(); + } + }); + } + + Future _loadMedia() async { + if (isLoading) return; + setState(() => isLoading = true); + + try { + List newMedia = await fetchMedia(older: mediaItems.isNotEmpty ? mediaItems.last.id.toString() : null); + setState(() { + mediaItems.addAll(newMedia); + isLoading = false; + }); + } catch (e) { + print('Fehler: $e'); + } + } + + @override + Widget build(BuildContext context) { + return GridView.builder( + controller: _scrollController, + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + crossAxisSpacing: 8.0, + mainAxisSpacing: 8.0, + ), + itemCount: mediaItems.length + (isLoading ? 1 : 0), + itemBuilder: (context, index) { + if (index >= mediaItems.length) { + return const Center(child: CircularProgressIndicator()); + } + final item = mediaItems[index]; + + return GestureDetector( + onTap: () async { + try { + final details = await fetchMediaDetail(item.id); + Navigator.push( + context, + MaterialPageRoute(builder: (context) => DetailView(details: details)), + ); + } catch (e) { + print('Fehler beim Laden der Details: $e'); + } + }, + child: Image.network(item.thumbnailUrl, fit: BoxFit.cover), + ); + }, + ); + } +} diff --git a/lib/models/mediaitem.dart b/lib/models/mediaitem.dart new file mode 100644 index 0000000..4bc618f --- /dev/null +++ b/lib/models/mediaitem.dart @@ -0,0 +1,17 @@ +class MediaItem { + final int id; + final String mime; + final int tagid; + + MediaItem({required this.id, required this.mime, required this.tagid}); + + factory MediaItem.fromJson(Map json) { + return MediaItem( + id: json['id'], + mime: json['mime'], + tagid: json['tag_id'], + ); + } + + String get thumbnailUrl => 'https://f0ck.me/t/$id.webp'; +} diff --git a/lib/models/mediaitem_detail.dart b/lib/models/mediaitem_detail.dart new file mode 100644 index 0000000..4339d12 --- /dev/null +++ b/lib/models/mediaitem_detail.dart @@ -0,0 +1,33 @@ +class MediaItemDetail { + final int id; + final String mime; + final String dest; + final String username; + final int stamp; + final int next; + final int prev; + + MediaItemDetail({ + required this.id, + required this.mime, + required this.dest, + required this.username, + required this.stamp, + required this.next, + required this.prev, + }); + + factory MediaItemDetail.fromJson(Map json) { + return MediaItemDetail( + id: json['id'], + mime: json['mime'], + dest: json['dest'], + username: json['username'], + stamp: json['stamp'], + next: json['next'], + prev: json['prev'], + ); + } + + String get mediaUrl => 'https://f0ck.me/b/$dest'; +} diff --git a/lib/screens/detail copy.dart b/lib/screens/detail copy.dart new file mode 100644 index 0000000..3f10366 --- /dev/null +++ b/lib/screens/detail copy.dart @@ -0,0 +1,82 @@ +import 'package:f0ckapp/services/api.dart'; +import 'package:flutter/material.dart'; + +import 'package:f0ckapp/models/mediaitem_detail.dart'; +import 'package:f0ckapp/widgets/video_widget.dart'; + +class DetailScreen extends StatelessWidget { + final MediaItemDetail details; + + const DetailScreen({super.key, required this.details}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onHorizontalDragEnd: (details) { + if (details.velocity.pixelsPerSecond.dx > 0) { + _navigateToPrev(context); + } else { + _navigateToNext(context); + } + }, + child: VideoWidget(details: this.details) + ); + //return VideoWidget(url: this.details.mediaUrl); + /*return GestureDetector( + onHorizontalDragEnd: (details) { + if (details.velocity.pixelsPerSecond.dx > 0) { + _navigateToPrev(context); + } else { + _navigateToNext(context); + } + }, + child: Scaffold( + body: Column( + children: [ + if (this.details.mime.startsWith('image')) + ClipRRect( + child: Image.network(this.details.mediaUrl, fit: BoxFit.cover), + ) + else + VideoPost( + url: this.details.mediaUrl, + /*appBar: AppBar( + backgroundColor: const Color.fromARGB(255, 43, 43, 43), + foregroundColor: const Color.fromARGB(255, 255, 255, 255), + title: const Text('f0ck'), + centerTitle: true, + )*/ + ), + + //const SizedBox(height: 10), + //Text('f0cked by: ${this.details.username}', style: const TextStyle(fontSize: 16, color: Color.fromARGB(255, 255, 255, 255))), + ], + ), + ), + );*/ + } + + void _navigateToNext(BuildContext context) async { + try { + final nextDetails = await fetchMediaDetail(details.next); + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => DetailScreen(details: nextDetails)), + ); + } catch (e) { + print('Fehler beim Laden des nächsten Items: $e'); + } + } + + void _navigateToPrev(BuildContext context) async { + try { + final prevDetails = await fetchMediaDetail(details.prev); + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => DetailScreen(details: prevDetails)), + ); + } catch (e) { + print('Fehler beim Laden des vorherigen Items: $e'); + } + } +} diff --git a/lib/screens/detail.dart b/lib/screens/detail.dart new file mode 100644 index 0000000..7648943 --- /dev/null +++ b/lib/screens/detail.dart @@ -0,0 +1,164 @@ +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; +import 'package:f0ckapp/models/mediaitem_detail.dart'; +import 'package:f0ckapp/services/api.dart'; // API Call für neue Items + +class DetailView extends StatefulWidget { + final MediaItemDetail details; + + const DetailView({super.key, required this.details}); + + @override + State createState() => _DetailViewState(); +} + +class _DetailViewState extends State { + late VideoPlayerController _controller; + late Future _initializeVideoPlayer; + bool isAudio = false; + + @override + void initState() { + super.initState(); + isAudio = widget.details.mime.startsWith("audio/"); + _controller = VideoPlayerController.networkUrl(Uri.parse(widget.details.mediaUrl)); + + if (!widget.details.mime.startsWith("image/")) { + _initializeVideoPlayer = _controller.initialize().then((_) { + setState(() { + _controller.play(); + _controller.setLooping(true); + }); + }).catchError((error) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("Fehler beim Laden des Videos: $error")), + ); + }); + } + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + Future _loadNewMediaItem(int itemId, bool swipeLeft) async { + try { + var newDetails = await fetchMediaDetail(itemId); // API Call + + Navigator.of(context).pushReplacement(PageRouteBuilder( + pageBuilder: (context, animation, secondaryAnimation) => DetailView(details: newDetails), + transitionsBuilder: (context, animation, secondaryAnimation, child) { + Offset begin = swipeLeft ? const Offset(-1.0, 0.0) : const Offset(1.0, 0.0); // Richtung des Swipes + const Offset end = Offset.zero; + const curve = Curves.easeInOut; + + var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); + var offsetAnimation = animation.drive(tween); + + return SlideTransition(position: offsetAnimation, child: child); + }, + )); + } catch (error) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("Fehler beim Laden des Items: $error")), + ); + } + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onHorizontalDragEnd: (details) { + if (details.velocity.pixelsPerSecond.dx > 0) { + _loadNewMediaItem(widget.details.next, true); + } else if (details.velocity.pixelsPerSecond.dx < 0) { + _loadNewMediaItem(widget.details.prev, false); + } + }, + child: Scaffold( + appBar: AppBar( + backgroundColor: const Color(0xFF2B2B2B), + foregroundColor: Colors.white, + title: Text('f0ck #${widget.details.id}'), + centerTitle: true, + ), + body: SingleChildScrollView( + child: Column( + children: [ + if (widget.details.mime.contains(RegExp(r'image/(jpeg|png|gif|webp)'))) ...[ + Image.network(widget.details.mediaUrl), + ] else ...[ + Stack( + alignment: Alignment.center, + children: [ + if (isAudio) + Image.network('https://f0ck.me/ca/${widget.details.id}.webp'), + FutureBuilder( + future: _initializeVideoPlayer, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done && _controller.value.isInitialized) { + return AspectRatio( + aspectRatio: isAudio ? 1 : _controller.value.aspectRatio, + child: VideoPlayer(_controller), + ); + } else { + return const CircularProgressIndicator(); + } + }, + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: VideoProgressIndicator( + _controller, + allowScrubbing: true, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + IconButton( + icon: const Icon(Icons.replay_10), + onPressed: () { + _controller.seekTo(_controller.value.position - const Duration(seconds: 10)); + }, + ), + IconButton( + icon: Icon(_controller.value.isPlaying ? Icons.pause : Icons.play_arrow), + onPressed: () { + setState(() { + _controller.value.isPlaying ? _controller.pause() : _controller.play(); + }); + }, + ), + IconButton( + icon: const Icon(Icons.forward_10), + onPressed: () { + _controller.seekTo(_controller.value.position + const Duration(seconds: 10)); + }, + ), + ], + ), + ], + const SizedBox(height: 16), + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('${widget.details.mime}', style: const TextStyle(fontSize: 16, color: Colors.white)), + Text("Benutzername: ${widget.details.username}", style: const TextStyle(fontSize: 16, color: Colors.white)), + Text("Zeitstempel: ${widget.details.stamp}", style: const TextStyle(fontSize: 16, color: Colors.white)), + ], + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/services/api.dart b/lib/services/api.dart new file mode 100644 index 0000000..c3d6ec3 --- /dev/null +++ b/lib/services/api.dart @@ -0,0 +1,33 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; + +import 'package:f0ckapp/models/mediaitem.dart'; +import 'package:f0ckapp/models/mediaitem_detail.dart'; + +Future> fetchMedia({String? older}) async { + final Uri url = Uri.parse('https://f0ck.me/api/v2/items/get') + .replace(queryParameters: { + if (older != null) 'older': older, + }); + + final response = await http.get(url); + if (response.statusCode == 200) { + final Map jsonResponse = jsonDecode(response.body); + final List jsonList = jsonResponse['items']; + return jsonList.map((item) => MediaItem.fromJson(item)).toList(); + } else { + throw Exception('Fehler beim Abrufen der Medien: ${response.statusCode}'); + } +} + +Future fetchMediaDetail(int itemId) async { + final Uri url = Uri.parse('https://f0ck.me/api/v2/item/$itemId'); + + final response = await http.get(url); + if (response.statusCode == 200) { + final Map jsonResponse = jsonDecode(response.body); + return MediaItemDetail.fromJson(jsonResponse['rows']); + } else { + throw Exception('Fehler beim Abrufen der Media-Details: ${response.statusCode}'); + } +} diff --git a/lib/widgets/video_widget.dart b/lib/widgets/video_widget.dart new file mode 100644 index 0000000..b2d76bb --- /dev/null +++ b/lib/widgets/video_widget.dart @@ -0,0 +1,51 @@ +import 'package:f0ckapp/models/mediaitem_detail.dart'; +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; + +class VideoWidget extends StatefulWidget { + final MediaItemDetail details; + //const VideoWidget({super.key, required this.details}): super(key: key); + const VideoWidget({Key? key, required this.details}) : super(key: key); + + @override + _VideoWidgetState createState() => _VideoWidgetState(); +} + +class _VideoWidgetState extends State { + late VideoPlayerController _controller; + + @override + void initState() { + super.initState(); + + _controller = VideoPlayerController.networkUrl( + Uri.parse(widget.details.mediaUrl) + )..initialize().then((_) { + setState(() {}); + }); + _controller.play(); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Center( + child: _controller.value.isInitialized + ? AspectRatio( + aspectRatio: _controller.value.aspectRatio, + child: VideoPlayer(_controller), + ) + : Center( + child: CircularProgressIndicator(), + ), + ), + ); + } +} diff --git a/lib/widgets/video_widget.dart.old b/lib/widgets/video_widget.dart.old new file mode 100644 index 0000000..94d7b7b --- /dev/null +++ b/lib/widgets/video_widget.dart.old @@ -0,0 +1,92 @@ +import 'package:f0ckapp/models/mediaitem_detail.dart'; +import 'package:flutter/material.dart'; +import 'package:media_kit/media_kit.dart'; +import 'package:media_kit_video/media_kit_video.dart'; + +class VideoWidget extends StatefulWidget { + final MediaItemDetail details; + const VideoWidget({super.key, required this.details}); + + @override + State createState() => _VideoWidgetState(); +} + +class _VideoWidgetState extends State { + late final Player _player; + late final VideoController _controller; + double? _aspectRatio; + + @override + void initState() { + super.initState(); + _player = Player(); + _controller = VideoController(_player); + _player.open(Media(widget.details.mediaUrl)); + _player.setPlaylistMode(PlaylistMode.loop); + _player.setVolume(0); + + //_player.stream.height.first; + _player.stream.playing.listen((blah) { + setState(() { + Future.microtask(() async { + int h = await _player.stream.height.first ?? 0; + int w = await _player.stream.width.first ?? 0; + _aspectRatio = h / w; + print(_aspectRatio); + }); + }); + }); + } + + @override + void dispose() { + _player.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + //_aspectRatio = _controller.player.state.height! / _controller.player.state.width!; + print(_aspectRatio); + + return Scaffold( + appBar: AppBar( + backgroundColor: const Color.fromARGB(255, 43, 43, 43), + foregroundColor: const Color.fromARGB(255, 255, 255, 255), + title: Text('f0ck #${widget.details.id}'), + centerTitle: true, + ), + body: Column( + children: [ + if (_aspectRatio != null) + AspectRatio( + aspectRatio: _aspectRatio!, + child: Video( + controller: _controller, + fit: BoxFit.cover, + alignment: Alignment.topCenter, + ), + ) + else + SizedBox( + width: double.infinity, + height: MediaQuery.of(context).size.height * 0.75, + child: Video( + controller: _controller, + fit: BoxFit.cover, + alignment: Alignment.topCenter, + ), + ), + const SizedBox(height: 10), + Text( + 'f0cked by: ${widget.details.username}', + style: const TextStyle( + fontSize: 16, + color: Color.fromARGB(255, 255, 255, 255), + ), + ), + ], + ), + ); + } +} diff --git a/linux/.gitignore b/linux/.gitignore new file mode 100644 index 0000000..d3896c9 --- /dev/null +++ b/linux/.gitignore @@ -0,0 +1 @@ +flutter/ephemeral diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt new file mode 100644 index 0000000..eea3bf1 --- /dev/null +++ b/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "f0ckapp") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.f0ckapp") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt new file mode 100644 index 0000000..d5bd016 --- /dev/null +++ b/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..31d12f9 --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,23 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include + +void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) media_kit_libs_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitLibsLinuxPlugin"); + media_kit_libs_linux_plugin_register_with_registrar(media_kit_libs_linux_registrar); + g_autoptr(FlPluginRegistrar) media_kit_video_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitVideoPlugin"); + media_kit_video_plugin_register_with_registrar(media_kit_video_registrar); + g_autoptr(FlPluginRegistrar) volume_controller_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "VolumeControllerPlugin"); + volume_controller_plugin_register_with_registrar(volume_controller_registrar); +} diff --git a/linux/flutter/generated_plugin_registrant.h b/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..e0f0a47 --- /dev/null +++ b/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake new file mode 100644 index 0000000..bc679af --- /dev/null +++ b/linux/flutter/generated_plugins.cmake @@ -0,0 +1,26 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + media_kit_libs_linux + media_kit_video + volume_controller +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/linux/runner/CMakeLists.txt b/linux/runner/CMakeLists.txt new file mode 100644 index 0000000..e97dabc --- /dev/null +++ b/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/linux/runner/main.cc b/linux/runner/main.cc new file mode 100644 index 0000000..e7c5c54 --- /dev/null +++ b/linux/runner/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/linux/runner/my_application.cc b/linux/runner/my_application.cc new file mode 100644 index 0000000..b8bd871 --- /dev/null +++ b/linux/runner/my_application.cc @@ -0,0 +1,130 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + 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, "f0ckapp"); + 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, "f0ckapp"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/linux/runner/my_application.h b/linux/runner/my_application.h new file mode 100644 index 0000000..72271d5 --- /dev/null +++ b/linux/runner/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/macos/.gitignore b/macos/.gitignore new file mode 100644 index 0000000..746adbb --- /dev/null +++ b/macos/.gitignore @@ -0,0 +1,7 @@ +# Flutter-related +**/Flutter/ephemeral/ +**/Pods/ + +# Xcode-related +**/dgph +**/xcuserdata/ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 0000000..c2efd0b --- /dev/null +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1 @@ +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 0000000..47096db --- /dev/null +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,26 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + +import media_kit_libs_macos_video +import media_kit_video +import package_info_plus +import path_provider_foundation +import sqflite_darwin +import video_player_avfoundation +import volume_controller +import wakelock_plus + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + MediaKitLibsMacosVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosVideoPlugin")) + MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitVideoPlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) + FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) + VolumeControllerPlugin.register(with: registry.registrar(forPlugin: "VolumeControllerPlugin")) + WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) +} diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..11c7b8c --- /dev/null +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,705 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 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 */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 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 /* f0ckapp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "f0ckapp.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 = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 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 = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* f0ckapp.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* f0ckapp.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.f0ckapp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/f0ckapp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/f0ckapp"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.f0ckapp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/f0ckapp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/f0ckapp"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.f0ckapp.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/f0ckapp.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/f0ckapp"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..f7c82d3 --- /dev/null +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift new file mode 100644 index 0000000..b3c1761 --- /dev/null +++ b/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..a2ec33f --- /dev/null +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 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

$e#+&mks>|8!lgGariG| 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⪙}wt!=@B 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 literal 0 HcmV?d00001 diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 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 SmN76eFnGH9xvXk44ofy`glX=O&z~GV^ z;hE;^%b>-;z`()4*q+J20#d@jz#zo{0?Z2-8JNK$j0_A5nBcMw3z!jXkV3aWrwt4Y z93q}Bjv*C{Z=|mBZEQn{dA3`CzRFxDXT3D6z+925OH)7n5yyT z<5Y<+?yhwcB$7>9JbL;im_IQK&pUQv@zSN+Oun!>2?}foh|*d5`;+zNy_+{rpSk<( zxtz?$^Par9Q=R^9@AKd9EWaDh6-re(?9kT8!z{`6Z$D2(P^(<8oBQH-PA^1WXuPn! zz+l3y<&ro5v(r)IXW1f>3yXH1V4wJ+_f76>u&7n z9aj!8r%76BCf*jhGynR}&zC;0OLKPEu~yUP__}tU4R;zDa?}pI|9IgSr`;^en9Jru zdreY=JTf+|TFlkR8YX&2>ou3~-vTqXIEHQ6)f1jA-1@lYOF-6xossu8M0RyC+B8_%!{evU6b6aQSfrlxj#)eZLT@vPhR_gpXB9(H!QOGB>eYPlyyeLv?v{Fd}& z=|MHaUoqzl_sitjf8V#IVY;vPiPcUD4-ei;sd!R8&-qO9Tz|E=hWN&b^UK8#Y|dRL zd_eiMw`_iXDFfX!1vxgC!b$q+xDa< zH{XUQ9GY#v>b<&+alyngABOjDx0`OfecQjH@WYLV4@1nK>mA#}ptr7%#U!x zy%Wdq{M?tDa?0nITNR%ve({Ipedf!qtqEI_Ra#cw&^TB-O)O)IxWRUT{qwy}2{ImE z=kh^K-RxoKxw8vgC7YkWUHj(S_6H{MCM_>rs&noc7)W>i&@#HR{9^XwyR7HGS#ljw z+VN?J%=~>T6CW5=G&Yx4a4(th{>X{?FnM&JCj89Ven|=Pf+ytCFx%-oNZE2 zzQ6wBu}(YLJ)QQC3%3htF;!hXo?w6Rw8YwrmUUI4-g9~O2@BtApQ?DP`{^XdxLu-4 z%LI~+@SI|)sN+9jXrCHkwea`@)nBd-E(|4Y%YD%k#Hi2DfW#uAXZD<3+TmHY4L2zT4s%Uyc}@ znIOOz74y|7Wu2_OU$1HDmXyzotJeMYuHUx4E`(*n+`d-N8y_}IpC{QUs~jcV`)QqF zQ*ugnq-E^t+yxwW7OYeDIG=mZUp;HK?00QbgUa`NJ zFyTX;;ys3^#||yryQe8iD@&uv*-yaRea3%gUY+3$IPu(8^WEz&JLbpRX)QD4=b1j+bK3kK{}idUa+_2e + + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 0000000..f344daf --- /dev/null +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = f0ckapp + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.f0ckapp + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2025 com.example. All rights reserved. diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 0000000..36b0fd9 --- /dev/null +++ b/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 0000000..dff4f49 --- /dev/null +++ b/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 0000000..42bcbf4 --- /dev/null +++ b/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements new file mode 100644 index 0000000..dddb8a3 --- /dev/null +++ b/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist new file mode 100644 index 0000000..4789daa --- /dev/null +++ b/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 0000000..3cc05eb --- /dev/null +++ b/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements new file mode 100644 index 0000000..852fa1a --- /dev/null +++ b/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/macos/RunnerTests/RunnerTests.swift b/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 0000000..61f3bd1 --- /dev/null +++ b/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..c30f9f6 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,730 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + archive: + dependency: transitive + description: + name: archive + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + url: "https://pub.dev" + source: hosted + version: "4.0.7" + args: + dependency: transitive + description: + name: args + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 + url: "https://pub.dev" + source: hosted + version: "2.7.0" + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + cached_network_image: + dependency: "direct main" + description: + name: cached_network_image + sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" + url: "https://pub.dev" + source: hosted + version: "4.1.1" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + csslib: + dependency: transitive + description: + name: csslib + sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + dbus: + dependency: transitive + description: + name: dbus + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + url: "https://pub.dev" + source: hosted + version: "0.7.11" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + html: + dependency: transitive + description: + name: html + sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602" + url: "https://pub.dev" + source: hosted + version: "0.15.6" + http: + dependency: "direct main" + description: + name: http + sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b" + url: "https://pub.dev" + source: hosted + version: "1.4.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" + image: + dependency: transitive + description: + name: image + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" + url: "https://pub.dev" + source: hosted + version: "4.5.4" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0" + url: "https://pub.dev" + source: hosted + version: "11.0.1" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: a5e2b223cb7c9c8efdc663ef484fdd95bb243bff242ef5b13e26883547fce9a0 + url: "https://pub.dev" + source: hosted + version: "6.0.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + media_kit: + dependency: "direct main" + description: + name: media_kit + sha256: "48c10c3785df5d88f0eef970743f8c99b2e5da2b34b9d8f9876e598f62d9e776" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + media_kit_libs_android_video: + dependency: transitive + description: + name: media_kit_libs_android_video + sha256: adff9b571b8ead0867f9f91070f8df39562078c0eb3371d88b9029a2d547d7b7 + url: "https://pub.dev" + source: hosted + version: "1.3.7" + media_kit_libs_ios_video: + dependency: transitive + description: + name: media_kit_libs_ios_video + sha256: b5382994eb37a4564c368386c154ad70ba0cc78dacdd3fb0cd9f30db6d837991 + url: "https://pub.dev" + source: hosted + version: "1.1.4" + media_kit_libs_linux: + dependency: transitive + description: + name: media_kit_libs_linux + sha256: "2b473399a49ec94452c4d4ae51cfc0f6585074398d74216092bf3d54aac37ecf" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + media_kit_libs_macos_video: + dependency: transitive + description: + name: media_kit_libs_macos_video + sha256: f26aa1452b665df288e360393758f84b911f70ffb3878032e1aabba23aa1032d + url: "https://pub.dev" + source: hosted + version: "1.1.4" + media_kit_libs_video: + dependency: "direct main" + description: + name: media_kit_libs_video + sha256: "958cc55e7065d9d01f52a2842dab2a0812a92add18489f1006d864fb5e42a3ef" + url: "https://pub.dev" + source: hosted + version: "1.0.6" + media_kit_libs_windows_video: + dependency: transitive + description: + name: media_kit_libs_windows_video + sha256: dff76da2778729ab650229e6b4ec6ec111eb5151431002cbd7ea304ff1f112ab + url: "https://pub.dev" + source: hosted + version: "1.0.11" + media_kit_video: + dependency: "direct main" + description: + name: media_kit_video + sha256: a656a9463298c1adc64c57f2d012874f7f2900f0c614d9545a3e7b8bb9e2137b + url: "https://pub.dev" + source: hosted + version: "1.3.0" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + octo_image: + dependency: transitive + description: + name: octo_image + sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + package_info_plus: + dependency: transitive + description: + name: package_info_plus + sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191" + url: "https://pub.dev" + source: hosted + version: "8.3.0" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 + url: "https://pub.dev" + source: hosted + version: "2.2.17" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + posix: + dependency: transitive + description: + name: posix + sha256: f0d7856b6ca1887cfa6d1d394056a296ae33489db914e365e2044fdada449e62 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" + url: "https://pub.dev" + source: hosted + version: "0.28.0" + safe_local_storage: + dependency: transitive + description: + name: safe_local_storage + sha256: e9a21b6fec7a8aa62cc2585ff4c1b127df42f3185adbd2aca66b47abe2e80236 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + screen_brightness_android: + dependency: transitive + description: + name: screen_brightness_android + sha256: "6ba1b5812f66c64e9e4892be2d36ecd34210f4e0da8bdec6a2ea34f1aa42683e" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + screen_brightness_platform_interface: + dependency: transitive + description: + name: screen_brightness_platform_interface + sha256: "737bd47b57746bc4291cab1b8a5843ee881af499514881b0247ec77447ee769c" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + url: "https://pub.dev" + source: hosted + version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" + url: "https://pub.dev" + source: hosted + version: "2.5.5" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" + url: "https://pub.dev" + source: hosted + version: "3.3.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + url: "https://pub.dev" + source: hosted + version: "0.7.6" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + universal_platform: + dependency: transitive + description: + name: universal_platform + sha256: "64e16458a0ea9b99260ceb5467a214c1f298d647c659af1bff6d3bf82536b1ec" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + uri_parser: + dependency: transitive + description: + name: uri_parser + sha256: ff4d2c720aca3f4f7d5445e23b11b2d15ef8af5ddce5164643f38ff962dcb270 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + video_player: + dependency: "direct main" + description: + name: video_player + sha256: "7d78f0cfaddc8c19d4cb2d3bebe1bfef11f2103b0a03e5398b303a1bf65eeb14" + url: "https://pub.dev" + source: hosted + version: "2.9.5" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "4a5135754a62dbc827a64a42ef1f8ed72c962e191c97e2d48744225c2b9ebb73" + url: "https://pub.dev" + source: hosted + version: "2.8.7" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: "9ee764e5cd2fc1e10911ae8ad588e1a19db3b6aa9a6eb53c127c42d3a3c3f22f" + url: "https://pub.dev" + source: hosted + version: "2.7.1" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: df534476c341ab2c6a835078066fc681b8265048addd853a1e3c78740316a844 + url: "https://pub.dev" + source: hosted + version: "6.3.0" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: e8bba2e5d1e159d5048c9a491bb2a7b29c535c612bb7d10c1e21107f5bd365ba + url: "https://pub.dev" + source: hosted + version: "2.3.5" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 + url: "https://pub.dev" + source: hosted + version: "15.0.0" + volume_controller: + dependency: transitive + description: + name: volume_controller + sha256: d75039e69c0d90e7810bfd47e3eedf29ff8543ea7a10392792e81f9bded7edf5 + url: "https://pub.dev" + source: hosted + version: "3.4.0" + wakelock_plus: + dependency: transitive + description: + name: wakelock_plus + sha256: a474e314c3e8fb5adef1f9ae2d247e57467ad557fa7483a2b895bc1b421c5678 + url: "https://pub.dev" + source: hosted + version: "1.3.2" + wakelock_plus_platform_interface: + dependency: transitive + description: + name: wakelock_plus_platform_interface + sha256: e10444072e50dbc4999d7316fd303f7ea53d31c824aa5eb05d7ccbdd98985207 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + win32: + dependency: transitive + description: + name: win32 + sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" + url: "https://pub.dev" + source: hosted + version: "5.13.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" +sdks: + dart: ">=3.9.0-172.0.dev <4.0.0" + flutter: ">=3.29.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..39881a0 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,95 @@ +name: f0ckapp +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ^3.9.0-172.0.dev + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + http: ^1.4.0 # API-Anfragen + cached_network_image: ^3.2.3 # Bilder effizient laden + media_kit: ^1.1.11 # Primary package. + media_kit_video: ^1.2.5 # For video rendering. + media_kit_libs_video: ^1.0.5 # Native video dependencies. + video_player: ^2.2.10 + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + +dev_dependencies: + flutter_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^6.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package diff --git a/test/widget_test.dart b/test/widget_test.dart new file mode 100644 index 0000000..8b4622b --- /dev/null +++ b/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. 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. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:f0ckapp/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z`$AH z5n0T@pr;JNj1^1m%NQ6KBQrxHN+NuHtdjF{^%7I^lT!66atjzhz^1~gBDWwnwIorY zA~z?m*s8)-39P~@uhG~7qCqZhc3d|4;4lG&j~$oK zA@xWG2F9zNE{-7;ld7wO#(qnZWJZzI2E3_xA*Lsx!2?73+ET^w%+}I@67GR zPL~gKB+lnDthp%7_f?t4uW8c8|3WP+WgZ_FE&TA=jOG3EO9#GP7O}Aw)>E_$k#Ij{ zy7GD-^V?e9l7~+mufGc|5hy!fsr=)zztlt_?dh+%eqZG?+EVFvYJGT3%B4l+c?Nxv zA961J%WD)5K5(#z=Uq!-q}j6RjfU+9tC!e#p8CvEH~sU+6WhDDJxnp0o^W94eWCU1 zQd#DyR^MO$Yr>MKOsyrcjGjlI&9nHBnS0EEGw0Y$CX2WHmGZe!`~O@#c5SN5zDu26 zDI4BKt!FtLvCi9OcFDt_gv}BORd*bZl^1SM*A_yFxrSX8ds2x$lS21HT;^ zTCIz7I(nCKmV|Unv7TVUR`#dH$H;AN(TuMbbG%<%3CMZUe|J|QuJuIw1-!H;WNWB?$;ib zdFQ+9g^uhz>as0SX1QKp$Jx0PS=bUhTs~c2!d=hEU?gX@B64~UD6e?B`njxgN@xNA DfL3B_ literal 0 HcmV?d00001 diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 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 L>gTe~DWM4f2kRIC literal 0 HcmV?d00001 diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 F695xY89M*~ literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..d4eb1e0 --- /dev/null +++ b/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + f0ckapp + + + + + + diff --git a/web/manifest.json b/web/manifest.json new file mode 100644 index 0000000..1952a9b --- /dev/null +++ b/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "f0ckapp", + "short_name": "f0ckapp", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/windows/.gitignore b/windows/.gitignore new file mode 100644 index 0000000..d492d0d --- /dev/null +++ b/windows/.gitignore @@ -0,0 +1,17 @@ +flutter/ephemeral/ + +# Visual Studio user-specific files. +*.suo +*.user +*.userosscache +*.sln.docstates + +# Visual Studio build-related files. +x64/ +x86/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt new file mode 100644 index 0000000..cd76c4d --- /dev/null +++ b/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(f0ckapp LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "f0ckapp") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt new file mode 100644 index 0000000..903f489 --- /dev/null +++ b/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 0000000..8bebf73 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,20 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + +#include +#include +#include + +void RegisterPlugins(flutter::PluginRegistry* registry) { + MediaKitLibsWindowsVideoPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("MediaKitLibsWindowsVideoPluginCApi")); + MediaKitVideoPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("MediaKitVideoPluginCApi")); + VolumeControllerPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("VolumeControllerPluginCApi")); +} diff --git a/windows/flutter/generated_plugin_registrant.h b/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 0000000..dc139d8 --- /dev/null +++ b/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake new file mode 100644 index 0000000..f1c4e92 --- /dev/null +++ b/windows/flutter/generated_plugins.cmake @@ -0,0 +1,26 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST + media_kit_libs_windows_video + media_kit_video + volume_controller +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt new file mode 100644 index 0000000..394917c --- /dev/null +++ b/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc new file mode 100644 index 0000000..3865972 --- /dev/null +++ b/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "f0ckapp" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "f0ckapp" "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "f0ckapp.exe" "\0" + VALUE "ProductName", "f0ckapp" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp new file mode 100644 index 0000000..955ee30 --- /dev/null +++ b/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h new file mode 100644 index 0000000..6da0652 --- /dev/null +++ b/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp new file mode 100644 index 0000000..c127d24 --- /dev/null +++ b/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"f0ckapp", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/windows/runner/resource.h b/windows/runner/resource.h new file mode 100644 index 0000000..66a65d1 --- /dev/null +++ b/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 nI|D-_GXq0IBLl;MdIp9E_6!UkK + + + + PerMonitorV2 + + + + + + + + + diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp new file mode 100644 index 0000000..3a0b465 --- /dev/null +++ b/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h new file mode 100644 index 0000000..3879d54 --- /dev/null +++ b/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp new file mode 100644 index 0000000..60608d0 --- /dev/null +++ b/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h new file mode 100644 index 0000000..e901dde --- /dev/null +++ b/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_

y_uhUqwLR%$*pFW?72VBUg9j9 zo12&9oH(12m-F~~?|ZGayhbbglP_y?Y02MSV*CH#0}V|kr41iIvGu`u1z(4QIm?G< z{|znw-#zfggG=W3os;GM`|sWS{;@CQo7ypJiGP*Sh4b^0FW3o}Jiq$-=ItkcwjYdG zsXOiO|4*A|-wgNfo%7$T*Guc;JqN?bd(hdtT+Gf$?Kix zW5;P=)}8-nVob_&`EQ309uRF?eCOMKaN)T9d4%hsWqAjnS$M1ot_1ph};HYAk;Ig^9i~XF<$t~u`KNYp_|Gqpi z-^Kjng46qc3$r>j%wKl*=)C{@H!}aX>s{OQpYw``;G3WSx9-1tW}fNu`N?e?&OW^z zylndQFZ(_i2`ra+m29;}+?MyK!J+apgXCq^uYG6fbxu#Z?yU0Bq))Y2M(4_=|1Y*I z1r6{zFjZMe3G55$K5&6$!*luNe^39EuTnXdZ}zrx`-`)6f%iU$UEkht{(8nq3#Vfr z5A=6eE)Lmy|HIGx-C4HQ>-_&-Wxl?^?AxFEd*A-p|9h49Tt4~6x2$6MkgKsz9(=M} zqqTT)mD~*lww@|R<2_aRVd{T*T0~ARubUz|m0f9)epP~_Ryl-Lr}%KOKnYGfi~@3j8# z`wr=KX5?9aOUS$3PhB>`SL6M z!>135vo5aTQi=*+n8zW-ad-uP+6moTpYK=MfZUT{2x|5j9`g+Aa!6;1+m`x&{)W{5 z_LpY=KR2Vw@!tZwC&s?VmFpjDZ7Kiu*Ykg^T}}1w?H(BOlumov{`HW_w?Fsu zPXF8b++O8!tyJ~D`s6*&=U>_@e0-0Z;(OsOy&vBnIK8~q_r2w|d>J7rr?PG7$tRi> ze_h(lxmztIgL|UMv*@i4BNl%96VAGu@^Sj^o=lGyF{pkwsz%%Yu7uRpl-~3Db+S*IsyWgDs|NAVc z)u#J<{h`&qvU`61_r3l3zv%7H=eajVCZDPbJuG`NH2TVF_v)Kk+w5N56lIF4;7#BO zJtWhoeE7m1iOfFt`Bt^|AHpABTYT&D`J$!p}g9Q+=9iH!cX-u(a4 z^21XepId%u!MBjPg_5$r7Q9-g^6KKn^N)9D^%(tdhzr^ya8piR?oFlQ{M6Vl!qxxm ztIk%HJrT0}pCY4uWZr-O+nfF`KR*B0XTIpm8^3&Snl8SYKTa>VZ`t&@pS@~rbo$dy z^j!*2^CMYkq!yvcpccref#gN1anVXFmP$W62>QmmBGi zlC9oEMb<^+he_rCdvEys|AsmLBWGA?S|``r*Bw;j-*5ZxN__M}iTXRrd;B%{U+TT% zJ(cWH>(OqN^y2i_wz-Q9?Y^9tDgf!+Bf>wIS{?cbGl_2q`w){9nL;Mwu@#=SRh z+pm|O5)lT?xr&13TtRad#ig7HH|_1dE@%F4wTu13ldkp?ADdN}EWXT;Iq}%zw*SSc z`+w?d>tt0kL(S@5E(#YO*iJ4I=+Pi~L+_J6Ipo4MZcS=$ZY{|sVeWzA^r z-Xw9}SozPVUrHV8)i0Ir;@nep>)EwsoIKCXUaVj`&hn^2zf@({q#5%sHP%nHSUHKK z<3N$ngMw z(;qggB9|DX9BBV(AYYp#>HN*u$GASOqVezgR_6cfuFd;jxgu(M{*8J6ObJKXV(!Muf`&1azpdQ=Jp9X+`h8RNr3$ARy2u`r+$1X(@^^N% ze7dasCfh@Q6t_R{6i@B0TgY9J@ICfp=CR0g6aMmDJ~Ll*-Ruj$-v-xPy{#8pns@5V z_w#apucdwKS*vg;;!*mw&~zJ3?p%TOm&>N{?mKgO8Q=QpR+7KAU3|3AC_hDIX$a%T zp36L+KCFs-_IX#I_|3*W8M{_qD7lkS{qKIA%jti+<$_NNGYUrNfLi5iK2F-I6wrC# z^|LSbN!9oI8eL0br51#WM|JI#(O|$4;;C1^wVpko1r|#PG`M^Ja z!xuX?i{GC8pFe)@JXsf)@DQfuxi|mo+wPueYhCtlVNdeu!sj!to3^}FT)(nM%WCEE z*9r2gw)BS`mu69&*sH|8B596dXuI0NyffNY+^rYAlqvsF>%R55y;L%%7^7f>2FP(M z9!}b*WH2Ax4u1PHKJ|IMxT;O!r>f64cKZhZbBNTLvyBVC>`k1jHAnx<>?dbGeEb-vXZzvU*+H+ueGz4Sr+=YzrCf&z_8l@@S9 z*FkQ2lRBHB;-cK6>Hj|YPrepu@x0{4;eG6(%U^Ajb+Y;)Yv67F2e+ait zg;6X^7e`EHpU^kY!-ZbY9tEo(Ryv$ERrD(Vuj$rr)ec*K+9x@;+NScCl`Egk>BOJ~ z$GXov7T&qrYnpQN;h-aosXFO5Qr8#q+gHq;^Ivb~w3AlZ=l&nQe`|)t|A#kzmCWo} z^>adKiG66U{c5?VRn;@iSI0h2HE0m$`M_pae_+Bh!#9VgC<^TP{z2~T&-cj%OPyI< z5*C7Lt%Ysg$GRL$nJiS^>fP3#d!{VYuCf2H)AF0AYWDT}SJ}SLEY+!hbVdA1`n4r} zoafc~)x4G|ud$!ITT1hbtVer7gZ`hpx!*VN{pqe>p9o57ntG0B?J_3!p~*}_?Zv4xFHFVepM-oU*4Z+v~p{ROpp z2NvjnMyMs`G^jDK$umhRFcosdWd2^7zxn*qtMgbs`1hnP3tbs}VVYm<%)@h^&(67` zz3TDRMSM>kLuZ`(eC+2G(QEqI?SDdd*@SEd6HOo~5!?ZOO}o<*KA?NNVU?l5}a+jrEj^YFa? z(R^<&Hr5A+OaZM}Ys_S-IyCFq!YQDU$~klXEttz$U^jo?F~$2`{-ryfG?t!f+-4P= zDQr;qMp4>6?wmz__*~7Si_0p5Pq<48y>t3)bN|x{`!~#&_vw9}v%)57n*6osXC)04 zmqMRx=26^foFBCD@d?&%_LrKkzde0#+2w!MYP+NF9J`ir{(t!0%>Q+3YP;1QpEKK0 zE|7lfbg$@gy|#^C-c0gt<&bn=YOr^8;vSwA$0Q159%atb-+6+qKXYHpPt&|3oBk*N zeik0W3rZjniJ-#h;lc3h;q46H0+Ur4zJ)$MC7WT>`|*>1+GBO2YmOF$)7Iv!x@j@- z`q#HVLfVUdJ61-hPv@*$Va)e=#nHgFnwFmDUo-S)?XWtNCfj!6d*QX&Q{TVVDVACD zvH5g>pC!k>p3;Ex$0xq~bZGfMyOi%Q9(E`8uA9NK;rajYeVZrRKK}M6I9~AYs>knM zw-(M{wr-nZ%B8rLo?!9A+p4s-E;o{|YMv4A8BsoU!L`{3E6Sx-c`lMwY%_@UjVfIG z{pP0s(tT_Ee?`Z5?}UsN&0@GKjfvNBk(U z@Y^gGc<|>p@ku3HUe5Tv+~8We>=xHKnJprc&o=XYt&EJ*KP?)jKH>A`S2Fc&S5-@b zg}a+t}okOb6?QZ&rR2aXUVXzolf4Boou?Cxz4bUbh(C5c~O)U)w@*#bf>Oqv`Lv z+Rfgs+K?ovxP8%<^UiZJ+nkl6H&=gDF7wYiU;iiY#x}YXOW!TKhW0nNUsb&B+WxX4PPZ!U>FjR?b2yxK z7dp4?>nWTj`Z7VbWzF-?BJ=$foH1`#9f={fpkc z^z*jaT&nl`NU-!x^Z5B?2bTq3&YiX7&)%zBb8ZBe>=%1#x^Zuj^!f|sJ2o}E)4rr4 z|EuD=RJyl{SUvxRc{g=mPra9t|L=ZfPW@gt$VN78KL`IC0Ta;Pqt5|eEMaX2IB)Yc)LyUP?moT0 z@%yS%KZISTC?xbN6sJYRr30md#vs$uD-O)Crte3j_3FCzsqe~@}kR|A^%_f z=iRe!hBu}DFWuVqy=VXY7cHOdoF%TUU)}$;`-#E%*B`%a$lWr5t%B9Ha-U7noL47V zY^qX?-pRjp5c()#_F(<7wYNU=9|4a;FA!w3tu;Ng%uQ*742uEhhrr)13+#mxEUUKN z*?YiwYyE}vJM9VwOdfNz?<-h;H~agXIsbnsH`@N6UsGlL`*V1K`kC@m>6Y1ho@bc8 zUpw)Mtb2dvwQT9C*()}Cq+PG-F7f%q(aiRBRZWts+(J&1&ZTG4t;#%DwlHTN+kJ(1 zrn%giFVFUSuK?{%*-!-P%oI7Vrc7-)^qwTji- zl{R!U$jSBJOk{|dRO>LAVfPQ7nS#H>eA@Z{)Ld}0t8d$~+ru2x!L0sQ_(1-5V2FR^ zThLrb{;lQz{xsI_aIcuJkYmj@Mf`VNbImPYqm5r3kKfT2T%5qR{({Pr-$mEDMT5lO zChYRAeQ&+U_J8cBDLSBx1sXHCDqHqOHpa0Dmb@=zv)zwE{zgSehFxKO8 z*(Pbu^^Gd6lC42gOO1d0 z%l@8fk?#~9!xVix^4p5HKmT`!pZA^fY~6eD_b;}-^}T2t^KChM>FHCqZW&&^Cwat%- z8=kNfs2y~PHYgVXsx@GKNB{4a3UA5{^ZRxdhhI>9-DRih94Bt{{N#dt20d1C_f{D2IaiscT?x)-E6QN{ zJn`Gdz}5fiFY9G|`)D>T;pTtq{>=0B(rsDVpm}uAKExIm&}8_DbvsH*)EK_yzV32v z;6G7Q;Qr!sja46O;nGL<4(=4n-(2k(9>a78)EeK@?DlKIt50@KI;Un|yOR4~LweVw zogBuDi}!GLJZ?YJ_Q-X%L|G#HoO<2g@0*sSK#K_5nZBSR!X?3nA)VY&*x9y zx3@d@$x89Ia>^dR-)g0m{m$}_eV>%vYZG8ISk+;BRdy=Z<;#Uzrh9*_I{oPB+HUWA#RdLlhYjEU)L*tZ2Glso z@OSXfcq{4E#Gzx_*t~7xZ@p;F1#cPd@@%g6Xmhc-VcgIE(`WIW;}iXU91F$x!Qi^`qFt(oAwxHcr?$5_l_{1+8rYPv~+RqK9N_)Y!6yQ z{rpj*xjXyLD%=0N7izeJrbd+nB0e7f$>E|J#4>FP!#S286Xw3?JHKn~E77vO8fV*+ z?0A&VR`GQIIIE?-YJQO1yH5U_v+Ljf?6=qYapnI1pKrd*tIv4)S1c;v>%LEK1)uw0 z{kHI)R_3X13;V+-UaXYOXHZZ$JOA9&tHLJ?KdD`te8D&O#q+<8om)CzS}A_}b3bMN zuigJnRLxCW1e$h4+|UD|NK9 zAD>=*jq~=B3CH$+xV-Io{PMrY<$HVA7T;9QIsZTW`0~G>_sxDr*KkY!6o! zt(sCDnK&o2E%ZrgT>B|T*1~@!>sIV?nDOB3%6psU&vLoua=W+e!F;=~*IVY?0_7bC zV@u=8!StDY=B74|th+lzCnopS4msR z%Jct!k6eoM)ZmbRg~@I z3)(GYG>5a`yXkAmZ~1zUTHB-l9Qd<{J$l+^zF!?X*6BnWCzRi=6i|Qq$9=!-wztcE zpE15%{jW0L$@0Bt+h?96+fxa%{`VaIVpCaqTG9SWXt-PY*PAylXgn)lwql>ctd;_e zVhg_w^UMtTU;eT^ZDdn%uSB5w-`8jRIqkQCYmRL!CX5%REx6TvfJ@k-=;RBZ25#XW z-a+3RMff-UNZh@M{kB1Wru~z|xEbF{rz`et{P!~Z`sT%DaxLq2u$;Rw?|=LJTPNmK z%`JcF5kI@SCs*(j`=y_U<$SYK@_q|gY0lnOu@ZD*!exu87d2YWG%FpGEL&Bx&0qz~ za-*xMKQ}Km(_d=4IcJsD-)D!nJ^%mdZ|LgP^T1Qs4#!!(uv|9`=oD@YRcdHIbhu3I zfb2GYncoN7_xy11dETU$`ziCt&&RhF`{b{sMyM>-(a$+tby^^)$MD*WABx*kUxatn z9+>w({{QXGH}Bt=SAQ=!@y4~h6N}H-9h>~?&;HE;`foFDZ;yJra7tSRvqXA?cgE&Z zA*~bCL_L%CF50y2^MdYQ3Br$kza*Uh|Mk}A`z&)I2{s)RUXos%LXB5d8)_fC-~RW3 z<{Fj{iw#~oPUXM8udlz_vMc@PjijE9U!B8am?}R1m%eX1`|nTf+rsIqS65Fik`ViA z-Er0W1(&SHEkW<})SV|Kj5b+33E3$>QR~<5mXB7e4D4%G@BLZ7+wN;P`|MYsb(0Pv zOjVP*n?jvj6TWgJ2t7#NW+Lsl&G9K?2Z!vsdf67hb-;o#Lsxw{PLbD|HPfBOWH8I`y?501gn@J~y4 z^f)DC3j546?h^kt=pNdzPXBYE{`u$HcD@YN{|u*1zdhp;=Ztj=L&8CQSo7SQ|IObV zu)p^>H?`XG-+i{HpYAhWj%|;#%l%jx`+Bv?dFcZdhrO6~t$%XW_}qr-+^;IXelP3v z{RtWZiRa&y1=@V#kis;Jp@S#lk!yk|XTnMgnd6`D#!J}PT<{+0LXPv;NcTV(s+_rl6v zP`+_de;{{$@#{%Uf&z`AN(Fz6Zu2GlKKA|QWgU6FpAMbuG0zx1CDLa-)X52bbtY^5 zrn@W#Y2V{_>mQbQ)#d$Q&CfsmH#Yr09xr?M$k=5Uuj;YyP~!^;O~V!yRP-y{x{D!U;kU$RS480R$yYZz3bYbHBm`{Ng327UaVeT zuVhg3Lv(!!N5X3RV{bkjy%+6ud|&D&mg;}@-_50OmcI$EcMUJh3p_j5#;PbM+N8_1 z(pu=&QK!Femz3U-3P>v3*S7N>k5O`QpX}w@w%8ZPHvKP`yM2H8%}bCS@&U~aY7AKi zf5u;GIiV8PaD&3hN!LoTvKMpnY=7K!?1)TWZ9Q>;;Uhvw$(b1sZu>BPO-y>fR zHtdV}_>kkk&-w?uzP{0V`?KGU1GMVmQMB~U$?MUQ)c^x%GX}sY%DK$yBBIm zbLILRU0rspa&l0jn{~pne(TNYZuh~>xQ(^OuU9~pXe#i6CK{7vQd&9IurxM*3;fxC zBl;P0@iyi)EIlq(m7Ra}3$9VLN_PM4@?D*GIN$N!`{ed1&W zyY>9i%Sr+)o%xR+UoQ1^_J_0|75l?_wg?Ibb^QLa;@BV1c6q+ye>bQ9)D3Y4wU}HI zJeaB;Nl)5W(tUtSXvd{{M#=Mk?lEQz6YzZ>`wW!-3rR_6bECqI4E z3j6V^V8@4Mn?DyAKbPw4{(SoMcdOdE=U%J1mN>FBm!0uG;4q6}@}ADn-PcQPZ#lS> zKFvN~ADgrayesCg@CB9wACd*4E`0g_Fre>}(gYpGIh-F7t6%R~x4U+O;h}l4JqJNE z=5}n+&%XY>o$g-!?vz*o0F%;)(uE!tQ4)cuvhN8b3E|c>8HJmobo&RH}7e` zFq>64gYEb_c44m23w;|l=-96*Uo87$x&PnR5Kxy%LuteDb&G1A^13_p-#fff|4Pld zb%&TzyAB8mS!85i_*lv?m-E8?2T8Aw&OPp4{qL)NQOvs=pZ~8eyY+u_zTf}I`F?M= zDawe)%ctsm|G9f<$?V`IlPm9Ltdmg$`Fx0@Df>ouC2olo7LcJ6<8&iVS;+-vtXx0TGe?p8N>+Z(~dYDQMs%oZjs zh07$%maW;fAi(r8&uZ^i>y};bwYbdlJd^2ObpMOs`p*_CV^~}gW*xY7E9$Df@nznr zU2YEkjTbMN3FmB1`8H7_R%t^NOM%(}+v{u6Z-lSX=4&)fuKo^66wc*QTHpTE|5=^B z>Hd%QwQq7hi0^%;d+t|7)gk`Nm!*Dt@~+*#VY*3ILqz8S38VeX1+p@QoMKE`A8Ksh zfB&A^t>CL-Hahnz3{J1JUu6FOZ|@9~&I3gPH}2h=wtwc0fGh_g@CJ|7UJo|Z_VfL| z^l@5L_;!|pbBCO-uS<7-dxtf)kaJIF{=fH?e@ebRy?!qB_OqY0|F3+zqQWrupjFrg zURjH_(v&SLrC;SMul~I4Uh~&Nsk0l3k6vZDq+*}OJlkYuM}ur=?#`R{{_KDK>F-sm zwNap+$G1*-)zQEqB6xwTK}qZI zvrMLhh=04c++J=}_EgiEC9IR-+w%K)e5?2IU8uWq@WbD-eTO{X{>sD7?@XtQHL0fk1(+Uf_dr<|} zj8Crmd6}>6WHnQaJ8m}H`b?hf8r%POds>!s9C!s<2J+=toG?RYZ>QfWpB#sja|$d4 z1`qyjONmWqGC9s)CU4wk5$^~ZTiKTP`kwmvlz5Zp@_f_&FJxxB|Nplcr@%bU2eL-@ z`^1dwr))BF7FS5O1k*}Z2{b% zlHX%a!#o~gX$4;f6*C2+bOWXzE)ST?3>NI;3#jKP=sQ$f_Tawa!PWfh)41n+`+p&R z-nn@u&*j8rzFvq-mzvCQ{$^Rj*-5=|iP7&j{H$2F;;H_vC(g$dZ`~Gpwmrml|4*IP zdj?J)zdrYVzlY8DQ`(P;=UmzxIoX%jZhP~8?yb-9jaxv2qGyy7R?lw#H`(I+k*V6( zSsap_*R6-RCxGern+sMs>=$M-Ty1Bx`~P;^oBv(jTc7W@+L~q>zuor#{Eeyq{~P|e zBL64IDxu@Df2-IW&IV70d7KaCcSTIk4YYsu^z9 zot=^CYS5T=L8Zkx?w;C>#uCxlZq@&;x0}T7as{vPwPT)fFCmLbq1W(XvGX!fhD@H0 zH6HB@(>6R7*vdylb+=lV|tDTX9|){-QDOEqAzA|GT|- zI*TA^5AQxE0R~TnmFh=X*bdHKz{%k6Tqt-$vEYK)w)@GyZ+(okj=jvX;m!YftFM1P zui-ac*Uvlo@6xwFhYO$i3)@aMX4GL~@14xxn{qYN*_P+xwd1c(bj69c zwcgX|O_jLYQN(J{Xuo1=gXhkT_xR+`b92{$24VW%dLR48Bs^7>Nom6ZmM@|WU)cPF z84mZIT<7_7bNYF{?1@{t9S*VFO9Q*Zm+1|U(47CbdrnT><^>v=Ecj>t{fgVS4Y?8RHRJ$-jK=H6y)KBlOm(RQ&{QuD*B8kwa& z#!GhE&YZS-Vcsog>6*HUwgsT|1&IB=(t^MBoKOww)vwdCV z^8@x7ONDQ=vd&>SFq0uRc0+%7a)CIzV|&Nw4bllAboZ`Gpqf*q;|6KU? zXMbJ(zKxc*KL2koyJfFu6;ZM$gW>bcJmDf$hA`PJdo#qH{#*!L5;M*CZncDzgL7ui zd$y_COIGq6o|XDDaj)LxD<=*1B+rn4wI{UtpR)>hBkKV#(E915!)rMkjDtbvKkR>BPyb~5|8q)9-}ODeKA*DW+;FqN znnAWUU;NQSd%<|S^ULB+?R{uqX0k(EdD+wpOJ3f&yK-M-*hTSc2iZgNtY)NMe|=#8 zUFH=sf&z^hEG29XCR=)0vzZnc?y}(hD%xNXqguL?Q^p$Hc5B~X(D{E+Y(nkt%-4^f zmi=p7w}Zv+cGMq!`#P)Nm&4uX|KgTix#O1mrR}~i`E#rf+~k_fu&}oC$GOjjqLSyr z5+y%Z^PMy@Nq@1E^96tItoCPn+rOv0-&6B{PnH(wAc{sm&KEoleuZU9KK_&DCcN=G z@y$%`H)tXM71e?Z-wr=^`IBlR%n&VOS5dR&d40z5#qW0LMEwok_Wb|lvRnTrmucDm zllaWPssH=c<*U+}TE4U7E}MM9X`d6K2n9O;3;ebJ`mO-7PmrkeZmP|3$H$V43 zT*3Ee_EC>iP&;9R7HDtN4UcSY@X3c_T@2rj?!SMI<$&GK)SVkvF+P_`SlzsC2g|)J zw*TkXW-0%^E3Un#tUrZou62jIOz@%m+fQ~>rZfF0yJxthU-smkUrC7?J)hjJO}|vl zeSUlS(?+MhOwrk(rF6=_uEaM4c!Fxfh)kxcMLyX-R{yD=H|^*qHx?n~f5-HM*05>@pDh^`|x<;=kvGQ6?r)>pLwtK<&)s?dM+Db zhTDvP>V@q1{`x2{k$Gm=Th$!z>c*R+;L9X^WM^cd_)bf> z&&rj&w9eq{AIC!%3M32{GzQ4dnj++V!|8X!soQNP>y&EDZ_oQ*o_YR1$Ar4>1`ZxK zhja#>wtXQR=jnJ~fNH$S`&dIs)8XWv{1rHo-_E&uJ@fxv>C#?zHvRqb z-L6vY_oD{(e;3vMUF4VbpVqFZ&RC%4V6@%T+A%p(!n$>W{hG-E9G^2cz4y{mYd4#^ z@bJ9)x!>a5+@PwG+tC^3bqkuu(P*|uQq}*9p2>a<~7Z9 z2@@3t&3LW%@&+IFny{5KgGpiI$Lop>pr%cv7E?r2{qfGPJip%r@BB7jSd&ULP=?9*LO}qQ~$jmqVahrNSGsl*^TQKjV!J1^L{KR>j4aK}{yDtd- zxuCI(-8f@=(xz{!oU>*of6>^xH}Q`x`}Y@H{tI+n0+nV8OvaoqRu-$x`^UX~d+^N* zH|y^&4P^PH)L_i`ZsXr?&T}{&)LBmdd%v&B)_RTY|BLOir~lQzTYo;q|JLkJiuyl} zh05;URhA_5pxQz>VZ~d97kBpX6%{SWdv3KVe#t(K^~$BaM=va^{LVG)@BYU(_MM#L zo!pwG0h+B++7JXTNDH!A!3F8GX$NlSs4{%J``wnap}kt>NBQiR`%di(SfH)PXz_o3 zb(ZpPetrJWRWg1ubp@@8vU>wFKi{9yZOk}tvnSvG&I8YavbVG_{&8HM5umY1$9|2t z=G&{r=L{yDa!bm*tTW}-=ldLMr69+aNHE&gs+CEvS-+nD^ORW<>@$^_Y6T9=WRTxv z%(y{h|9bBE%6l%CWSy_Cc@**O|B3pS_2=znE$$y)Rk_c1s>M^ICuI#Uv>8`SaQk#$ z;FDx}q>|zpEn{mz;bP;C^&G0-{@kz0=;!<6op~Uo8{9;Y0G-}umT(JFPApY#nEc)T zpKu``8_(R{&u{hLId6L&pa1Xi{jl^mr9a%~SlQmt$G!@JsaNN_G;K{ zxZ5v(mYYEfqg~&Z1K}Bc{=a`rNIS%L>yW^=9~PI)XML`3*8P1QGES(#Vc9PH|Pw5)i2K9a=Ni^jawE|LZo}xUm-@p6}}97zwUy@H_}g^w&qOjV|lHV zQrq$)(m1mGW+rGqq*bAQ4cq(p+nN9Oe||h8`~LFZ2dWSC|1RnMrFqK5`&8Q4tIBrHHC~{t*LZo`v%iP?=b!ucx^ik_zWx5zdB825DPX2~OJ(R3_jQkVimY68Q)hPg{I5yvp>HeRKeWBMTkpR7 zZJCpxCKe-TM}3u+Z_b9?nLbyaHyzQLZmG1vhJ|m|_x}eU_%QrA{N=yJ%(NG^N>6Uu zIF+@({b`>h7{ASC%B7c_-~QD9dVTo)Pj$h2>O3>!)l;HdcGUl|J+jH_Q-Run`?pmN z99#20$?2ev@sdLZXa6udomUOvH*PmFy>i;b$$s7${#^H2)&IIrO#xT2O0bk{xmB1^ zFd~cT`0;e61l5N64EHnaBB{_4m1-HS+7T9a?@F2!~5t@@ZQf_4hB| zSEI8NzKKP)ux|zrley+V9dcn_gBrsv;~cGpAO6?NGTjhaeyh{rJE%i-JcslDuOBP# z{$K1m$Ns_@qc=bIUq2^k@iXji<=Z-!WvY)-zcJUBs{M9iKWBfuU(r5n0~S>5$FT{$?`+|4kK!{d@sW3IaI8xNS1d z*-!iX8oV~k{@an4Z?u=c2-$v*d6nq#UbW2y8k3#(Zs{&-d%ESjSoP=iw*QwbgbtdsG1@LYw&0f2GQU$f zjQ+l^3POw)U*tFZ{WJa6#5<|{?>_v@-=6w^y8MNC|2+;H2zJ~4-=A^%-~KOAH#2-z zZR-lKnrrs{$W}q0ol^vtO^ly%{8wy?h46!FGfsn>d zpWBUUU!4!`6h5B$e}BTc`s?$5J(f>x`8>z`TJEjG0d|+-mg(oOTI^+=$3DYKLZGc8 zc@>A$f7JH7ISjZOu$J?=i=cQ0xA-~F-ke@SP(SP~8zxDV@UP-6(o+Ho~f zP@vI_W!oL((DU~u-&w#11say%WPjJx&9<|%6Z__2oXD6@x#gmX+lBL14SKxp;)58z) z8{RTlh(AbHzrOkKt-V0Mbh1j{w`bM8MP?_G?Y@Rg zy&h`&t@Bd`zZ&BP*#zO`TED#391!5GoztY$ZlGz>ou(jP81Gjc(f)Eq;)-swi+0nD zTXZ|_XF--X`dn6t1_cb8Y6AP5)AwacSjx2R^UJ3dRjECg&t4U#TMEk190~L7zx_TO zUv+!wullu|hploqJpW(ppPN$u$*X++ufy_jR=qu+`wb6Unf=-|C3>3sPoCPnijOuZ z+Y2913-61Yk^1|iX7`cxk$qnUmQ^Rogtw)BOE|xO+TZCH1NU)s9M~jqV|RIe`Tt6N z?kSDG7jiZL@mp1aezUn*Ovi8JszY}k~ z;$wf;)ZP+kTQfPIeSnA!2{N}rElIH4)Jd(lsA&QwaE6rq9AB@HRx0*g$0}qiYv}vSZU0V zb|7#f_@aXwCiDLb$KO6t_xkwPx&M`ppMHMv;`d4hsb#kv+H~G;sEWMu{&Ui?%;P$< z(_TKG$>6+(rQz(B>S?{sQwn7g<@MSYUwL=`d1Ui!{#2_E`Q}njK}&8LICwxiQD5(+*MW{d;j*U$Dv>DR22B{d$Zpw_9|$F z321rZ4Nyj$UEupOiZMWV#;WcH4jop|X-02eOWzdU_GZsp*5?!XQlcY2-wGCY%C~&X z^ZaCHu-vz+%U9lie)VeWTZa06V@9icd?33%@7l0C&p!R?^4Jy4JGP&{?JK#aAJn?K zeLM$tG>U-*qb~!G9ZN9VhnY!Q!JOa%F%5LMf8_1Y|Bs5V*8Q#j+qtvm|Kph#6+c({ zK8o9Z{pg={UraWh-M-NFM6<8m+t;DJhridKvlEo~?Zc3tE?yS?Hhyl^2ElC??UwAl zJE8ToCw}wVH8ww{2XopY#NYHKR*Qf8wbAv?^1Xjdz4u)I z_9wpHCI6qTIA}^NY;r^GL!GPkuUA_tT+0Sc0erDyR)8L?e34_$wyjUg{~mq$#(rGZ@WjmdV1|E=(%$a)7GwCyY$=hny2lq!VH~vL6>|$Eer&m%CSFl!}I;C zgs&~VSW~p{al6T9iL#aJSLxhvmaDzhXw3NUoEqb-JoW{5U!>133x8_0{+`b4`{h@@ z{gJ;q`+p@*D7YP}WB@wHndf-iEYK2@1Xa#GnQ~9k_wAfmyD;T^{mkapnm-p__A>Tc zDcrt&u;zu_r&;O2@!txq9VUA++-KkP=5*ex)l!$j`s{Cs-t0>K|8w5|!>>bKq05LG zICz{Kgc(57R;!E|PTgGL!s3$fk@G;|p7;9aedg3#MeIv2+3=#Iwe--I{MU~|Uv1=b z`crXt!qK85g{?0G^S1Bb%Xduj65Eo!Ywhl>H9dN1LH}fiJA4mvb@H|zmMA@JH)U(* z-1l$O?%Y0Zb4zg9!AE!5w?3a=170W4z_G*^G#1j^e-1p-+{e-3kj_$Y>;GT>Ip^f; zMRx^QYrUvYZ1>YW^hwM*_prq6_MdiVtvI^BY`C+%Q}(-+WID&)o@zBax!ZR7^65-} z_U5u5IM}e|^z`<^D<8N0s)*RWe#`dRg>4%S9`DZCb=2>7{q?7}KF1$%gPv0M5;Ptv zm26bWc1aREAtJyi_+lEvw?FluF@T%dlkLlQHeJ}6B(*hSa^iNew;qdYTCSWAnr3*n z+~Y4t?Vfz=73Xg=gn2ynVen!4@s?rD^V^F0XVNRV7H;n^`?W_&`hI!JdcWWLOp76h z<~OE*#szLJoR|nIG&jhwoSV`9Bmd0L|GD2+?pI>(J{R_)MLcjt(DD_rfpW5uQ!eTq z*?onv(pUc$OLd0u;blg%w>8JzYMx+LXw9I`m?8gqlicUouljHHnT2iqX|uYfd+xXY z-;{5CmM`{!)Tk~Cs+ndnyqLFA1++@4fun~rq5g;ae4ELC@BKJn|2}3Rm#ot><@3iU z>g`Iqs;T|?rybwVEr(xoz5cODqVR?GWzOFqIPjR?0uRdhv`7PTUD}77LuJV~JOXB{;5`BUgX7nn5p`Gd#Kw>;8#x^oVieEXhriTyTX(8k>-{GN$^OpBD* zcYes3ff3}q|IwSBWNxYltOcvq@yFh-MC)<{^xRIiMFkxA|?xb zM1ESxhCX@Nel9M8|K&dYeD#vc+YI*S@7`l~>xt!}nt8o<_%<}2XHluzm>;ThWZwVT z{OQ|3XPPZKthw36fkjAl!`{8R^~M`FUTgqOT!NRxip^x0^MCi-;QIO>pI)4`pQ~*( zq4rDft_8Dytu*&B-hbX;OJios7TIqmMzxA2$n zt#c-aE-W*cE1kFhUNJ}YzpZcP+kms4Lnza>U6p_KJ6si8B@ViEDM@%*4Y(Q*1hou0 z_uEaj&GeJkw+gYg)X5ZY`?P{RDDYU(6XU*33-xa}MeohsGEwo(myZ%<;Zx67ZQ0$Y zdxP&o`M1sky^Y(L4}6O(+noOoDe!@2JjHo+{%K{-# zTVdyNvrYCA`+ue{R%-7`%{_EMaSPWrCib?a_lQfu3?HQV;{lh&$C{#%OgE}wCZ z`2MJjp-yQ--fy$7-M>0)zUk`lmp(jTult*SC1~7Ffk|n@2^JH^4JQ_>-v*^j1xBVH zZ*Kqpx3%}p_PRUowd~(7xwLYzvpah}ht0xw7yNEKdHv&uz_)LS{OXKm>=wcbPu^Gl z-jNPky>)X_z3h+YD>Wd6@dh4{u{?`c*nt`g2OL<=-H>{}Th4y&-_E(;wQUs}-L zXaCCJoM%JCw=A_O#}A!t`{Ja3uT-ATvf-`b41-sno8HO@-(vc^`B%we z%m2Tw#Lr)>0vZ=rQedhDl}q4rZd@E#ru8s<`}26qfAupfKlg>6$qV8?bfNKcs$uR5 zZR-*{=iRSQyeQ#hRd&5*KN9~7-twDxawfyRyq+D~ZysN{T7y6J#^?3S z|2;e*(QsfB$c7~4s&6`dK9E&nnZgg|{l8yrc<=R{5B-Xl?NV%1qc(K<B_}yx%xY=rT>oauR7j(1$s7mSVUBU;; zGzavU3LexwTb;h>?a%hlVpat{hdoz6I`h_OS3A!w*;P*e0>Wp$Tl8mJ%tg5(OSgr5 z`t{F!8uCs$q_5bnp?{^TeW5h}yvy_c3-mx6wcenUroGLVyqW-NZ5~nnux#zaeYd~; z`F}He;q0q^>T^w6?lmsC+;QQ0=JK_buQy!xxt!;fW_Q`S^@;o6&2MIf9{c91cpJ2} zdvD#dK(~ED2kZoIJe|pK!F}#RyH~ng`Br<>tFJ$OE-tDGJMV59sMj_v%i^jeD4TS+ zKbZ3N=l|CHoRoOW(BoTY7#7-#P#_kGlRFesdBFsbWVMKy76%e zm+idN;N1$%*L5WK$-Vw9F#F!W)xJz7cljKCa{OfexjE<4FG2aYKktjDX+w@eyTI7^ z_HFLZ*|G(1f?C*?c+UcDDFU5-`Cvq|es{9IErZI0flJ$jo`PVD<(75icdkG^=}zYTk` zPBb$fe#;P7H&JI=@cQ@WuQu;l@pgCa`TxA`PydK-41}z1KJZEC0?UC=mvu?v3R7#IF`w4JumS6(r9 zXqxAuSg1L*)ZaC96n z0RcRGlp)?UK>#QY8R znm2f)Gr}{}e_yzEPRY`>GWY8O+jl$O-|U)P$Ac}{;ga?} zdvrSv=e5}J{jRB(aQ_!DeY>=of$!}Z>yqSO8-2;0@ceV_o$Ify`mFicnLqh3|zV}&n+NyD|o$sc|$alR-7_VicK{<8i5 zRvX_GHvabKF~9i#ih~~)eLiZF@wISCB>TrHdimmyc@oth@3Xg)+pWJ)Z+@DL;v1I} zd#uVf_Vd(6KQY|jnWMitPllcOkxv7!wakIrjFwwEjh^3Zv;F_xW?Ox@^|o-xXtDy+ zYDkH+1v2R-BN(9w+Rk)*eb2o=(@XDKCl~Db;M~6EjG*>u{mU22?S3=v-E#H$*IfRu z6SHTe?b|-JbQjObhF`m;#JY-wE&lU&<;60FTTNwe%0(q_eU5LP1X_UA(ZI0=wETOC z@ukvv>6bP}P3r)4;~LMd)v5mS`e^mPTK1PMhBBuNznE?9U9A76{l9aM&9m)SFK)4Y zoA}~sN#^Y7{TB7Rt~|_LFLghe?a6$OEuxyU4|+9JZhKn&k3aK#edsmFjvYgeoZQ^A zzl&v^*QT5Ub&DknLR3K6WVJ)WVVgDmHicHd7f)Y)|4;Su2{M2FKk8V_=X}l6aEY_` z?V4R@>f+nq{^C1%`?kk!fk#Pm16SRAuOzwfT-v1UEt~k}O8;+JYr)xI%y=WeEirc4 z{bt+$+up>38*&{73RtdPyY}qwPPubCM6a&lY}mpU_ut`?6n~^Llea&^>3{YgxAwmI z_;FtSKfzClfiej-b*~mYIMe30uDsyzCdFUDM}#Z?H2SV-w#fZfc_P26(sshdsdtR3 zAH4C8y{5S5WBUGpHmehdS)c!ZU!ca2#{4WM;v4Aly!pR?_u)6wVxCpCEwTHWqgD6nbLNF$}{PAmM@(CGxo*>H@3)P9*xt_jrkRS zKm0uF$j$m!nM#X2rLDg0zBNm+PPJja#sQTBd;D1*9oWBJ{^oY?HAbMK5PU_`CLdvj zUECmU0xRc%iNAL4mwWs3d!PIq$0aXCjAWHQZ~W&?{Gng;-E6Zy z&+U>%qZ*IAGtD*6wq7({zqb5Spn3V1vmEa~h@U*b)bRXRI@6D$H$V5E{Prha|M~r7 z`1O^`Ks#@^+J!*A-tdRTZ@%sHyI+62eB&Q?cb>(seb?^^y420kJN?dy^OUZ(n z&)+UAK7C<2ujKN(wKopzn;g7ib4PT<@?5JJ#tF+aZ$wl?v|D{PW_b0 zT>fuH7$kET*g&e8!~BP*uu4tPl<@*LY>GgaX8PaE{D0%Kzxw(!oG~dviTC%!pEPRg zzH>fu+wXs^g-d=Kd%K-6+VgUG^ZBa`4{!fBc>8u^<(fC|{d&)_9GLfCx({?d=wk4F z4oe(Br)KA^GGpydX;xzp+Rc7$j^*STu14-GE(tR^YVP0r_5bFNE%jDM3s}TIekxNw z_iurIkMaHMvb)xAIofW=_j^WOa<(M%Gv{sn+b>>SvbOx+O}Wa_oI_p>*Z2L7DSPzC zT+<2CxB(U9JWR6~W-z+Df&(yzW!=x^**Eq7_5a>f`z*EeVal;5kKa1av5#ARp8N5d z_CHtjZm_s-*T21@-|A(`@k{5;zq{sttCf3QSo6t9?ODr@w@zH=Ezjre5DV_tS#;W(I4tS7+7kyL=5P0GU}pZ~AMli4_SJ=x{I8YI z?g^O_ee0mXGl5O-FEsAB{_^IAJJ;Rg-gJBamaM9Mn8grprr%c=_vsJ+rvJa5s&Bep zz~E3&`%>ON-Tdz#`Sky9kFRG_^@8+dI~q6|4lwlBGTC<@m}gsEW`FTa)&e7t{TYrA z=Kn9xzN!EB^xvN|8FY_a$$KSxZG)lgjSYS`<&SUr6Oh-l<$A0b|8GX?u1~LSw12zM zE-$~FH}~oFjYqF9Jgge#C7Z3g&D4b?{{e6&{1vFzPHKzcdE6-g{BqL z%P&cMSA6ti;pbB&A&aB9zHd|Vn_VkY`7m^f_%%(h_O~n8O9hYfuiJ1>!~9*o#kZ0_ zlJA2ax7yd}RiFCyXMWk~f130Esx|B1oXKGRZ?%5f`aQqcRzuHrmS||OW42)UVyUHU z|L*L?b&p~}=Yq$2Oi^S~5}3&_XW8U335IRVM{I-}{G@h0e(ZC(a`w|bZEr7_wQ6t4 z4wJuiEGL>)GNjNeV_Wq&QAU*E!#A@w4`1-3NMZmcIxo> z$}4hp{<>EobDy2PKj-!KZ#Rn9?>+x+c5xl|HOb^Y%UwUCw|={oyl(6BMX`bL+f&aR zeRfV})zkC;!ZaQqau1Zbecx+NRqorzf46wbf7ZXWFi+R&$#N6Fn!5JeKVH~}*nIQ1 zwvLnI{?b@4kd%w~^MFp0Y1_1#kZ>dJJ`m@oOBCIdE_^Ho89ut@CZj z{}s+67akIM&C)7*!a_=?zko4?9f^HrV7d$yJ@f_QPa**2&FmcS;oOL7i|E<91_eE}8NaHq;Saeo4 zS1fJ9MvLY-(r<6ROV2ufsne#DwNNQ7$GA>C>H1S+?;~P=YL47L_3Bfo>&qRo(RcUT zeu#LO|8Fg);liF98+ohl7f*iocYf^SZ?ZGCBz*+=m{IXUBFh#whjzxiLwnU2W-<7x zfrJ~6_Aqd*;*K|Yv#v6G7H1=Oc~&%gWcy-UAyrZfr&FgYnWKX_!^c6WMw@Xz9gFV5Yp;*Fbg#ny$f z?cEaV>o$Myg0eXeET=7s$@(h#Qv75`XRr7Eu&|Wd+%xxHmak))pnA}=F|FuO{y+b^ z#Po;{`8JhT<6oUma(c7CdFRxN-x&WFGpym<@PENP76mo1D;oWj7R+ZT5xV=VCYx!2 zHhZIMt{r91Bdt)9bDpnW9wzxp9dbBzW*b>bG_Q; zA{py9Ggx-~xm8-{%kcNfx`T(6OF@zDaG2wTIs>oswL)fJP|8@v_~!ehRbHcKhq6U#vDZ-Ir*$V3CeF%-+eunwodctjv&d~Uw`?1?GSzX!F~RV zWc$=BuO(BRPFz;MdUDT)Rr~AfKNS9-{eLHG`)L~o-!9RzH{M^b{|aaMcm4dDvg)s8 z4P0kbz*cP$X0&Cz;Ae9Cv9~b8+k+c(y(We{VCctGwC~{dB#Q z#;SmTn~PTUF06W_rK|Gxht*7h4O?8ZX1S{;>%X|Ip8WpJ^Gcd8N|wzmKmf z|95%98P?1twO4}{%e}O%OFZDcF7A2Ujp7ZnI-fw2#04d$Dy9Xl4Au$jI2-sHZgqM8 zWmzElB}JR1#X((g$B&-Wce}3l?z*_<7gM65+pUv7=6*VRCs1OO#g>gX@>AbFknGFq&PtVkhXvxY;6C(KkwOIf4ESgeSv>-N9_I3T||7V>2f875w z-R*3$V^_ojZ>g`Y?RCm!+1q+|m)CzP+g^RYqLy)qDx|C|Ra~IX@TzI$YOh%gFSPD( zvs*uG5nix_v!Qk2q&5KoCR>*Wi^TbNXUE$<@_YArwMXE?6OSgS<>zCTCCBJzrX#T7U|P&nmvivB#J!k8hTYaEqG<+*%z%e&Xj!FFY zeCC>i>p2UOrmxfbW9E3v`$(WoQM%ody=PWObyj*`myz~OQ-BsV)_ivj%)%$(OHm_fdO{Xc?2%I`%IewTj zyt*_w=)1s+OW|AJ@n&35){WmM<9tDwp}9_B>VAQUCXSdV>WusTc`weZjPf*Xbd6fG z(YH(B$-{e}d|OuEUZTO5;`(XV+-)mP+?v^HbGyX5GVu1RvMe6;{U7F3zdCr_`D4F~ zg!F=TK3C)Go&aKFoi6)ozw_ zvC7+RpoxiXj+*X}qOM?Fz3T(>IP+IwTPsQvH?p||@4J^TbZy;TcQ(s{{O#}E{(kJU z(*Jrcoj)b{vF^Xh0oCwzh3v=q168yjdDtl-K``T^_N@bbyYCBM7iRcd*D__kfB;h~ z$ATHV9&CB|p_pO6i9>L7px`kj-r6TG_jt(HUVXA<_4GshwKs1(*m+pI^uYJS$Ex)f zoVc8)apqZ_A>d+m2c)d` zu1h>HHS_9Jp4}^cEaL3m6QZ80t|y%p74K@3a)RBuVw>&k?Q3P9#NPC|uw?@ON8fsl zZ+kC@{ctsN-IR9B=*dLOhn4?l|8K8Nfi?+kV}9{7%ZzwKWRIk0?*~_xhpt zTZKWdsc!FqO}x|Y==e)!Bnjg^88X1a37vlg6~x*Nn8w`6=_ zU(ea_&w}ri6Uf~gGz2YI`hR=*&)tH%!+Mgp=N9_czYjE@`*()@1F=a=%l^lkxq1H&o^(6AR38+%0!&T|o^yo! z^t$$W&lFI@*U5oHhlwSiVech-&Vt^0*9CJ~928r7U1#cE(UIS(_5a%9;LOlTOTJ~= zWdyTN`K!vm_i4p*855EJkxe<9_s@=8^yB`Q6W{NKRJ_?Qv#}v{=ZVMN^O+qw9FO>X z6gglxQ_kf^w-{T`t*igj-bvZz`AnQ5ID`9k_BQ_={4ra@vY7+~z^#7=QIA?kY3nuJ+N5Z(;xKIFnnW{6@g@dC!;KNsW(q z&)4JYxW*S0hYBn$2OL1-g^d|4P*^X`g#&0>YE>$eD8X#w!8J;^Vuz~#@9v!EKSaO zZr*xjdam)lsgZVPSBvM`ojPy*+pJw_=G*sd`)gjOec#OfVRn7}%});=?z1cATm7rm zv!NraubizY=eV2NssDjba?d~6BQK!F_@e!>^Zuz5m&mho5Wi zSv|Y=edg7?_4oJ!Sk|V1vxMS>bdC(B1?TxXE(wAvNS!j4xWA8fs2w;dyNhXK0(0N8 z5bh0&dh2$#_u2go4te5yjbFO%^ZuU?-|u#Q=KkvkZ@owVfyGbN89zOm+3Bnq%rlv7 zLi<6t!now>jkVScJ_eiuK8a2LdZO-iOWk_WyycKZ!#sYi^HZx{m-+1QULX0q?7i$_ z4{&Lwz@o(T=Y*JCZIeU$zPhg`U$B|;+AW9f zE9Awcy2lBL(@(uBy5YDqApF)6fz#WYZ8}dcnla^W=Il>?mnN6nKA%_nf^+`^`ANF2 zOwwFsrw$$bQ2zGpWCqpT^FJGp&1ZaYvaw={(c}eU6~9<`FLm%cr!3kwVV2!$*(q-r z5`-Q&Utd@LcyjygN!@ceK&=@uMJ7}GH1UTOzl%I(F}yf^c+rv;P=4)}Z=62g>`mT> zY^FI^j!a!~&71?&)A3DN%a?k0*}}3jtD>$=KXF>@>yyv_R0>b+p86Y7N!4oDed}K! zdEf-I^U2GnpBUZoo5&I#yJR7u^$j}cIck{{XS#J zJ=&Zld1_w6=_pIy$e<243x}ys>nE_MYDFsR8~a*wGL*+i7?^)Q<8*w^-z6JV{j>hE z?rUr=x;@SC`#b-8&%V8pUSFUL?yZ7`4dRp+a5lurH$M9Di_^hSZxR=y;sy@Eir#qP z2e-m|ceq_=aoBjQiPu!A{FLwA8=+Ukv~E;>wosX>>M0%YDb{yaU&8Uc@B4q&zxbWF z_5Xr-jqzcZJ~v#5zxBOpqssDUi)EIufpP>QjzqK5gT^>bdfs8Qs!o&R_Loy8!(<5!+}=?{;E`&uA*RDq?cu|bWYs`1w$ z!>=p{4oP@Ab8s}ewlUQ4eb`z#}NH4{P+LsU-@?_pPZ^G?>4D?LbaquWw-5>_JE_$%PfUmD~*kQc-uFMZF#un zmI}jNL-~Lc8tPvcX*_K_bdYiW`@qGw?r*wdq-w+YVWIZ*9i5uGJQ2L+CtDi?BJOa! z;B5G3y>Ax7i~Y%qdcgU?TZmC4;Q8;P4Ew&k+M&k4y;+G%@_QX~_t(W|xs9UzH}!8- zy}iKo+qV6)|8)F6`+pg`{CDnui3{!QIU4e|MSO9R`)zqFrvKNHduG=g&hf0n=QzU(LNe@B&MT6fqBSxD5K z_IPl(khA}5dz!|l(;|y3BnsbrwD@$wE&u1nt>^YCpK#9cpV)nL$D2f^`{z9wT6)SJ zJaYSguy$U@^iK{`&-$gfT`{)Hx%T0tZSYEk?>6R7_5MGq+Ft(O#dSUlDDE4N_Bc%4 zwd_rBonile`Qytt8|rMdPI-c=xD7`Hcbw4Y`QiJ&>p*hg>`I-0gvO%x;uR6nQKzDW zu86I=@^bo}?5Bl)K3m^4{%-$@ul?%3g)h556zH_wk?CVPCMNTsY`mBAb+AAD_CrH~CWSi&?w>YBOzBYdGo(t_vMFO2ip`8A`<8vn~epFsx4M z>x!F9ZUS|I5-uthyjzv{{p|Ih^Oc^Q z!r$Dx_FpW#sKT&oMZS&OGp8yIvs>iONR9i?%djUQO%&1wr>*v)3Qq{a1DOg_q1vh1kAMx)c5^QG-z| zY>Rj4VaEo$GPyN2lZBd>b7pXJ)#o^O|2uen^WA-^cm6JnmnistZ)4S!rOL2Y&-g1Thw~n&-;I7Ka!uC zyQ0ka!Dpu#vM>6c<{w?ixoaQ)ff>3s|MFdy?*1n7E2&!V)07J~*T2d}uq#Y^XjtbX zvgbYHk2G$3-4C0JGM63rli+;sM$^{H3+$PTqRNH+nPUF6eg!phcjYe8069;>g(WR5 zjm_|_>)g$148J~n;N#_esm@Sa5d+SKdz~LlU9MkT|G6!2`=zktyFSYoJaRrOQ8t#-zZn`Y*cx$=;c#)mK!tQ^I;tr}XSXCG}=*stc8Eq5py72bSyKj>j zrnj0h_HDbowgysVHVCZfY*1s!I&}H3U;Xk$f2w`H2M4%->R5;SiVgh7ivP@Fh~I0m zj`PA-mb2={uift$JmZU;Dt#i>f9u7DiZ}mfR?C;UKi{-7y=UnOPc@#SKjy8Yl*@rjGfx9hIl*1Eg+_Kw|8R&9+EUZ9(Cs#8FK>2F)Z`s^>#4R+QVcmHr* zO?Q6(x@6gJD{EDCP=a`&$P^*`!0NxsfkM}*$%`vzuF?~k$og#|hl|d6hjvrtA4;>8 zA{%et>#CVl@uvRsce(HDe;wxFHjA$*7CO+!d5f{ipt6xqCm?}Y~?rHYm*!35*D0<@Yts>I@azFv-a4{Z<+5?|{x77*UU}tyM@)y>~{uZCxYHVHhJM8=W??=M_GB#CA-5xtFe5yNG9`AOd7ZjQEg=C+VuI)EQaepw=>VV)}|e)@geYMJiQG6ne&UgGKfH ztJ#|r($klv&kE>Y{jZ(jA^)zIY@2PIZ=PrSB(dS-m6hDJw>IbpztlLW&2<0w%G-DE z{S}t&Relb3PM)HHt?gQMhFz>>a|>^M*t+tZN6>2N#+^GYeHpIwP7?vu*QYpQzJPim ztHjo)?fBh4w^aM~g6_n}25#GPilXH!4#^%2`cv5{?JiN`v-Nb6#TT~9YcDwqwGOMj z=Bu+Qh%^pwv^kdGpYb&E$=^Vk)t`#4#)x(QSTot`p8ZV;^)@#D$~|A-t4cVyT}Usz z@J!COnXm<>K1eclWQaJ+S|k{vWUV-_w?=*RP-N88IQK$E>#1 z?){Xy%{v=(gmf1Q)N=@!?3H+GYuF-YYAbzBu3`Tq8E*czc^}MKKF7;8>lpJKKQ6uS zBxlQtn1AM94qFB}O&50&pD5Y1ScBuQM87kw^KH=o<=HTK)2RvNpD#CMuXNaY=l;+8&*HzP#~%`T ztok@Hbg0`^ylDc z+~;~=KMR9D!5ZSB58nqgTo-0g%{c3{!BI%=Ywlz+78W_3r!Q6{Tq z&3g;CGuq7mUOD@~?K&3y+eXaxHx0y-4zPt89GZ5NJ8MTU|HS;3GEenwi|bC_`n`y2 zSIzN18~$fa7X9~P)7?yIwYj$r3FH*WcevIc*=bSq>%CA^`P&%<@;hGT{gqiDVdUA` zAn+oY<&QAKN%cf|_1!K(msuS0`AZ&hKAg{R;kQwBb&N#kG^ zWqC%2Z2Y10G~lw?)4yJUEXB<6T3vIc?`}Hz_szQZt;hd0`$@=fyZ7uBAhvZ1T|+syW*JMI2F{aE~6t@%<3gV;0f!bF)>sYiO}Iq_RL*EMq1 z9{g)~yyZ~6T&sP^hICISp_)aDyQMGr|Gz7^-N0o2l(*?wR}yE7_%qdfIAt0oF`=P@ zi&4=)faAw@hA)qlD-<@o44pKK;f38N?s+V~I32$8cPW87%sT`eE`I-Xx$W-sINL`y zhODn2Nu^s!^;B0}X50RBpZi^(n?ir~v9qSH&|5fF^j2qcMdPP>X5r`y=T`sM=xWuj zc(4Cu^AWyH3g>K-yBeZ9-pnpOp}f8%+5XodztS)4%^9(?)EXB3|Mlqom-D*at@ZQb z#WcQ8-TJ$A!-Mnf$2MM@sc?;@;(q$OE80x2k9cQ+rd;J1|BE%S*}trs|2gTrgD^vF zMax&Q20I%KFHg`~0T+h#9DgRo3qLsGTC~-Bzw5%er)xqb>ps`-|9{qgfBsKDk;87< zBKJ~{mb~b%4_FX1pZn+2e=DD}R=(vspK7?stmZ=BlxIs4BVXJRR8v_nGqd@LUlMcq zujc_@`hV2k@YmijYniiiuX>fq-nr?Y6MqIgxT)sKc4Fg9-hB2Qf4E=Y-N!6^cE)Kp zP=Dz{D9f?q$7lcD@j7dsx8@C{pI%#b@XegZ5D{}cc(EXp(}L|BF;A|u{Fqkn`k-** zrnk99x^CN@514ChJGlPFM%#bS?%)5(?|*W${M?h*^+guVVd1cI+Q0qtmJ)w^lRbr* zhws)L;|aR2adY}7NBR2M@yqxt4SMR6ZfHD=_hD&S&UWEt_n*l6>Gfi+_V2zu7OW5c z!T$S<{Lh56q%TdbU5wspqU}OKhA++M-nu0_`JHq4`r`KGThj_IE1U}8;AqTKTyUMC zjQge4;|!(+ehaKtr0tVCqVbQDVJ+hY#{*BJI5--YwjZ!u-FDYJ?s>f6i+VnT6ViGT zdomUzsM&AIT>SgzUH)B*ZzliOu+yFvdu~c#+~NbzR2aD4MNB=e**Ga&;py*$={KDW z(>Lc$*x+bd^2qE9>(5mnR*k-qJ?(lp5F2M@cFeD zXEEeD2K%)%2)tlnYUh*nvR`H`=w>Gk+A_)8a8);Se?*%a!!Fisk3gHisSdQ*_Z$0=dtBH zYm+q7Ai`ZdQ2Pj1eNuQra(GGDrW1eC{pEjfNv?l0J9eMWowxJ9+SKm~`1Ys9@go0p zj>fw!Z9B}P&F)PQ{@GJzwQzU&F;hmq9^W#nDSyE8s8VhTMVnrw2T!+CmG-N=DE;MU z_yX7d`iBgESsLn?0y=uY!$^(S1b2M+0%^HE{{4naqRZXhCO~9sPPp{PjkmY&n!mnU zqyCNkt4i%Z{Er_fPIo)@pSSyW>R*MAoed{gqcavsmRxx7jCCeYO2_sc7Y#o3=uU2R zTV}rh%>9SoUH_lSs5vwL-s`12#}CcVy%8L?etp`PPd__y7G$)`Y$`Lhi{1)a-xI&s zlridP;5R1+jxF+yP4gLU_;d_7ljOwb`^_r8QZo4vCxNUZ^NVi$CC zEbur2?r-f=+R(i)yUi)?&d1)4qdNO#H}dW}WB+ac$9L^_a&E5vSJNIYcgXmAoTkVN zgL5(|N6b&NPN_bd@%*=7^T#4~$Aj6w|L+uHC|z;BEa2#TA8}AI@bKIFWG&&Uzj%Jx`n+1*Y})EEAGZUozHS$ z7Q^371_^b7A9kj0O^v+vkm;eS#=q@%U)O)`e{}zU{6cAw$I0IgGKv^I?s<~5?uz{0 zANK+#gd1{%{b06T|G4yUic^AOH`fNYpobs-T}*xVVxw~2HSzyH=GOn~urCqN*8afU zU)IroZbz#r*NN&bfjh>9*F8N9c{Yhyd0NZ5d2T!_v*Ez8l6N=E9@t+XU*K|M)HJYR~xM@Z&{OS{ei*YB*xvTxa?5{-0++9TYH_qP;u}JejF;&trqW3)St|JEg zB7g5FKK`(4irWG9jSUN2KkEH2ZaBRz_Wd!nFJ%pRvfM{OMYa{wO<{&_$*Xp4s@m1m zpvJI^sW@@MA>o7bRsOZL$1z8A%zz|)K7|il|H~Sr?_0d`dv!o`P zw@lB!`>1Z;x5j`!(b8WMy}us5TO6`tO~hWluF6|MGH<-RackS}n-pP{O`dhH6?AG?CJ=lpu*;*ia7 zg>%XkaI#se)WGyAX205j(tmFmmh*0Zwf4@uqmesJwmDtQuv+1rwd>BNUg~N;`ZkXizYE^0LajL)BzCU9BQfcPz-t&*f;TrU(Ps zOEZp7*nM@s(g)l6y4|;T*Dt!f^5lMS7S&>Urp|Cd^Z$xfSxfu;KnrL67Ts>iKQrm4 zu&XeGZ-Tlov{el4)XBw22Hsi9D$BiZ;v4h-#>H`(!fK|q5@uhEc^+JN9~k#67$&ui&xO(f_yBP)3V~e-n-kZN?+N@vTAeD7Ku%E49VgIVWqthNI zu~dC9U2Y-h=?z*|rm6#J@9yekxW=;M-`B-?TUKbTH5RP9%;;OW<>9O;dTZrU7aV_V z{{OW+U;kfrOOeRG&1`lY&gDnnf8Ct0@j?0&9lJBlp)dXI-aOzaivQBjv-{=L(|0e5 zF8+75_Vl6me@=H*&UgM0JWbqZ?{*va`^)6+{Ngn`(v*85$8TD@pSzjxk{pgH)lyF+ zEgo<`GqRdAtMpV!(M*38`#9Im^i7~X1AlDo_Sti0o%1~ko{(xeaLEMDD4{P^+b ze}fsKb}m2P*A1G>OL(d9!RUWfgY;2A~ zF&B*`<>L>#_h+iS7pz*g`^p)a6vv+`403u7{x7~>eS4;(e$RdJzwTkb-2eQ&TNkoN zReolnSHuVByvoJLr!;l_Kb+&i?UuC0`pB#$6U@vm-QcKytm2Sz`iIYzGAAF8+y;fu zp3iE1W{B9zOrOsYvAy_GY}HjM^HPgFSvPhGfhWITXfXZ$_V%>>Dk~|EbFbYNoLp~S z`g?j(E=z^egk5)cm+#Kpf7L7)G}__hz)`}*c*R%WHuXmB(gfdzKZmWjr&ZeS&cWhz`HZc+yB7aD_y60Q(0WJx zkcBf@MgFh}>B~imh&Ak#iK;uj&Y-bku>q%m)W40j@ej`bJpMcV&*H!CeV`Jk^!}Rq zT=}|x=X-TBC(Mpm*z3vk&SZ__Lv3&E^}!eQx&sgI3yzgxYCmqKu`TY2`g z&U4uG-hUnke})p4I7?9`CkGCbHU>4ueLuaQW;5ML;;|{ONIQ5;Jw7;u3ZofxNz&HMh{L#mM_q{l-^>5(| z{Gt28%+HWhIbD((r zkyGDOtj<{5%L#<2_?^G_eC}=aJF4^dN3Z8Nb5K~BrNv>nz>L|mtt$?3s+XMF`^OA4 zraOyeo#*CDp*t=)-Yb7_fYFyB(&X^`QB*!~?;9M1|$AXq@=b$UBc! zD)p?I<)iqo-`~vr-u}q`SBKo^_^QntoWH!Otn1h?(M|2_5&L`ZyZ_CcdVJSmbs6cp z+x^#nICk%3SO4I=Ow6};LH2ux-_M-t#9plz-6vc7Gq%=#n#}Gpi@XEvtrL$c1*ko* zbzCm6n&o}fAtSbu>p#^Q^?ts|GPkSTAs74-oXKZ79q?y(BQGiW(0%4#i_JB``%W+U&OMK|Bz{-@U)&(hJ3Z&)+g9tPXX_Rp%>TE2 zef<&rAJZ#O$lO+%X!xVcE@a(8d)`;K1s1-rue#GQ`s^$*%?LW+ou%Xe?1m;i*NaJ%d1`u3}zE7d^+s=&+5)Te&>CC z+Sc29%h!aNd<733%yLU8D=W+S`RS?e?b92KLBk@(JGMP3O-f2yrpj&v9%AEY+@{}Eyi~b*} zSYAJE{oB(aM&8ptFe+DZ*4oWqG1)UR#Yxy^+mfJV{v}g?p1SqoIp5s4T#wt!n+`lD-Y-;rSJAIo{ByxscmEra~OLsi?~A8>J%-~`tYYn2|TGaPewcaJVr z{%xjw;oN$|T)*6xyFU9foYA{`F&nbv^q=d4t98B&`#-Mdh zb~Sh3?}Y`=<^8{k-%6Vr{V%xTOr=Iz;*<4H-2Xb&wflAT|B#Qh3o8Cvx8rn7TB}0z znOhkO9O{fGf^`=wrms)l>yWlbq+k2v<&DdHc`8%icEnd+35cHFZFO&xg<{0N{Dw{@ z&ks4*CtB2AFxN=!Xf!il!&z|iYLsw81!xrEf*s2TmID_8zRlkH;#%FGE&3B|Ok2R0 zKCR9@W%~bPe{XLl(}LW9(-XmU_g?TS`r5~(%I`wzS&z0?{%V}JZMAFsw#4S!JDxTE zG5>!s-1M=}IiH?1oacz8seE3y!f~%O5S}f>y*-1P#V&k zv1|2{`3y5&=ef8-)^#>k2|8$&J?ws@&Gh#YgKzHX53~Q5_V19i`PRSQ>E`u?0ncWx zcS~^${38E#{j1sET>n3u+*iEg^7*5GCa{zqENahS_-=FFKZRnIewY3D z_dfzZ$bYhqzny+K(t5_lE2lnd&1mE3vAwII?7IJ{aqa8d$8$#TEMwpO zYi9#ACHQoAJIyRo4O^)q%^|F&E8&uLQlghH<7^+e0=U~~Xv=v)qwJD6lhXpB#>MXa zuMRH}nl{hdgz>^>=LzZ);`jd*X4o0f14=Uv9AEUADuf>VuYR0ymz!Dd{-&e35uX># zo;g=r+a>V!N2P{GxoJN)1$^-Tx#<6gkEajM{THQiLCk7{yL5FN$FlOCi`zC`_{R1! zt@M)JeZB6$3-`4HBX5b#kyA-IJo$XTcck6SD`LM=nNLpXPC3S(ED`AZW|pk*yTjMl zl(sMb>a?h>Ve%#c0VYw7AL0yN&9g#{jS>o+5au;PuFuSt&ChK-u>@z-PeC7L$&Xi zbk_yH`FLo;B@?mVirZ@<_gr{coy(VcYG(ND`JGKG|1+2N+zor1v*^1qX_asr!8q&a3U`FTJ?9Edyx97{dzPU32bl&7SVpCgwP0Cn(4l%;wnh>PzZ7 z?)81#%wk86Hq~4IN&dh2=jwldj_;}8Q=eCIL)JENr*(;!&aZU0w!3?#FPGNin$mP@ z+uno#^&7XH1Z~uW9oEWpg{7&+ZAewlI~~C2>bur+mDi7B;1k zZRXnz$4_cqdyv>?+Z%a!$)eRKzV+n_zjF>>dvz9rXojZ(ON+x^jvu@KxBq#4_O#to zuAJO@$L%g}LD%iQb=$)G?@!LnJ@-xC-ec2w3SMG)L6>EN+JXO{cLkQOS-Y&paeLD1 zu`yv0e|Mz+I*7B|S&QmroaFMog-eli%Gwi?< zPB$yg2`B$bU4T%8ZAU*70u?<%`}PCH3t!kmbR1v64){8Se3&cCC%y-;IuuDM3L*oiK#mfy&0B`%uczB&L`ZzdTFV*W6gfvgfa$B!hVu9K zm|1uIxuN-D(h6yigQYdZk8k+@<0Sj8nx93_=QG`i%u!nj@}C387i}hu0~^#1l&+U7 z)W5gwVs6C?PV>r5@dxWg<8D8H|3%#9UVN_3HkUQagrDeqTA6ZtP0!jj4*lYaB@^9i z-c7l9Ch&W6~( z(`Ok8ff|q;ja33WUK~ArC;rc?lkfgq?u#y9t$(e5r8(|^QqNJz5)I|EZzCMo9Is`k zYG_>aVJ*%1C~v$+ME4+$?i9^O7qU!`7$lJ0a{e;V8~=$_J%{7;a6PU84+!- zTcIo_j2A+8WV4-Kf85#G`E%XTGq$E%uWEuOs|A>9dk<)zx4(V&%g6gg%k{PQU-=X* zVE;vT>(THF-dzV<+2>RyG-mP&#a~FVncZy4=s!2)-c&PT@1~6(j!!tDt|gnVWSW$` zv8QqJ{L~vc6HNMDA3W@sw&qw{^Q}=rE};);MeF0`aEmn;w;#d^Ha4G#HKCj=_r$x-f}7_)$D8Jb-@LWQzvZm zJi&LG@8l=mwhT|%m5j5KY9<}&R#GfnCCYQ?SDMZ$@txT&X|?7_?6EeS1uvgp|KZv2 z=kC4UT@&_!Hk7b5KA&GNC(Ll`7Z0N^!Jde2|q_yu>G@4w;y zy>`v(nrSTUZMSY*JAQ=y@7`M-!a)c6%)V`!GQ)&DY2|fZY1xgr8Ly;cO|SGmJ)~26 zIX&_o_w3#KZ<{>3_j%>*uf+{k8zyxLM4STE7|%9+{QQ`EN;Ma6Y0%DFxu8-jmu-ve zJ2iFn=YQ%p$nJaM%mHq8SM`G;{Pf?e^YI3f>0S0GjjCtGOBZ?wkMLKI`HqGXhLDahwnS)|$9OV}nCVyRMw# zV!7W7=Z79_6&IcHWA4WT(YCu@a-}A)DErS+J&>lcqPCgUu5G51@SO_^o8PlIay&}^ zJ3Zyk+4^Zb{hp4ODtFyX_*C|6##@6r{p8!na$EGDMtllYi9V4&i@henw}C%yX*i2s z%iLeB2ZCG<=$lyE8X8WlD_Ihtb7lUk)pyxIIf+f+_6sF@&TnsS8eenUUj*GERoiet ze@p!dKGC01Q&t!3B_Z5*yND{DWJ+M>1a^mk@|1A$l`^%i|z9XO=viIcD#-l2lBD(Wc zPv%D~l-9cGXL;+v&2Kq3CS{0}w>~@k!L#A~_jNA$Ivj<}ab^5*pBh!{G}T?VKQ%6u z6A$>6w#R2_rqlf|-0lxbySg%CcMc%%*h?H}X^WJ~0&GF@7?KckW^3w`FxF zSfw*_bU&E;n#nNy@!S@2zFfKQZsyg18sTM;){htIU3`!+~jSn187BgyiI<-oq=KFcf$ac@}FS`}J zvtxN$os%~y=BwT7T{21HNQcPXC&69&YM!<(I_St4{o?c*aS7=y66!a$eQ2-KNv#O_ zwpBoF#vy;*`0cr~3+gM5%D#JWBV_f$6n&PK0}RR!#2M}sJ@KemaI-Gw!{fuJ*ea$p z&)lWPP*r`WLTE|knfzN@INzUrvfKD_9b{j$Q^G`rf`69!W!L|IjJ_l7_h~XiWTB)U zU*^KhW2f`|7U+ENDL)@+UEY{jpfQIfVfGerPGR#44d0nOTUx~?7TE2`NqDL7qQ~ST zcj44^F2xVk{ubzLP&jWFbV~eN)EY+nFQID!C*9kVdMCE%X>6460+vn-#SKpcKIof# z<~Om=&z@Oj?=(#&?5^AfHHKZi6{$9H!IeQQyRxpXQvCnojPcZ0lfVUN%Yh_k$X@Z< zH|BRLk3V|OuvF<>pYh&^4gE#is$EaNN|-Nld&Tt2hxUhCiXCOG)97>DIPqB6x9P3* zD;8}&D5^Cr^69<>r}nN8(4RE5S}QNodYSXAsF2Cat1^Pcr|j-^ovkGK``r!0hkEPzw(1zn++1oTw-JbathxcpZMJT*uA_PJkH z()pZqyG6{U(<#k2rtF5tqxHA$XWd)9(O|(f zmK9y=ty&HwxjmSfKF{*O@%Dc8cQSbw-Nk;p>}~+fSTGb#6)^q(k)N0Mth`l8MzCmf zXDet+fm4E@QiCaD-mlH~3-WC$E04bT!Mp0&(Zz>WeP)V&Vl2h|FW^HOXYlz~6W-fr zolduBQ0qT5ui5$1gPpS-Tjq18q+9L>#trXjWd&@!&1P_5UC1i`IYVW_~8lIyonBWBRV@W1GynJYfky8dpYQ|a{RWL z)e90C9{f@GbTD;RW&BK6lWwtAyXeNn8tx}{gr{Aa(elqTcipu7Gub`@+{|?^R&CAu zzHejO*;ECVmIDb&AM*cy%QsdluG=Cp@kShIUtpYKy!E?3*VaZq|Mvd=f2Um2uUwE# z4oNN#raqtlHt)y&d(X~EX~r&#Z25Y1`wAV&YT-NAj!k=iwU8;#WAcxyXPP;qx$N@8 zw?8Y~_)%i=6sxOyr+km7{k62m?zHZ#{EPN0o<5vt`1)HOuTgsW56_0v>mr}4sa>Ak zR9ZcC5qRlu!+%Z&JI)=-#dSszUUdy_WD>D- z>B<|MwSskG_pI)f+$hn%W!5{VqF+v2H=@6W>&n$$w$C*E%lg#wQF-3{lIiiK)2(f4 zOB{niD-#WNfY!L@9jHoUjXo`}&1$EbCBW#*V8Rj6ezkHX&zG0W=gYk>u-OT2QF1ie zxiMrj)%;H0|L$JM1~rHMOU`mK-cxyB8uxPh=`C}gPgjk(asJSKzEc`azR#FXaedyR z-+xoV*?z$d!ReV3%wBBrnQP~9+A2Ep#*v5YjGGk9bES&^KNa4-YwvIMs7{4w(43+~ z z*KDRgC!_CV`*-*=l^FA1+rPxjEXB2G_2pbS@c^+?)0F!EJesAJ%Fbw4%cXE}yWtCQ zqhH%=l6ECr{ooo>P zYeBwNpr7q2>4jfBxuQROx!bWmW;*9ZPt)gDxIebluo}G2yKVN)?u9s;P00_BcYdI; zm2T$7lP6E+MqId)Z}EF)xb&Q#Ei0BORay(axNF{7)|a%Q_M?2Q*G9GjbLyu~sM9dN zaXkDcxc0i$bfDhib;$P?m2VpMD@|I7#nUOPAk_= z=d`EOzSq5&trvNJnMl=2z1&v|*US%&{iWjjTRQVF`(uOp6KnPe*0;9#OzFGHSD3_n z^nbv#le6Yde&;-Y_hnz%OU(VeiTbIa8vV`P-R0BoKig#T)6?P9o7~%<-iW^y0EMBz zhSD8J?Mwb8>o5AOKELMEg!#6=BW3q3QG)cPycrrHJ%Ii{QMa$LXzZT-e)XX}a_820 zz2G-L@mnHVY_spu2sVeM>_3jB>0dIFdvb-d%lF^H`dQm=>;G*m+Ft2=?L(Su#AB@@ zvA+xEur$0XH)peZ+qKX`}