diff --git a/.metadata b/.metadata
index de745e4..ba62e94 100644
--- a/.metadata
+++ b/.metadata
@@ -1,11 +1,11 @@
# 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.
+# This file should be version controlled and should not be manually edited.
version:
- revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- channel: stable
+ revision: "2f708eb8396e362e280fac22cf171c2cb467343c"
+ channel: "stable"
project_type: app
@@ -13,26 +13,20 @@ project_type: app
migration:
platforms:
- platform: root
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- - platform: android
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ create_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
+ base_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
- platform: ios
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ create_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
+ base_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
- platform: linux
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ create_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
+ base_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
- platform: macos
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- - platform: web
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ create_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
+ base_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
- platform: windows
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ create_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
+ base_revision: 2f708eb8396e362e280fac22cf171c2cb467343c
# User provided section
diff --git a/analysis_options.yaml b/analysis_options.yaml
index 11aa977..a4fa330 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,31 +1,31 @@
-# This file configures the analyzer, which statically analyzes Dart code to
-# check for errors, warnings, and lints.
-#
-# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
-# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
-# invoked from the command line by running `flutter analyze`.
-
-# The following line activates a set of recommended lints for Flutter apps,
-# packages, and plugins designed to encourage good coding practices.
-include: package:flutter_lints/flutter.yaml
-
-linter:
- # The lint rules applied to this project can be customized in the
- # section below to disable rules from the `package:flutter_lints/flutter.yaml`
- # included above or to enable additional rules. A list of all available lints
- # and their documentation is published at
- # https://dart-lang.github.io/linter/lints/index.html.
- #
- # Instead of disabling a lint rule for the entire project in the
- # section below, it can also be suppressed for a single line of code
- # or a specific dart file by using the `// ignore: name_of_lint` and
- # `// ignore_for_file: name_of_lint` syntax on the line or in the file
- # producing the lint.
- rules:
- # avoid_print: false # Uncomment to disable the `avoid_print` rule
- # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
- constant_identifier_names: false # too much
- use_build_context_synchronously: false # no
-
-# Additional information about this file can be found at
-# https://dart.dev/guides/language/analysis-options
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at
+ # https://dart-lang.github.io/linter/lints/index.html.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+ constant_identifier_names: false # too much
+ use_build_context_synchronously: false # no
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/android/app/src/main/kotlin/f/f/freezer/MainActivity.kt b/android/app/src/main/kotlin/f/f/freezer/MainActivity.kt
index ac121af..bed7d55 100644
--- a/android/app/src/main/kotlin/f/f/freezer/MainActivity.kt
+++ b/android/app/src/main/kotlin/f/f/freezer/MainActivity.kt
@@ -1,6 +1,6 @@
-package f.f.freezer
-
-import io.flutter.embedding.android.FlutterActivity
-
-class MainActivity: FlutterActivity() {
-}
+package f.f.freezer
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity() {
+}
diff --git a/android/app/src/main/res/drawable/ic_forward_30.xml b/android/app/src/main/res/drawable/ic_forward_30.xml
index 46f27b3..5fca728 100644
--- a/android/app/src/main/res/drawable/ic_forward_30.xml
+++ b/android/app/src/main/res/drawable/ic_forward_30.xml
@@ -1,9 +1,9 @@
-
-
-
+
+
+
diff --git a/android/app/src/main/res/drawable/ic_heart_outline.xml b/android/app/src/main/res/drawable/ic_heart_outline.xml
index 316ed06..61ff6f4 100644
--- a/android/app/src/main/res/drawable/ic_heart_outline.xml
+++ b/android/app/src/main/res/drawable/ic_heart_outline.xml
@@ -1,9 +1,9 @@
-
-
-
+
+
+
diff --git a/android/app/src/main/res/drawable/ic_replay_30.xml b/android/app/src/main/res/drawable/ic_replay_30.xml
index efd3bfe..f642205 100644
--- a/android/app/src/main/res/drawable/ic_replay_30.xml
+++ b/android/app/src/main/res/drawable/ic_replay_30.xml
@@ -1,9 +1,9 @@
-
-
-
+
+
+
diff --git a/android/build.gradle b/android/build.gradle
index 0822484..3c8e8a8 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -1,29 +1,29 @@
-buildscript {
- repositories {
- google()
- mavenCentral()
- }
-
- dependencies {
- classpath 'com.android.tools.build:gradle:7.4.2'
- }
-}
-
-allprojects {
- repositories {
- google()
- mavenCentral()
- }
-}
-
-rootProject.buildDir = '../build'
-subprojects {
- project.buildDir = "${rootProject.buildDir}/${project.name}"
-}
-subprojects {
- project.evaluationDependsOn(':app')
-}
-
-tasks.register("clean", Delete) {
- delete rootProject.buildDir
-}
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:7.4.2'
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+tasks.register("clean", Delete) {
+ delete rootProject.buildDir
+}
diff --git a/build.yaml b/build.yaml
index aaa6e0d..4b79da1 100644
--- a/build.yaml
+++ b/build.yaml
@@ -1,6 +1,6 @@
-targets:
- $default:
- builders:
- json_serializable:
- options:
+targets:
+ $default:
+ builders:
+ json_serializable:
+ options:
explicit_to_json: true
\ No newline at end of file
diff --git a/deezcryptor/.gitignore b/deezcryptor/.gitignore
index 96486fd..3f360a5 100644
--- a/deezcryptor/.gitignore
+++ b/deezcryptor/.gitignore
@@ -1,30 +1,30 @@
-# Miscellaneous
-*.class
-*.log
-*.pyc
-*.swp
-.DS_Store
-.atom/
-.buildlog/
-.history
-.svn/
-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
-# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
-/pubspec.lock
-**/doc/api/
-.dart_tool/
-.packages
-build/
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+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
+# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
+/pubspec.lock
+**/doc/api/
+.dart_tool/
+.packages
+build/
diff --git a/deezcryptor/.metadata b/deezcryptor/.metadata
index 75415e5..cc40b80 100644
--- a/deezcryptor/.metadata
+++ b/deezcryptor/.metadata
@@ -1,42 +1,42 @@
-# 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.
-
-version:
- revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- channel: stable
-
-project_type: plugin_ffi
-
-# Tracks metadata for the flutter migrate command
-migration:
- platforms:
- - platform: root
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- - platform: android
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- - platform: ios
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- - platform: linux
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- - platform: macos
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- - platform: windows
- create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
-
- # 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'
+# 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.
+
+version:
+ revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ channel: stable
+
+project_type: plugin_ffi
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ - platform: android
+ create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ - platform: ios
+ create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ - platform: linux
+ create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ - platform: macos
+ create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ - platform: windows
+ create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+ base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
+
+ # 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/deezcryptor/CHANGELOG.md b/deezcryptor/CHANGELOG.md
index 41cc7d8..64c21a1 100644
--- a/deezcryptor/CHANGELOG.md
+++ b/deezcryptor/CHANGELOG.md
@@ -1,3 +1,3 @@
-## 0.0.1
-
-* TODO: Describe initial release.
+## 0.0.1
+
+* TODO: Describe initial release.
diff --git a/deezcryptor/LICENSE b/deezcryptor/LICENSE
index ba75c69..97cfb48 100644
--- a/deezcryptor/LICENSE
+++ b/deezcryptor/LICENSE
@@ -1 +1 @@
-TODO: Add your license here.
+TODO: Add your license here.
diff --git a/deezcryptor/README.md b/deezcryptor/README.md
index 046499b..d5535d6 100644
--- a/deezcryptor/README.md
+++ b/deezcryptor/README.md
@@ -1,92 +1,92 @@
-# deezcryptor
-
-A new Flutter FFI plugin project.
-
-## Getting Started
-
-This project is a starting point for a Flutter
-[FFI plugin](https://docs.flutter.dev/development/platform-integration/c-interop),
-a specialized package that includes native code directly invoked with Dart FFI.
-
-## Project structure
-
-This template uses the following structure:
-
-* `src`: Contains the native source code, and a CmakeFile.txt file for building
- that source code into a dynamic library.
-
-* `lib`: Contains the Dart code that defines the API of the plugin, and which
- calls into the native code using `dart:ffi`.
-
-* platform folders (`android`, `ios`, `windows`, etc.): Contains the build files
- for building and bundling the native code library with the platform application.
-
-## Building and bundling native code
-
-The `pubspec.yaml` specifies FFI plugins as follows:
-
-```yaml
- plugin:
- platforms:
- some_platform:
- ffiPlugin: true
-```
-
-This configuration invokes the native build for the various target platforms
-and bundles the binaries in Flutter applications using these FFI plugins.
-
-This can be combined with dartPluginClass, such as when FFI is used for the
-implementation of one platform in a federated plugin:
-
-```yaml
- plugin:
- implements: some_other_plugin
- platforms:
- some_platform:
- dartPluginClass: SomeClass
- ffiPlugin: true
-```
-
-A plugin can have both FFI and method channels:
-
-```yaml
- plugin:
- platforms:
- some_platform:
- pluginClass: SomeName
- ffiPlugin: true
-```
-
-The native build systems that are invoked by FFI (and method channel) plugins are:
-
-* For Android: Gradle, which invokes the Android NDK for native builds.
- * See the documentation in android/build.gradle.
-* For iOS and MacOS: Xcode, via CocoaPods.
- * See the documentation in ios/deezcryptor.podspec.
- * See the documentation in macos/deezcryptor.podspec.
-* For Linux and Windows: CMake.
- * See the documentation in linux/CMakeLists.txt.
- * See the documentation in windows/CMakeLists.txt.
-
-## Binding to native code
-
-To use the native code, bindings in Dart are needed.
-To avoid writing these by hand, they are generated from the header file
-(`src/deezcryptor.h`) by `package:ffigen`.
-Regenerate the bindings by running `flutter pub run ffigen --config ffigen.yaml`.
-
-## Invoking native code
-
-Very short-running native functions can be directly invoked from any isolate.
-For example, see `sum` in `lib/deezcryptor.dart`.
-
-Longer-running functions should be invoked on a helper isolate to avoid
-dropping frames in Flutter applications.
-For example, see `sumAsync` in `lib/deezcryptor.dart`.
-
-## Flutter help
-
-For help getting started with Flutter, view our
-[online documentation](https://flutter.dev/docs), which offers tutorials,
-samples, guidance on mobile development, and a full API reference.
-
+# deezcryptor
+
+A new Flutter FFI plugin project.
+
+## Getting Started
+
+This project is a starting point for a Flutter
+[FFI plugin](https://docs.flutter.dev/development/platform-integration/c-interop),
+a specialized package that includes native code directly invoked with Dart FFI.
+
+## Project structure
+
+This template uses the following structure:
+
+* `src`: Contains the native source code, and a CmakeFile.txt file for building
+ that source code into a dynamic library.
+
+* `lib`: Contains the Dart code that defines the API of the plugin, and which
+ calls into the native code using `dart:ffi`.
+
+* platform folders (`android`, `ios`, `windows`, etc.): Contains the build files
+ for building and bundling the native code library with the platform application.
+
+## Building and bundling native code
+
+The `pubspec.yaml` specifies FFI plugins as follows:
+
+```yaml
+ plugin:
+ platforms:
+ some_platform:
+ ffiPlugin: true
+```
+
+This configuration invokes the native build for the various target platforms
+and bundles the binaries in Flutter applications using these FFI plugins.
+
+This can be combined with dartPluginClass, such as when FFI is used for the
+implementation of one platform in a federated plugin:
+
+```yaml
+ plugin:
+ implements: some_other_plugin
+ platforms:
+ some_platform:
+ dartPluginClass: SomeClass
+ ffiPlugin: true
+```
+
+A plugin can have both FFI and method channels:
+
+```yaml
+ plugin:
+ platforms:
+ some_platform:
+ pluginClass: SomeName
+ ffiPlugin: true
+```
+
+The native build systems that are invoked by FFI (and method channel) plugins are:
+
+* For Android: Gradle, which invokes the Android NDK for native builds.
+ * See the documentation in android/build.gradle.
+* For iOS and MacOS: Xcode, via CocoaPods.
+ * See the documentation in ios/deezcryptor.podspec.
+ * See the documentation in macos/deezcryptor.podspec.
+* For Linux and Windows: CMake.
+ * See the documentation in linux/CMakeLists.txt.
+ * See the documentation in windows/CMakeLists.txt.
+
+## Binding to native code
+
+To use the native code, bindings in Dart are needed.
+To avoid writing these by hand, they are generated from the header file
+(`src/deezcryptor.h`) by `package:ffigen`.
+Regenerate the bindings by running `flutter pub run ffigen --config ffigen.yaml`.
+
+## Invoking native code
+
+Very short-running native functions can be directly invoked from any isolate.
+For example, see `sum` in `lib/deezcryptor.dart`.
+
+Longer-running functions should be invoked on a helper isolate to avoid
+dropping frames in Flutter applications.
+For example, see `sumAsync` in `lib/deezcryptor.dart`.
+
+## Flutter help
+
+For help getting started with Flutter, view our
+[online documentation](https://flutter.dev/docs), which offers tutorials,
+samples, guidance on mobile development, and a full API reference.
+
diff --git a/deezcryptor/analysis_options.yaml b/deezcryptor/analysis_options.yaml
index a5744c1..a66c323 100644
--- a/deezcryptor/analysis_options.yaml
+++ b/deezcryptor/analysis_options.yaml
@@ -1,4 +1,4 @@
-include: package:flutter_lints/flutter.yaml
-
-# Additional information about this file can be found at
-# https://dart.dev/guides/language/analysis-options
+include: package:flutter_lints/flutter.yaml
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/deezcryptor/android/.gitignore b/deezcryptor/android/.gitignore
index 161bdcd..a2b1dea 100644
--- a/deezcryptor/android/.gitignore
+++ b/deezcryptor/android/.gitignore
@@ -1,9 +1,9 @@
-*.iml
-.gradle
-/local.properties
-/.idea/workspace.xml
-/.idea/libraries
-.DS_Store
-/build
-/captures
-.cxx
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
+.cxx
diff --git a/deezcryptor/android/build.gradle b/deezcryptor/android/build.gradle
index 9454eef..eec66ae 100644
--- a/deezcryptor/android/build.gradle
+++ b/deezcryptor/android/build.gradle
@@ -1,59 +1,59 @@
-// The Android Gradle Plugin builds the native code with the Android NDK.
-
-group 'com.example.deezcryptor'
-version '1.0'
-
-buildscript {
- repositories {
- google()
- mavenCentral()
- }
-
- dependencies {
- // The Android Gradle Plugin knows how to build native code with the NDK.
- classpath 'com.android.tools.build:gradle:7.3.0'
- }
-}
-
-rootProject.allprojects {
- repositories {
- google()
- mavenCentral()
- }
-}
-
-apply plugin: 'com.android.library'
-
-android {
- // Bumping the plugin compileSdkVersion requires all clients of this plugin
- // to bump the version in their app.
- compileSdkVersion 31
-
- // Bumping the plugin ndkVersion requires all clients of this plugin to bump
- // the version in their app and to download a newer version of the NDK.
- // ndkVersion "25.2.9519653"
-
- // Invoke the shared CMake build with the Android Gradle Plugin.
- externalNativeBuild {
- cmake {
- path "../src/CMakeLists.txt"
-
- // The default CMake version for the Android Gradle Plugin is 3.10.2.
- // https://developer.android.com/studio/projects/install-ndk#vanilla_cmake
- //
- // The Flutter tooling requires that developers have CMake 3.10 or later
- // installed. You should not increase this version, as doing so will cause
- // the plugin to fail to compile for some customers of the plugin.
- // version "3.10.2"
- }
- }
-
- compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
- }
-
- defaultConfig {
- minSdkVersion 21
- }
-}
+// The Android Gradle Plugin builds the native code with the Android NDK.
+
+group 'com.example.deezcryptor'
+version '1.0'
+
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ // The Android Gradle Plugin knows how to build native code with the NDK.
+ classpath 'com.android.tools.build:gradle:7.3.0'
+ }
+}
+
+rootProject.allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+apply plugin: 'com.android.library'
+
+android {
+ // Bumping the plugin compileSdkVersion requires all clients of this plugin
+ // to bump the version in their app.
+ compileSdkVersion 31
+
+ // Bumping the plugin ndkVersion requires all clients of this plugin to bump
+ // the version in their app and to download a newer version of the NDK.
+ // ndkVersion "25.2.9519653"
+
+ // Invoke the shared CMake build with the Android Gradle Plugin.
+ externalNativeBuild {
+ cmake {
+ path "../src/CMakeLists.txt"
+
+ // The default CMake version for the Android Gradle Plugin is 3.10.2.
+ // https://developer.android.com/studio/projects/install-ndk#vanilla_cmake
+ //
+ // The Flutter tooling requires that developers have CMake 3.10 or later
+ // installed. You should not increase this version, as doing so will cause
+ // the plugin to fail to compile for some customers of the plugin.
+ // version "3.10.2"
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ defaultConfig {
+ minSdkVersion 21
+ }
+}
diff --git a/deezcryptor/android/settings.gradle b/deezcryptor/android/settings.gradle
index 3949190..4d51dfc 100644
--- a/deezcryptor/android/settings.gradle
+++ b/deezcryptor/android/settings.gradle
@@ -1 +1 @@
-rootProject.name = 'deezcryptor'
+rootProject.name = 'deezcryptor'
diff --git a/deezcryptor/android/src/main/AndroidManifest.xml b/deezcryptor/android/src/main/AndroidManifest.xml
index 5ae942d..773343b 100644
--- a/deezcryptor/android/src/main/AndroidManifest.xml
+++ b/deezcryptor/android/src/main/AndroidManifest.xml
@@ -1,3 +1,3 @@
-
-
+
+
diff --git a/deezcryptor/ffigen.yaml b/deezcryptor/ffigen.yaml
index 332434b..e593575 100644
--- a/deezcryptor/ffigen.yaml
+++ b/deezcryptor/ffigen.yaml
@@ -1,19 +1,19 @@
-# Run with `flutter pub run ffigen --config ffigen.yaml`.
-name: DeezcryptorBindings
-description: |
- Bindings for `src/deezcryptor.h`.
-
- Regenerate bindings with `flutter pub run ffigen --config ffigen.yaml`.
-output: 'lib/deezcryptor_bindings_generated.dart'
-headers:
- entry-points:
- - 'src/deezcryptor.h'
- include-directives:
- - 'src/deezcryptor.h'
-preamble: |
- // ignore_for_file: always_specify_types
- // ignore_for_file: camel_case_types
- // ignore_for_file: non_constant_identifier_names
-comments:
- style: any
- length: full
+# Run with `flutter pub run ffigen --config ffigen.yaml`.
+name: DeezcryptorBindings
+description: |
+ Bindings for `src/deezcryptor.h`.
+
+ Regenerate bindings with `flutter pub run ffigen --config ffigen.yaml`.
+output: 'lib/deezcryptor_bindings_generated.dart'
+headers:
+ entry-points:
+ - 'src/deezcryptor.h'
+ include-directives:
+ - 'src/deezcryptor.h'
+preamble: |
+ // ignore_for_file: always_specify_types
+ // ignore_for_file: camel_case_types
+ // ignore_for_file: non_constant_identifier_names
+comments:
+ style: any
+ length: full
diff --git a/deezcryptor/ios/Classes/deezcryptor.c b/deezcryptor/ios/Classes/deezcryptor.c
index b25f2b3..c84d9f7 100644
--- a/deezcryptor/ios/Classes/deezcryptor.c
+++ b/deezcryptor/ios/Classes/deezcryptor.c
@@ -1,3 +1,3 @@
-// Relative import to be able to reuse the C sources.
-// See the comment in ../{projectName}}.podspec for more information.
-#include "../../src/deezcryptor.c"
+// Relative import to be able to reuse the C sources.
+// See the comment in ../{projectName}}.podspec for more information.
+#include "../../src/deezcryptor.c"
diff --git a/deezcryptor/ios/deezcryptor.podspec b/deezcryptor/ios/deezcryptor.podspec
index 9c9aa27..9ba398c 100644
--- a/deezcryptor/ios/deezcryptor.podspec
+++ b/deezcryptor/ios/deezcryptor.podspec
@@ -1,28 +1,28 @@
-#
-# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
-# Run `pod lib lint deezcryptor.podspec` to validate before publishing.
-#
-Pod::Spec.new do |s|
- s.name = 'deezcryptor'
- s.version = '0.0.1'
- s.summary = 'A new Flutter FFI plugin project.'
- s.description = <<-DESC
-A new Flutter FFI plugin project.
- DESC
- s.homepage = 'http://example.com'
- s.license = { :file => '../LICENSE' }
- s.author = { 'Your Company' => 'email@example.com' }
-
- # This will ensure the source files in Classes/ are included in the native
- # builds of apps using this FFI plugin. Podspec does not support relative
- # paths, so Classes contains a forwarder C file that relatively imports
- # `../src/*` so that the C sources can be shared among all target platforms.
- s.source = { :path => '.' }
- s.source_files = 'Classes/**/*'
- s.dependency 'Flutter'
- s.platform = :ios, '11.0'
-
- # Flutter.framework does not contain a i386 slice.
- s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
- s.swift_version = '5.0'
-end
+#
+# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
+# Run `pod lib lint deezcryptor.podspec` to validate before publishing.
+#
+Pod::Spec.new do |s|
+ s.name = 'deezcryptor'
+ s.version = '0.0.1'
+ s.summary = 'A new Flutter FFI plugin project.'
+ s.description = <<-DESC
+A new Flutter FFI plugin project.
+ DESC
+ s.homepage = 'http://example.com'
+ s.license = { :file => '../LICENSE' }
+ s.author = { 'Your Company' => 'email@example.com' }
+
+ # This will ensure the source files in Classes/ are included in the native
+ # builds of apps using this FFI plugin. Podspec does not support relative
+ # paths, so Classes contains a forwarder C file that relatively imports
+ # `../src/*` so that the C sources can be shared among all target platforms.
+ s.source = { :path => '.' }
+ s.source_files = 'Classes/**/*'
+ s.dependency 'Flutter'
+ s.platform = :ios, '11.0'
+
+ # Flutter.framework does not contain a i386 slice.
+ s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
+ s.swift_version = '5.0'
+end
diff --git a/deezcryptor/lib/deezcryptor.dart b/deezcryptor/lib/deezcryptor.dart
index 9d72a86..bce13b3 100644
--- a/deezcryptor/lib/deezcryptor.dart
+++ b/deezcryptor/lib/deezcryptor.dart
@@ -1,55 +1,55 @@
-import 'dart:ffi' as ffi;
-import 'dart:io';
-
-import 'package:ffi/ffi.dart';
-
-import 'deezcryptor_bindings_generated.dart';
-
-const String _libName = 'deezcryptor';
-
-/// The dynamic library in which the symbols for [DeezcryptorBindings] can be found.
-final ffi.DynamicLibrary _dylib = () {
- if (Platform.isMacOS || Platform.isIOS) {
- return ffi.DynamicLibrary.open('$_libName.framework/$_libName');
- }
- if (Platform.isAndroid || Platform.isLinux) {
- return ffi.DynamicLibrary.open('lib$_libName.so');
- }
- if (Platform.isWindows) {
- return ffi.DynamicLibrary.open('$_libName.dll');
- }
-
- throw UnsupportedError('Unknown platform: ${Platform.operatingSystem}');
-}();
-
-/// The bindings to the native functions in [_dylib].
-final DeezcryptorBindings _bindings = DeezcryptorBindings(_dylib);
-
-final decryptChunkRaw = _bindings.decryptChunk;
-
-List decryptChunk(List data, List key) {
- final ptr = malloc(data.length);
- final ptr1 = listIntToPointerChar(data);
- final ptr2 = listIntToPointerChar(key);
- final size = _bindings.decryptChunk(ptr, ptr1, ptr2);
- malloc.free(ptr1);
- malloc.free(ptr2);
- final dec = pointerCharToListInt(ptr, size);
- malloc.free(ptr);
- return dec;
-}
-
-ffi.Pointer listIntToPointerChar(List list) {
- final length = list.length;
- final ptr = malloc(length);
- for (int i = 0; i < length; i++) {
- ptr[i] = list[i];
- }
-
- return ptr;
-}
-
-List pointerCharToListInt(ffi.Pointer ptr, int size) {
- return List.unmodifiable(
- Iterable.generate(size, (index) => ptr[index]));
-}
+import 'dart:ffi' as ffi;
+import 'dart:io';
+
+import 'package:ffi/ffi.dart';
+
+import 'deezcryptor_bindings_generated.dart';
+
+const String _libName = 'deezcryptor';
+
+/// The dynamic library in which the symbols for [DeezcryptorBindings] can be found.
+final ffi.DynamicLibrary _dylib = () {
+ if (Platform.isMacOS || Platform.isIOS) {
+ return ffi.DynamicLibrary.open('$_libName.framework/$_libName');
+ }
+ if (Platform.isAndroid || Platform.isLinux) {
+ return ffi.DynamicLibrary.open('lib$_libName.so');
+ }
+ if (Platform.isWindows) {
+ return ffi.DynamicLibrary.open('$_libName.dll');
+ }
+
+ throw UnsupportedError('Unknown platform: ${Platform.operatingSystem}');
+}();
+
+/// The bindings to the native functions in [_dylib].
+final DeezcryptorBindings _bindings = DeezcryptorBindings(_dylib);
+
+final decryptChunkRaw = _bindings.decryptChunk;
+
+List decryptChunk(List data, List key) {
+ final ptr = malloc(data.length);
+ final ptr1 = listIntToPointerChar(data);
+ final ptr2 = listIntToPointerChar(key);
+ final size = _bindings.decryptChunk(ptr, ptr1, ptr2);
+ malloc.free(ptr1);
+ malloc.free(ptr2);
+ final dec = pointerCharToListInt(ptr, size);
+ malloc.free(ptr);
+ return dec;
+}
+
+ffi.Pointer listIntToPointerChar(List list) {
+ final length = list.length;
+ final ptr = malloc(length);
+ for (int i = 0; i < length; i++) {
+ ptr[i] = list[i];
+ }
+
+ return ptr;
+}
+
+List pointerCharToListInt(ffi.Pointer ptr, int size) {
+ return List.unmodifiable(
+ Iterable.generate(size, (index) => ptr[index]));
+}
diff --git a/deezcryptor/lib/deezcryptor_bindings_generated.dart b/deezcryptor/lib/deezcryptor_bindings_generated.dart
index 70b4957..135731b 100644
--- a/deezcryptor/lib/deezcryptor_bindings_generated.dart
+++ b/deezcryptor/lib/deezcryptor_bindings_generated.dart
@@ -1,48 +1,48 @@
-// ignore_for_file: always_specify_types
-// ignore_for_file: camel_case_types
-// ignore_for_file: non_constant_identifier_names
-
-// AUTO GENERATED FILE, DO NOT EDIT.
-//
-// Generated by `package:ffigen`.
-import 'dart:ffi' as ffi;
-
-/// Bindings for `src/deezcryptor.h`.
-///
-/// Regenerate bindings with `flutter pub run ffigen --config ffigen.yaml`.
-///
-class DeezcryptorBindings {
- /// Holds the symbol lookup function.
- final ffi.Pointer Function(String symbolName)
- _lookup;
-
- /// The symbols are looked up in [dynamicLibrary].
- DeezcryptorBindings(ffi.DynamicLibrary dynamicLibrary)
- : _lookup = dynamicLibrary.lookup;
-
- /// The symbols are looked up with [lookup].
- DeezcryptorBindings.fromLookup(
- ffi.Pointer Function(String symbolName)
- lookup)
- : _lookup = lookup;
-
- int decryptChunk(
- ffi.Pointer buffer,
- ffi.Pointer encrypted,
- ffi.Pointer key,
- ) {
- return _decryptChunk(
- buffer,
- encrypted,
- key,
- );
- }
-
- late final _decryptChunkPtr = _lookup<
- ffi.NativeFunction<
- ffi.Int Function(ffi.Pointer, ffi.Pointer,
- ffi.Pointer)>>('decryptChunk');
- late final _decryptChunk = _decryptChunkPtr.asFunction<
- int Function(ffi.Pointer, ffi.Pointer,
- ffi.Pointer)>();
-}
+// ignore_for_file: always_specify_types
+// ignore_for_file: camel_case_types
+// ignore_for_file: non_constant_identifier_names
+
+// AUTO GENERATED FILE, DO NOT EDIT.
+//
+// Generated by `package:ffigen`.
+import 'dart:ffi' as ffi;
+
+/// Bindings for `src/deezcryptor.h`.
+///
+/// Regenerate bindings with `flutter pub run ffigen --config ffigen.yaml`.
+///
+class DeezcryptorBindings {
+ /// Holds the symbol lookup function.
+ final ffi.Pointer Function(String symbolName)
+ _lookup;
+
+ /// The symbols are looked up in [dynamicLibrary].
+ DeezcryptorBindings(ffi.DynamicLibrary dynamicLibrary)
+ : _lookup = dynamicLibrary.lookup;
+
+ /// The symbols are looked up with [lookup].
+ DeezcryptorBindings.fromLookup(
+ ffi.Pointer Function(String symbolName)
+ lookup)
+ : _lookup = lookup;
+
+ int decryptChunk(
+ ffi.Pointer buffer,
+ ffi.Pointer encrypted,
+ ffi.Pointer key,
+ ) {
+ return _decryptChunk(
+ buffer,
+ encrypted,
+ key,
+ );
+ }
+
+ late final _decryptChunkPtr = _lookup<
+ ffi.NativeFunction<
+ ffi.Int Function(ffi.Pointer, ffi.Pointer,
+ ffi.Pointer)>>('decryptChunk');
+ late final _decryptChunk = _decryptChunkPtr.asFunction<
+ int Function(ffi.Pointer, ffi.Pointer,
+ ffi.Pointer)>();
+}
diff --git a/deezcryptor/linux/CMakeLists.txt b/deezcryptor/linux/CMakeLists.txt
index 0c5ce8f..ab6d60c 100644
--- a/deezcryptor/linux/CMakeLists.txt
+++ b/deezcryptor/linux/CMakeLists.txt
@@ -1,22 +1,22 @@
-# The Flutter tooling requires that developers have CMake 3.10 or later
-# installed. You should not increase this version, as doing so will cause
-# the plugin to fail to compile for some customers of the plugin.
-cmake_minimum_required(VERSION 3.10)
-
-# Project-level configuration.
-set(PROJECT_NAME "deezcryptor")
-project(${PROJECT_NAME} LANGUAGES CXX)
-
-# Invoke the build for native code shared with the other target platforms.
-# This can be changed to accommodate different builds.
-add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared")
-
-# List of absolute paths to libraries that should be bundled with the plugin.
-# This list could contain prebuilt libraries, or libraries created by an
-# external build triggered from this build file.
-set(deezcryptor_bundled_libraries
- # Defined in ../src/CMakeLists.txt.
- # This can be changed to accommodate different builds.
- $
- PARENT_SCOPE
-)
+# The Flutter tooling requires that developers have CMake 3.10 or later
+# installed. You should not increase this version, as doing so will cause
+# the plugin to fail to compile for some customers of the plugin.
+cmake_minimum_required(VERSION 3.10)
+
+# Project-level configuration.
+set(PROJECT_NAME "deezcryptor")
+project(${PROJECT_NAME} LANGUAGES CXX)
+
+# Invoke the build for native code shared with the other target platforms.
+# This can be changed to accommodate different builds.
+add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared")
+
+# List of absolute paths to libraries that should be bundled with the plugin.
+# This list could contain prebuilt libraries, or libraries created by an
+# external build triggered from this build file.
+set(deezcryptor_bundled_libraries
+ # Defined in ../src/CMakeLists.txt.
+ # This can be changed to accommodate different builds.
+ $
+ PARENT_SCOPE
+)
diff --git a/deezcryptor/macos/Classes/deezcryptor.c b/deezcryptor/macos/Classes/deezcryptor.c
index b25f2b3..c84d9f7 100644
--- a/deezcryptor/macos/Classes/deezcryptor.c
+++ b/deezcryptor/macos/Classes/deezcryptor.c
@@ -1,3 +1,3 @@
-// Relative import to be able to reuse the C sources.
-// See the comment in ../{projectName}}.podspec for more information.
-#include "../../src/deezcryptor.c"
+// Relative import to be able to reuse the C sources.
+// See the comment in ../{projectName}}.podspec for more information.
+#include "../../src/deezcryptor.c"
diff --git a/deezcryptor/macos/deezcryptor.podspec b/deezcryptor/macos/deezcryptor.podspec
index 7e20e6c..a927722 100644
--- a/deezcryptor/macos/deezcryptor.podspec
+++ b/deezcryptor/macos/deezcryptor.podspec
@@ -1,27 +1,27 @@
-#
-# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
-# Run `pod lib lint deezcryptor.podspec` to validate before publishing.
-#
-Pod::Spec.new do |s|
- s.name = 'deezcryptor'
- s.version = '0.0.1'
- s.summary = 'A new Flutter FFI plugin project.'
- s.description = <<-DESC
-A new Flutter FFI plugin project.
- DESC
- s.homepage = 'http://example.com'
- s.license = { :file => '../LICENSE' }
- s.author = { 'Your Company' => 'email@example.com' }
-
- # This will ensure the source files in Classes/ are included in the native
- # builds of apps using this FFI plugin. Podspec does not support relative
- # paths, so Classes contains a forwarder C file that relatively imports
- # `../src/*` so that the C sources can be shared among all target platforms.
- s.source = { :path => '.' }
- s.source_files = 'Classes/**/*'
- s.dependency 'FlutterMacOS'
-
- s.platform = :osx, '10.11'
- s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
- s.swift_version = '5.0'
-end
+#
+# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
+# Run `pod lib lint deezcryptor.podspec` to validate before publishing.
+#
+Pod::Spec.new do |s|
+ s.name = 'deezcryptor'
+ s.version = '0.0.1'
+ s.summary = 'A new Flutter FFI plugin project.'
+ s.description = <<-DESC
+A new Flutter FFI plugin project.
+ DESC
+ s.homepage = 'http://example.com'
+ s.license = { :file => '../LICENSE' }
+ s.author = { 'Your Company' => 'email@example.com' }
+
+ # This will ensure the source files in Classes/ are included in the native
+ # builds of apps using this FFI plugin. Podspec does not support relative
+ # paths, so Classes contains a forwarder C file that relatively imports
+ # `../src/*` so that the C sources can be shared among all target platforms.
+ s.source = { :path => '.' }
+ s.source_files = 'Classes/**/*'
+ s.dependency 'FlutterMacOS'
+
+ s.platform = :osx, '10.11'
+ s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }
+ s.swift_version = '5.0'
+end
diff --git a/deezcryptor/pubspec.yaml b/deezcryptor/pubspec.yaml
index 0caaee8..d511a17 100644
--- a/deezcryptor/pubspec.yaml
+++ b/deezcryptor/pubspec.yaml
@@ -1,35 +1,35 @@
-name: deezcryptor
-description: A deezer decryptor written in C
-version: 0.0.1
-homepage:
-
-environment:
- sdk: '>=3.0.6 <4.0.0'
- flutter: ">=3.3.0"
-
-dependencies:
- ffi: ^2.0.2
- flutter:
- sdk: flutter
- plugin_platform_interface: ^2.0.2
-
-dev_dependencies:
- ffigen: ^6.1.2
- flutter_test:
- sdk: flutter
- flutter_lints: ^2.0.0
-
-flutter:
- plugin:
- platforms:
- android:
- ffiPlugin: true
- ios:
- ffiPlugin: true
- linux:
- ffiPlugin: true
- macos:
- ffiPlugin: true
- windows:
- ffiPlugin: true
-
+name: deezcryptor
+description: A deezer decryptor written in C
+version: 0.0.1
+homepage:
+
+environment:
+ sdk: '>=3.0.6 <4.0.0'
+ flutter: ">=3.3.0"
+
+dependencies:
+ ffi: ^2.0.2
+ flutter:
+ sdk: flutter
+ plugin_platform_interface: ^2.0.2
+
+dev_dependencies:
+ ffigen: ^6.1.2
+ flutter_test:
+ sdk: flutter
+ flutter_lints: ^2.0.0
+
+flutter:
+ plugin:
+ platforms:
+ android:
+ ffiPlugin: true
+ ios:
+ ffiPlugin: true
+ linux:
+ ffiPlugin: true
+ macos:
+ ffiPlugin: true
+ windows:
+ ffiPlugin: true
+
diff --git a/deezcryptor/src/CMakeLists.txt b/deezcryptor/src/CMakeLists.txt
index f96676a..ef20b78 100644
--- a/deezcryptor/src/CMakeLists.txt
+++ b/deezcryptor/src/CMakeLists.txt
@@ -1,33 +1,33 @@
-# The Flutter tooling requires that developers have CMake 3.10 or later
-# installed. You should not increase this version, as doing so will cause
-# the plugin to fail to compile for some customers of the plugin.
-cmake_minimum_required(VERSION 3.10)
-
-project(deezcryptor VERSION 0.0.1 LANGUAGES C)
-
-SET(OPENSSL_ROOT_DIR openssl)
-
-SET(OPENSSL_LIBRARIES_DIR "lib/${ANDROID_ABI}")
-SET(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include)
-SET(OPENSSL_LIBRARIES "ssl" "crypto")
-
-set(OPENSSL_USE_STATIC_LIBS TRUE)
-find_package(OpenSSL REQUIRED)
-
-target_link_libraries(deezcryptor OpenSSL::Crypto)
-
-LINK_DIRECTORIES(${OPENSSL_LIBRARIES_DIR})
-
-add_library(deezcryptor SHARED
- "deezcryptor.c"
-)
-
-set_target_properties(deezcryptor PROPERTIES
- PUBLIC_HEADER deezcryptor.h
- OUTPUT_NAME "deezcryptor"
-)
-
-TARGET_INCLUDE_DIRECTORIES(deezcryptor PUBLIC ${OPENSSL_INCLUDE_DIR})
-TARGET_LINK_LIBRARIES(deezcryptor ${OPENSSL_LIBRARIES})
-
-target_compile_definitions(deezcryptor PUBLIC DART_SHARED_LIB)
+# The Flutter tooling requires that developers have CMake 3.10 or later
+# installed. You should not increase this version, as doing so will cause
+# the plugin to fail to compile for some customers of the plugin.
+cmake_minimum_required(VERSION 3.10)
+
+project(deezcryptor VERSION 0.0.1 LANGUAGES C)
+
+SET(OPENSSL_ROOT_DIR openssl)
+
+SET(OPENSSL_LIBRARIES_DIR "lib/${ANDROID_ABI}")
+SET(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include)
+SET(OPENSSL_LIBRARIES "ssl" "crypto")
+
+set(OPENSSL_USE_STATIC_LIBS TRUE)
+find_package(OpenSSL REQUIRED)
+
+target_link_libraries(deezcryptor OpenSSL::Crypto)
+
+LINK_DIRECTORIES(${OPENSSL_LIBRARIES_DIR})
+
+add_library(deezcryptor SHARED
+ "deezcryptor.c"
+)
+
+set_target_properties(deezcryptor PROPERTIES
+ PUBLIC_HEADER deezcryptor.h
+ OUTPUT_NAME "deezcryptor"
+)
+
+TARGET_INCLUDE_DIRECTORIES(deezcryptor PUBLIC ${OPENSSL_INCLUDE_DIR})
+TARGET_LINK_LIBRARIES(deezcryptor ${OPENSSL_LIBRARIES})
+
+target_compile_definitions(deezcryptor PUBLIC DART_SHARED_LIB)
diff --git a/deezcryptor/src/deezcryptor.c b/deezcryptor/src/deezcryptor.c
index ab39e0a..35ac6a8 100644
--- a/deezcryptor/src/deezcryptor.c
+++ b/deezcryptor/src/deezcryptor.c
@@ -1,14 +1,14 @@
-#include "deezcryptor.h"
-#include
-#define CHUNK_SIZE 2048
-
-FFI_PLUGIN_EXPORT int decryptChunk(unsigned char *buffer, unsigned char *encrypted, unsigned char *key)
-{
- BF_KEY _key;
- BF_set_key(&_key, 16, key);
-
- unsigned char IV = {0, 1, 2, 3, 4, 5, 6, 7};
-
- BF_cbc_encrypt(encrypted, buffer, CHUNK_SIZE, &_key, IV, BF_DECRYPT);
- return CHUNK_SIZE;
+#include "deezcryptor.h"
+#include
+#define CHUNK_SIZE 2048
+
+FFI_PLUGIN_EXPORT int decryptChunk(unsigned char *buffer, unsigned char *encrypted, unsigned char *key)
+{
+ BF_KEY _key;
+ BF_set_key(&_key, 16, key);
+
+ unsigned char IV = {0, 1, 2, 3, 4, 5, 6, 7};
+
+ BF_cbc_encrypt(encrypted, buffer, CHUNK_SIZE, &_key, IV, BF_DECRYPT);
+ return CHUNK_SIZE;
}
\ No newline at end of file
diff --git a/deezcryptor/src/deezcryptor.h b/deezcryptor/src/deezcryptor.h
index 5597366..bc3dbb4 100644
--- a/deezcryptor/src/deezcryptor.h
+++ b/deezcryptor/src/deezcryptor.h
@@ -1,7 +1,7 @@
-#if _WIN32
-#define FFI_PLUGIN_EXPORT __declspec(dllexport)
-#else
-#define FFI_PLUGIN_EXPORT
-#endif
-
-FFI_PLUGIN_EXPORT int decryptChunk(char *buffer, char *encrypted, char *key);
+#if _WIN32
+#define FFI_PLUGIN_EXPORT __declspec(dllexport)
+#else
+#define FFI_PLUGIN_EXPORT
+#endif
+
+FFI_PLUGIN_EXPORT int decryptChunk(char *buffer, char *encrypted, char *key);
diff --git a/deezcryptor/windows/.gitignore b/deezcryptor/windows/.gitignore
index b3eb2be..808064a 100644
--- a/deezcryptor/windows/.gitignore
+++ b/deezcryptor/windows/.gitignore
@@ -1,17 +1,17 @@
-flutter/
-
-# 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/
+flutter/
+
+# 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/deezcryptor/windows/CMakeLists.txt b/deezcryptor/windows/CMakeLists.txt
index 0b1f79c..181cef5 100644
--- a/deezcryptor/windows/CMakeLists.txt
+++ b/deezcryptor/windows/CMakeLists.txt
@@ -1,23 +1,23 @@
-# The Flutter tooling requires that developers have a version of Visual Studio
-# installed that includes CMake 3.14 or later. You should not increase this
-# version, as doing so will cause the plugin to fail to compile for some
-# customers of the plugin.
-cmake_minimum_required(VERSION 3.14)
-
-# Project-level configuration.
-set(PROJECT_NAME "deezcryptor")
-project(${PROJECT_NAME} LANGUAGES CXX)
-
-# Invoke the build for native code shared with the other target platforms.
-# This can be changed to accommodate different builds.
-add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared")
-
-# List of absolute paths to libraries that should be bundled with the plugin.
-# This list could contain prebuilt libraries, or libraries created by an
-# external build triggered from this build file.
-set(deezcryptor_bundled_libraries
- # Defined in ../src/CMakeLists.txt.
- # This can be changed to accommodate different builds.
- $
- PARENT_SCOPE
-)
+# The Flutter tooling requires that developers have a version of Visual Studio
+# installed that includes CMake 3.14 or later. You should not increase this
+# version, as doing so will cause the plugin to fail to compile for some
+# customers of the plugin.
+cmake_minimum_required(VERSION 3.14)
+
+# Project-level configuration.
+set(PROJECT_NAME "deezcryptor")
+project(${PROJECT_NAME} LANGUAGES CXX)
+
+# Invoke the build for native code shared with the other target platforms.
+# This can be changed to accommodate different builds.
+add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/../src" "${CMAKE_CURRENT_BINARY_DIR}/shared")
+
+# List of absolute paths to libraries that should be bundled with the plugin.
+# This list could contain prebuilt libraries, or libraries created by an
+# external build triggered from this build file.
+set(deezcryptor_bundled_libraries
+ # Defined in ../src/CMakeLists.txt.
+ # This can be changed to accommodate different builds.
+ $
+ PARENT_SCOPE
+)
diff --git a/ios/.gitignore b/ios/.gitignore
index 7a7f987..ad322bc 100644
--- a/ios/.gitignore
+++ b/ios/.gitignore
@@ -1,34 +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
+**/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
index 9625e10..0d9747f 100644
--- a/ios/Flutter/AppFrameworkInfo.plist
+++ b/ios/Flutter/AppFrameworkInfo.plist
@@ -1,26 +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
- 11.0
-
-
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 11.0
+
+
diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig
index 592ceee..0b2d479 100644
--- a/ios/Flutter/Debug.xcconfig
+++ b/ios/Flutter/Debug.xcconfig
@@ -1 +1 @@
-#include "Generated.xcconfig"
+#include "Generated.xcconfig"
diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig
index 592ceee..0b2d479 100644
--- a/ios/Flutter/Release.xcconfig
+++ b/ios/Flutter/Release.xcconfig
@@ -1 +1 @@
-#include "Generated.xcconfig"
+#include "Generated.xcconfig"
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index bf49373..9ba6d45 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -1,613 +1,613 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 54;
- objects = {
-
-/* Begin PBXBuildFile section */
- 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
- 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 */; };
- 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
-/* 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 = ""; };
- 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 = ""; };
- 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; };
-/* End PBXFileReference section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 97C146EB1CF9000F007C117D /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 9740EEB11CF90186004384FC /* Flutter */ = {
- isa = PBXGroup;
- children = (
- 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
- 9740EEB21CF90195004384FC /* Debug.xcconfig */,
- 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
- 9740EEB31CF90195004384FC /* Generated.xcconfig */,
- );
- name = Flutter;
- sourceTree = "";
- };
- 331C8082294A63A400263BE5 /* RunnerTests */ = {
- isa = PBXGroup;
- children = (
- 331C807B294A618700263BE5 /* RunnerTests.swift */,
- );
- path = RunnerTests;
- 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 */,
- 331C807E294A63A400263BE5 /* Frameworks */,
- 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 = {
- LastUpgradeCheck = 1300;
- 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;
- 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;
- 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 = 11.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 = f.f.freezer;
- 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;
- baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */;
- buildSettings = {
- BUNDLE_LOADER = "$(TEST_HOST)";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- GENERATE_INFOPLIST_FILE = YES;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = f.f.freezer.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;
- baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */;
- buildSettings = {
- BUNDLE_LOADER = "$(TEST_HOST)";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- GENERATE_INFOPLIST_FILE = YES;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = f.f.freezer.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;
- baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */;
- buildSettings = {
- BUNDLE_LOADER = "$(TEST_HOST)";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- GENERATE_INFOPLIST_FILE = YES;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = f.f.freezer.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;
- 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;
- 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 = 11.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;
- 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;
- 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 = 11.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 = f.f.freezer;
- 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 = f.f.freezer;
- 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 */;
-}
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 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 */; };
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
+/* 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 = ""; };
+ 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 = ""; };
+ 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; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 331C8082294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C807B294A618700263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ 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 */,
+ 331C807E294A63A400263BE5 /* Frameworks */,
+ 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 = {
+ LastUpgradeCheck = 1300;
+ 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;
+ 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;
+ 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 = 11.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 = f.f.freezer;
+ 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;
+ baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = f.f.freezer.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;
+ baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = f.f.freezer.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;
+ baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = f.f.freezer.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;
+ 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;
+ 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 = 11.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;
+ 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;
+ 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 = 11.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 = f.f.freezer;
+ 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 = f.f.freezer;
+ 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
index 919434a..c4b79bd 100644
--- a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -1,7 +1,7 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
index 18d9810..fc6bf80 100644
--- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -1,8 +1,8 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
index f9b0d7c..af0309c 100644
--- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
+++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -1,8 +1,8 @@
-
-
-
-
- PreviewsEnabled
-
-
-
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index e42adcb..c77b648 100644
--- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,98 +1,98 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata
index 1d526a1..59c6d39 100644
--- a/ios/Runner.xcworkspace/contents.xcworkspacedata
+++ b/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -1,7 +1,7 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
index 18d9810..fc6bf80 100644
--- a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -1,8 +1,8 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
index f9b0d7c..af0309c 100644
--- a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
+++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -1,8 +1,8 @@
-
-
-
-
- PreviewsEnabled
-
-
-
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift
index 70693e4..3763683 100644
--- a/ios/Runner/AppDelegate.swift
+++ b/ios/Runner/AppDelegate.swift
@@ -1,13 +1,13 @@
-import UIKit
-import Flutter
-
-@UIApplicationMain
-@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)
- }
-}
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@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
index d36b1fa..1950fd8 100644
--- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
+++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -1,122 +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"
- }
-}
+{
+ "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/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
index 0bedcf2..d08a4de 100644
--- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -1,23 +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"
- }
-}
+{
+ "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/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
index 89c2725..65a94b5 100644
--- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
+++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -1,5 +1,5 @@
-# Launch Screen Assets
-
-You can customize the launch screen with your own desired assets by replacing the image files in this directory.
-
+# 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
index f2e259c..497371e 100644
--- a/ios/Runner/Base.lproj/LaunchScreen.storyboard
+++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -1,37 +1,37 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard
index f3c2851..bbb83ca 100644
--- a/ios/Runner/Base.lproj/Main.storyboard
+++ b/ios/Runner/Base.lproj/Main.storyboard
@@ -1,26 +1,26 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist
index 6e29beb..383d242 100644
--- a/ios/Runner/Info.plist
+++ b/ios/Runner/Info.plist
@@ -1,51 +1,51 @@
-
-
-
-
- CFBundleDevelopmentRegion
- $(DEVELOPMENT_LANGUAGE)
- CFBundleDisplayName
- Freezer
- CFBundleExecutable
- $(EXECUTABLE_NAME)
- CFBundleIdentifier
- $(PRODUCT_BUNDLE_IDENTIFIER)
- CFBundleInfoDictionaryVersion
- 6.0
- CFBundleName
- freezer
- 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
-
- UIViewControllerBasedStatusBarAppearance
-
- CADisableMinimumFrameDurationOnPhone
-
- UIApplicationSupportsIndirectInputEvents
-
-
-
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ Freezer
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ freezer
+ 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
+
+ UIViewControllerBasedStatusBarAppearance
+
+ CADisableMinimumFrameDurationOnPhone
+
+ UIApplicationSupportsIndirectInputEvents
+
+
+
diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h
index 308a2a5..fae207f 100644
--- a/ios/Runner/Runner-Bridging-Header.h
+++ b/ios/Runner/Runner-Bridging-Header.h
@@ -1 +1 @@
-#import "GeneratedPluginRegistrant.h"
+#import "GeneratedPluginRegistrant.h"
diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift
index 86a7c3b..4d206de 100644
--- a/ios/RunnerTests/RunnerTests.swift
+++ b/ios/RunnerTests/RunnerTests.swift
@@ -1,12 +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.
- }
-
-}
+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/api/cache_provider.dart b/lib/api/cache_provider.dart
index 2edf422..23c8370 100644
--- a/lib/api/cache_provider.dart
+++ b/lib/api/cache_provider.dart
@@ -1,104 +1,104 @@
-// ignore_for_file: implementation_imports
-
-import 'package:dart_blowfish/dart_blowfish.dart';
-import 'package:flutter_cache_manager/flutter_cache_manager.dart';
-import 'package:flutter_cache_manager/src/storage/cache_object.dart';
-import 'package:freezer/type_adapters/uri.dart';
-import 'package:hive_flutter/hive_flutter.dart';
-
-class FreezerCacheManager extends CacheManager {
- static const key = 'freezerImageCache';
-
- void init(String path, {String? boxName}) {
- _instance =
- FreezerCacheManager._(FreezerCacheInfoRepository(boxName ?? key, path));
- }
-
- static late final FreezerCacheManager _instance;
- factory FreezerCacheManager() => _instance;
-
- FreezerCacheManager._(FreezerCacheInfoRepository repo)
- : super(Config(key, repo: repo));
-}
-
-class FreezerCacheInfoRepository extends CacheInfoRepository {
- final String boxName;
- final String path;
- late final LazyBox _box;
- bool _isOpen;
- FreezerCacheInfoRepository(this.boxName, this.path);
-
- @override
- Future exists() => Hive.boxExists(boxName, path: path);
-
- @override
- Future open() async {
- if (_isOpen) return true;
-
- _box = await Hive.openLazyBox(boxName, path: path);
- _isOpen = true;
- return true;
- }
-
- @override
- Future updateOrInsert(CacheObject cacheObject) {
- if (cacheObject.id == null) {
- return insert(cacheObject);
- } else {
- return update(cacheObject);
- }
- }
-
- @override
- Future insert(CacheObject cacheObject,
- {bool setTouchedToNow = true}) {
- final id = await _box.add(cacheObject);
- }
-
- /// Gets a [CacheObject] by [key]
- @override
- Future get(String key);
-
- /// Deletes a cache object by [id]
- @override
- Future delete(int id);
-
- /// Deletes items with [ids] from the repository
- @override
- Future deleteAll(Iterable ids);
-
- /// Updates an existing [cacheObject]
- @override
- Future update(CacheObject cacheObject, {bool setTouchedToNow = true});
-
- /// Gets the list of all objects in the cache
- @override
- Future> getAllObjects();
-
- /// Gets the list of [CacheObject] that can be removed if the repository is over capacity.
- ///
- /// The exact implementation is up to the repository, but implementations should
- /// return a preferred list of items. For example, the least recently accessed
- @override
- Future> getObjectsOverCapacity(int capacity);
-
- /// Returns a list of [CacheObject] that are older than [maxAge]
- @override
- Future> getOldObjects(Duration maxAge);
-
- /// Close the connection to the repository. If this is the last connection
- /// to the repository it will return true and the repository is truly
- /// closed. If there are still open connections it will return false;
- @override
- Future close();
-
- /// Deletes the cache data file including all cache data.
- @override
- Future deleteDataFile();
-}
-
-class CacheObjectAdapter extends TypeAdapter {
- @override
- // TODO: implement typeId
- int get typeId => throw UnimplementedError();
+// ignore_for_file: implementation_imports
+
+import 'package:dart_blowfish/dart_blowfish.dart';
+import 'package:flutter_cache_manager/flutter_cache_manager.dart';
+import 'package:flutter_cache_manager/src/storage/cache_object.dart';
+import 'package:freezer/type_adapters/uri.dart';
+import 'package:hive_flutter/hive_flutter.dart';
+
+class FreezerCacheManager extends CacheManager {
+ static const key = 'freezerImageCache';
+
+ void init(String path, {String? boxName}) {
+ _instance =
+ FreezerCacheManager._(FreezerCacheInfoRepository(boxName ?? key, path));
+ }
+
+ static late final FreezerCacheManager _instance;
+ factory FreezerCacheManager() => _instance;
+
+ FreezerCacheManager._(FreezerCacheInfoRepository repo)
+ : super(Config(key, repo: repo));
+}
+
+class FreezerCacheInfoRepository extends CacheInfoRepository {
+ final String boxName;
+ final String path;
+ late final LazyBox _box;
+ bool _isOpen;
+ FreezerCacheInfoRepository(this.boxName, this.path);
+
+ @override
+ Future exists() => Hive.boxExists(boxName, path: path);
+
+ @override
+ Future open() async {
+ if (_isOpen) return true;
+
+ _box = await Hive.openLazyBox(boxName, path: path);
+ _isOpen = true;
+ return true;
+ }
+
+ @override
+ Future updateOrInsert(CacheObject cacheObject) {
+ if (cacheObject.id == null) {
+ return insert(cacheObject);
+ } else {
+ return update(cacheObject);
+ }
+ }
+
+ @override
+ Future insert(CacheObject cacheObject,
+ {bool setTouchedToNow = true}) {
+ final id = await _box.add(cacheObject);
+ }
+
+ /// Gets a [CacheObject] by [key]
+ @override
+ Future get(String key);
+
+ /// Deletes a cache object by [id]
+ @override
+ Future delete(int id);
+
+ /// Deletes items with [ids] from the repository
+ @override
+ Future deleteAll(Iterable ids);
+
+ /// Updates an existing [cacheObject]
+ @override
+ Future update(CacheObject cacheObject, {bool setTouchedToNow = true});
+
+ /// Gets the list of all objects in the cache
+ @override
+ Future> getAllObjects();
+
+ /// Gets the list of [CacheObject] that can be removed if the repository is over capacity.
+ ///
+ /// The exact implementation is up to the repository, but implementations should
+ /// return a preferred list of items. For example, the least recently accessed
+ @override
+ Future> getObjectsOverCapacity(int capacity);
+
+ /// Returns a list of [CacheObject] that are older than [maxAge]
+ @override
+ Future> getOldObjects(Duration maxAge);
+
+ /// Close the connection to the repository. If this is the last connection
+ /// to the repository it will return true and the repository is truly
+ /// closed. If there are still open connections it will return false;
+ @override
+ Future close();
+
+ /// Deletes the cache data file including all cache data.
+ @override
+ Future deleteDataFile();
+}
+
+class CacheObjectAdapter extends TypeAdapter {
+ @override
+ // TODO: implement typeId
+ int get typeId => throw UnimplementedError();
}
\ No newline at end of file
diff --git a/lib/api/deezer_audio_source.dart b/lib/api/deezer_audio_source.dart
index 598c985..20d9576 100644
--- a/lib/api/deezer_audio_source.dart
+++ b/lib/api/deezer_audio_source.dart
@@ -1,394 +1,394 @@
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-import 'dart:isolate';
-import 'dart:typed_data';
-
-import 'package:encrypt/encrypt.dart';
-import 'package:flutter/foundation.dart' as flutter;
-import 'package:freezer/api/deezer.dart';
-import 'package:freezer/api/definitions.dart';
-import 'package:freezer/settings.dart';
-import 'package:just_audio/just_audio.dart';
-import 'package:crypto/crypto.dart';
-import 'package:http/http.dart' as http;
-import 'package:dart_blowfish/dart_blowfish.dart';
-import 'package:logging/logging.dart';
-import 'package:scrobblenaut/lastfm.dart';
-
-typedef _IsolateMessage = (
- Stream> source,
- int start,
- String trackId,
- SendPort sendPort
-);
-
-// Maybe better implementation of Blowfish CBC instead of random-ass, unpublished library from github?
-// This class can be considered a rewrite in Dart of the Java backend (from the StreamServer.deezer() function and also from the Deezer class)
-class DeezerAudioSource extends StreamAudioSource {
- final _logger = Logger("DeezerAudioSource");
-
- late AudioQuality Function() _getQuality;
- late AudioQuality? _initialQuality;
- late String _trackId;
- late String _md5origin;
- late String _mediaVersion;
- final String trackToken;
- final int trackTokenExpiration;
- final StreamInfoCallback? onStreamObtained;
-
- // some cache
- AudioQuality? _currentQuality;
- int? _cachedSourceLength;
- String? _cachedContentType;
- Uri? _downloadUrl;
-
- DeezerAudioSource({
- required AudioQuality Function() getQuality,
- required String trackId,
- required String md5origin,
- required String mediaVersion,
- required this.trackToken,
- required this.trackTokenExpiration,
- this.onStreamObtained,
- }) {
- _getQuality = getQuality;
- _initialQuality = quality;
- _trackId = trackId;
- _md5origin = md5origin;
- _mediaVersion = mediaVersion;
- }
-
- AudioQuality? get quality => _currentQuality;
- String get trackId => _trackId;
- String get md5origin => _md5origin;
- String get mediaVersion => _mediaVersion;
-
- static const chunkSize = 2048;
-
- void _updateTrackData(Map trackData) {
- _trackId = trackData["SNG_ID"];
- _md5origin = trackData["MD5_ORIGIN"];
- _mediaVersion = trackData["MEDIA_VERSION"];
- }
-
- Future _fallbackUrl() async {
- _logger.finer("called _fallbackUrl()");
- try {
- return await _qualityFallback();
- } on QualityException {
- _logger.warning("quality fallback failed! trying trackId fallback");
- _currentQuality = _initialQuality;
- }
-
- Map? privateJson;
- try {
- // TRACK ID FALLBACK
- final data = await deezerAPI
- .callApi("deezer.pageTrack", params: {"sng_id": trackId});
- privateJson = data["results"]["DATA"];
- if (privateJson!.containsKey("FALLBACK")) {
- String fallbackId = privateJson["FALLBACK"]["SNG_ID"];
- if (fallbackId != trackId) {
- final newPrivate =
- await deezerAPI.callApi("song.getListData", params: {
- "sng_ids": [fallbackId]
- });
- final Map trackData = newPrivate["results"]["data"][0];
- _updateTrackData(trackData);
- return await _fallbackUrl();
- }
- }
- } catch (e, st) {
- _logger.warning("ID fallback failed! Trying ISRC fallback!", e, st);
- }
-
- try {
- final data =
- await deezerAPI.callPublicApi("track/isrc:${privateJson!["ISRC"]!}");
- final newId = data["id"] as int;
- if (newId == int.parse(trackId)) throw Exception();
-
- final newPrivate = await deezerAPI.callApi("song.getListData", params: {
- "sng_ids": [newId]
- });
- final trackData = newPrivate["results"]["data"][0] as Map;
- _updateTrackData(trackData);
- return await _fallbackUrl();
- } catch (e, st) {
- _logger.severe("ISRC Fallback failed, track unavailable!", e, st);
- }
-
- throw Exception(
- "Every known method of fallback failed, track unavailable!");
- }
-
- Future _qualityFallback() async {
- // only use url generation with MP3_128
- _currentQuality = AudioQuality.MP3_128;
- final genUri = _generateTrackUri();
-
- final req = await http.head(genUri, headers: {
- 'User-Agent': deezerAPI.headers['User-Agent']!,
- 'Accept-Language': '*',
- 'Accept': '*/*'
- });
- int rc = req.statusCode;
- if (rc > 400) {
- _logger.warning(
- "quality fallback, response code: $rc, current quality: $quality");
- switch (_currentQuality) {
- case AudioQuality.FLAC:
- _currentQuality = AudioQuality.MP3_320;
- break;
- case AudioQuality.MP3_320:
- _currentQuality = AudioQuality.MP3_128;
- break;
- case AudioQuality.MP3_128:
- default:
- _currentQuality = null;
- throw QualityException("No quality to fallback to!");
- }
-
- return await _qualityFallback();
- }
-
- return genUri;
- }
-
- Uri _generateTrackUri() {
- int magic = 164;
- // step 1
- final step1 = [
- ...md5origin.codeUnits,
- magic,
- ...quality!.toDeezerQualityInt().toString().codeUnits,
- magic,
- ...trackId.codeUnits,
- magic,
- ...mediaVersion.codeUnits,
- ];
-
- // get md5 hash of step1
- final md5hex = md5.convert(step1).toString().toLowerCase();
-
- // step2
- final step2 = [
- ...md5hex.codeUnits,
- magic,
- ...step1,
- magic,
- ];
-
- // pad step2 with dots to get correct length
- while (step2.length % 16 > 0) {
- // step2.addAll(('.' * (step2.length % 16)).codeUnits);
- step2.add(46);
- }
-
- // encrypt with AES ECB
- final k = Uint8List.fromList('jo6aey6haid2Teih'.codeUnits);
- final encrypter = Encrypter(AES(Key(k), mode: AESMode.ecb, padding: null));
- final String step3 = encrypter
- .encryptBytes(step2, iv: IV(Uint8List(8)))
- .base16
- .toLowerCase();
-
- final uri =
- Uri.https('e-cdns-proxy-${md5origin[0]}.dzcdn.net', '/mobile/1/$step3');
- return uri;
- }
-
- static List getKey(String id) {
- final secret = utf8.encode('g4el58wc0zvf9na1');
- final idmd5 =
- utf8.encode(md5.convert(utf8.encode(id)).toString().toLowerCase());
- final buffer = [];
- for (int i = 0; i < 16; i++) {
- final s0 = idmd5[i];
- final s1 = idmd5[i + 16];
- final s2 = secret[i];
- buffer.add(s0 ^ s1 ^ s2);
- }
- return buffer;
- }
-
- static List decryptChunk(List key, List data) {
- final Uint8List iv =
- Uint8List.fromList(const [00, 01, 02, 03, 04, 05, 06, 07]);
- final bf = Blowfish(
- key: Uint8List.fromList(key), mode: Mode.cbc, padding: Padding.none)
- ..setIv(iv);
- Uint8List decrypted = bf.decode(data, returnType: Type.uInt8Array);
- return decrypted;
- }
-
- static Stream> decryptionStream(Stream> source,
- {required int start, required String trackId}) async* {
- var dropBytes = start % 2048;
- final deezerStart = start - dropBytes;
- int counter = deezerStart ~/ chunkSize;
- final buffer = List.empty(growable: true);
- final key = getKey(trackId);
-
- await for (var bytes in source) {
- buffer.addAll(bytes);
-
- int i;
- for (i = 0; i < buffer.length; i += chunkSize) {
- if (buffer.length <= i + chunkSize) {
- break;
- }
-
- bytes = buffer.sublist(i, i + chunkSize);
-
- if ((counter % 3) == 0) {
- bytes = decryptChunk(key, bytes);
- }
-
- if (dropBytes > 0) {
- bytes = bytes.sublist(dropBytes);
- dropBytes = 0;
- }
-
- counter++;
- yield bytes;
- }
-
- if (i < buffer.length) {
- buffer.removeRange(0, i);
- } else {
- buffer.clear();
- }
- }
-
- // add remaining items in buffer
-
- if (buffer.isNotEmpty) {
- if (dropBytes > 0) {
- yield buffer.sublist(dropBytes);
- return;
- }
-
- yield buffer;
- }
- }
-
- Future _getUrl() async {
- final String actualTrackToken;
- if (DateTime.now().millisecondsSinceEpoch ~/ 1000 > trackTokenExpiration) {
- if (!deezerAPI.canStreamHQ && !deezerAPI.canStreamLossless) {
- _logger.fine('using old url generation, token expired.');
- }
- final newTrack = await deezerAPI.track(trackId);
- actualTrackToken = newTrack.trackToken!;
- } else {
- actualTrackToken = trackToken;
- }
-
- final res = await deezerAPI.getTrackUrl(
- actualTrackToken, _currentQuality!.toDeezerQualityString());
- if (res.error != null) {
- _logger.warning('Error while getting track url: ${res.error!}');
- return null;
- }
- if (res.sources == null) {
- _logger.warning('Error while getting track url: No sources!');
- return null;
- }
-
- return Uri.parse(res.sources![0].url);
- }
-
- @override
- Future request([int? start, int? end]) async {
- start ??= 0;
-
- if (_cachedSourceLength != null) {
- if (start == _cachedSourceLength) {
- return StreamAudioResponse(
- sourceLength: _cachedSourceLength,
- contentLength: 0,
- offset: start,
- stream: const Stream>.empty(),
- contentType: _cachedContentType!);
- }
- }
-
- _logger.fine("authorizing...");
- if (!await deezerAPI.authorize()) {
- _logger.severe("authorization failed! cannot continue!");
- throw Exception("Authorization failed!");
- }
-
- // determine quality to use
- final newQuality = _getQuality.call();
-
- if (_downloadUrl != null && _currentQuality != newQuality) {
- // update currentUrl to get tracks with new quality
- _downloadUrl = null;
- }
-
- _currentQuality = newQuality;
-
- if (_downloadUrl == null) {
- final gottenUrl = await _getUrl();
- if (gottenUrl != null) {
- _downloadUrl = gottenUrl;
- } else {
- _logger.warning('falling back to old url generation!');
-
- // OLD URL GENERATION
- try {
- _downloadUrl = await _fallbackUrl();
- } on QualityException {
- rethrow;
- }
- }
- }
-
- _logger.fine("Downloading track from ${_downloadUrl!.toString()}");
- final int deezerStart = start - (start % 2048);
- final req = http.Request('GET', _downloadUrl!)
- ..headers.addAll({
- 'User-Agent': deezerAPI.headers['User-Agent']!,
- 'Accept-Language': '*',
- 'Accept': '*/*',
- if (deezerStart > 0)
- "Range": "bytes=$deezerStart-${end == null ? '' : end.toString()}"
- });
-
- final res = await req.send();
- final rc = res.statusCode;
- _logger
- .finest("request sent! rc: $rc, content-length: ${res.contentLength}");
- onStreamObtained?.call(StreamQualityInfo(
- format: quality == AudioQuality.FLAC ? Format.FLAC : Format.MP3,
- source: Source.stream,
- size: start + res.contentLength!,
- quality: quality,
- ));
- if (rc != HttpStatus.ok && rc != HttpStatus.partialContent) {
- throw Exception(await res.stream.bytesToString());
- }
-
- int dropBytes = start % chunkSize;
- _logger.finest(
- "deezerStart: $deezerStart (actual start: $start), end: $end, dropBytes: $dropBytes");
- final stream = decryptionStream(res.stream, start: start, trackId: trackId);
-
- final cl = res.contentLength! - dropBytes;
-
- if (end == null) {
- _cachedSourceLength = cl + start;
- }
-
- return StreamAudioResponse(
- sourceLength: _cachedSourceLength,
- contentLength: cl,
- offset: start,
- stream: stream,
- contentType: _cachedContentType =
- quality == AudioQuality.FLAC ? "audio/flac" : "audio/mpeg");
- }
-}
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+import 'dart:isolate';
+import 'dart:typed_data';
+
+import 'package:encrypt/encrypt.dart';
+import 'package:flutter/foundation.dart' as flutter;
+import 'package:freezer/api/deezer.dart';
+import 'package:freezer/api/definitions.dart';
+import 'package:freezer/settings.dart';
+import 'package:just_audio/just_audio.dart';
+import 'package:crypto/crypto.dart';
+import 'package:http/http.dart' as http;
+import 'package:dart_blowfish/dart_blowfish.dart';
+import 'package:logging/logging.dart';
+import 'package:scrobblenaut/lastfm.dart';
+
+typedef _IsolateMessage = (
+ Stream> source,
+ int start,
+ String trackId,
+ SendPort sendPort
+);
+
+// Maybe better implementation of Blowfish CBC instead of random-ass, unpublished library from github?
+// This class can be considered a rewrite in Dart of the Java backend (from the StreamServer.deezer() function and also from the Deezer class)
+class DeezerAudioSource extends StreamAudioSource {
+ final _logger = Logger("DeezerAudioSource");
+
+ late AudioQuality Function() _getQuality;
+ late AudioQuality? _initialQuality;
+ late String _trackId;
+ late String _md5origin;
+ late String _mediaVersion;
+ final String trackToken;
+ final int trackTokenExpiration;
+ final StreamInfoCallback? onStreamObtained;
+
+ // some cache
+ AudioQuality? _currentQuality;
+ int? _cachedSourceLength;
+ String? _cachedContentType;
+ Uri? _downloadUrl;
+
+ DeezerAudioSource({
+ required AudioQuality Function() getQuality,
+ required String trackId,
+ required String md5origin,
+ required String mediaVersion,
+ required this.trackToken,
+ required this.trackTokenExpiration,
+ this.onStreamObtained,
+ }) {
+ _getQuality = getQuality;
+ _initialQuality = quality;
+ _trackId = trackId;
+ _md5origin = md5origin;
+ _mediaVersion = mediaVersion;
+ }
+
+ AudioQuality? get quality => _currentQuality;
+ String get trackId => _trackId;
+ String get md5origin => _md5origin;
+ String get mediaVersion => _mediaVersion;
+
+ static const chunkSize = 2048;
+
+ void _updateTrackData(Map trackData) {
+ _trackId = trackData["SNG_ID"];
+ _md5origin = trackData["MD5_ORIGIN"];
+ _mediaVersion = trackData["MEDIA_VERSION"];
+ }
+
+ Future _fallbackUrl() async {
+ _logger.finer("called _fallbackUrl()");
+ try {
+ return await _qualityFallback();
+ } on QualityException {
+ _logger.warning("quality fallback failed! trying trackId fallback");
+ _currentQuality = _initialQuality;
+ }
+
+ Map? privateJson;
+ try {
+ // TRACK ID FALLBACK
+ final data = await deezerAPI
+ .callApi("deezer.pageTrack", params: {"sng_id": trackId});
+ privateJson = data["results"]["DATA"];
+ if (privateJson!.containsKey("FALLBACK")) {
+ String fallbackId = privateJson["FALLBACK"]["SNG_ID"];
+ if (fallbackId != trackId) {
+ final newPrivate =
+ await deezerAPI.callApi("song.getListData", params: {
+ "sng_ids": [fallbackId]
+ });
+ final Map trackData = newPrivate["results"]["data"][0];
+ _updateTrackData(trackData);
+ return await _fallbackUrl();
+ }
+ }
+ } catch (e, st) {
+ _logger.warning("ID fallback failed! Trying ISRC fallback!", e, st);
+ }
+
+ try {
+ final data =
+ await deezerAPI.callPublicApi("track/isrc:${privateJson!["ISRC"]!}");
+ final newId = data["id"] as int;
+ if (newId == int.parse(trackId)) throw Exception();
+
+ final newPrivate = await deezerAPI.callApi("song.getListData", params: {
+ "sng_ids": [newId]
+ });
+ final trackData = newPrivate["results"]["data"][0] as Map;
+ _updateTrackData(trackData);
+ return await _fallbackUrl();
+ } catch (e, st) {
+ _logger.severe("ISRC Fallback failed, track unavailable!", e, st);
+ }
+
+ throw Exception(
+ "Every known method of fallback failed, track unavailable!");
+ }
+
+ Future _qualityFallback() async {
+ // only use url generation with MP3_128
+ _currentQuality = AudioQuality.MP3_128;
+ final genUri = _generateTrackUri();
+
+ final req = await http.head(genUri, headers: {
+ 'User-Agent': deezerAPI.headers['User-Agent']!,
+ 'Accept-Language': '*',
+ 'Accept': '*/*'
+ });
+ int rc = req.statusCode;
+ if (rc > 400) {
+ _logger.warning(
+ "quality fallback, response code: $rc, current quality: $quality");
+ switch (_currentQuality) {
+ case AudioQuality.FLAC:
+ _currentQuality = AudioQuality.MP3_320;
+ break;
+ case AudioQuality.MP3_320:
+ _currentQuality = AudioQuality.MP3_128;
+ break;
+ case AudioQuality.MP3_128:
+ default:
+ _currentQuality = null;
+ throw QualityException("No quality to fallback to!");
+ }
+
+ return await _qualityFallback();
+ }
+
+ return genUri;
+ }
+
+ Uri _generateTrackUri() {
+ int magic = 164;
+ // step 1
+ final step1 = [
+ ...md5origin.codeUnits,
+ magic,
+ ...quality!.toDeezerQualityInt().toString().codeUnits,
+ magic,
+ ...trackId.codeUnits,
+ magic,
+ ...mediaVersion.codeUnits,
+ ];
+
+ // get md5 hash of step1
+ final md5hex = md5.convert(step1).toString().toLowerCase();
+
+ // step2
+ final step2 = [
+ ...md5hex.codeUnits,
+ magic,
+ ...step1,
+ magic,
+ ];
+
+ // pad step2 with dots to get correct length
+ while (step2.length % 16 > 0) {
+ // step2.addAll(('.' * (step2.length % 16)).codeUnits);
+ step2.add(46);
+ }
+
+ // encrypt with AES ECB
+ final k = Uint8List.fromList('jo6aey6haid2Teih'.codeUnits);
+ final encrypter = Encrypter(AES(Key(k), mode: AESMode.ecb, padding: null));
+ final String step3 = encrypter
+ .encryptBytes(step2, iv: IV(Uint8List(8)))
+ .base16
+ .toLowerCase();
+
+ final uri =
+ Uri.https('e-cdns-proxy-${md5origin[0]}.dzcdn.net', '/mobile/1/$step3');
+ return uri;
+ }
+
+ static List getKey(String id) {
+ final secret = utf8.encode('g4el58wc0zvf9na1');
+ final idmd5 =
+ utf8.encode(md5.convert(utf8.encode(id)).toString().toLowerCase());
+ final buffer = [];
+ for (int i = 0; i < 16; i++) {
+ final s0 = idmd5[i];
+ final s1 = idmd5[i + 16];
+ final s2 = secret[i];
+ buffer.add(s0 ^ s1 ^ s2);
+ }
+ return buffer;
+ }
+
+ static List decryptChunk(List key, List data) {
+ final Uint8List iv =
+ Uint8List.fromList(const [00, 01, 02, 03, 04, 05, 06, 07]);
+ final bf = Blowfish(
+ key: Uint8List.fromList(key), mode: Mode.cbc, padding: Padding.none)
+ ..setIv(iv);
+ Uint8List decrypted = bf.decode(data, returnType: Type.uInt8Array);
+ return decrypted;
+ }
+
+ static Stream> decryptionStream(Stream> source,
+ {required int start, required String trackId}) async* {
+ var dropBytes = start % 2048;
+ final deezerStart = start - dropBytes;
+ int counter = deezerStart ~/ chunkSize;
+ final buffer = List.empty(growable: true);
+ final key = getKey(trackId);
+
+ await for (var bytes in source) {
+ buffer.addAll(bytes);
+
+ int i;
+ for (i = 0; i < buffer.length; i += chunkSize) {
+ if (buffer.length <= i + chunkSize) {
+ break;
+ }
+
+ bytes = buffer.sublist(i, i + chunkSize);
+
+ if ((counter % 3) == 0) {
+ bytes = decryptChunk(key, bytes);
+ }
+
+ if (dropBytes > 0) {
+ bytes = bytes.sublist(dropBytes);
+ dropBytes = 0;
+ }
+
+ counter++;
+ yield bytes;
+ }
+
+ if (i < buffer.length) {
+ buffer.removeRange(0, i);
+ } else {
+ buffer.clear();
+ }
+ }
+
+ // add remaining items in buffer
+
+ if (buffer.isNotEmpty) {
+ if (dropBytes > 0) {
+ yield buffer.sublist(dropBytes);
+ return;
+ }
+
+ yield buffer;
+ }
+ }
+
+ Future _getUrl() async {
+ final String actualTrackToken;
+ if (DateTime.now().millisecondsSinceEpoch ~/ 1000 > trackTokenExpiration) {
+ if (!deezerAPI.canStreamHQ && !deezerAPI.canStreamLossless) {
+ _logger.fine('using old url generation, token expired.');
+ }
+ final newTrack = await deezerAPI.track(trackId);
+ actualTrackToken = newTrack.trackToken!;
+ } else {
+ actualTrackToken = trackToken;
+ }
+
+ final res = await deezerAPI.getTrackUrl(
+ actualTrackToken, _currentQuality!.toDeezerQualityString());
+ if (res.error != null) {
+ _logger.warning('Error while getting track url: ${res.error!}');
+ return null;
+ }
+ if (res.sources == null) {
+ _logger.warning('Error while getting track url: No sources!');
+ return null;
+ }
+
+ return Uri.parse(res.sources![0].url);
+ }
+
+ @override
+ Future request([int? start, int? end]) async {
+ start ??= 0;
+
+ if (_cachedSourceLength != null) {
+ if (start == _cachedSourceLength) {
+ return StreamAudioResponse(
+ sourceLength: _cachedSourceLength,
+ contentLength: 0,
+ offset: start,
+ stream: const Stream>.empty(),
+ contentType: _cachedContentType!);
+ }
+ }
+
+ _logger.fine("authorizing...");
+ if (!await deezerAPI.authorize()) {
+ _logger.severe("authorization failed! cannot continue!");
+ throw Exception("Authorization failed!");
+ }
+
+ // determine quality to use
+ final newQuality = _getQuality.call();
+
+ if (_downloadUrl != null && _currentQuality != newQuality) {
+ // update currentUrl to get tracks with new quality
+ _downloadUrl = null;
+ }
+
+ _currentQuality = newQuality;
+
+ if (_downloadUrl == null) {
+ final gottenUrl = await _getUrl();
+ if (gottenUrl != null) {
+ _downloadUrl = gottenUrl;
+ } else {
+ _logger.warning('falling back to old url generation!');
+
+ // OLD URL GENERATION
+ try {
+ _downloadUrl = await _fallbackUrl();
+ } on QualityException {
+ rethrow;
+ }
+ }
+ }
+
+ _logger.fine("Downloading track from ${_downloadUrl!.toString()}");
+ final int deezerStart = start - (start % 2048);
+ final req = http.Request('GET', _downloadUrl!)
+ ..headers.addAll({
+ 'User-Agent': deezerAPI.headers['User-Agent']!,
+ 'Accept-Language': '*',
+ 'Accept': '*/*',
+ if (deezerStart > 0)
+ "Range": "bytes=$deezerStart-${end == null ? '' : end.toString()}"
+ });
+
+ final res = await req.send();
+ final rc = res.statusCode;
+ _logger
+ .finest("request sent! rc: $rc, content-length: ${res.contentLength}");
+ onStreamObtained?.call(StreamQualityInfo(
+ format: quality == AudioQuality.FLAC ? Format.FLAC : Format.MP3,
+ source: Source.stream,
+ size: start + res.contentLength!,
+ quality: quality,
+ ));
+ if (rc != HttpStatus.ok && rc != HttpStatus.partialContent) {
+ throw Exception(await res.stream.bytesToString());
+ }
+
+ int dropBytes = start % chunkSize;
+ _logger.finest(
+ "deezerStart: $deezerStart (actual start: $start), end: $end, dropBytes: $dropBytes");
+ final stream = decryptionStream(res.stream, start: start, trackId: trackId);
+
+ final cl = res.contentLength! - dropBytes;
+
+ if (end == null) {
+ _cachedSourceLength = cl + start;
+ }
+
+ return StreamAudioResponse(
+ sourceLength: _cachedSourceLength,
+ contentLength: cl,
+ offset: start,
+ stream: stream,
+ contentType: _cachedContentType =
+ quality == AudioQuality.FLAC ? "audio/flac" : "audio/mpeg");
+ }
+}
diff --git a/lib/api/download_manager/database.dart b/lib/api/download_manager/database.dart
index 0567191..d6a74e8 100644
--- a/lib/api/download_manager/database.dart
+++ b/lib/api/download_manager/database.dart
@@ -1,3 +1,3 @@
-import 'package:isar/isar.dart';
-
-class T {}
+import 'package:isar/isar.dart';
+
+class T {}
diff --git a/lib/api/download_manager/download_manager.dart b/lib/api/download_manager/download_manager.dart
index c67249f..ae13c3b 100644
--- a/lib/api/download_manager/download_manager.dart
+++ b/lib/api/download_manager/download_manager.dart
@@ -1,30 +1,30 @@
-import 'dart:io';
-
-import 'package:flutter_background_service/flutter_background_service.dart';
-import 'package:freezer/api/download_manager/download_service.dart';
-import 'package:freezer/translations.i18n.dart';
-
-class DownloadManager {
- Future startService() {
- if (Platform.isAndroid) {
- return FlutterBackgroundService().configure(
- iosConfiguration: IosConfiguration(), // fuck ios
- androidConfiguration: AndroidConfiguration(
- onStart: _startService,
- isForegroundMode: false,
- autoStart: false,
- autoStartOnBoot: false,
- foregroundServiceNotificationId: DownloadService.NOTIFICATION_ID,
- notificationChannelId: DownloadService.NOTIFICATION_CHANNEL_ID,
- initialNotificationTitle: 'Freezer'.i18n,
- initialNotificationContent: 'Starting download service...'.i18n,
- ));
- }
-
- _startService(null);
- return Future.value(true);
- }
-
- static void _startService(ServiceInstance? service) =>
- DownloadService(service).run();
-}
+import 'dart:io';
+
+import 'package:flutter_background_service/flutter_background_service.dart';
+import 'package:freezer/api/download_manager/download_service.dart';
+import 'package:freezer/translations.i18n.dart';
+
+class DownloadManager {
+ Future startService() {
+ if (Platform.isAndroid) {
+ return FlutterBackgroundService().configure(
+ iosConfiguration: IosConfiguration(), // fuck ios
+ androidConfiguration: AndroidConfiguration(
+ onStart: _startService,
+ isForegroundMode: false,
+ autoStart: false,
+ autoStartOnBoot: false,
+ foregroundServiceNotificationId: DownloadService.NOTIFICATION_ID,
+ notificationChannelId: DownloadService.NOTIFICATION_CHANNEL_ID,
+ initialNotificationTitle: 'Freezer'.i18n,
+ initialNotificationContent: 'Starting download service...'.i18n,
+ ));
+ }
+
+ _startService(null);
+ return Future.value(true);
+ }
+
+ static void _startService(ServiceInstance? service) =>
+ DownloadService(service).run();
+}
diff --git a/lib/api/download_manager/download_service.dart b/lib/api/download_manager/download_service.dart
index a68975a..da9cbf2 100644
--- a/lib/api/download_manager/download_service.dart
+++ b/lib/api/download_manager/download_service.dart
@@ -1,11 +1,11 @@
-import 'package:flutter_background_service/flutter_background_service.dart';
-
-class DownloadService {
- static const NOTIFICATION_ID = 6969;
- static const NOTIFICATION_CHANNEL_ID = "freezerdownloads";
-
- final ServiceInstance? service;
- DownloadService(this.service);
-
- void run() {}
-}
+import 'package:flutter_background_service/flutter_background_service.dart';
+
+class DownloadService {
+ static const NOTIFICATION_ID = 6969;
+ static const NOTIFICATION_CHANNEL_ID = "freezerdownloads";
+
+ final ServiceInstance? service;
+ DownloadService(this.service);
+
+ void run() {}
+}
diff --git a/lib/api/offline_audio_source.dart b/lib/api/offline_audio_source.dart
index 8073c62..0600d0f 100644
--- a/lib/api/offline_audio_source.dart
+++ b/lib/api/offline_audio_source.dart
@@ -1,34 +1,34 @@
-import 'dart:io';
-
-import 'package:freezer/api/definitions.dart';
-import 'package:just_audio/just_audio.dart';
-
-class OfflineAudioSource extends StreamAudioSource {
- final File file;
- final StreamInfoCallback? onStreamObtained;
- OfflineAudioSource(this.file, {this.onStreamObtained});
-
- @override
- Future request([int? start, int? end]) async {
- // determine content type
- final first = await file.openRead(0, 4).join();
- bool isFlac = false;
- if (first == 'fLaC') isFlac = true;
-
- final length = await file.length();
- final stream = file.openRead(start, end);
-
- onStreamObtained?.call(StreamQualityInfo(
- format: isFlac ? Format.FLAC : Format.MP3,
- source: Source.offline,
- quality: null,
- size: length));
-
- return StreamAudioResponse(
- sourceLength: length,
- contentLength: (end ?? length) - (start ?? 0),
- offset: start,
- stream: stream,
- contentType: isFlac ? 'audio/flac' : 'audio/mpeg');
- }
-}
+import 'dart:io';
+
+import 'package:freezer/api/definitions.dart';
+import 'package:just_audio/just_audio.dart';
+
+class OfflineAudioSource extends StreamAudioSource {
+ final File file;
+ final StreamInfoCallback? onStreamObtained;
+ OfflineAudioSource(this.file, {this.onStreamObtained});
+
+ @override
+ Future request([int? start, int? end]) async {
+ // determine content type
+ final first = await file.openRead(0, 4).join();
+ bool isFlac = false;
+ if (first == 'fLaC') isFlac = true;
+
+ final length = await file.length();
+ final stream = file.openRead(start, end);
+
+ onStreamObtained?.call(StreamQualityInfo(
+ format: isFlac ? Format.FLAC : Format.MP3,
+ source: Source.offline,
+ quality: null,
+ size: length));
+
+ return StreamAudioResponse(
+ sourceLength: length,
+ contentLength: (end ?? length) - (start ?? 0),
+ offset: start,
+ stream: stream,
+ contentType: isFlac ? 'audio/flac' : 'audio/mpeg');
+ }
+}
diff --git a/lib/api/paths.dart b/lib/api/paths.dart
index 85e9725..96a470c 100644
--- a/lib/api/paths.dart
+++ b/lib/api/paths.dart
@@ -1,49 +1,54 @@
-import 'dart:io';
-
-import 'package:flutter/foundation.dart';
-import 'package:path/path.dart' as path;
-import 'package:path_provider/path_provider.dart';
-
-class Paths {
- static Future dataDirectory() async {
- switch (defaultTargetPlatform) {
- case TargetPlatform.linux:
- final home = Platform.environment['HOME'];
- if (home == null) return path.dirname(Platform.resolvedExecutable);
- if (await Directory(path.join(home, '.local', 'share')).exists()) {
- final target =
- await Directory(path.join(home, '.local', 'share', 'freezer'))
- .create();
- return target.path;
- }
- return path.dirname(Platform.resolvedExecutable);
- case TargetPlatform.windows:
- String? home = Platform.environment['USERPROFILE'];
- if (home == null) {
- final drive = Platform.environment['HOMEDRIVE'];
- final homepath = Platform.environment['HOMEPATH'];
- if (drive == null || homepath == null) {
- return path.dirname(Platform.resolvedExecutable);
- }
-
- home = drive + homepath;
- }
-
- final target =
- await Directory(path.join(home, 'AppData', 'Freezer')).create();
- return target.path;
- default:
- return (await getApplicationDocumentsDirectory()).path;
- }
- }
-
- static Future cacheDir() async {
- if (Platform.isLinux || Platform.isWindows) {
- final dataDir = await dataDirectory();
- final target = await Directory(path.join(dataDir, 'cache')).create();
- return target.path;
- }
-
- return (await getTemporaryDirectory()).path;
- }
-}
+import 'dart:io';
+
+import 'package:flutter/foundation.dart';
+import 'package:path/path.dart' as path;
+import 'package:path_provider/path_provider.dart';
+
+class Paths {
+ static Future dataDirectory() async {
+ switch (defaultTargetPlatform) {
+ case TargetPlatform.linux:
+ final home = Platform.environment['HOME'];
+ if (home == null) return path.dirname(Platform.resolvedExecutable);
+ if (await Directory(path.join(home, '.local', 'share')).exists()) {
+ final target =
+ await Directory(path.join(home, '.local', 'share', 'freezer'))
+ .create();
+ return target.path;
+ }
+ return path.dirname(Platform.resolvedExecutable);
+ case TargetPlatform.windows:
+ final String? localAppData = Platform.environment['LOCALAPPDATA'];
+ if (localAppData != null) {
+ final target = await Directory(path.join(localAppData, 'Freezer')).create();
+ return target.path;
+ }
+ String? home = Platform.environment['USERPROFILE'];
+ if (home == null) {
+ final drive = Platform.environment['HOMEDRIVE'];
+ final homepath = Platform.environment['HOMEPATH'];
+ if (drive == null || homepath == null) {
+ return path.dirname(Platform.resolvedExecutable);
+ }
+
+ home = drive + homepath;
+ }
+
+ final target =
+ await Directory(path.join(home, 'AppData', 'Local', 'Freezer')).create();
+ return target.path;
+ default:
+ return (await getApplicationDocumentsDirectory()).path;
+ }
+ }
+
+ static Future cacheDir() async {
+ if (Platform.isLinux || Platform.isWindows) {
+ final dataDir = await dataDirectory();
+ final target = await Directory(path.join(dataDir, 'cache')).create();
+ return target.path;
+ }
+
+ return (await getTemporaryDirectory()).path;
+ }
+}
diff --git a/lib/api/player/player_helper.dart b/lib/api/player/player_helper.dart
index 4ab2afa..eac20aa 100644
--- a/lib/api/player/player_helper.dart
+++ b/lib/api/player/player_helper.dart
@@ -1,304 +1,304 @@
-import 'dart:async';
-import 'package:audio_service/audio_service.dart';
-import 'package:equalizer/equalizer.dart';
-import 'package:fluttertoast/fluttertoast.dart';
-import 'package:freezer/api/cache.dart';
-import 'package:freezer/api/deezer.dart';
-import 'package:freezer/api/definitions.dart';
-import 'package:freezer/api/player/audio_handler.dart';
-import 'package:freezer/settings.dart';
-import 'package:freezer/translations.i18n.dart';
-import 'package:logging/logging.dart';
-import 'package:rxdart/rxdart.dart';
-
-class PlayerHelper {
- late StreamSubscription _customEventSubscription;
- late StreamSubscription _mediaItemSubscription;
- late StreamSubscription _playbackStateStreamSubscription;
- QueueSource? queueSource;
- AudioServiceRepeatMode repeatType = AudioServiceRepeatMode.none;
- int? audioSession;
- int? _prevAudioSession;
- bool equalizerOpen = false;
- bool _shuffleEnabled = false;
- int _queueIndex = 0;
- bool _started = false;
-
- /// Whether this system supports the [Connectivity] plugin or not
- bool _isConnectivityPluginAvailable = true;
- bool get isConnectivityPluginAvailable => _isConnectivityPluginAvailable;
-
- //Visualizer
- // StreamController _visualizerController = StreamController.broadcast();
- // Stream get visualizerStream => _visualizerController.stream;
-
- final _streamInfoSubject = BehaviorSubject();
- ValueStream get streamInfo => _streamInfoSubject.stream;
-
- final _bufferPositionSubject = BehaviorSubject();
- ValueStream get bufferPosition => _bufferPositionSubject.stream;
-
- /// Find queue index by id
- ///
- /// The function gets more expensive the longer the queue is and the further the element is from the beginning.
- int getQueueIndexFromId() => audioHandler.mediaItem.value == null
- ? -1
- : audioHandler.queue.value
- .indexWhere((mi) => mi.id == audioHandler.mediaItem.value!.id);
-
- int getQueueIndex() =>
- audioHandler.playbackState.value.queueIndex ?? getQueueIndexFromId();
-
- int get queueIndex => _queueIndex;
-
- Future initAudioHandler() async {
- final initArgs = AudioPlayerTaskInitArguments.from(
- settings: settings, deezerAPI: deezerAPI);
- // initialize our audiohandler instance
- audioHandler = await AudioService.init(
- builder: () => AudioPlayerTask(initArgs),
- config: AudioServiceConfig(
- notificationColor: settings.primaryColor,
- androidStopForegroundOnPause: false,
- androidNotificationOngoing: false,
- androidNotificationClickStartsActivity: true,
- androidNotificationChannelDescription: 'Freezer',
- androidNotificationChannelName: 'Freezer',
- androidNotificationIcon: 'drawable/ic_logo',
- preloadArtwork: false,
- ),
- );
- }
-
- Future start() async {
- if (_started) return;
- _started = true;
- //Subscribe to custom events
- _customEventSubscription = audioHandler.customEvent.listen((event) async {
- if (event is! Map) return;
- Logger('PlayerHelper').fine("event received: ${event['action']}");
- switch (event['action']) {
- case 'onLoad':
- //After audio_service is loaded, load queue, set quality
- await settings.updateAudioServiceQuality();
- break;
- case 'onRestore':
- //Load queueSource from isolate
- queueSource = event['queueSource'] as QueueSource;
- repeatType = event['repeatMode'] as AudioServiceRepeatMode;
- _queueIndex = getQueueIndex();
- break;
- case 'audioSession':
- if (!settings.enableEqualizer) break;
- //Save
- _prevAudioSession = audioSession;
- audioSession = event['id'];
- if (audioSession == null) break;
- //Open EQ
- if (!equalizerOpen) {
- Equalizer.open(event['id']);
- equalizerOpen = true;
- break;
- }
- //Change session id
- if (_prevAudioSession != audioSession) {
- if (_prevAudioSession != null) {
- Equalizer.removeAudioSessionId(_prevAudioSession!);
- }
- Equalizer.setAudioSessionId(audioSession!);
- }
- break;
- //Visualizer data
- // case 'visualizer':
- // _visualizerController.add(event['data']);
- // break;
- case 'streamInfo':
- Logger('PlayerHelper').fine("streamInfo received");
- _streamInfoSubject.add(event['data'] as StreamQualityInfo);
- break;
- case 'bufferPosition':
- _bufferPositionSubject.add(event['data'] as Duration);
- break;
- case 'connectivityPlugin':
- _isConnectivityPluginAvailable = event['available'] as bool;
- break;
- }
- });
- _mediaItemSubscription = audioHandler.mediaItem.listen((mediaItem) async {
- if (mediaItem == null) return;
- _queueIndex = getQueueIndex();
- //Load more flow if last song (not using .last since it iterates through previous elements first)
-
- //Save queue
- await audioHandler.customAction('saveQueue', {});
- //Add to history
- if (cache.history.isNotEmpty && cache.history.last.id == mediaItem.id) {
- return;
- }
- cache.history.add(Track.fromMediaItem(mediaItem));
- cache.save();
- });
-
- //Start audio_service
- // await startService(); it is already ready, there is no need to start it
- }
-
- Future authorizeLastFM() async {
- if (settings.lastFMUsername == null || settings.lastFMPassword == null) {
- return;
- }
- await audioHandler.customAction('authorizeLastFM', {
- 'username': settings.lastFMUsername,
- 'password': settings.lastFMPassword
- });
- }
-
- Future toggleShuffle() async {
- _shuffleEnabled = !_shuffleEnabled;
- await audioHandler.setShuffleMode(_shuffleEnabled
- ? AudioServiceShuffleMode.all
- : AudioServiceShuffleMode.none);
- return _shuffleEnabled;
- }
-
- bool get shuffleEnabled => _shuffleEnabled;
-
- //Repeat toggle
- Future changeRepeat() async {
- //Change to next repeat type
- repeatType = repeatType == AudioServiceRepeatMode.all
- ? AudioServiceRepeatMode.none
- : repeatType == AudioServiceRepeatMode.none
- ? AudioServiceRepeatMode.one
- : AudioServiceRepeatMode.all;
- //Set repeat type
- await audioHandler.setRepeatMode(repeatType);
- }
-
- //Executed before exit
- Future onExit() async {
- _customEventSubscription.cancel();
- _playbackStateStreamSubscription.cancel();
- _mediaItemSubscription.cancel();
- }
-
- //Replace queue, play specified track id
- Future _loadQueuePlay(List queue, String? trackId) async {
- await settings.updateAudioServiceQuality();
-
- await audioHandler.customAction('setIndex', {
- 'index': trackId == null ? 0 : queue.indexWhere((m) => m.id == trackId)
- });
- await audioHandler.updateQueue(queue);
-// if (queue[0].id != trackId)
-// await AudioService.skipToQueueItem(trackId);
- if (!audioHandler.playbackState.value.playing) audioHandler.play();
- }
-
- //Play track from album
- Future playFromAlbum(Album album, [String? trackId]) async {
- await playFromTrackList(album.tracks!, trackId,
- QueueSource(id: album.id, text: album.title, source: 'album'));
- }
-
- //Play mix by track
- Future playMix(String trackId, String trackTitle) async {
- List