Initial Commit
45
.gitignore
vendored
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# Miscellaneous
|
||||||
|
*.class
|
||||||
|
*.log
|
||||||
|
*.pyc
|
||||||
|
*.swp
|
||||||
|
.DS_Store
|
||||||
|
.atom/
|
||||||
|
.build/
|
||||||
|
.buildlog/
|
||||||
|
.history
|
||||||
|
.svn/
|
||||||
|
.swiftpm/
|
||||||
|
migrate_working_dir/
|
||||||
|
|
||||||
|
# IntelliJ related
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# The .vscode folder contains launch configuration and tasks you configure in
|
||||||
|
# VS Code which you may wish to be included in version control, so this line
|
||||||
|
# is commented out by default.
|
||||||
|
#.vscode/
|
||||||
|
|
||||||
|
# Flutter/Dart/Pub related
|
||||||
|
**/doc/api/
|
||||||
|
**/ios/Flutter/.last_build_id
|
||||||
|
.dart_tool/
|
||||||
|
.flutter-plugins-dependencies
|
||||||
|
.pub-cache/
|
||||||
|
.pub/
|
||||||
|
/build/
|
||||||
|
/coverage/
|
||||||
|
|
||||||
|
# Symbolication related
|
||||||
|
app.*.symbols
|
||||||
|
|
||||||
|
# Obfuscation related
|
||||||
|
app.*.map.json
|
||||||
|
|
||||||
|
# Android Studio will place build artifacts here
|
||||||
|
/android/app/debug
|
||||||
|
/android/app/profile
|
||||||
|
/android/app/release
|
||||||
45
.metadata
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# This file tracks properties of this Flutter project.
|
||||||
|
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||||
|
#
|
||||||
|
# This file should be version controlled and should not be manually edited.
|
||||||
|
|
||||||
|
version:
|
||||||
|
revision: "6c794842101b5805e74774cce9f1fdb49cbcd13c"
|
||||||
|
channel: "beta"
|
||||||
|
|
||||||
|
project_type: app
|
||||||
|
|
||||||
|
# Tracks metadata for the flutter migrate command
|
||||||
|
migration:
|
||||||
|
platforms:
|
||||||
|
- platform: root
|
||||||
|
create_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
base_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
- platform: android
|
||||||
|
create_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
base_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
- platform: ios
|
||||||
|
create_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
base_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
- platform: linux
|
||||||
|
create_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
base_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
- platform: macos
|
||||||
|
create_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
base_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
- platform: web
|
||||||
|
create_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
base_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
- platform: windows
|
||||||
|
create_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
base_revision: 6c794842101b5805e74774cce9f1fdb49cbcd13c
|
||||||
|
|
||||||
|
# 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'
|
||||||
16
README.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# proto_portal
|
||||||
|
|
||||||
|
A new Flutter project.
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
This project is a starting point for a Flutter application.
|
||||||
|
|
||||||
|
A few resources to get you started if this is your first Flutter project:
|
||||||
|
|
||||||
|
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
|
||||||
|
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
|
||||||
|
|
||||||
|
For help getting started with Flutter development, view the
|
||||||
|
[online documentation](https://docs.flutter.dev/), which offers tutorials,
|
||||||
|
samples, guidance on mobile development, and a full API reference.
|
||||||
28
analysis_options.yaml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# This file configures the analyzer, which statically analyzes Dart code to
|
||||||
|
# check for errors, warnings, and lints.
|
||||||
|
#
|
||||||
|
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
||||||
|
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
||||||
|
# invoked from the command line by running `flutter analyze`.
|
||||||
|
|
||||||
|
# The following line activates a set of recommended lints for Flutter apps,
|
||||||
|
# packages, and plugins designed to encourage good coding practices.
|
||||||
|
include: package:flutter_lints/flutter.yaml
|
||||||
|
|
||||||
|
linter:
|
||||||
|
# The lint rules applied to this project can be customized in the
|
||||||
|
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
||||||
|
# included above or to enable additional rules. A list of all available lints
|
||||||
|
# and their documentation is published at https://dart.dev/lints.
|
||||||
|
#
|
||||||
|
# Instead of disabling a lint rule for the entire project in the
|
||||||
|
# section below, it can also be suppressed for a single line of code
|
||||||
|
# or a specific dart file by using the `// ignore: name_of_lint` and
|
||||||
|
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
||||||
|
# producing the lint.
|
||||||
|
rules:
|
||||||
|
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
||||||
|
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
||||||
|
|
||||||
|
# Additional information about this file can be found at
|
||||||
|
# https://dart.dev/guides/language/analysis-options
|
||||||
14
android/.gitignore
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
gradle-wrapper.jar
|
||||||
|
/.gradle
|
||||||
|
/captures/
|
||||||
|
/gradlew
|
||||||
|
/gradlew.bat
|
||||||
|
/local.properties
|
||||||
|
GeneratedPluginRegistrant.java
|
||||||
|
.cxx/
|
||||||
|
|
||||||
|
# Remember to never publicly share your keystore.
|
||||||
|
# See https://flutter.dev/to/reference-keystore
|
||||||
|
key.properties
|
||||||
|
**/*.keystore
|
||||||
|
**/*.jks
|
||||||
44
android/app/build.gradle.kts
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
plugins {
|
||||||
|
id("com.android.application")
|
||||||
|
id("kotlin-android")
|
||||||
|
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
||||||
|
id("dev.flutter.flutter-gradle-plugin")
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace = "net.imbenji.proto_portal"
|
||||||
|
compileSdk = flutter.compileSdkVersion
|
||||||
|
ndkVersion = flutter.ndkVersion
|
||||||
|
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility = JavaVersion.VERSION_11
|
||||||
|
targetCompatibility = JavaVersion.VERSION_11
|
||||||
|
}
|
||||||
|
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = JavaVersion.VERSION_11.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||||
|
applicationId = "net.imbenji.proto_portal"
|
||||||
|
// You can update the following values to match your application needs.
|
||||||
|
// For more information, see: https://flutter.dev/to/review-gradle-config.
|
||||||
|
minSdk = flutter.minSdkVersion
|
||||||
|
targetSdk = flutter.targetSdkVersion
|
||||||
|
versionCode = flutter.versionCode
|
||||||
|
versionName = flutter.versionName
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
// TODO: Add your own signing config for the release build.
|
||||||
|
// Signing with the debug keys for now, so `flutter run --release` works.
|
||||||
|
signingConfig = signingConfigs.getByName("debug")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
flutter {
|
||||||
|
source = "../.."
|
||||||
|
}
|
||||||
7
android/app/src/debug/AndroidManifest.xml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<!-- The INTERNET permission is required for development. Specifically,
|
||||||
|
the Flutter tool needs it to communicate with the running application
|
||||||
|
to allow setting breakpoints, to provide hot reload, etc.
|
||||||
|
-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
|
</manifest>
|
||||||
45
android/app/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<application
|
||||||
|
android:label="proto_portal"
|
||||||
|
android:name="${applicationName}"
|
||||||
|
android:icon="@mipmap/ic_launcher">
|
||||||
|
<activity
|
||||||
|
android:name=".MainActivity"
|
||||||
|
android:exported="true"
|
||||||
|
android:launchMode="singleTop"
|
||||||
|
android:taskAffinity=""
|
||||||
|
android:theme="@style/LaunchTheme"
|
||||||
|
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||||
|
android:hardwareAccelerated="true"
|
||||||
|
android:windowSoftInputMode="adjustResize">
|
||||||
|
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||||
|
the Android process has started. This theme is visible to the user
|
||||||
|
while the Flutter UI initializes. After that, this theme continues
|
||||||
|
to determine the Window background behind the Flutter UI. -->
|
||||||
|
<meta-data
|
||||||
|
android:name="io.flutter.embedding.android.NormalTheme"
|
||||||
|
android:resource="@style/NormalTheme"
|
||||||
|
/>
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
<!-- Don't delete the meta-data below.
|
||||||
|
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||||
|
<meta-data
|
||||||
|
android:name="flutterEmbedding"
|
||||||
|
android:value="2" />
|
||||||
|
</application>
|
||||||
|
<!-- Required to query activities that can process text, see:
|
||||||
|
https://developer.android.com/training/package-visibility and
|
||||||
|
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
||||||
|
|
||||||
|
In particular, this is used by the Flutter engine in io.flutter.plugin.text.ProcessTextPlugin. -->
|
||||||
|
<queries>
|
||||||
|
<intent>
|
||||||
|
<action android:name="android.intent.action.PROCESS_TEXT"/>
|
||||||
|
<data android:mimeType="text/plain"/>
|
||||||
|
</intent>
|
||||||
|
</queries>
|
||||||
|
</manifest>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package net.imbenji.proto_portal;
|
||||||
|
|
||||||
|
import io.flutter.embedding.android.FlutterActivity;
|
||||||
|
|
||||||
|
public class MainActivity extends FlutterActivity {
|
||||||
|
}
|
||||||
12
android/app/src/main/res/drawable-v21/launch_background.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Modify this file to customize your launch splash screen -->
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:drawable="?android:colorBackground" />
|
||||||
|
|
||||||
|
<!-- You can insert your own image assets here -->
|
||||||
|
<!-- <item>
|
||||||
|
<bitmap
|
||||||
|
android:gravity="center"
|
||||||
|
android:src="@mipmap/launch_image" />
|
||||||
|
</item> -->
|
||||||
|
</layer-list>
|
||||||
12
android/app/src/main/res/drawable/launch_background.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Modify this file to customize your launch splash screen -->
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<item android:drawable="@android:color/white" />
|
||||||
|
|
||||||
|
<!-- You can insert your own image assets here -->
|
||||||
|
<!-- <item>
|
||||||
|
<bitmap
|
||||||
|
android:gravity="center"
|
||||||
|
android:src="@mipmap/launch_image" />
|
||||||
|
</item> -->
|
||||||
|
</layer-list>
|
||||||
BIN
android/app/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 544 B |
BIN
android/app/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 442 B |
BIN
android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 721 B |
BIN
android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
18
android/app/src/main/res/values-night/styles.xml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
|
||||||
|
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||||
|
<!-- Show a splash screen on the activity. Automatically removed when
|
||||||
|
the Flutter engine draws its first frame -->
|
||||||
|
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||||
|
</style>
|
||||||
|
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||||
|
This theme determines the color of the Android Window while your
|
||||||
|
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||||
|
running.
|
||||||
|
|
||||||
|
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||||
|
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
||||||
|
<item name="android:windowBackground">?android:colorBackground</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
18
android/app/src/main/res/values/styles.xml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
||||||
|
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||||
|
<!-- Show a splash screen on the activity. Automatically removed when
|
||||||
|
the Flutter engine draws its first frame -->
|
||||||
|
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||||
|
</style>
|
||||||
|
<!-- Theme applied to the Android Window as soon as the process has started.
|
||||||
|
This theme determines the color of the Android Window while your
|
||||||
|
Flutter UI initializes, as well as behind your Flutter UI while its
|
||||||
|
running.
|
||||||
|
|
||||||
|
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
||||||
|
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
||||||
|
<item name="android:windowBackground">?android:colorBackground</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
7
android/app/src/profile/AndroidManifest.xml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<!-- The INTERNET permission is required for development. Specifically,
|
||||||
|
the Flutter tool needs it to communicate with the running application
|
||||||
|
to allow setting breakpoints, to provide hot reload, etc.
|
||||||
|
-->
|
||||||
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
|
</manifest>
|
||||||
24
android/build.gradle.kts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
allprojects {
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val newBuildDir: Directory =
|
||||||
|
rootProject.layout.buildDirectory
|
||||||
|
.dir("../../build")
|
||||||
|
.get()
|
||||||
|
rootProject.layout.buildDirectory.value(newBuildDir)
|
||||||
|
|
||||||
|
subprojects {
|
||||||
|
val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
|
||||||
|
project.layout.buildDirectory.value(newSubprojectBuildDir)
|
||||||
|
}
|
||||||
|
subprojects {
|
||||||
|
project.evaluationDependsOn(":app")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register<Delete>("clean") {
|
||||||
|
delete(rootProject.layout.buildDirectory)
|
||||||
|
}
|
||||||
3
android/gradle.properties
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
|
||||||
|
android.useAndroidX=true
|
||||||
|
android.enableJetifier=true
|
||||||
5
android/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionPath=wrapper/dists
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip
|
||||||
26
android/settings.gradle.kts
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
pluginManagement {
|
||||||
|
val flutterSdkPath =
|
||||||
|
run {
|
||||||
|
val properties = java.util.Properties()
|
||||||
|
file("local.properties").inputStream().use { properties.load(it) }
|
||||||
|
val flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||||
|
require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
|
||||||
|
flutterSdkPath
|
||||||
|
}
|
||||||
|
|
||||||
|
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
mavenCentral()
|
||||||
|
gradlePluginPortal()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
|
||||||
|
id("com.android.application") version "8.9.1" apply false
|
||||||
|
id("org.jetbrains.kotlin.android") version "2.1.0" apply false
|
||||||
|
}
|
||||||
|
|
||||||
|
include(":app")
|
||||||
BIN
assets/background-1.jpeg
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
71
assets/logo.svg
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg id="Layer_2" data-name="Layer 2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1861.51 307.15">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #280071;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g id="Layer_1-2" data-name="Layer 1">
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path class="cls-1" d="M338.04,34.42h-13.06c-9.07,0-15.62,1.66-20.59,5.23-6.75,4.84-10.18,13.27-10.18,25.05v11.37h-16.87v16.45h16.87v72.97h17.09v-72.97h27.17v-16.45h-27.17v-11.37c0-11.48,5.47-13.83,13.68-13.83h13.49v-16.45h-.43Z"/>
|
||||||
|
<g>
|
||||||
|
<path class="cls-1" d="M352.52,76.07h-.43v89.42h17.09v-89.42h-16.65Z"/>
|
||||||
|
<path class="cls-1" d="M360.64,32.78c-6.5,0-11.79,5.34-11.79,11.91s5.29,11.91,11.79,11.91,11.79-5.34,11.79-11.91-5.29-11.91-11.79-11.91Z"/>
|
||||||
|
</g>
|
||||||
|
<path class="cls-1" d="M452.86,79.89c-8.49-4.79-14.89-7.93-26-7.93-5.54,0-10.58,1.86-15.46,3.65-4.3,1.58-8.36,3.07-12.28,3.07-1.98,0-4.7-1.73-6.57-3.04l-3.73-2.62-.35-.25-.25.35-9.41,13.45-.27.39.41.24,2.27,1.31c6.59,3.8,11.63,7.47,11.63,17v59.96h17.09v-59.96c0-4.5-.55-8.44-1.67-12.01,1.79-.56,3.57-1.22,5.3-1.85,4.53-1.67,8.81-3.25,13.3-3.25,7.62,0,12.31,2.49,18.11,6l.38.23.22-.4,7.46-13.77.21-.38-.37-.21Z"/>
|
||||||
|
<path class="cls-1" d="M493.31,87.76c10.45,0,21.11,3.76,28.52,10.06l.33.28.28-.34,9.81-11.97.28-.35-.35-.28c-10.63-8.34-24.77-13.13-38.79-13.13-9.36,0-17.82,2.27-23.83,6.39-7.04,4.82-10.75,12.15-10.75,21.19s4.17,15.34,12.41,20c5.96,3.37,14.24,5.57,22.72,6.02,14.22.71,20.84,4.84,20.84,13.01,0,3.91-1.89,7.48-5.31,10.03-3.69,2.75-8.89,4.21-15.02,4.21-11.81,0-18.55-3.03-30.05-13.5l-.33-.3-.29.33-9.98,11.56-.28.33.32.29c13.76,12.39,24.77,17,40.6,17,9.33,0,18.5-2.63,25.16-7.21,7.91-5.44,12.09-13.3,12.09-22.74s-4.1-17.12-12.18-22.01c-7.7-4.65-17.52-6.04-24.4-6.38-2.82-.13-8.18-.6-12.52-2.37-4.55-1.85-6.86-4.63-6.86-8.27,0-10.32,11.01-11.86,17.58-11.86Z"/>
|
||||||
|
<path class="cls-1" d="M237.99,91.82c-.98-25.45-11.73-49.03-30.27-66.37C189.17,8.1,165.1-.92,139.91.07,87.85,2.11,47.13,46.59,49.15,99.22c0,0,0,.02,0,.03-16.2,5.54-32.09,12.06-47.52,19.49l-1.63.78,7.11,15.08,1.63-.78c13.84-6.67,28.07-12.56,42.56-17.66,3.98,18.28,13.22,35.01,26.86,48.24,17.71,17.18,40.93,26.64,65.36,26.64,1.22,0,2.47-.02,3.7-.07,25.22-.99,48.55-11.84,65.7-30.57,17.14-18.72,26.05-43.08,25.07-68.57ZM140.55,16.77c1.01-.04,2.04-.06,3.06-.06,8.07,0,15.97,1.25,23.49,3.66-10.52,11.72-19.83,24.54-27.76,38.28-2.64,4.58-5.17,9.32-7.51,14.09-1.23,2.52-2.41,5.05-3.54,7.59-16.23,2.28-32.32,5.47-48.15,9.59-4.86,1.26-9.7,2.62-14.52,4.05.78-41.38,33.5-75.58,74.93-77.2ZM108.45,165.87c-6.83-3.5-13.18-8.03-18.85-13.53-11.65-11.3-19.4-25.68-22.49-41.38,5.69-1.74,11.4-3.37,17.14-4.86,12.15-3.16,24.46-5.76,36.88-7.79-7.64,21.78-11.88,44.39-12.68,67.58ZM200.79,149.05c-14.14,15.45-33.39,24.41-54.21,25.22-1.02.04-2.02.06-3.06.06-6.37,0-12.63-.78-18.68-2.29.23-26.35,5.24-51.95,14.93-76.36,14.69-1.73,29.48-2.67,44.31-2.82l1.79-.02v-16.71l-1.82.02c-12.15.12-24.29.76-36.36,1.9,1.87-3.72,3.85-7.4,5.92-10.98,8.27-14.32,18.15-27.58,29.43-39.5,5.18,3.09,10.05,6.81,14.49,11.12,14.65,14.22,23.16,33.31,23.94,53.77.81,21.04-6.54,41.13-20.69,56.58Z"/>
|
||||||
|
<path class="cls-1" d="M597.4,76.07h-22.12v-41.65h-17.09v25.85q0,15.8-15.47,15.8h-1.24v16.45h16.71v42.69c0,11.78,3.42,20.21,10.18,25.05,4.97,3.56,11.51,5.23,20.59,5.23h8.87v-16.45h-8.87c-8.21,0-13.68-2.35-13.68-13.83v-42.69h22.55v-16.45h-.43Z"/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path class="cls-1" d="M690.27,163.32c-4.04-1.32-7.42-4-10.13-8.03-2.72-4.04-4.08-9.82-4.08-17.34v-52.57h-20.27v-9.06h9.81c6.97,0,10.46-3.98,10.46-11.95v-29.91h9.39v41.86h24.88v9.06h-24.88v52.57c0,5.38.84,9.41,2.51,12.07,1.67,2.66,3.79,4.37,6.34,5.11,2.55.74,5.75,1.11,9.6,1.11h6.43v9.06h-6.43c-5.05,0-9.6-.66-13.64-1.98Z"/>
|
||||||
|
<path class="cls-1" d="M734.18,95.22c-.91-2.33-2.16-4.3-3.75-5.89-1.59-1.59-3.9-3.51-6.92-5.77l-2.47-1.81,5.6-7.75,3.62,2.8c2.75,2.09,5.16,3.13,7.25,3.13,1.54,0,3.16-.26,4.86-.78,1.7-.52,3.95-1.36,6.76-2.51,3.46-1.43,6.48-2.53,9.06-3.3,2.58-.77,5.24-1.15,7.99-1.15s5.51.3,7.95.91c2.44.61,4.7,1.37,6.76,2.31,2.06.93,4.74,2.28,8.03,4.04l-4.45,8.07-4.12-2.14c-2.53-1.26-4.92-2.27-7.17-3.01-2.25-.74-4.59-1.11-7-1.11s-4.59.34-6.84,1.03c-2.25.69-4.89,1.66-7.91,2.93-2.2.88-3.95,1.55-5.27,2.02-1.32.47-2.61.78-3.87.95l-1.15.16c1.37,2.14,2.38,4.44,3.01,6.88.63,2.44.95,5.42.95,8.94v61.14h-9.56v-61.14c0-3.63-.45-6.6-1.36-8.94Z"/>
|
||||||
|
<path class="cls-1" d="M814.04,164.93c-5.16-2-9.33-5.16-12.48-9.48-3.16-4.31-4.74-9.76-4.74-16.36,0-9.78,3.38-16.75,10.13-20.93,6.76-4.17,15.13-6.26,25.13-6.26h4.61c5.66,0,10.53-.74,14.62-2.22,4.09-1.48,6.14-4.53,6.14-9.15,0-6.7-2.1-11.56-6.3-14.58-4.2-3.02-9.54-4.53-16.03-4.53-5.05,0-10.09,1-15.12,3.01-5.03,2.01-9.43,4.46-13.22,7.37l-5.36-7c4.5-3.51,9.68-6.4,15.53-8.65,5.85-2.25,11.69-3.38,17.51-3.38s11.16.96,16.03,2.88c4.86,1.92,8.77,5,11.74,9.23,2.97,4.23,4.45,9.64,4.45,16.23v34.19c0,4.72.77,8.53,2.31,11.41,1.54,2.88,3.95,5.56,7.25,8.03l5.93,4.45-5.6,7.75-3.79-2.97c-1.43-1.1-2.76-1.89-4-2.39-1.24-.49-2.59-.74-4.08-.74-2.03,0-3.93.23-5.68.7-1.76.47-4.09,1.19-7,2.18-3.68,1.32-7.07,2.35-10.17,3.09-3.1.74-6.74,1.11-10.92,1.11-6.1,0-11.73-1-16.89-3.01ZM809.92,150.35c2.36,2.99,5.46,5.16,9.31,6.51,3.84,1.35,8.02,2.02,12.52,2.02,3.19,0,6-.27,8.45-.82,2.44-.55,5.4-1.4,8.86-2.55,2.47-.88,4.72-1.58,6.76-2.1,2.03-.52,4.17-.84,6.43-.95-1.7-2.09-2.95-4.49-3.75-7.21s-1.19-6.03-1.19-9.93v-20.1c-2.36,2.14-5.22,3.56-8.57,4.24-3.35.69-7.2,1.03-11.54,1.03h-6.92c-6.76,0-12.43,1.44-17.01,4.33-4.59,2.88-6.88,7.6-6.88,14.13,0,4.61,1.18,8.42,3.54,11.41Z"/>
|
||||||
|
<path class="cls-1" d="M922.44,166.37c-2.22-1.54-3.86-3.71-4.9-6.51l-30.73-83.14,9.23-2.14,30.4,82.15c.27.71.71,1.28,1.32,1.69.6.41,1.26.62,1.98.62s1.36-.19,1.94-.58c.58-.38,1-.96,1.28-1.73l29.99-82.31,9.23,2.14-30.32,83.3c-1.04,2.8-2.66,4.97-4.86,6.51-2.2,1.54-4.61,2.31-7.25,2.31s-5.07-.77-7.29-2.31Z"/>
|
||||||
|
<path class="cls-1" d="M1004.71,161.63c-6.65-4.53-11.87-10.51-15.66-17.92-3.79-7.42-5.68-15.21-5.68-23.4,0-10.38,2.07-19.18,6.22-26.41,4.15-7.22,9.57-12.62,16.27-16.19,6.7-3.57,13.84-5.36,21.42-5.36s14.24,1.61,20.81,4.82c6.56,3.21,11.86,7.83,15.9,13.84,4.04,6.01,6.05,12.98,6.05,20.89,0,3.79-1.25,6.91-3.75,9.35-2.5,2.44-5.92,3.67-10.26,3.67h-51.25c-2.47,0-4.57.81-6.3,2.43-1.73,1.62-2.6,3.67-2.6,6.14,0,3.02,1.37,6.58,4.12,10.67,2.75,4.09,6.5,7.62,11.25,10.59,4.75,2.97,9.96,4.45,15.61,4.45s11.29-1.32,16.56-3.95c5.27-2.64,9.72-6.26,13.35-10.88l7.17,6.34c-4.5,5.55-10,9.89-16.48,13.02-6.48,3.13-13.35,4.7-20.6,4.7-8.13,0-15.52-2.27-22.16-6.8ZM992.93,122.62c.88-1.81,2.54-3.34,4.98-4.57,2.44-1.24,4.9-1.85,7.37-1.85h50.43c3.3,0,4.94-1.43,4.94-4.28,0-5.99-1.58-11.3-4.74-15.94-3.16-4.64-7.31-8.22-12.44-10.75-5.14-2.53-10.53-3.79-16.19-3.79-5.99,0-11.6,1.44-16.85,4.33-5.25,2.88-9.5,7.25-12.77,13.1-3.27,5.85-4.9,13.01-4.9,21.46,0,.33.05,1.1.16,2.31Z"/>
|
||||||
|
<path class="cls-1" d="M1089,34.46h9.56v130.84h-9.56V34.46Z"/>
|
||||||
|
<path class="cls-1" d="M1175.74,164.89c-5.55-2.36-11.07-6.18-16.56-11.45l5.77-7.09c4.89,4.67,9.57,8.01,14.05,10.01,4.48,2.01,9.96,3.01,16.44,3.01,4.72,0,8.95-.81,12.69-2.43,3.73-1.62,6.65-3.9,8.73-6.84,2.09-2.94,3.13-6.27,3.13-10.01,0-6.37-2.38-10.85-7.13-13.43-4.75-2.58-10.67-4.09-17.76-4.53-5.27-.33-10.33-1.33-15.16-3.01-4.83-1.68-8.85-4.27-12.03-7.79-3.19-3.51-4.78-7.94-4.78-13.27,0-5.77,1.4-10.59,4.2-14.46,2.8-3.87,6.55-6.73,11.25-8.57,4.7-1.84,9.96-2.76,15.78-2.76,6.21,0,12.44.99,18.7,2.97,6.26,1.98,11.48,4.7,15.65,8.16l-5.6,7.25c-2.91-2.69-7.09-4.92-12.52-6.67-5.44-1.76-10.88-2.64-16.31-2.64-6.32,0-11.52,1.36-15.61,4.08-4.09,2.72-6.14,6.94-6.14,12.65,0,3.46,1.24,6.3,3.71,8.53s5.49,3.86,9.06,4.9c3.57,1.04,7.11,1.68,10.63,1.9,9.56.49,17.52,2.8,23.9,6.92,6.37,4.12,9.56,10.71,9.56,19.77,0,6.1-1.61,11.28-4.82,15.53-3.21,4.26-7.41,7.46-12.61,9.6-5.19,2.14-10.7,3.21-16.52,3.21-7.58,0-14.14-1.18-19.69-3.54Z"/>
|
||||||
|
<path class="cls-1" d="M1267.15,161.92c-6.78-4.34-12.17-10.18-16.15-17.51-3.98-7.33-5.97-15.31-5.97-23.94s1.99-16.7,5.97-24.06c3.98-7.36,9.36-13.21,16.15-17.55,6.78-4.34,14.19-6.51,22.21-6.51s15.52,2.17,22.33,6.51c6.81,4.34,12.21,10.19,16.19,17.55,3.98,7.36,5.97,15.38,5.97,24.06s-1.99,16.6-5.97,23.94c-3.98,7.33-9.38,13.17-16.19,17.51-6.81,4.34-14.26,6.51-22.33,6.51s-15.42-2.17-22.21-6.51ZM1259.33,139.96c3.16,5.96,7.4,10.68,12.73,14.17,5.33,3.49,11.09,5.23,17.3,5.23s12.07-1.74,17.43-5.23c5.35-3.49,9.61-8.21,12.77-14.17,3.16-5.96,4.74-12.45,4.74-19.49s-1.58-13.54-4.74-19.53c-3.16-5.99-7.42-10.74-12.77-14.25-5.36-3.51-11.16-5.27-17.43-5.27s-11.98,1.76-17.3,5.27c-5.33,3.52-9.57,8.27-12.73,14.25-3.16,5.99-4.74,12.5-4.74,19.53s1.58,13.53,4.74,19.49Z"/>
|
||||||
|
<path class="cls-1" d="M1352.8,34.46h9.56v130.84h-9.56V34.46Z"/>
|
||||||
|
<path class="cls-1" d="M1402.61,163.49c-5.52-3.19-9.76-7.54-12.73-13.06-2.97-5.52-4.45-11.71-4.45-18.58v-55.53h9.56v55.86c0,5.11,1.06,9.7,3.17,13.76,2.11,4.07,5.2,7.27,9.27,9.6,4.06,2.34,8.93,3.5,14.58,3.5,3.62,0,6.88-.3,9.76-.91,2.88-.6,5.81-1.45,8.77-2.55l2.22-.82c2.36-.93,4.35-1.63,5.97-2.1,1.62-.47,3.36-.7,5.23-.7.66,0,1.1.06,1.32.16-1.37-1.98-2.38-4.2-3.01-6.67s-.95-5.52-.95-9.15v-59.98h9.56v59.98c0,4.34.63,7.79,1.89,10.34,1.26,2.55,3.27,4.93,6.01,7.13l6.43,5.11-5.44,7.58-1.81-1.32c-2.25-1.65-4.27-2.86-6.05-3.62-1.79-.77-3.61-1.15-5.48-1.15-1.48,0-3.01.22-4.57.66-1.57.44-3.78,1.15-6.63,2.14l-4.94,1.65c-3.3,1.1-6.29,1.95-8.98,2.55-2.69.6-5.8.91-9.31.91-7.42,0-13.88-1.59-19.4-4.78Z"/>
|
||||||
|
<path class="cls-1" d="M1517.14,163.32c-4.04-1.32-7.42-4-10.13-8.03-2.72-4.04-4.08-9.82-4.08-17.34v-52.57h-20.27v-9.06h9.81c6.97,0,10.46-3.98,10.46-11.95v-29.91h9.39v41.86h24.88v9.06h-24.88v52.57c0,5.38.84,9.41,2.51,12.07,1.67,2.66,3.79,4.37,6.34,5.11,2.55.74,5.75,1.11,9.6,1.11h6.43v9.06h-6.43c-5.05,0-9.6-.66-13.64-1.98Z"/>
|
||||||
|
<path class="cls-1" d="M1554.18,36.1c1.65-1.65,3.63-2.47,5.93-2.47s4.28.82,5.93,2.47c1.65,1.65,2.47,3.63,2.47,5.93s-.82,4.28-2.47,5.93c-1.65,1.65-3.63,2.47-5.93,2.47s-4.28-.82-5.93-2.47c-1.65-1.65-2.47-3.63-2.47-5.93s.82-4.28,2.47-5.93ZM1555.33,76.31h9.56v88.99h-9.56v-88.99Z"/>
|
||||||
|
<path class="cls-1" d="M1605.96,161.92c-6.78-4.34-12.17-10.18-16.15-17.51-3.98-7.33-5.97-15.31-5.97-23.94s1.99-16.7,5.97-24.06c3.98-7.36,9.36-13.21,16.15-17.55,6.78-4.34,14.19-6.51,22.21-6.51s15.52,2.17,22.33,6.51c6.81,4.34,12.21,10.19,16.19,17.55,3.98,7.36,5.97,15.38,5.97,24.06s-1.99,16.6-5.97,23.94c-3.98,7.33-9.38,13.17-16.19,17.51-6.81,4.34-14.26,6.51-22.33,6.51s-15.42-2.17-22.21-6.51ZM1598.13,139.96c3.16,5.96,7.4,10.68,12.73,14.17,5.33,3.49,11.09,5.23,17.3,5.23s12.07-1.74,17.43-5.23c5.35-3.49,9.61-8.21,12.77-14.17,3.16-5.96,4.74-12.45,4.74-19.49s-1.58-13.54-4.74-19.53c-3.16-5.99-7.42-10.74-12.77-14.25-5.36-3.51-11.16-5.27-17.43-5.27s-11.98,1.76-17.3,5.27c-5.33,3.52-9.57,8.27-12.73,14.25-3.16,5.99-4.74,12.5-4.74,19.53s1.58,13.53,4.74,19.49Z"/>
|
||||||
|
<path class="cls-1" d="M1696.64,93.82c-1.26-2.55-3.27-4.93-6.01-7.13l-6.43-5.11,5.44-7.58,1.81,1.32c2.25,1.65,4.27,2.86,6.06,3.63,1.78.77,3.61,1.15,5.48,1.15,1.48,0,3.01-.22,4.57-.66,1.57-.44,3.78-1.15,6.63-2.14l4.94-1.65c3.3-1.1,6.29-1.95,8.98-2.55,2.69-.6,5.79-.91,9.31-.91,7.42,0,13.88,1.59,19.4,4.78,5.52,3.19,9.76,7.54,12.73,13.06,2.97,5.52,4.45,11.71,4.45,18.58v56.69h-9.56v-57.02c0-5.11-1.06-9.69-3.17-13.76-2.11-4.06-5.2-7.26-9.27-9.6-4.07-2.33-8.93-3.5-14.58-3.5-3.62,0-6.88.3-9.76.91-2.88.6-5.81,1.46-8.78,2.55l-2.22.82c-2.36.93-4.35,1.63-5.97,2.1-1.62.47-3.36.7-5.23.7-.66,0-1.1-.05-1.32-.16,1.43,1.98,2.44,4.2,3.05,6.67.6,2.47.91,5.52.91,9.15v61.14h-9.56v-61.14c0-4.34-.63-7.79-1.9-10.34Z"/>
|
||||||
|
<path class="cls-1" d="M1807.87,164.89c-5.55-2.36-11.07-6.18-16.56-11.45l5.77-7.09c4.89,4.67,9.57,8.01,14.05,10.01,4.48,2.01,9.96,3.01,16.44,3.01,4.72,0,8.95-.81,12.69-2.43,3.73-1.62,6.65-3.9,8.73-6.84,2.09-2.94,3.13-6.27,3.13-10.01,0-6.37-2.38-10.85-7.13-13.43-4.75-2.58-10.67-4.09-17.76-4.53-5.27-.33-10.33-1.33-15.16-3.01-4.83-1.68-8.85-4.27-12.03-7.79-3.19-3.51-4.78-7.94-4.78-13.27,0-5.77,1.4-10.59,4.2-14.46,2.8-3.87,6.55-6.73,11.25-8.57,4.7-1.84,9.96-2.76,15.78-2.76,6.21,0,12.44.99,18.7,2.97,6.26,1.98,11.48,4.7,15.65,8.16l-5.6,7.25c-2.91-2.69-7.09-4.92-12.52-6.67-5.44-1.76-10.88-2.64-16.31-2.64-6.32,0-11.52,1.36-15.61,4.08-4.09,2.72-6.14,6.94-6.14,12.65,0,3.46,1.24,6.3,3.71,8.53s5.49,3.86,9.06,4.9c3.57,1.04,7.11,1.68,10.63,1.9,9.56.49,17.52,2.8,23.9,6.92,6.37,4.12,9.56,10.71,9.56,19.77,0,6.1-1.61,11.28-4.82,15.53-3.21,4.26-7.41,7.46-12.61,9.6-5.19,2.14-10.7,3.21-16.52,3.21-7.58,0-14.14-1.18-19.69-3.54Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<path class="cls-1" d="M662.15,225.66h22.03c5.83,0,10.74,1.26,14.72,3.79,3.98,2.52,6.98,6.18,8.99,10.96,2.01,4.78,3.02,10.54,3.02,17.29s-.99,12.53-2.98,17.35-4.97,8.51-8.97,11.08c-4,2.57-8.92,3.85-14.78,3.85h-22.03v-64.31ZM684.19,282.28c6.05,0,10.67-1.98,13.85-5.93,3.19-3.96,4.78-10.16,4.78-18.61s-1.58-14.63-4.74-18.53c-3.16-3.9-7.79-5.85-13.89-5.85h-13.93v48.92h13.93Z"/>
|
||||||
|
<path class="cls-1" d="M728.03,288.34c-3.52-2.12-6.32-5-8.38-8.63s-3.1-7.58-3.1-11.85,1-8.2,3.02-11.81,4.78-6.47,8.3-8.59c3.52-2.12,7.45-3.18,11.77-3.18,3.56,0,7.04.86,10.43,2.59,3.39,1.73,6.16,4.09,8.3,7.09s3.22,6.3,3.22,9.92c0,1.43-.36,2.75-1.07,3.97-.72,1.21-1.69,2.18-2.92,2.9-1.23.72-2.6,1.07-4.11,1.07h-25.19c-.62,0-1.15.21-1.6.63-.45.42-.67.94-.67,1.56,0,1.24.63,2.67,1.9,4.27,1.27,1.61,2.96,2.97,5.06,4.09,2.11,1.12,4.32,1.68,6.64,1.68,2.67,0,4.93-.39,6.78-1.17,1.85-.78,3.83-1.96,5.93-3.52l4.21,6.16c-2.62,2.02-5.25,3.53-7.9,4.52-2.65.99-5.68,1.48-9.11,1.48-4.16,0-8-1.06-11.52-3.18ZM726.51,264.83c.81-.24,1.57-.36,2.27-.36h24.06c.24,0,.44-.11.59-.32.15-.22.22-.46.22-.73,0-2.21-.7-4.21-2.09-5.99s-3.17-3.17-5.33-4.17c-2.16-1-4.33-1.5-6.52-1.5-2.75,0-5.21.62-7.37,1.86-2.16,1.24-3.9,2.93-5.2,5.06-1.31,2.13-2.11,4.5-2.41,7.09.38-.38.97-.69,1.78-.93Z"/>
|
||||||
|
<path class="cls-1" d="M769.68,225.66h8.1v64.31h-8.1v-64.31Z"/>
|
||||||
|
<path class="cls-1" d="M788.04,227.69c.51-.86,1.2-1.55,2.07-2.07.86-.51,1.81-.77,2.83-.77s1.97.26,2.83.77c.86.51,1.55,1.2,2.07,2.07.51.86.77,1.81.77,2.83s-.26,1.97-.77,2.83c-.51.86-1.2,1.55-2.07,2.07-.86.51-1.81.77-2.83.77s-1.97-.26-2.83-.77c-.86-.51-1.55-1.2-2.07-2.07-.51-.86-.77-1.81-.77-2.83s.26-1.97.77-2.83ZM788.89,246.24h8.1v43.74h-8.1v-43.74Z"/>
|
||||||
|
<path class="cls-1" d="M821.68,290.32c-1.42-.88-2.45-2.13-3.1-3.75l-15.59-39.77,7.9-1.7,15.23,38.92h.4l15.07-39,7.9,1.7-15.39,39.85c-.62,1.62-1.64,2.87-3.06,3.75-1.42.88-2.98,1.32-4.68,1.32s-3.26-.44-4.68-1.32Z"/>
|
||||||
|
<path class="cls-1" d="M862.82,288.34c-3.52-2.12-6.32-5-8.38-8.63s-3.1-7.58-3.1-11.85,1-8.2,3.02-11.81,4.78-6.47,8.3-8.59c3.52-2.12,7.45-3.18,11.77-3.18,3.56,0,7.04.86,10.43,2.59,3.39,1.73,6.16,4.09,8.3,7.09s3.22,6.3,3.22,9.92c0,1.43-.36,2.75-1.07,3.97-.72,1.21-1.69,2.18-2.92,2.9-1.23.72-2.6,1.07-4.11,1.07h-25.19c-.62,0-1.15.21-1.6.63-.45.42-.67.94-.67,1.56,0,1.24.63,2.67,1.9,4.27,1.27,1.61,2.96,2.97,5.06,4.09,2.11,1.12,4.32,1.68,6.64,1.68,2.67,0,4.93-.39,6.78-1.17,1.85-.78,3.83-1.96,5.93-3.52l4.21,6.16c-2.62,2.02-5.25,3.53-7.9,4.52-2.65.99-5.68,1.48-9.11,1.48-4.16,0-8-1.06-11.52-3.18ZM861.3,264.83c.81-.24,1.57-.36,2.27-.36h24.06c.24,0,.44-.11.59-.32.15-.22.22-.46.22-.73,0-2.21-.7-4.21-2.09-5.99s-3.17-3.17-5.33-4.17c-2.16-1-4.33-1.5-6.52-1.5-2.75,0-5.21.62-7.37,1.86-2.16,1.24-3.9,2.93-5.2,5.06-1.31,2.13-2.11,4.5-2.41,7.09.38-.38.97-.69,1.78-.93Z"/>
|
||||||
|
<path class="cls-1" d="M905.51,256.75c-.49-1.04-1.14-1.9-1.96-2.59-.82-.69-1.9-1.41-3.22-2.17l-1.13-.65,4.7-6.64,1.86,1.3c1.49,1.03,2.62,1.54,3.4,1.54.89,0,1.82-.13,2.77-.38.96-.26,2.1-.64,3.42-1.15,1.67-.59,3.07-1.04,4.19-1.34,1.12-.3,2.27-.45,3.46-.45,2.51,0,4.67.3,6.48.91,1.81.61,3.94,1.6,6.4,2.98l-3.73,6.8c-1.7-1.03-3.21-1.78-4.54-2.27-1.32-.49-2.86-.73-4.62-.73-1,0-2,.14-3,.4-1,.27-2.24.68-3.73,1.21-.27.11-.7.26-1.28.47-.58.2-1.1.37-1.56.51.59,1.78.89,3.81.89,6.08v29.4h-8.1v-29.4c0-1.51-.24-2.79-.73-3.83Z"/>
|
||||||
|
<path class="cls-1" d="M941.27,227.69c.51-.86,1.2-1.55,2.07-2.07.86-.51,1.81-.77,2.83-.77s1.97.26,2.83.77c.86.51,1.55,1.2,2.07,2.07.51.86.77,1.81.77,2.83s-.26,1.97-.77,2.83c-.51.86-1.2,1.55-2.07,2.07-.86.51-1.81.77-2.83.77s-1.97-.26-2.83-.77c-.86-.51-1.55-1.2-2.07-2.07-.51-.86-.77-1.81-.77-2.83s.26-1.97.77-2.83ZM942.12,246.24h8.1v43.74h-8.1v-43.74Z"/>
|
||||||
|
<path class="cls-1" d="M962.47,256.34c-.67-1.07-1.69-2.09-3.04-3.06l-2.83-2.02,4.62-6.56.97.65c1.27.86,2.32,1.47,3.16,1.82.84.35,1.65.53,2.43.53.7,0,1.49-.11,2.37-.32.88-.22,2.09-.57,3.62-1.05,2.11-.67,3.93-1.19,5.47-1.56,1.54-.36,3.09-.55,4.66-.55,3.86,0,7.25.8,10.17,2.41,2.92,1.61,5.16,3.8,6.74,6.58,1.58,2.78,2.37,5.89,2.37,9.31v27.46h-8.1v-27.78c0-1.94-.42-3.69-1.28-5.22s-2.11-2.75-3.79-3.65c-1.67-.89-3.71-1.34-6.12-1.34-1.4,0-2.73.14-3.97.4-1.24.27-2.78.69-4.62,1.26-1.89.59-3.38.99-4.46,1.17.49,1.54.73,3.46.73,5.75v29.4h-8.1v-29.4c0-1.75-.34-3.17-1.01-4.23Z"/>
|
||||||
|
<path class="cls-1" d="M1021.99,305.1c-3.66-1.36-6.93-3.22-9.82-5.57l4.78-6.12c2.29,1.89,4.85,3.42,7.65,4.6,2.81,1.17,5.68,1.76,8.63,1.76,2.11,0,4.09-.32,5.95-.97s3.39-1.68,4.58-3.1,1.78-3.22,1.78-5.41v-2.96c-3.38,2.4-7.28,3.6-11.7,3.6-4.73,0-8.78-1.11-12.17-3.32-3.39-2.21-5.95-5.12-7.69-8.71-1.74-3.59-2.61-7.4-2.61-11.42s.86-7.75,2.59-11.26c1.73-3.51,4.32-6.35,7.78-8.53,3.46-2.17,7.64-3.26,12.55-3.26,1.46,0,2.87.14,4.23.43,1.36.28,2.92.7,4.68,1.24,1.48.43,2.67.75,3.56.95.89.2,1.75.3,2.59.3.76,0,1.61-.13,2.55-.41.95-.27,1.66-.57,2.15-.89l1.78-1.22,4.7,6.56-3.32,2.27c-.84.57-1.5,1.11-1.98,1.64-.49.53-.87,1.19-1.15,2s-.43,1.84-.43,3.08v30.13c0,3.83-.96,6.99-2.88,9.48-1.92,2.48-4.4,4.29-7.45,5.43-3.05,1.13-6.34,1.7-9.88,1.7-3.97,0-7.78-.68-11.44-2.04ZM1021.07,275.23c1.16,2.4,2.9,4.35,5.2,5.85s5.08,2.25,8.32,2.25c2.27,0,4.33-.38,6.18-1.15s3.44-1.86,4.76-3.26v-18.43c0-1,.07-2.04.2-3.12.13-1.08.34-2.04.61-2.88-1.4-.24-3.08-.65-5.02-1.21-1.65-.43-2.97-.76-3.97-.97-1-.22-2.03-.32-3.08-.32-3.19,0-5.91.73-8.16,2.19-2.25,1.46-3.95,3.38-5.08,5.75-1.13,2.38-1.7,4.91-1.7,7.61s.58,5.29,1.74,7.69Z"/>
|
||||||
|
<path class="cls-1" d="M1107.64,291.01c-1.36-.28-2.92-.7-4.68-1.24-1.49-.43-2.67-.75-3.56-.95-.89-.2-1.75-.3-2.59-.3-.76,0-1.61.14-2.55.4-.95.27-1.66.57-2.15.89l-1.78,1.22-4.7-6.56,3.32-2.27c1.24-.84,2.15-1.72,2.71-2.65.57-.93.85-2.29.85-4.07v-49.81h8.1v22.11c1.7-1.11,3.54-1.94,5.53-2.51,1.99-.57,4-.85,6.06-.85,4.8,0,8.94,1.11,12.39,3.34s6.06,5.14,7.82,8.73c1.75,3.59,2.63,7.43,2.63,11.5s-.88,7.86-2.65,11.44c-1.77,3.58-4.39,6.47-7.88,8.69-3.48,2.21-7.7,3.32-12.64,3.32-1.46,0-2.87-.14-4.23-.43ZM1104.83,282.61c1.65.43,2.98.76,3.99.97,1.01.22,2.03.32,3.06.32,3.19,0,5.92-.76,8.2-2.27,2.28-1.51,4-3.5,5.16-5.95,1.16-2.46,1.74-5.06,1.74-7.82s-.57-5.3-1.72-7.72c-1.15-2.42-2.86-4.37-5.14-5.85-2.28-1.48-5.04-2.23-8.28-2.23-2.11,0-4.15.37-6.14,1.11-1.98.74-3.68,1.82-5.08,3.22v18.99c0,1-.07,2.04-.2,3.12-.14,1.08-.34,2.04-.61,2.88,1.4.24,3.08.65,5.02,1.21Z"/>
|
||||||
|
<path class="cls-1" d="M1152.39,288.34c-3.52-2.12-6.32-5-8.38-8.63s-3.1-7.58-3.1-11.85,1-8.2,3.02-11.81,4.78-6.47,8.3-8.59c3.52-2.12,7.45-3.18,11.77-3.18,3.56,0,7.04.86,10.43,2.59,3.39,1.73,6.16,4.09,8.3,7.09s3.22,6.3,3.22,9.92c0,1.43-.36,2.75-1.07,3.97-.72,1.21-1.69,2.18-2.92,2.9-1.23.72-2.6,1.07-4.11,1.07h-25.19c-.62,0-1.15.21-1.6.63-.45.42-.67.94-.67,1.56,0,1.24.63,2.67,1.9,4.27,1.27,1.61,2.96,2.97,5.06,4.09,2.11,1.12,4.32,1.68,6.64,1.68,2.67,0,4.93-.39,6.78-1.17,1.85-.78,3.83-1.96,5.93-3.52l4.21,6.16c-2.62,2.02-5.25,3.53-7.9,4.52-2.65.99-5.68,1.48-9.11,1.48-4.16,0-8-1.06-11.52-3.18ZM1150.87,264.83c.81-.24,1.57-.36,2.27-.36h24.06c.24,0,.44-.11.59-.32.15-.22.22-.46.22-.73,0-2.21-.7-4.21-2.09-5.99s-3.17-3.17-5.33-4.17c-2.16-1-4.33-1.5-6.52-1.5-2.75,0-5.21.62-7.37,1.86-2.16,1.24-3.9,2.93-5.2,5.06-1.31,2.13-2.11,4.5-2.41,7.09.38-.38.97-.69,1.78-.93Z"/>
|
||||||
|
<path class="cls-1" d="M1203.42,286.94c-2.86-2.02-4.29-5.93-4.29-11.7v-21.3h-8.34v-7.7h3.56c1.59,0,2.79-.36,3.58-1.09.8-.73,1.19-1.97,1.19-3.73v-15.75h8.1v20.57h11.26v7.7h-11.26v21.3c0,1.89.3,3.36.89,4.39.59,1.04,1.4,1.74,2.41,2.11,1.01.36,2.26.55,3.75.55h4.21v7.69h-4.21c-4.37,0-7.99-1.01-10.85-3.04Z"/>
|
||||||
|
<path class="cls-1" d="M1237.71,286.94c-2.86-2.02-4.29-5.93-4.29-11.7v-21.3h-8.34v-7.7h3.56c1.59,0,2.79-.36,3.58-1.09.8-.73,1.19-1.97,1.19-3.73v-15.75h8.1v20.57h11.26v7.7h-11.26v21.3c0,1.89.3,3.36.89,4.39.59,1.04,1.4,1.74,2.41,2.11,1.01.36,2.26.55,3.75.55h4.21v7.69h-4.21c-4.37,0-7.99-1.01-10.85-3.04Z"/>
|
||||||
|
<path class="cls-1" d="M1268.58,288.34c-3.52-2.12-6.32-5-8.38-8.63s-3.1-7.58-3.1-11.85,1-8.2,3.02-11.81,4.78-6.47,8.3-8.59c3.52-2.12,7.45-3.18,11.77-3.18,3.56,0,7.04.86,10.43,2.59,3.39,1.73,6.16,4.09,8.3,7.09s3.22,6.3,3.22,9.92c0,1.43-.36,2.75-1.07,3.97-.72,1.21-1.69,2.18-2.92,2.9-1.23.72-2.6,1.07-4.11,1.07h-25.19c-.62,0-1.15.21-1.6.63-.45.42-.67.94-.67,1.56,0,1.24.63,2.67,1.9,4.27,1.27,1.61,2.96,2.97,5.06,4.09,2.11,1.12,4.32,1.68,6.64,1.68,2.67,0,4.93-.39,6.78-1.17,1.85-.78,3.83-1.96,5.93-3.52l4.21,6.16c-2.62,2.02-5.25,3.53-7.9,4.52-2.65.99-5.68,1.48-9.11,1.48-4.16,0-8-1.06-11.52-3.18ZM1267.06,264.83c.81-.24,1.57-.36,2.27-.36h24.06c.24,0,.44-.11.59-.32.15-.22.22-.46.22-.73,0-2.21-.7-4.21-2.09-5.99s-3.17-3.17-5.33-4.17c-2.16-1-4.33-1.5-6.52-1.5-2.75,0-5.21.62-7.37,1.86-2.16,1.24-3.9,2.93-5.2,5.06-1.31,2.13-2.11,4.5-2.41,7.09.38-.38.97-.69,1.78-.93Z"/>
|
||||||
|
<path class="cls-1" d="M1311.27,256.75c-.49-1.04-1.14-1.9-1.96-2.59-.82-.69-1.9-1.41-3.22-2.17l-1.13-.65,4.7-6.64,1.86,1.3c1.49,1.03,2.62,1.54,3.4,1.54.89,0,1.82-.13,2.77-.38.96-.26,2.1-.64,3.42-1.15,1.67-.59,3.07-1.04,4.19-1.34,1.12-.3,2.27-.45,3.46-.45,2.51,0,4.67.3,6.48.91,1.81.61,3.94,1.6,6.4,2.98l-3.73,6.8c-1.7-1.03-3.21-1.78-4.54-2.27-1.32-.49-2.86-.73-4.62-.73-1,0-2,.14-3,.4-1,.27-2.24.68-3.73,1.21-.27.11-.7.26-1.28.47-.58.2-1.1.37-1.56.51.59,1.78.89,3.81.89,6.08v29.4h-8.1v-29.4c0-1.51-.24-2.79-.73-3.83Z"/>
|
||||||
|
<path class="cls-1" d="M1379.85,288.34c-3.52-2.12-6.32-5-8.38-8.63s-3.1-7.58-3.1-11.85,1-8.2,3.02-11.81,4.78-6.47,8.3-8.59c3.52-2.12,7.45-3.18,11.77-3.18,3.56,0,7.04.86,10.43,2.59,3.39,1.73,6.16,4.09,8.3,7.09s3.22,6.3,3.22,9.92c0,1.43-.36,2.75-1.07,3.97-.72,1.21-1.69,2.18-2.92,2.9-1.23.72-2.6,1.07-4.11,1.07h-25.19c-.62,0-1.15.21-1.6.63-.45.42-.67.94-.67,1.56,0,1.24.63,2.67,1.9,4.27,1.27,1.61,2.96,2.97,5.06,4.09,2.11,1.12,4.32,1.68,6.64,1.68,2.67,0,4.93-.39,6.78-1.17,1.85-.78,3.83-1.96,5.93-3.52l4.21,6.16c-2.62,2.02-5.25,3.53-7.9,4.52-2.65.99-5.68,1.48-9.11,1.48-4.16,0-8-1.06-11.52-3.18ZM1378.33,264.83c.81-.24,1.57-.36,2.27-.36h24.06c.24,0,.44-.11.59-.32.15-.22.22-.46.22-.73,0-2.21-.7-4.21-2.09-5.99s-3.17-3.17-5.33-4.17c-2.16-1-4.33-1.5-6.52-1.5-2.75,0-5.21.62-7.37,1.86-2.16,1.24-3.9,2.93-5.2,5.06-1.31,2.13-2.11,4.5-2.41,7.09.38-.38.97-.69,1.78-.93Z"/>
|
||||||
|
<path class="cls-1" d="M1415.41,286.66l12.96-14.9,3.32-3.56-3.32-3.65-12.23-14.26,6.12-5.27,11.22,13.45,3.08,3.97,3.08-3.97,11.26-13.45,6.16,5.27-12.23,14.17-3.48,3.73,3.4,3.65,12.96,14.82-6.24,5.26-11.75-14.01-3.16-3.97-3.16,3.97-11.83,14.01-6.16-5.26Z"/>
|
||||||
|
<path class="cls-1" d="M1467.42,256.34c-.57-.93-1.47-1.82-2.71-2.65l-3.32-2.27,4.7-6.56,1.78,1.22c.49.32,1.2.62,2.15.89.95.27,1.8.41,2.55.41.84,0,1.7-.1,2.59-.3.89-.2,2.08-.52,3.56-.95,1.75-.54,3.31-.95,4.68-1.24,1.36-.28,2.77-.43,4.23-.43,4.94,0,9.15,1.11,12.64,3.32,3.48,2.21,6.11,5.11,7.88,8.69,1.77,3.58,2.65,7.39,2.65,11.44s-.88,7.91-2.63,11.5c-1.76,3.59-4.36,6.5-7.82,8.73s-7.59,3.34-12.39,3.34c-2.05,0-4.07-.28-6.06-.85-1.98-.57-3.83-1.4-5.53-2.51v18.55h-8.1v-46.25c0-1.78-.28-3.14-.85-4.07ZM1476.16,257.37c.13,1.08.2,2.12.2,3.12v18.99c1.4,1.4,3.1,2.48,5.08,3.22s4.03,1.11,6.14,1.11c3.24,0,6-.74,8.28-2.23s4-3.44,5.14-5.85c1.15-2.42,1.72-4.99,1.72-7.72s-.58-5.36-1.74-7.82c-1.16-2.46-2.88-4.44-5.16-5.95-2.28-1.51-5.02-2.27-8.2-2.27-1.03,0-2.05.11-3.06.32-1.01.22-2.34.54-3.99.97-1.94.57-3.62.97-5.02,1.21.27.84.47,1.8.61,2.88Z"/>
|
||||||
|
<path class="cls-1" d="M1528.14,288.34c-3.52-2.12-6.32-5-8.38-8.63s-3.1-7.58-3.1-11.85,1-8.2,3.02-11.81,4.78-6.47,8.3-8.59c3.52-2.12,7.45-3.18,11.77-3.18,3.56,0,7.04.86,10.43,2.59,3.39,1.73,6.16,4.09,8.3,7.09s3.22,6.3,3.22,9.92c0,1.43-.36,2.75-1.07,3.97-.72,1.21-1.69,2.18-2.92,2.9-1.23.72-2.6,1.07-4.11,1.07h-25.19c-.62,0-1.15.21-1.6.63-.45.42-.67.94-.67,1.56,0,1.24.63,2.67,1.9,4.27,1.27,1.61,2.96,2.97,5.06,4.09,2.11,1.12,4.32,1.68,6.64,1.68,2.67,0,4.93-.39,6.78-1.17,1.85-.78,3.83-1.96,5.93-3.52l4.21,6.16c-2.62,2.02-5.25,3.53-7.9,4.52-2.65.99-5.68,1.48-9.11,1.48-4.16,0-8-1.06-11.52-3.18ZM1526.62,264.83c.81-.24,1.57-.36,2.27-.36h24.06c.24,0,.44-.11.59-.32.15-.22.22-.46.22-.73,0-2.21-.7-4.21-2.09-5.99s-3.17-3.17-5.33-4.17c-2.16-1-4.33-1.5-6.52-1.5-2.75,0-5.21.62-7.37,1.86-2.16,1.24-3.9,2.93-5.2,5.06-1.31,2.13-2.11,4.5-2.41,7.09.38-.38.97-.69,1.78-.93Z"/>
|
||||||
|
<path class="cls-1" d="M1570.83,256.75c-.49-1.04-1.14-1.9-1.96-2.59-.82-.69-1.9-1.41-3.22-2.17l-1.13-.65,4.7-6.64,1.86,1.3c1.49,1.03,2.62,1.54,3.4,1.54.89,0,1.82-.13,2.77-.38.96-.26,2.1-.64,3.42-1.15,1.67-.59,3.07-1.04,4.19-1.34,1.12-.3,2.27-.45,3.46-.45,2.51,0,4.67.3,6.48.91,1.81.61,3.94,1.6,6.4,2.98l-3.73,6.8c-1.7-1.03-3.21-1.78-4.54-2.27-1.32-.49-2.86-.73-4.62-.73-1,0-2,.14-3,.4-1,.27-2.24.68-3.73,1.21-.27.11-.7.26-1.28.47-.58.2-1.1.37-1.56.51.59,1.78.89,3.81.89,6.08v29.4h-8.1v-29.4c0-1.51-.24-2.79-.73-3.83Z"/>
|
||||||
|
<path class="cls-1" d="M1606.58,227.69c.51-.86,1.2-1.55,2.07-2.07.86-.51,1.81-.77,2.83-.77s1.97.26,2.83.77c.86.51,1.55,1.2,2.07,2.07.51.86.77,1.81.77,2.83s-.26,1.97-.77,2.83c-.51.86-1.2,1.55-2.07,2.07-.86.51-1.81.77-2.83.77s-1.97-.26-2.83-.77c-.86-.51-1.55-1.2-2.07-2.07-.51-.86-.77-1.81-.77-2.83s.26-1.97.77-2.83ZM1607.43,246.24h8.1v43.74h-8.1v-43.74Z"/>
|
||||||
|
<path class="cls-1" d="M1635.31,288.34c-3.52-2.12-6.32-5-8.38-8.63s-3.1-7.58-3.1-11.85,1-8.2,3.02-11.81,4.78-6.47,8.3-8.59c3.52-2.12,7.45-3.18,11.77-3.18,3.56,0,7.04.86,10.43,2.59,3.39,1.73,6.16,4.09,8.3,7.09s3.22,6.3,3.22,9.92c0,1.43-.36,2.75-1.07,3.97-.72,1.21-1.69,2.18-2.92,2.9-1.23.72-2.6,1.07-4.11,1.07h-25.19c-.62,0-1.15.21-1.6.63-.45.42-.67.94-.67,1.56,0,1.24.63,2.67,1.9,4.27,1.27,1.61,2.96,2.97,5.06,4.09,2.11,1.12,4.32,1.68,6.64,1.68,2.67,0,4.93-.39,6.78-1.17,1.85-.78,3.83-1.96,5.93-3.52l4.21,6.16c-2.62,2.02-5.25,3.53-7.9,4.52-2.65.99-5.68,1.48-9.11,1.48-4.16,0-8-1.06-11.52-3.18ZM1633.79,264.83c.81-.24,1.57-.36,2.27-.36h24.06c.24,0,.44-.11.59-.32.15-.22.22-.46.22-.73,0-2.21-.7-4.21-2.09-5.99s-3.17-3.17-5.33-4.17c-2.16-1-4.33-1.5-6.52-1.5-2.75,0-5.21.62-7.37,1.86-2.16,1.24-3.9,2.93-5.2,5.06-1.31,2.13-2.11,4.5-2.41,7.09.38-.38.97-.69,1.78-.93Z"/>
|
||||||
|
<path class="cls-1" d="M1677.55,256.34c-.67-1.07-1.69-2.09-3.04-3.06l-2.83-2.02,4.62-6.56.97.65c1.27.86,2.32,1.47,3.16,1.82.84.35,1.65.53,2.43.53.7,0,1.49-.11,2.37-.32.88-.22,2.09-.57,3.62-1.05,2.11-.67,3.93-1.19,5.47-1.56,1.54-.36,3.09-.55,4.66-.55,3.86,0,7.25.8,10.17,2.41,2.92,1.61,5.16,3.8,6.74,6.58,1.58,2.78,2.37,5.89,2.37,9.31v27.46h-8.1v-27.78c0-1.94-.42-3.69-1.28-5.22s-2.11-2.75-3.79-3.65c-1.67-.89-3.71-1.34-6.12-1.34-1.4,0-2.73.14-3.97.4-1.24.27-2.78.69-4.62,1.26-1.89.59-3.38.99-4.46,1.17.49,1.54.73,3.46.73,5.75v29.4h-8.1v-29.4c0-1.75-.34-3.17-1.01-4.23Z"/>
|
||||||
|
<path class="cls-1" d="M1737.85,288.32c-3.54-2.13-6.33-5.01-8.38-8.63-2.05-3.62-3.08-7.56-3.08-11.83s1.03-8.2,3.08-11.81c2.05-3.6,4.85-6.47,8.38-8.59,3.54-2.12,7.41-3.18,11.62-3.18,3.4,0,6.5.57,9.29,1.72,2.79,1.15,5.42,2.63,7.88,4.44l-4.54,6.16c-1.92-1.4-3.91-2.52-5.97-3.36s-4.29-1.26-6.66-1.26c-2.67,0-5.16.72-7.45,2.15s-4.12,3.37-5.49,5.81c-1.36,2.44-2.04,5.08-2.04,7.92s.68,5.48,2.04,7.94c1.36,2.46,3.19,4.41,5.49,5.85,2.29,1.44,4.78,2.17,7.45,2.17,2.35,0,4.54-.41,6.58-1.22,2.04-.81,4.11-1.94,6.22-3.4l4.21,6.4c-2.27,1.73-4.85,3.15-7.74,4.25-2.89,1.11-5.98,1.66-9.27,1.66-4.21,0-8.09-1.07-11.62-3.2Z"/>
|
||||||
|
<path class="cls-1" d="M1782.1,288.34c-3.52-2.12-6.32-5-8.38-8.63s-3.1-7.58-3.1-11.85,1-8.2,3.02-11.81,4.78-6.47,8.3-8.59c3.52-2.12,7.45-3.18,11.77-3.18,3.56,0,7.04.86,10.43,2.59,3.39,1.73,6.16,4.09,8.3,7.09s3.22,6.3,3.22,9.92c0,1.43-.36,2.75-1.07,3.97-.72,1.21-1.69,2.18-2.92,2.9-1.23.72-2.6,1.07-4.11,1.07h-25.19c-.62,0-1.15.21-1.6.63-.45.42-.67.94-.67,1.56,0,1.24.63,2.67,1.9,4.27,1.27,1.61,2.96,2.97,5.06,4.09,2.11,1.12,4.32,1.68,6.64,1.68,2.67,0,4.93-.39,6.78-1.17,1.85-.78,3.83-1.96,5.93-3.52l4.21,6.16c-2.62,2.02-5.25,3.53-7.9,4.52-2.65.99-5.68,1.48-9.11,1.48-4.16,0-8-1.06-11.52-3.18ZM1780.58,264.83c.81-.24,1.57-.36,2.27-.36h24.06c.24,0,.44-.11.59-.32.15-.22.22-.46.22-.73,0-2.21-.7-4.21-2.09-5.99s-3.17-3.17-5.33-4.17c-2.16-1-4.33-1.5-6.52-1.5-2.75,0-5.21.62-7.37,1.86-2.16,1.24-3.9,2.93-5.2,5.06-1.31,2.13-2.11,4.5-2.41,7.09.38-.38.97-.69,1.78-.93Z"/>
|
||||||
|
<path class="cls-1" d="M1828.84,289.61c-3.01-1.27-6.22-3.42-9.62-6.44l4.98-5.71c1.94,1.76,3.67,3.11,5.18,4.07,1.51.96,3.04,1.64,4.58,2.05,1.54.4,3.33.61,5.39.61s3.94-.32,5.51-.95c1.57-.63,2.77-1.5,3.6-2.61.84-1.11,1.26-2.33,1.26-3.69,0-2.27-.95-3.9-2.86-4.9-1.9-1-4.49-1.58-7.76-1.74-2.67-.13-5.33-.63-7.96-1.48s-4.85-2.2-6.66-4.05c-1.81-1.85-2.71-4.22-2.71-7.11s.79-5.54,2.37-7.55c1.58-2.01,3.66-3.49,6.24-4.44,2.58-.94,5.39-1.42,8.44-1.42,3.29,0,6.63.53,10,1.6,3.38,1.07,6.45,2.68,9.23,4.84l-4.9,5.91c-1.89-1.59-4.12-2.83-6.68-3.71-2.57-.88-5.13-1.32-7.7-1.32-2.81,0-5.01.51-6.6,1.52-1.59,1.01-2.39,2.53-2.39,4.56,0,1.89,1.01,3.25,3.04,4.07s4.31,1.29,6.84,1.4c4.99.24,9.25,1.42,12.78,3.52s5.29,5.54,5.29,10.29c0,3.19-.9,5.87-2.69,8.06s-4.1,3.82-6.91,4.9c-2.81,1.08-5.74,1.62-8.79,1.62-4,0-7.5-.63-10.51-1.9Z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 28 KiB |
3
devtools_options.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
description: This file stores settings for Dart & Flutter DevTools.
|
||||||
|
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
|
||||||
|
extensions:
|
||||||
34
ios/.gitignore
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
**/dgph
|
||||||
|
*.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
*.moved-aside
|
||||||
|
*.pbxuser
|
||||||
|
*.perspectivev3
|
||||||
|
**/*sync/
|
||||||
|
.sconsign.dblite
|
||||||
|
.tags*
|
||||||
|
**/.vagrant/
|
||||||
|
**/DerivedData/
|
||||||
|
Icon?
|
||||||
|
**/Pods/
|
||||||
|
**/.symlinks/
|
||||||
|
profile
|
||||||
|
xcuserdata
|
||||||
|
**/.generated/
|
||||||
|
Flutter/App.framework
|
||||||
|
Flutter/Flutter.framework
|
||||||
|
Flutter/Flutter.podspec
|
||||||
|
Flutter/Generated.xcconfig
|
||||||
|
Flutter/ephemeral/
|
||||||
|
Flutter/app.flx
|
||||||
|
Flutter/app.zip
|
||||||
|
Flutter/flutter_assets/
|
||||||
|
Flutter/flutter_export_environment.sh
|
||||||
|
ServiceDefinitions.json
|
||||||
|
Runner/GeneratedPluginRegistrant.*
|
||||||
|
|
||||||
|
# Exceptions to above rules.
|
||||||
|
!default.mode1v3
|
||||||
|
!default.mode2v3
|
||||||
|
!default.pbxuser
|
||||||
|
!default.perspectivev3
|
||||||
26
ios/Flutter/AppFrameworkInfo.plist
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>en</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>App</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>io.flutter.flutter.app</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>App</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>FMWK</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>MinimumOSVersion</key>
|
||||||
|
<string>13.0</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
2
ios/Flutter/Debug.xcconfig
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
|
||||||
|
#include "Generated.xcconfig"
|
||||||
2
ios/Flutter/Release.xcconfig
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
|
||||||
|
#include "Generated.xcconfig"
|
||||||
43
ios/Podfile
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# Uncomment this line to define a global platform for your project
|
||||||
|
# platform :ios, '13.0'
|
||||||
|
|
||||||
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|
||||||
|
project 'Runner', {
|
||||||
|
'Debug' => :debug,
|
||||||
|
'Profile' => :release,
|
||||||
|
'Release' => :release,
|
||||||
|
}
|
||||||
|
|
||||||
|
def flutter_root
|
||||||
|
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
|
||||||
|
unless File.exist?(generated_xcode_build_settings_path)
|
||||||
|
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
|
||||||
|
end
|
||||||
|
|
||||||
|
File.foreach(generated_xcode_build_settings_path) do |line|
|
||||||
|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
|
||||||
|
return matches[1].strip if matches
|
||||||
|
end
|
||||||
|
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
|
||||||
|
end
|
||||||
|
|
||||||
|
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
|
||||||
|
|
||||||
|
flutter_ios_podfile_setup
|
||||||
|
|
||||||
|
target 'Runner' do
|
||||||
|
use_frameworks!
|
||||||
|
|
||||||
|
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
|
||||||
|
target 'RunnerTests' do
|
||||||
|
inherit! :search_paths
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
post_install do |installer|
|
||||||
|
installer.pods_project.targets.each do |target|
|
||||||
|
flutter_additional_ios_build_settings(target)
|
||||||
|
end
|
||||||
|
end
|
||||||
48
ios/Podfile.lock
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
PODS:
|
||||||
|
- device_info_plus (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- Flutter (1.0.0)
|
||||||
|
- irondash_engine_context (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- path_provider_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- shared_preferences_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- super_native_extensions (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
|
||||||
|
DEPENDENCIES:
|
||||||
|
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
|
||||||
|
- Flutter (from `Flutter`)
|
||||||
|
- irondash_engine_context (from `.symlinks/plugins/irondash_engine_context/ios`)
|
||||||
|
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
|
||||||
|
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||||
|
- super_native_extensions (from `.symlinks/plugins/super_native_extensions/ios`)
|
||||||
|
|
||||||
|
EXTERNAL SOURCES:
|
||||||
|
device_info_plus:
|
||||||
|
:path: ".symlinks/plugins/device_info_plus/ios"
|
||||||
|
Flutter:
|
||||||
|
:path: Flutter
|
||||||
|
irondash_engine_context:
|
||||||
|
:path: ".symlinks/plugins/irondash_engine_context/ios"
|
||||||
|
path_provider_foundation:
|
||||||
|
:path: ".symlinks/plugins/path_provider_foundation/darwin"
|
||||||
|
shared_preferences_foundation:
|
||||||
|
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
|
||||||
|
super_native_extensions:
|
||||||
|
:path: ".symlinks/plugins/super_native_extensions/ios"
|
||||||
|
|
||||||
|
SPEC CHECKSUMS:
|
||||||
|
device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342
|
||||||
|
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
||||||
|
irondash_engine_context: 3458bf979b90d616ffb8ae03a150bafe2e860cc9
|
||||||
|
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||||
|
shared_preferences_foundation: 5086985c1d43c5ba4d5e69a4e8083a389e2909e6
|
||||||
|
super_native_extensions: 4916b3c627a9c7fffdc48a23a9eca0b1ac228fa7
|
||||||
|
|
||||||
|
PODFILE CHECKSUM: 3c63482e143d1b91d2d2560aee9fb04ecc74ac7e
|
||||||
|
|
||||||
|
COCOAPODS: 1.16.2
|
||||||
731
ios/Runner.xcodeproj/project.pbxproj
Normal file
@@ -0,0 +1,731 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 54;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
|
||||||
|
312585564FC21072D00896A8 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B60CF695DEDD1236C1651092 /* Pods_Runner.framework */; };
|
||||||
|
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
||||||
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||||
|
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||||
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||||
|
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||||
|
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||||
|
E01AE0CF82ADCD992B28695A /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F37A6D20BAF44266D8E11D69 /* Pods_RunnerTests.framework */; };
|
||||||
|
/* 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 = "<group>"; };
|
||||||
|
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||||
|
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
||||||
|
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
37EDA8495E9B1883E5A55A02 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||||
|
5FFA587ED8A04B136E8EB44C /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
|
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||||
|
8364F32FFC0139C02B2FD599 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
||||||
|
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
||||||
|
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 = "<group>"; };
|
||||||
|
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
|
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
|
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
B60CF695DEDD1236C1651092 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
E4EB96A3AC2E66CF06FC6143 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
EC4B7E432520C712CE6EB33A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
F37A6D20BAF44266D8E11D69 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
FF9A982280FAE5FB7C83D709 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
3A48D7311EB0AB4221E4D50C /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
E01AE0CF82ADCD992B28695A /* Pods_RunnerTests.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
97C146EB1CF9000F007C117D /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
312585564FC21072D00896A8 /* Pods_Runner.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
331C8082294A63A400263BE5 /* RunnerTests */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
331C807B294A618700263BE5 /* RunnerTests.swift */,
|
||||||
|
);
|
||||||
|
path = RunnerTests;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
8847FC28EDC06AF8BD7FA163 /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B60CF695DEDD1236C1651092 /* Pods_Runner.framework */,
|
||||||
|
F37A6D20BAF44266D8E11D69 /* Pods_RunnerTests.framework */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
||||||
|
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
||||||
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
||||||
|
9740EEB31CF90195004384FC /* Generated.xcconfig */,
|
||||||
|
);
|
||||||
|
name = Flutter;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
97C146E51CF9000F007C117D = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
9740EEB11CF90186004384FC /* Flutter */,
|
||||||
|
97C146F01CF9000F007C117D /* Runner */,
|
||||||
|
97C146EF1CF9000F007C117D /* Products */,
|
||||||
|
331C8082294A63A400263BE5 /* RunnerTests */,
|
||||||
|
F9406981C20A68ED155AB0C2 /* Pods */,
|
||||||
|
8847FC28EDC06AF8BD7FA163 /* Frameworks */,
|
||||||
|
);
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
97C146EF1CF9000F007C117D /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
97C146EE1CF9000F007C117D /* Runner.app */,
|
||||||
|
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
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 = "<group>";
|
||||||
|
};
|
||||||
|
F9406981C20A68ED155AB0C2 /* Pods */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
E4EB96A3AC2E66CF06FC6143 /* Pods-Runner.debug.xcconfig */,
|
||||||
|
37EDA8495E9B1883E5A55A02 /* Pods-Runner.release.xcconfig */,
|
||||||
|
8364F32FFC0139C02B2FD599 /* Pods-Runner.profile.xcconfig */,
|
||||||
|
FF9A982280FAE5FB7C83D709 /* Pods-RunnerTests.debug.xcconfig */,
|
||||||
|
5FFA587ED8A04B136E8EB44C /* Pods-RunnerTests.release.xcconfig */,
|
||||||
|
EC4B7E432520C712CE6EB33A /* Pods-RunnerTests.profile.xcconfig */,
|
||||||
|
);
|
||||||
|
name = Pods;
|
||||||
|
path = Pods;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
331C8080294A63A400263BE5 /* RunnerTests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
||||||
|
buildPhases = (
|
||||||
|
14DA813DDA77F0BE13E9CCC0 /* [CP] Check Pods Manifest.lock */,
|
||||||
|
331C807D294A63A400263BE5 /* Sources */,
|
||||||
|
331C807F294A63A400263BE5 /* Resources */,
|
||||||
|
3A48D7311EB0AB4221E4D50C /* Frameworks */,
|
||||||
|
);
|
||||||
|
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 = (
|
||||||
|
F5C4EB0A56C406DAD14532F9 /* [CP] Check Pods Manifest.lock */,
|
||||||
|
9740EEB61CF901F6004384FC /* Run Script */,
|
||||||
|
97C146EA1CF9000F007C117D /* Sources */,
|
||||||
|
97C146EB1CF9000F007C117D /* Frameworks */,
|
||||||
|
97C146EC1CF9000F007C117D /* Resources */,
|
||||||
|
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||||
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||||
|
2E4D5B0045AC02F55AF7ABDB /* [CP] Embed Pods Frameworks */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = Runner;
|
||||||
|
productName = Runner;
|
||||||
|
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
|
||||||
|
productType = "com.apple.product-type.application";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
97C146E61CF9000F007C117D /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
BuildIndependentTargetsInParallel = YES;
|
||||||
|
LastUpgradeCheck = 1510;
|
||||||
|
ORGANIZATIONNAME = "";
|
||||||
|
TargetAttributes = {
|
||||||
|
331C8080294A63A400263BE5 = {
|
||||||
|
CreatedOnToolsVersion = 14.0;
|
||||||
|
TestTargetID = 97C146ED1CF9000F007C117D;
|
||||||
|
};
|
||||||
|
97C146ED1CF9000F007C117D = {
|
||||||
|
CreatedOnToolsVersion = 7.3.1;
|
||||||
|
LastSwiftMigration = 1100;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
|
||||||
|
compatibilityVersion = "Xcode 9.3";
|
||||||
|
developmentRegion = en;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
Base,
|
||||||
|
);
|
||||||
|
mainGroup = 97C146E51CF9000F007C117D;
|
||||||
|
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
97C146ED1CF9000F007C117D /* Runner */,
|
||||||
|
331C8080294A63A400263BE5 /* RunnerTests */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
331C807F294A63A400263BE5 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
97C146EC1CF9000F007C117D /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
|
||||||
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
|
||||||
|
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
|
||||||
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
|
14DA813DDA77F0BE13E9CCC0 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
2E4D5B0045AC02F55AF7ABDB /* [CP] Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
||||||
|
);
|
||||||
|
name = "[CP] Embed Pods Frameworks";
|
||||||
|
outputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
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";
|
||||||
|
};
|
||||||
|
F5C4EB0A56C406DAD14532F9 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
/* 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 = "<group>";
|
||||||
|
};
|
||||||
|
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
97C147001CF9000F007C117D /* Base */,
|
||||||
|
);
|
||||||
|
name = LaunchScreen.storyboard;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXVariantGroup section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
249021D3217E4FDB00AE95B9 /* Profile */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
SUPPORTED_PLATFORMS = iphoneos;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
};
|
||||||
|
name = Profile;
|
||||||
|
};
|
||||||
|
249021D4217E4FDB00AE95B9 /* Profile */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
|
DEVELOPMENT_TEAM = A9TMA2CA43;
|
||||||
|
ENABLE_BITCODE = NO;
|
||||||
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = net.imbenji.protoPortal;
|
||||||
|
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 = FF9A982280FAE5FB7C83D709 /* 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 = net.imbenji.protoPortal.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 = 5FFA587ED8A04B136E8EB44C /* 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 = net.imbenji.protoPortal.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 = EC4B7E432520C712CE6EB33A /* 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 = net.imbenji.protoPortal.RunnerTests;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
|
||||||
|
};
|
||||||
|
name = Profile;
|
||||||
|
};
|
||||||
|
97C147031CF9000F007C117D /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
|
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
97C147041CF9000F007C117D /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_COMMA = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
SUPPORTED_PLATFORMS = iphoneos;
|
||||||
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
97C147061CF9000F007C117D /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
|
DEVELOPMENT_TEAM = A9TMA2CA43;
|
||||||
|
ENABLE_BITCODE = NO;
|
||||||
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = net.imbenji.protoPortal;
|
||||||
|
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)";
|
||||||
|
DEVELOPMENT_TEAM = A9TMA2CA43;
|
||||||
|
ENABLE_BITCODE = NO;
|
||||||
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = net.imbenji.protoPortal;
|
||||||
|
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 */;
|
||||||
|
}
|
||||||
7
ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "self:">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>IDEDidComputeMac32BitWarning</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>PreviewsEnabled</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
101
ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1510"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||||
|
BuildableName = "Runner.app"
|
||||||
|
BlueprintName = "Runner"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||||
|
BuildableName = "Runner.app"
|
||||||
|
BlueprintName = "Runner"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO"
|
||||||
|
parallelizable = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "331C8080294A63A400263BE5"
|
||||||
|
BuildableName = "RunnerTests.xctest"
|
||||||
|
BlueprintName = "RunnerTests"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
enableGPUValidationMode = "1"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||||
|
BuildableName = "Runner.app"
|
||||||
|
BlueprintName = "Runner"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Profile"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
||||||
|
BuildableName = "Runner.app"
|
||||||
|
BlueprintName = "Runner"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
||||||
10
ios/Runner.xcworkspace/contents.xcworkspacedata
generated
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "group:Runner.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:Pods/Pods.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>IDEDidComputeMac32BitWarning</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>PreviewsEnabled</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
13
ios/Runner/AppDelegate.swift
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import Flutter
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
@main
|
||||||
|
@objc class AppDelegate: FlutterAppDelegate {
|
||||||
|
override func application(
|
||||||
|
_ application: UIApplication,
|
||||||
|
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
||||||
|
) -> Bool {
|
||||||
|
GeneratedPluginRegistrant.register(with: self)
|
||||||
|
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||||
|
}
|
||||||
|
}
|
||||||
122
ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"size" : "20x20",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Icon-App-20x20@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "20x20",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Icon-App-20x20@3x.png",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "29x29",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Icon-App-29x29@1x.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "29x29",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Icon-App-29x29@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "29x29",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Icon-App-29x29@3x.png",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "40x40",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Icon-App-40x40@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "40x40",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Icon-App-40x40@3x.png",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "60x60",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Icon-App-60x60@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "60x60",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"filename" : "Icon-App-60x60@3x.png",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "20x20",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Icon-App-20x20@1x.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "20x20",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Icon-App-20x20@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "29x29",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Icon-App-29x29@1x.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "29x29",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Icon-App-29x29@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "40x40",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Icon-App-40x40@1x.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "40x40",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Icon-App-40x40@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "76x76",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Icon-App-76x76@1x.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "76x76",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Icon-App-76x76@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "83.5x83.5",
|
||||||
|
"idiom" : "ipad",
|
||||||
|
"filename" : "Icon-App-83.5x83.5@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "1024x1024",
|
||||||
|
"idiom" : "ios-marketing",
|
||||||
|
"filename" : "Icon-App-1024x1024@1x.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 295 B |
|
After Width: | Height: | Size: 406 B |
|
After Width: | Height: | Size: 450 B |
|
After Width: | Height: | Size: 282 B |
|
After Width: | Height: | Size: 462 B |
|
After Width: | Height: | Size: 704 B |
|
After Width: | Height: | Size: 406 B |
|
After Width: | Height: | Size: 586 B |
|
After Width: | Height: | Size: 862 B |
|
After Width: | Height: | Size: 862 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 762 B |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
23
ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"filename" : "LaunchImage.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"filename" : "LaunchImage@2x.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"filename" : "LaunchImage@3x.png",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
vendored
Normal file
|
After Width: | Height: | Size: 68 B |
BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 68 B |
BIN
ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
vendored
Normal file
|
After Width: | Height: | Size: 68 B |
5
ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Launch Screen Assets
|
||||||
|
|
||||||
|
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
|
||||||
|
|
||||||
|
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
|
||||||
37
ios/Runner/Base.lproj/LaunchScreen.storyboard
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
|
||||||
|
</dependencies>
|
||||||
|
<scenes>
|
||||||
|
<!--View Controller-->
|
||||||
|
<scene sceneID="EHf-IW-A2E">
|
||||||
|
<objects>
|
||||||
|
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
|
||||||
|
<layoutGuides>
|
||||||
|
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
|
||||||
|
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
|
||||||
|
</layoutGuides>
|
||||||
|
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
|
||||||
|
</imageView>
|
||||||
|
</subviews>
|
||||||
|
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
|
||||||
|
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
|
||||||
|
</constraints>
|
||||||
|
</view>
|
||||||
|
</viewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
<point key="canvasLocation" x="53" y="375"/>
|
||||||
|
</scene>
|
||||||
|
</scenes>
|
||||||
|
<resources>
|
||||||
|
<image name="LaunchImage" width="168" height="185"/>
|
||||||
|
</resources>
|
||||||
|
</document>
|
||||||
26
ios/Runner/Base.lproj/Main.storyboard
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
|
||||||
|
</dependencies>
|
||||||
|
<scenes>
|
||||||
|
<!--Flutter View Controller-->
|
||||||
|
<scene sceneID="tne-QT-ifu">
|
||||||
|
<objects>
|
||||||
|
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
|
||||||
|
<layoutGuides>
|
||||||
|
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
|
||||||
|
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
|
||||||
|
</layoutGuides>
|
||||||
|
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||||
|
</view>
|
||||||
|
</viewController>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
|
||||||
|
</objects>
|
||||||
|
</scene>
|
||||||
|
</scenes>
|
||||||
|
</document>
|
||||||
49
ios/Runner/Info.plist
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
|
<key>CFBundleDisplayName</key>
|
||||||
|
<string>Proto Portal</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>proto_portal</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>$(FLUTTER_BUILD_NAME)</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>$(FLUTTER_BUILD_NUMBER)</string>
|
||||||
|
<key>LSRequiresIPhoneOS</key>
|
||||||
|
<true/>
|
||||||
|
<key>UILaunchStoryboardName</key>
|
||||||
|
<string>LaunchScreen</string>
|
||||||
|
<key>UIMainStoryboardFile</key>
|
||||||
|
<string>Main</string>
|
||||||
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>UISupportedInterfaceOrientations~ipad</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>CADisableMinimumFrameDurationOnPhone</key>
|
||||||
|
<true/>
|
||||||
|
<key>UIApplicationSupportsIndirectInputEvents</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
1
ios/Runner/Runner-Bridging-Header.h
Normal file
@@ -0,0 +1 @@
|
|||||||
|
#import "GeneratedPluginRegistrant.h"
|
||||||
12
ios/RunnerTests/RunnerTests.swift
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import Flutter
|
||||||
|
import UIKit
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
class RunnerTests: XCTestCase {
|
||||||
|
|
||||||
|
func testExample() {
|
||||||
|
// If you add code to the Runner application, consider adding tests here.
|
||||||
|
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
63
lib/main.dart
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:proto_portal/pages/audit.dart';
|
||||||
|
import 'package:proto_portal/pages/home.dart';
|
||||||
|
import 'package:proto_portal/pages/login.dart';
|
||||||
|
import 'package:proto_portal/scraper.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||||
|
|
||||||
|
GtiAuth _auth = GtiAuth();
|
||||||
|
|
||||||
|
Future<void> main() async {
|
||||||
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
|
await _auth.init();
|
||||||
|
|
||||||
|
runApp(const MyApp());
|
||||||
|
}
|
||||||
|
|
||||||
|
class MyApp extends StatelessWidget {
|
||||||
|
const MyApp({super.key});
|
||||||
|
|
||||||
|
// This widget is the root of your application.
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return MultiProvider(
|
||||||
|
providers: [
|
||||||
|
ChangeNotifierProvider<GtiAuth>.value(
|
||||||
|
value: _auth,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
child: ShadcnApp.router(
|
||||||
|
title: 'Flutter Demo',
|
||||||
|
theme: ThemeData(
|
||||||
|
colorScheme: ColorSchemes.darkViolet,
|
||||||
|
surfaceOpacity: 1
|
||||||
|
),
|
||||||
|
routerConfig: _router,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GoRouter _router = GoRouter(
|
||||||
|
initialLocation: "/station",
|
||||||
|
redirect: (context, state) {
|
||||||
|
|
||||||
|
if (!_auth.isAuthenticated) {
|
||||||
|
return LoginPage.route.path;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.uri.path == "/") {
|
||||||
|
return StationPage.route.path;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
routes: [
|
||||||
|
LoginPage.route,
|
||||||
|
StationPage.route,
|
||||||
|
AuditPage.route,
|
||||||
|
],
|
||||||
|
);
|
||||||
643
lib/pages/audit.dart
Normal file
@@ -0,0 +1,643 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:ui';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:proto_portal/scraper.dart';
|
||||||
|
import 'package:proto_portal/widgets/service_card.dart';
|
||||||
|
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||||
|
|
||||||
|
class AuditPage extends StatefulWidget {
|
||||||
|
static GoRoute route = GoRoute(
|
||||||
|
path: "/audit",
|
||||||
|
builder: (context, state) {
|
||||||
|
final serviceBase64 = state.uri.queryParameters['service'] ?? '';
|
||||||
|
final stationBase64 = state.uri.queryParameters['station'] ?? '';
|
||||||
|
|
||||||
|
GtiService? service;
|
||||||
|
String? stationLabel;
|
||||||
|
String? crs;
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Decode service from base64
|
||||||
|
final serviceJson = utf8.decode(base64Decode(serviceBase64));
|
||||||
|
service = GtiService.fromJson(jsonDecode(serviceJson));
|
||||||
|
|
||||||
|
// Decode station from base64
|
||||||
|
final stationJson = utf8.decode(base64Decode(stationBase64));
|
||||||
|
final stationData = jsonDecode(stationJson);
|
||||||
|
stationLabel = stationData['label'];
|
||||||
|
crs = stationData['crs'];
|
||||||
|
} catch (e) {
|
||||||
|
print('Error decoding params: $e');
|
||||||
|
}
|
||||||
|
|
||||||
|
return AuditPage(
|
||||||
|
service: service,
|
||||||
|
stationLabel: stationLabel ?? '',
|
||||||
|
crs: crs ?? '',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
final GtiService? service;
|
||||||
|
final String stationLabel;
|
||||||
|
final String crs;
|
||||||
|
|
||||||
|
AuditPage({
|
||||||
|
required this.service,
|
||||||
|
required this.stationLabel,
|
||||||
|
required this.crs,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<AuditPage> createState() => _AuditPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AuditPageState extends State<AuditPage> {
|
||||||
|
|
||||||
|
// Form controllers
|
||||||
|
final TextEditingController _vehicleRegController = TextEditingController();
|
||||||
|
|
||||||
|
// Form values
|
||||||
|
int _seats1 = 5;
|
||||||
|
int _seats2 = 1;
|
||||||
|
int _pax1 = 0;
|
||||||
|
int _pax2 = 0;
|
||||||
|
String _luggage = '0';
|
||||||
|
String _paceNotes = '1';
|
||||||
|
CheckboxState _vehicleTracking = CheckboxState.unchecked;
|
||||||
|
CheckboxState _destBanner = CheckboxState.checked;
|
||||||
|
CheckboxState _callingPatternFront = CheckboxState.unchecked;
|
||||||
|
CheckboxState _callingPatternMiddle = CheckboxState.unchecked;
|
||||||
|
CheckboxState _callingPatternRear = CheckboxState.unchecked;
|
||||||
|
CheckboxState _audioEquipment = CheckboxState.unchecked;
|
||||||
|
CheckboxState _audioWorking = CheckboxState.unchecked;
|
||||||
|
CheckboxState _wheelchair = CheckboxState.checked;
|
||||||
|
String _exemption = 'X';
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_vehicleRegController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _saveAudit() async {
|
||||||
|
final auth = GtiAuth.of(context);
|
||||||
|
|
||||||
|
print('=== AUDIT FORM DEBUG ===');
|
||||||
|
print('Service: ${widget.service}');
|
||||||
|
print('Service vehicleId: ${widget.service?.vehicleId}');
|
||||||
|
print('Service auditId: ${widget.service?.auditId}');
|
||||||
|
print('Station CRS: ${widget.crs}');
|
||||||
|
print('======================');
|
||||||
|
|
||||||
|
if (widget.service == null) {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => AlertDialog(
|
||||||
|
title: Text('Error'),
|
||||||
|
content: Text('Service data not loaded'),
|
||||||
|
actions: [
|
||||||
|
PrimaryButton(
|
||||||
|
onPressed: () => Navigator.of(context).pop(),
|
||||||
|
child: Text('OK'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
final success = await auth.saveAudit(
|
||||||
|
time: widget.service!.time,
|
||||||
|
crs: widget.crs,
|
||||||
|
vehicleId: widget.service!.vehicleId,
|
||||||
|
auditId: widget.service!.auditId ?? '0',
|
||||||
|
vehicleReg: _vehicleRegController.text,
|
||||||
|
seats: '$_seats1$_seats2',
|
||||||
|
pax: '$_pax1$_pax2',
|
||||||
|
luggage: _luggage,
|
||||||
|
paceNotes: _paceNotes,
|
||||||
|
vehicleTracking: _vehicleTracking == CheckboxState.checked ? 'Y' : 'N',
|
||||||
|
destBanner: _destBanner == CheckboxState.checked ? 'Y' : 'N',
|
||||||
|
callingPatternFront: _callingPatternFront == CheckboxState.checked ? 'Y' : 'N',
|
||||||
|
callingPatternMiddle: _callingPatternMiddle == CheckboxState.checked ? 'Y' : 'N',
|
||||||
|
callingPatternRear: _callingPatternRear == CheckboxState.checked ? 'Y' : 'N',
|
||||||
|
audioEquipment: _audioEquipment == CheckboxState.checked ? 'Y' : 'N',
|
||||||
|
audioWorking: _audioWorking == CheckboxState.checked ? 'Y' : 'N',
|
||||||
|
wheelchair: _wheelchair == CheckboxState.checked ? 'Y' : 'N',
|
||||||
|
exemption: _exemption,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (success) {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => AlertDialog(
|
||||||
|
title: Text('Success'),
|
||||||
|
content: Text('Audit saved successfully!\n\nCheck console for request details.'),
|
||||||
|
actions: [
|
||||||
|
PrimaryButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
GoRouter.of(context).pop();
|
||||||
|
},
|
||||||
|
child: Text('OK'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => AlertDialog(
|
||||||
|
title: Text('Error'),
|
||||||
|
content: Text('Failed to save audit.\n\nCheck console for details.\n\nVehicleId: ${widget.service!.vehicleId}\nAuditId: ${widget.service!.auditId}'),
|
||||||
|
actions: [
|
||||||
|
PrimaryButton(
|
||||||
|
onPressed: () => Navigator.of(context).pop(),
|
||||||
|
child: Text('OK'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => AlertDialog(
|
||||||
|
title: Text('Error'),
|
||||||
|
content: Text('Error saving audit: $e'),
|
||||||
|
actions: [
|
||||||
|
PrimaryButton(
|
||||||
|
onPressed: () => Navigator.of(context).pop(),
|
||||||
|
child: Text('OK'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
double topPadding = MediaQuery.of(context).padding.top;
|
||||||
|
double bottomPadding = MediaQuery.of(context).padding.bottom;
|
||||||
|
|
||||||
|
if (widget.service == null) {
|
||||||
|
return _scaffoldBgAndTing(
|
||||||
|
context: context,
|
||||||
|
child: Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Icon(LucideIcons.triangleAlert, size: 48),
|
||||||
|
SizedBox(height: 16),
|
||||||
|
Text('Service not found').h4,
|
||||||
|
SizedBox(height: 8),
|
||||||
|
OutlineButton(
|
||||||
|
onPressed: () => GoRouter.of(context).pop(),
|
||||||
|
child: Text('Go Back'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return _scaffoldBgAndTing(
|
||||||
|
context: context,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
SizedBox(height: topPadding),
|
||||||
|
|
||||||
|
// Header
|
||||||
|
Container(
|
||||||
|
height: 60,
|
||||||
|
alignment: Alignment.center,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
SizedBox(width: 8),
|
||||||
|
Button.ghost(
|
||||||
|
onPressed: () => GoRouter.of(context).pop(),
|
||||||
|
child: Icon(LucideIcons.arrowLeft),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Text('Audit Form').h4,
|
||||||
|
Text('${widget.service?.coach} - ${widget.service?.time}').small.muted,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 48),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: 8),
|
||||||
|
|
||||||
|
// Form Content
|
||||||
|
Expanded(
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
child: OutlinedContainer(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
|
||||||
|
ServiceCard.fromService(
|
||||||
|
service: widget.service!,
|
||||||
|
),
|
||||||
|
|
||||||
|
// Read-only fields
|
||||||
|
_buildReadOnlyRow('Schedule Depart Time:', widget.service?.time ?? ''),
|
||||||
|
Divider(),
|
||||||
|
_buildReadOnlyRow('Diagram Number:', widget.service?.coach ?? ''),
|
||||||
|
Divider(),
|
||||||
|
_buildReadOnlyRow('End Destination on Route:', widget.service?.destination ?? 'N/A'),
|
||||||
|
Divider(),
|
||||||
|
_buildReadOnlyRow('Coach Operator:', widget.service?.operator ?? ''),
|
||||||
|
|
||||||
|
Divider(thickness: 2),
|
||||||
|
|
||||||
|
// Editable fields
|
||||||
|
_buildTextFieldRow(
|
||||||
|
label: 'Vehicle Reg:',
|
||||||
|
controller: _vehicleRegController,
|
||||||
|
maxLength: 8,
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildTwoDropdownRow(
|
||||||
|
label: 'Vehicle (No. Seats):',
|
||||||
|
value1: _seats1,
|
||||||
|
value2: _seats2,
|
||||||
|
onChanged1: (val) => setState(() => _seats1 = val!),
|
||||||
|
onChanged2: (val) => setState(() => _seats2 = val!),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildTwoDropdownRow(
|
||||||
|
label: 'Pax No.:',
|
||||||
|
value1: _pax1,
|
||||||
|
value2: _pax2,
|
||||||
|
onChanged1: (val) => setState(() => _pax1 = val!),
|
||||||
|
onChanged2: (val) => setState(() => _pax2 = val!),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildDropdownRow(
|
||||||
|
label: 'Luggage Hold:',
|
||||||
|
value: _luggage,
|
||||||
|
items: [
|
||||||
|
('0', 'Select'),
|
||||||
|
('1', 'OK'),
|
||||||
|
('2', 'Nearly Full'),
|
||||||
|
('3', 'Full'),
|
||||||
|
],
|
||||||
|
onChanged: (val) => setState(() => _luggage = val!),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildDropdownRow(
|
||||||
|
label: 'Vehicle (Pace Notes):',
|
||||||
|
value: _paceNotes,
|
||||||
|
items: [
|
||||||
|
('1', 'Yes - FTS Supplied'),
|
||||||
|
('2', 'Yes - Company Supplied'),
|
||||||
|
('3', 'Yes - Sat Nav'),
|
||||||
|
('4', 'No - Nothing'),
|
||||||
|
],
|
||||||
|
onChanged: (val) => setState(() => _paceNotes = val!),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildCheckboxRow(
|
||||||
|
label: 'Does the service have Vehicle Tracking:',
|
||||||
|
state: _vehicleTracking,
|
||||||
|
onChanged: (val) => setState(() => _vehicleTracking = val),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildCheckboxRow(
|
||||||
|
label: 'Diagram Number & Destination Banner:',
|
||||||
|
state: _destBanner,
|
||||||
|
onChanged: (val) => setState(() => _destBanner = val),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildCheckboxRow(
|
||||||
|
label: 'Destination & Calling Pattern (Front):',
|
||||||
|
state: _callingPatternFront,
|
||||||
|
onChanged: (val) => setState(() => _callingPatternFront = val),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildCheckboxRow(
|
||||||
|
label: 'Destination & Calling Pattern (Middle):',
|
||||||
|
state: _callingPatternMiddle,
|
||||||
|
onChanged: (val) => setState(() => _callingPatternMiddle = val),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildCheckboxRow(
|
||||||
|
label: 'Destination & Calling Pattern (Rear):',
|
||||||
|
state: _callingPatternRear,
|
||||||
|
onChanged: (val) => setState(() => _callingPatternRear = val),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildCheckboxRow(
|
||||||
|
label: 'Audio Announcement Equipment:',
|
||||||
|
state: _audioEquipment,
|
||||||
|
onChanged: (val) => setState(() => _audioEquipment = val),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildCheckboxRow(
|
||||||
|
label: 'Audio Announcement Working:',
|
||||||
|
state: _audioWorking,
|
||||||
|
onChanged: (val) => setState(() => _audioWorking = val),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(12),
|
||||||
|
child: Text(
|
||||||
|
'Where Audio Announcement is \'No\', please instruct the driver to perform verbal announcements'
|
||||||
|
).small.muted,
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildCheckboxRow(
|
||||||
|
label: 'Wheelchair Accessible:',
|
||||||
|
state: _wheelchair,
|
||||||
|
onChanged: (val) => setState(() => _wheelchair = val),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
_buildDropdownRow(
|
||||||
|
label: 'Where Wheelchair Accessible is \'No\', is an MTE Exemption certificate visible?:',
|
||||||
|
value: _exemption,
|
||||||
|
items: [
|
||||||
|
('X', 'N/A'),
|
||||||
|
('N', 'N'),
|
||||||
|
('Y', 'Y'),
|
||||||
|
],
|
||||||
|
onChanged: (val) => setState(() => _exemption = val!),
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
// Save button
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.all(16),
|
||||||
|
child: PrimaryButton(
|
||||||
|
onPressed: _saveAudit,
|
||||||
|
child: Text('Save Audit'),
|
||||||
|
).sized(width: double.infinity),
|
||||||
|
),
|
||||||
|
|
||||||
|
],
|
||||||
|
).withPadding(all: 8),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(height: bottomPadding),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildReadOnlyRow(String label, String value) {
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 12),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
flex: 7,
|
||||||
|
child: Text(label).small,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
flex: 5,
|
||||||
|
child: Text(value).small,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildTextFieldRow({
|
||||||
|
required String label,
|
||||||
|
required TextEditingController controller,
|
||||||
|
int? maxLength,
|
||||||
|
}) {
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 12),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
flex: 7,
|
||||||
|
child: Text(label).small,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
flex: 5,
|
||||||
|
child: TextField(
|
||||||
|
controller: controller,
|
||||||
|
maxLength: maxLength,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildTwoDropdownRow({
|
||||||
|
required String label,
|
||||||
|
required int value1,
|
||||||
|
required int value2,
|
||||||
|
required ValueChanged<int?> onChanged1,
|
||||||
|
required ValueChanged<int?> onChanged2,
|
||||||
|
}) {
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 12),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
flex: 7,
|
||||||
|
child: Text(label).small,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
flex: 5,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Select<int>(
|
||||||
|
itemBuilder: (context, item) => Text('$item'),
|
||||||
|
value: value1,
|
||||||
|
onChanged: onChanged1,
|
||||||
|
popup: SelectPopup.noVirtualization(
|
||||||
|
items: SelectItemList(
|
||||||
|
children: [
|
||||||
|
for (int i = 0; i <= 9; i++)
|
||||||
|
SelectItemButton(value: i, child: Text('$i')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
SizedBox(width: 4),
|
||||||
|
Expanded(
|
||||||
|
child: Select<int>(
|
||||||
|
itemBuilder: (context, item) => Text('$item'),
|
||||||
|
value: value2,
|
||||||
|
onChanged: onChanged2,
|
||||||
|
popup: SelectPopup.noVirtualization(
|
||||||
|
items: SelectItemList(
|
||||||
|
children: [
|
||||||
|
for (int i = 0; i <= 9; i++)
|
||||||
|
SelectItemButton(value: i, child: Text('$i')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildDropdownRow({
|
||||||
|
required String label,
|
||||||
|
required String value,
|
||||||
|
required List<(String, String)> items,
|
||||||
|
required ValueChanged<String?> onChanged,
|
||||||
|
}) {
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 12),
|
||||||
|
child: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
flex: 7,
|
||||||
|
child: Text(label).small,
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
flex: 5,
|
||||||
|
child: Select<String>(
|
||||||
|
itemBuilder: (context, item) {
|
||||||
|
final itemData = items.firstWhere((i) => i.$1 == item);
|
||||||
|
return Text(itemData.$2);
|
||||||
|
},
|
||||||
|
value: value,
|
||||||
|
onChanged: onChanged,
|
||||||
|
popup: SelectPopup.noVirtualization(
|
||||||
|
items: SelectItemList(
|
||||||
|
children: [
|
||||||
|
for (final item in items)
|
||||||
|
SelectItemButton(value: item.$1, child: Text(item.$2)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildCheckboxRow({
|
||||||
|
required String label,
|
||||||
|
required CheckboxState state,
|
||||||
|
required ValueChanged<CheckboxState> onChanged,
|
||||||
|
}) {
|
||||||
|
return Padding(
|
||||||
|
padding: EdgeInsets.symmetric(vertical: 8, horizontal: 12),
|
||||||
|
child: Checkbox(
|
||||||
|
state: state,
|
||||||
|
onChanged: onChanged,
|
||||||
|
trailing: Text(label).small,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _scaffoldBgAndTing({
|
||||||
|
required BuildContext context,
|
||||||
|
required Widget child,
|
||||||
|
}) {
|
||||||
|
Color bgColor = Colors.black;
|
||||||
|
if (Theme.of(context).brightness == Brightness.light) {
|
||||||
|
bgColor = Colors.white;
|
||||||
|
} else {
|
||||||
|
bgColor = Colors.black;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Scaffold(
|
||||||
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
image: DecorationImage(
|
||||||
|
image: AssetImage("assets/background-1.jpeg"),
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
BackdropFilter(
|
||||||
|
filter: ImageFilter.blur(
|
||||||
|
sigmaY: 10.0,
|
||||||
|
sigmaX: 10.0,
|
||||||
|
),
|
||||||
|
child: Container(
|
||||||
|
color: bgColor.withOpacity(0.3),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
Positioned.fill(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
height: 120,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
gradient: LinearGradient(
|
||||||
|
begin: Alignment.topCenter,
|
||||||
|
end: Alignment.bottomCenter,
|
||||||
|
colors: [
|
||||||
|
Colors.black.withOpacity(0.8),
|
||||||
|
Colors.black.withOpacity(0.5),
|
||||||
|
Colors.transparent,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
child,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
393
lib/pages/home.dart
Normal file
@@ -0,0 +1,393 @@
|
|||||||
|
|
||||||
|
import 'dart:ui';
|
||||||
|
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:proto_portal/scraper.dart';
|
||||||
|
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||||
|
import '../widgets/faded_scroll_view.dart';
|
||||||
|
import '../widgets/service_card.dart';
|
||||||
|
|
||||||
|
class StationPage extends StatefulWidget {
|
||||||
|
|
||||||
|
static GoRoute route = GoRoute(
|
||||||
|
path: "/station",
|
||||||
|
builder: (context, state) => StationPage(stationName: state.uri.queryParameters["station"],)
|
||||||
|
);
|
||||||
|
|
||||||
|
String? stationName;
|
||||||
|
|
||||||
|
StationPage({
|
||||||
|
this.stationName
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StationPage> createState() => _StationPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _StationPageState extends State<StationPage> {
|
||||||
|
|
||||||
|
GtiStation? _station = null;
|
||||||
|
List<GtiService>? services = null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
// TODO: implement initState
|
||||||
|
super.initState();
|
||||||
|
if (widget.stationName != null) {
|
||||||
|
setStation(widget.stationName!);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> setStation(String stationName) async {
|
||||||
|
if (true) {
|
||||||
|
List<GtiStation> results = await GtiAuth.of(context).searchStations(stationName.trim());
|
||||||
|
|
||||||
|
if (results.isNotEmpty) {
|
||||||
|
setState(() {
|
||||||
|
_station = results.first;
|
||||||
|
widget.stationName = _station!.label;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
setState(() {
|
||||||
|
widget.stationName = null;
|
||||||
|
_station = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Services.
|
||||||
|
List<GtiService> fetchedServices = await GtiAuth.of(context).getServicesForStation(_station!);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
services = fetchedServices;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> selectStation(GtiStation station) async {
|
||||||
|
setState(() {
|
||||||
|
_station = station;
|
||||||
|
widget.stationName = station.label;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Get Services.
|
||||||
|
List<GtiService> fetchedServices = await GtiAuth.of(context).getServicesForStation(station);
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
services = fetchedServices;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
|
||||||
|
double topPadding = MediaQuery.of(context).padding.top;
|
||||||
|
double bottomPadding = MediaQuery.of(context).padding.bottom;
|
||||||
|
|
||||||
|
print("Built page page");
|
||||||
|
|
||||||
|
|
||||||
|
if (_station == null) {
|
||||||
|
return StationSearch(
|
||||||
|
onSelected: (station) {
|
||||||
|
// GoRouter.of(context).go(
|
||||||
|
// "${StationPage.route.path}?station=${station.code}"
|
||||||
|
// );
|
||||||
|
selectStation(station);
|
||||||
|
print("Selected station: ${station.label}");
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return _scaffoldBgAndTing(
|
||||||
|
context: context,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
|
||||||
|
SizedBox(height: topPadding),
|
||||||
|
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
// Container(
|
||||||
|
// height: 40,
|
||||||
|
// width: double.infinity,
|
||||||
|
// alignment: Alignment.center,
|
||||||
|
// child: SvgPicture.asset(
|
||||||
|
// "assets/logo.svg",
|
||||||
|
// alignment: AlignmentGeometry.center,
|
||||||
|
// width: 250,
|
||||||
|
// colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
|
||||||
|
Container(
|
||||||
|
height: 40,
|
||||||
|
alignment: Alignment.center,
|
||||||
|
child: Text(
|
||||||
|
_station?.label ?? "Unknown Station"
|
||||||
|
).h4,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
|
||||||
|
const SizedBox(height: 4,),
|
||||||
|
|
||||||
|
// Content
|
||||||
|
|
||||||
|
Expanded(
|
||||||
|
child: services == null
|
||||||
|
? Center(child: CircularProgressIndicator())
|
||||||
|
: services!.isEmpty
|
||||||
|
? Center(
|
||||||
|
child: Column(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Icon(LucideIcons.trainTrack, size: 48),
|
||||||
|
SizedBox(height: 16),
|
||||||
|
Text("No services available").muted,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
: FadedScrollView(
|
||||||
|
padding: const EdgeInsets.all(4.0),
|
||||||
|
fadeHeight: 20,
|
||||||
|
easingDistance: 5,
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
child: Column(
|
||||||
|
spacing: 8,
|
||||||
|
children: [
|
||||||
|
for (final service in services!)
|
||||||
|
ServiceCard.fromService(
|
||||||
|
service: service,
|
||||||
|
station: _station,
|
||||||
|
showActions: true,
|
||||||
|
).withMargin(horizontal: 4),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
NavigationBar(
|
||||||
|
padding: EdgeInsets.only(
|
||||||
|
bottom: bottomPadding
|
||||||
|
),
|
||||||
|
children: [
|
||||||
|
NavigationItem(
|
||||||
|
child: Icon(
|
||||||
|
LucideIcons.house
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
NavigationItem(
|
||||||
|
child: Icon(
|
||||||
|
LucideIcons.house
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
NavigationItem(
|
||||||
|
child: Icon(
|
||||||
|
LucideIcons.house
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
NavigationItem(
|
||||||
|
child: Icon(
|
||||||
|
LucideIcons.house
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
]
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class StationSearch extends StatefulWidget{
|
||||||
|
|
||||||
|
Function(GtiStation) onSelected;
|
||||||
|
|
||||||
|
StationSearch({
|
||||||
|
required this.onSelected
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StationSearch> createState() => _StationSearchState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _StationSearchState extends State<StationSearch> {
|
||||||
|
TextEditingController _controller = TextEditingController();
|
||||||
|
|
||||||
|
List<GtiStation> _results = [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
|
||||||
|
double topPadding = MediaQuery.of(context).padding.top;
|
||||||
|
double bottomPadding = MediaQuery.of(context).padding.bottom;
|
||||||
|
|
||||||
|
|
||||||
|
return _scaffoldBgAndTing(
|
||||||
|
context: context,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
|
||||||
|
SizedBox(height: topPadding),
|
||||||
|
|
||||||
|
Expanded(
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
|
||||||
|
if (_results.isEmpty)
|
||||||
|
Text(
|
||||||
|
"No results"
|
||||||
|
).bold.large.withPadding(all: 16)
|
||||||
|
else for (final GtiStation station in _results.sublist(0, _results.length-1)) ...[
|
||||||
|
|
||||||
|
_stationButton(station),
|
||||||
|
|
||||||
|
Divider()
|
||||||
|
],
|
||||||
|
|
||||||
|
if (_results.isNotEmpty)
|
||||||
|
_stationButton(_results.last)
|
||||||
|
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
),
|
||||||
|
|
||||||
|
Divider(
|
||||||
|
color: Theme.of(context).colorScheme.border,
|
||||||
|
),
|
||||||
|
|
||||||
|
OutlinedContainer(
|
||||||
|
borderRadius: BorderRadius.zero,
|
||||||
|
borderWidth: 0,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
"Type station name"
|
||||||
|
).small.semiBold,
|
||||||
|
|
||||||
|
const SizedBox(height: 10,),
|
||||||
|
|
||||||
|
TextField(
|
||||||
|
controller: _controller,
|
||||||
|
placeholder: Text(
|
||||||
|
"e.g. Redhill"
|
||||||
|
),
|
||||||
|
onChanged: (value) async {
|
||||||
|
|
||||||
|
List<GtiStation> results = await GtiAuth.of(context).searchStations(value);
|
||||||
|
|
||||||
|
setState(() {
|
||||||
|
_results = results;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
SizedBox(
|
||||||
|
height: bottomPadding,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
).withPadding(all: 16),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
],
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _stationButton(GtiStation station) {
|
||||||
|
return Button.ghost(
|
||||||
|
onPressed: () {
|
||||||
|
widget.onSelected(station);
|
||||||
|
},
|
||||||
|
alignment: Alignment.centerLeft,
|
||||||
|
child: Basic(
|
||||||
|
title: Text(
|
||||||
|
station.label
|
||||||
|
).h4,
|
||||||
|
),
|
||||||
|
).sized(width: double.infinity).withPadding(all: 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Widget _scaffoldBgAndTing({
|
||||||
|
required BuildContext context,
|
||||||
|
required Widget child,
|
||||||
|
}) {
|
||||||
|
|
||||||
|
// light/dark mode color
|
||||||
|
Color bgColor = Colors.black;
|
||||||
|
if (Theme.of(context).brightness == Brightness.light) {
|
||||||
|
bgColor = Colors.white;
|
||||||
|
} else {
|
||||||
|
bgColor = Colors.black;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Scaffold(
|
||||||
|
child: Stack(
|
||||||
|
children: [
|
||||||
|
// Image goes BEHIND the BackdropFilter
|
||||||
|
Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
image: DecorationImage(
|
||||||
|
image: AssetImage("assets/background-1.jpeg"),
|
||||||
|
fit: BoxFit.cover,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// BackdropFilter blurs the image above
|
||||||
|
BackdropFilter(
|
||||||
|
filter: ImageFilter.blur(
|
||||||
|
sigmaY: 10.0,
|
||||||
|
sigmaX: 10.0,
|
||||||
|
),
|
||||||
|
child: Container(
|
||||||
|
color: bgColor.withOpacity(0.3), // Or add a tint if desired
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
Positioned.fill(
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
|
||||||
|
Container(
|
||||||
|
height: 120,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
gradient: LinearGradient(
|
||||||
|
begin: Alignment.topCenter,
|
||||||
|
end: Alignment.bottomCenter,
|
||||||
|
colors: [
|
||||||
|
Colors.black.withOpacity(0.8),
|
||||||
|
Colors.black.withOpacity(0.5),
|
||||||
|
Colors.transparent,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
child,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
135
lib/pages/login.dart
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:proto_portal/scraper.dart';
|
||||||
|
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
|
||||||
|
class LoginPage extends StatelessWidget {
|
||||||
|
|
||||||
|
static GoRoute route = GoRoute(
|
||||||
|
path: "/login",
|
||||||
|
builder: (context, state) => LoginPage()
|
||||||
|
);
|
||||||
|
|
||||||
|
GlobalKey<FormState> _formKey = GlobalKey<FormState>();
|
||||||
|
InputKey _usernameKey = InputKey("username");
|
||||||
|
InputKey _passwordKey = InputKey("password");
|
||||||
|
CheckboxState rememberMe = CheckboxState.checked;
|
||||||
|
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
child: Center(
|
||||||
|
child: Form(
|
||||||
|
key: _formKey,
|
||||||
|
onSubmit: (context, values) async {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
await GtiAuth.of(context).login(
|
||||||
|
values[_usernameKey] as String,
|
||||||
|
values[_passwordKey] as String,
|
||||||
|
remember: rememberMe == CheckboxState.checked
|
||||||
|
);
|
||||||
|
|
||||||
|
GoRouter.of(context).go("/");
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) {
|
||||||
|
return AlertDialog(
|
||||||
|
title: const Text('Error logging in'),
|
||||||
|
content: Text("The username or password provided is incorrect."),
|
||||||
|
actions: [
|
||||||
|
PrimaryButton(
|
||||||
|
onPressed: () => Navigator.of(context).pop(),
|
||||||
|
child: const Text('Close'),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
|
||||||
|
Container(
|
||||||
|
height: 50,
|
||||||
|
width: double.infinity,
|
||||||
|
alignment: Alignment.center,
|
||||||
|
child: SvgPicture.asset(
|
||||||
|
"assets/logo.svg",
|
||||||
|
alignment: AlignmentGeometry.center,
|
||||||
|
// width: 400,
|
||||||
|
colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
const SizedBox(height: 12),
|
||||||
|
|
||||||
|
Text(
|
||||||
|
"Coordination Portal"
|
||||||
|
).h4.center(),
|
||||||
|
|
||||||
|
const SizedBox(height: 32),
|
||||||
|
|
||||||
|
FormField(
|
||||||
|
label: Text("Username"),
|
||||||
|
key: _usernameKey,
|
||||||
|
child: TextField(
|
||||||
|
|
||||||
|
),
|
||||||
|
validator: ConditionalValidator((value) {
|
||||||
|
return value != null && (value as String).isNotEmpty;
|
||||||
|
}, message: "Username cannot be empty"),
|
||||||
|
),
|
||||||
|
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
|
||||||
|
FormField(
|
||||||
|
label: Text("Password"),
|
||||||
|
key: _passwordKey,
|
||||||
|
child: TextField(
|
||||||
|
obscureText: true,
|
||||||
|
),
|
||||||
|
validator: ConditionalValidator((value) {
|
||||||
|
return value != null && (value as String).isNotEmpty;
|
||||||
|
}, message: "Password cannot be empty"),
|
||||||
|
),
|
||||||
|
|
||||||
|
const SizedBox(height: 24),
|
||||||
|
|
||||||
|
Checkbox(
|
||||||
|
state: rememberMe,
|
||||||
|
onChanged: null,
|
||||||
|
trailing: Text("Remember me"),
|
||||||
|
),
|
||||||
|
|
||||||
|
const SizedBox(height: 24),
|
||||||
|
|
||||||
|
SizedBox(
|
||||||
|
width: double.infinity,
|
||||||
|
child: SubmitButton(
|
||||||
|
child: Text("Login"),
|
||||||
|
loadingTrailing: CircularProgressIndicator(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
).withPadding(
|
||||||
|
all: 16,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
608
lib/scraper.dart
Normal file
@@ -0,0 +1,608 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:io';
|
||||||
|
import 'dart:math';
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:http/http.dart' as http;
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
import 'package:html/parser.dart' as html_parser;
|
||||||
|
import 'package:html/dom.dart';
|
||||||
|
|
||||||
|
class GtiAuth extends ChangeNotifier { // Add ChangeNotifier for reactive updates
|
||||||
|
String? _SESSID;
|
||||||
|
|
||||||
|
String? get sessionId => _SESSID; // Dart convention: lowercase property names
|
||||||
|
|
||||||
|
bool get isAuthenticated => _SESSID != null;
|
||||||
|
|
||||||
|
static GtiAuth of(BuildContext context, {bool listen = false}) { // Add listen parameter
|
||||||
|
return Provider.of<GtiAuth>(context, listen: listen);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> init() async {
|
||||||
|
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||||
|
String? storedSessionId = prefs.getString('PHPSESSID');
|
||||||
|
|
||||||
|
if (storedSessionId != null) {
|
||||||
|
_SESSID = storedSessionId;
|
||||||
|
notifyListeners(); // Notify widgets that auth state changed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> login(String username, String password, {bool remember = false}) async {
|
||||||
|
try {
|
||||||
|
final response = await http.post(
|
||||||
|
Uri.parse('https://gti.fts-tech.co.uk/coordv2/login.php'),
|
||||||
|
body: {
|
||||||
|
'action': 'login',
|
||||||
|
'user': username,
|
||||||
|
'pass': password,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// Check if login successful (response is "1")
|
||||||
|
if (response.body.trim() != '1') {
|
||||||
|
throw Exception('Invalid username or password');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract PHPSESSID from cookies
|
||||||
|
final cookies = response.headers['set-cookie'];
|
||||||
|
if (cookies == null) {
|
||||||
|
throw Exception('No session cookie received from server');
|
||||||
|
}
|
||||||
|
|
||||||
|
_SESSID = _extractSessionId(cookies);
|
||||||
|
if (_SESSID == null) {
|
||||||
|
throw Exception('Failed to extract PHPSESSID from cookies');
|
||||||
|
}
|
||||||
|
|
||||||
|
// If remember is true, use shared_preferences to store session persistently
|
||||||
|
if (remember) {
|
||||||
|
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||||
|
await prefs.setString('PHPSESSID', _SESSID!);
|
||||||
|
}
|
||||||
|
|
||||||
|
notifyListeners(); // Notify widgets that auth state changed
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
if (e is Exception) {
|
||||||
|
rethrow;
|
||||||
|
}
|
||||||
|
throw Exception('Login failed: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> logout() async {
|
||||||
|
_SESSID = null;
|
||||||
|
|
||||||
|
SharedPreferences prefs = await SharedPreferences.getInstance();
|
||||||
|
await prefs.remove('PHPSESSID');
|
||||||
|
|
||||||
|
notifyListeners(); // Notify widgets that auth state changed
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate if the current session is still valid
|
||||||
|
Future<bool> validateSession() async {
|
||||||
|
if (_SESSID == null) return false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
final response = await getAuthenticatedPage(
|
||||||
|
'https://gti.fts-tech.co.uk/coordv2/home.php'
|
||||||
|
);
|
||||||
|
|
||||||
|
// If redirected to login or unauthorized, session is invalid
|
||||||
|
if (response.statusCode != 200 || response.body.contains('login')) {
|
||||||
|
await logout(); // Clear invalid session
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} catch (e) {
|
||||||
|
await logout(); // Clear invalid session
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String? _extractSessionId(String cookieHeader) {
|
||||||
|
// Parse the Set-Cookie header to extract PHPSESSID
|
||||||
|
// Example: "PHPSESSID=rm6rdoanhvcbo9cigsq1b5he17; path=/; HttpOnly"
|
||||||
|
final cookies = cookieHeader.split(';');
|
||||||
|
for (var cookie in cookies) {
|
||||||
|
if (cookie.trim().startsWith('PHPSESSID=')) {
|
||||||
|
return cookie.trim().substring('PHPSESSID='.length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper method to create authenticated requests
|
||||||
|
Map<String, String> getAuthHeaders() {
|
||||||
|
if (_SESSID == null) {
|
||||||
|
throw Exception('Not authenticated - SESSID is null');
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
'Cookie': 'PHPSESSID=$_SESSID',
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Example authenticated request
|
||||||
|
Future<http.Response> getAuthenticatedPage(String url) async {
|
||||||
|
if (_SESSID == null) {
|
||||||
|
throw Exception('Not authenticated');
|
||||||
|
}
|
||||||
|
|
||||||
|
return await http.get(
|
||||||
|
Uri.parse(url),
|
||||||
|
headers: getAuthHeaders(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<GtiStation>> searchStations(String term) async {
|
||||||
|
if (term.length < 3) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
final response = await http.get(
|
||||||
|
Uri.parse('https://gti.fts-tech.co.uk/ajax/station_lookup_mobile.php?term=$term'),
|
||||||
|
headers: {
|
||||||
|
...getAuthHeaders(),
|
||||||
|
'accept': 'application/json, text/javascript, */*; q=0.01',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
if (response.statusCode != 200) {
|
||||||
|
print('Search failed - Status: ${response.statusCode}');
|
||||||
|
print('Response body: ${response.body}');
|
||||||
|
print('Search term: $term');
|
||||||
|
throw Exception('Failed to search stations');
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
final List<dynamic> data = jsonDecode(response.body);
|
||||||
|
return data.map((json) => GtiStation.fromJson(json)).toList();
|
||||||
|
} catch (e) {
|
||||||
|
print('JSON parse error: $e');
|
||||||
|
print('Response body: ${response.body}');
|
||||||
|
rethrow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<GtiService>> getServicesForStation(GtiStation station, {String filter = ''}) async {
|
||||||
|
// Step 1: Set station context by navigating to home.php (as a page load, not AJAX)
|
||||||
|
print('Setting station to ${station.label} (${station.crs})...');
|
||||||
|
|
||||||
|
final homeUri = Uri.https(
|
||||||
|
'gti.fts-tech.co.uk',
|
||||||
|
'/coordv2/home.php',
|
||||||
|
{
|
||||||
|
'crs': station.crs,
|
||||||
|
'stationpc': station.postcode,
|
||||||
|
'stationname': station.label,
|
||||||
|
'stationloc': '${station.stationName},${station.postcode}',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
final homeResponse = await http.get(
|
||||||
|
homeUri,
|
||||||
|
headers: {
|
||||||
|
...getAuthHeaders(),
|
||||||
|
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
|
||||||
|
'referer': 'https://gti.fts-tech.co.uk/coordv2/home.php',
|
||||||
|
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
print('home.php status: ${homeResponse.statusCode}');
|
||||||
|
|
||||||
|
// Extract any new cookies from the response
|
||||||
|
String cookieHeader = getAuthHeaders()['Cookie']!;
|
||||||
|
final setCookie = homeResponse.headers['set-cookie'];
|
||||||
|
if (setCookie != null) {
|
||||||
|
print('Got new cookies: $setCookie');
|
||||||
|
// Append new cookies to existing ones
|
||||||
|
cookieHeader += '; $setCookie';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Step 2: Now fetch services via AJAX with updated cookies
|
||||||
|
final random = Random().nextInt(1000000000);
|
||||||
|
print('Fetching services...');
|
||||||
|
final response = await http.post(
|
||||||
|
Uri.parse('https://gti.fts-tech.co.uk/coordv2/station_adlist_quick.php?nocache=$random&filter=$filter'),
|
||||||
|
headers: {
|
||||||
|
'Cookie': cookieHeader,
|
||||||
|
'accept': '*/*',
|
||||||
|
'referer': 'https://gti.fts-tech.co.uk/coordv2/home.php',
|
||||||
|
'origin': 'https://gti.fts-tech.co.uk',
|
||||||
|
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36',
|
||||||
|
'x-requested-with': 'XMLHttpRequest',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
print('Services response status: ${response.statusCode}');
|
||||||
|
print('Response length: ${response.body.length}');
|
||||||
|
|
||||||
|
final services = _parseServicesFromHtml(response.body);
|
||||||
|
print('Parsed ${services.length} services');
|
||||||
|
|
||||||
|
return services;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<bool> saveAudit({
|
||||||
|
required String time,
|
||||||
|
required String crs,
|
||||||
|
required String vehicleId,
|
||||||
|
required String auditId,
|
||||||
|
required String vehicleReg,
|
||||||
|
required String seats,
|
||||||
|
required String pax,
|
||||||
|
required String luggage,
|
||||||
|
required String paceNotes,
|
||||||
|
required String vehicleTracking,
|
||||||
|
required String destBanner,
|
||||||
|
required String callingPatternFront,
|
||||||
|
required String callingPatternMiddle,
|
||||||
|
required String callingPatternRear,
|
||||||
|
required String audioEquipment,
|
||||||
|
required String audioWorking,
|
||||||
|
required String wheelchair,
|
||||||
|
required String exemption,
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
final requestBody = {
|
||||||
|
'txtVehicleReg': vehicleReg,
|
||||||
|
'cboSeats1': seats[0],
|
||||||
|
'cboSeats2': seats[1],
|
||||||
|
'cboPax1': pax[0],
|
||||||
|
'cboPax2': pax[1],
|
||||||
|
'cboLuggage': luggage,
|
||||||
|
'cboPaceNotes': paceNotes,
|
||||||
|
'cboVehicleTracking': vehicleTracking,
|
||||||
|
'cboDestBanner': destBanner,
|
||||||
|
'cboCallingPatternFront': callingPatternFront,
|
||||||
|
'cboCallingPatternMiddle': callingPatternMiddle,
|
||||||
|
'cboCallingPatternRear': callingPatternRear,
|
||||||
|
'cboAudioEquipment': audioEquipment,
|
||||||
|
'cboAudioWorking': audioWorking,
|
||||||
|
'cboWheelchair': wheelchair,
|
||||||
|
'cboExemption': exemption,
|
||||||
|
'time': time,
|
||||||
|
'crs': crs,
|
||||||
|
'vid': vehicleId,
|
||||||
|
'audit_id': auditId,
|
||||||
|
};
|
||||||
|
|
||||||
|
print('=== AUDIT SAVE DEBUG ===');
|
||||||
|
print('URL: https://gti.fts-tech.co.uk/coordv2/update_audit_psvair.php');
|
||||||
|
print('Request body:');
|
||||||
|
requestBody.forEach((key, value) {
|
||||||
|
print(' $key: $value');
|
||||||
|
});
|
||||||
|
|
||||||
|
final response = await http.post(
|
||||||
|
Uri.parse('https://gti.fts-tech.co.uk/coordv2/update_audit_psvair.php'),
|
||||||
|
headers: {
|
||||||
|
...getAuthHeaders(),
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
|
},
|
||||||
|
body: requestBody,
|
||||||
|
);
|
||||||
|
|
||||||
|
print('Response status: ${response.statusCode}');
|
||||||
|
print('Response body: ${response.body}');
|
||||||
|
print('======================');
|
||||||
|
|
||||||
|
if (response.statusCode == 200) {
|
||||||
|
// Check if response is a positive integer (success)
|
||||||
|
final result = int.tryParse(response.body.trim());
|
||||||
|
final success = result != null && result > 0;
|
||||||
|
print('Parse result: $result, Success: $success');
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
print('Non-200 status code: ${response.statusCode}');
|
||||||
|
return false;
|
||||||
|
} catch (e) {
|
||||||
|
print('Error saving audit: $e');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class GtiStation {
|
||||||
|
final String label; // "Redhill (RDH)"
|
||||||
|
final String stationName; // "Redhill"
|
||||||
|
final String area; // "Redstone Hill"
|
||||||
|
final String town; // "Redhill"
|
||||||
|
final String county; // "Surrey"
|
||||||
|
final String postcode; // "RH1 1RB"
|
||||||
|
final String crs; // "RDH"
|
||||||
|
|
||||||
|
GtiStation({
|
||||||
|
required this.label,
|
||||||
|
required this.stationName,
|
||||||
|
required this.area,
|
||||||
|
required this.town,
|
||||||
|
required this.county,
|
||||||
|
required this.postcode,
|
||||||
|
required this.crs,
|
||||||
|
});
|
||||||
|
|
||||||
|
factory GtiStation.fromJson(Map<String, dynamic> json) {
|
||||||
|
// Format: "StationName|Area|Town|County|Postcode|CRS"
|
||||||
|
final parts = (json['id'] as String).split('|');
|
||||||
|
|
||||||
|
return GtiStation(
|
||||||
|
label: json['label'],
|
||||||
|
stationName: parts[0],
|
||||||
|
area: parts[1],
|
||||||
|
town: parts[2],
|
||||||
|
county: parts[3],
|
||||||
|
postcode: parts[4],
|
||||||
|
crs: parts[5],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build the URL that the web portal uses
|
||||||
|
String getHomeUrl() {
|
||||||
|
return 'https://gti.fts-tech.co.uk/coordv2/home.php?'
|
||||||
|
'crs=$crs&'
|
||||||
|
'stationpc=$postcode&'
|
||||||
|
'stationname=${Uri.encodeComponent(label)}&'
|
||||||
|
'stationloc=${Uri.encodeComponent('$stationName,$postcode')}';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => label;
|
||||||
|
}
|
||||||
|
|
||||||
|
class GtiService {
|
||||||
|
final String time; // "14:13"
|
||||||
|
final String type; // "T" (Type - possibly Train replacement?)
|
||||||
|
final String coach; // "3" (Coach/diagram number)
|
||||||
|
final String vehicleType; // "Wheelchair Coach"
|
||||||
|
final String customer; // "Great Western Railway"
|
||||||
|
final String destination; // "GTWU - Gatwick Airport (Upper Level)"
|
||||||
|
final String operator; // "Passenger Plus Ltd"
|
||||||
|
final String vrm; // "YT23BTY" (Vehicle Registration Mark)
|
||||||
|
final int passengers; // 0-99
|
||||||
|
final String vehicleId; // "3314973"
|
||||||
|
final String timeKey; // "1413"
|
||||||
|
final String? auditId; // "438769" (if service has been audited)
|
||||||
|
final bool hasGps; // Whether GPS tracking is available
|
||||||
|
final bool hasStandbys; // Whether there are standby services
|
||||||
|
final List<CallingPoint> callingPattern; // List of stops
|
||||||
|
|
||||||
|
GtiService({
|
||||||
|
required this.time,
|
||||||
|
required this.type,
|
||||||
|
required this.coach,
|
||||||
|
required this.vehicleType,
|
||||||
|
required this.customer,
|
||||||
|
required this.destination,
|
||||||
|
required this.operator,
|
||||||
|
required this.vrm,
|
||||||
|
required this.passengers,
|
||||||
|
required this.vehicleId,
|
||||||
|
required this.timeKey,
|
||||||
|
this.auditId,
|
||||||
|
required this.hasGps,
|
||||||
|
required this.hasStandbys,
|
||||||
|
required this.callingPattern,
|
||||||
|
});
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return {
|
||||||
|
'time': time,
|
||||||
|
'type': type,
|
||||||
|
'coach': coach,
|
||||||
|
'vehicleType': vehicleType,
|
||||||
|
'customer': customer,
|
||||||
|
'destination': destination,
|
||||||
|
'operator': operator,
|
||||||
|
'vrm': vrm,
|
||||||
|
'passengers': passengers,
|
||||||
|
'vehicleId': vehicleId,
|
||||||
|
'timeKey': timeKey,
|
||||||
|
'hasGps': hasGps,
|
||||||
|
'hasStandbys': hasStandbys,
|
||||||
|
'callingPattern': callingPattern.map((cp) => cp.toJson()).toList(),
|
||||||
|
'auditId': auditId,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
factory GtiService.fromJson(Map<String, dynamic> json) {
|
||||||
|
return GtiService(
|
||||||
|
time: json['time'] ?? '',
|
||||||
|
type: json['type'] ?? '',
|
||||||
|
coach: json['coach'] ?? '',
|
||||||
|
vehicleType: json['vehicleType'] ?? '',
|
||||||
|
customer: json['customer'] ?? '',
|
||||||
|
destination: json['destination'] ?? '',
|
||||||
|
operator: json['operator'] ?? '',
|
||||||
|
vrm: json['vrm'] ?? '',
|
||||||
|
passengers: json['passengers'] ?? 0,
|
||||||
|
vehicleId: json['vehicleId'] ?? '',
|
||||||
|
timeKey: json['timeKey'] ?? '',
|
||||||
|
hasGps: json['hasGps'] ?? false,
|
||||||
|
hasStandbys: json['hasStandbys'] ?? false,
|
||||||
|
callingPattern: (json['callingPattern'] as List?)
|
||||||
|
?.map((cp) => CallingPoint.fromJson(cp))
|
||||||
|
.toList() ?? [],
|
||||||
|
auditId: json['auditId'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CallingPoint {
|
||||||
|
final String time;
|
||||||
|
final String location;
|
||||||
|
final String postcode;
|
||||||
|
|
||||||
|
CallingPoint({
|
||||||
|
required this.time,
|
||||||
|
required this.location,
|
||||||
|
required this.postcode,
|
||||||
|
});
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
return {
|
||||||
|
'Time': time,
|
||||||
|
'Loc': location,
|
||||||
|
'Postcode': postcode,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
factory CallingPoint.fromJson(Map<String, dynamic> json) {
|
||||||
|
return CallingPoint(
|
||||||
|
time: json['Time'],
|
||||||
|
location: json['Loc'],
|
||||||
|
postcode: json['Postcode'],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
List<GtiService> _parseServicesFromHtml(String htmlContent) {
|
||||||
|
final document = html_parser.parse(htmlContent);
|
||||||
|
final services = <GtiService>[];
|
||||||
|
|
||||||
|
// Extract calling patterns from script tags
|
||||||
|
final callingPatterns = <String, List<CallingPoint>>{};
|
||||||
|
final scripts = document.querySelectorAll('script');
|
||||||
|
|
||||||
|
for (final script in scripts) {
|
||||||
|
final text = script.text;
|
||||||
|
final cpMatch = RegExp(r"aCP\['(\d+-\d+)'\] = '(\[.*?\])'").firstMatch(text);
|
||||||
|
if (cpMatch != null) {
|
||||||
|
try {
|
||||||
|
final key = cpMatch.group(1)!;
|
||||||
|
final jsonStr = cpMatch.group(2)!;
|
||||||
|
final List<dynamic> data = jsonDecode(jsonStr);
|
||||||
|
callingPatterns[key] = data.map((cp) => CallingPoint.fromJson(cp)).toList();
|
||||||
|
} catch (e) {
|
||||||
|
// Skip invalid JSON
|
||||||
|
print('Failed to parse calling pattern: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse each service list item
|
||||||
|
final listItems = document.querySelectorAll('li.list-group-item-action');
|
||||||
|
print('Found ${listItems.length} list items');
|
||||||
|
|
||||||
|
for (final item in listItems) {
|
||||||
|
try {
|
||||||
|
final table = item.querySelector('table');
|
||||||
|
if (table == null) continue;
|
||||||
|
|
||||||
|
final rows = table.querySelectorAll('tr');
|
||||||
|
|
||||||
|
// Extract data from table rows
|
||||||
|
String? time, type, coach, vehicleType, customer, destination, operator, vrm;
|
||||||
|
int passengers = 0;
|
||||||
|
String? vehicleId, auditId;
|
||||||
|
bool hasGps = false;
|
||||||
|
bool hasStandbys = false;
|
||||||
|
|
||||||
|
for (final row in rows) {
|
||||||
|
// Get all labels and values in this row (some rows have multiple pairs)
|
||||||
|
final labels = row.querySelectorAll('.adlabel');
|
||||||
|
final values = row.querySelectorAll('.adtext');
|
||||||
|
|
||||||
|
// Process each label-value pair in this row
|
||||||
|
for (int i = 0; i < labels.length && i < values.length; i++) {
|
||||||
|
final label = labels[i].text.trim();
|
||||||
|
final value = values[i].text.trim();
|
||||||
|
|
||||||
|
switch (label) {
|
||||||
|
case 'Time:':
|
||||||
|
time = value;
|
||||||
|
break;
|
||||||
|
case 'Type:':
|
||||||
|
type = value;
|
||||||
|
break;
|
||||||
|
case 'Coach:':
|
||||||
|
coach = value;
|
||||||
|
break;
|
||||||
|
case 'Vehicle Type:':
|
||||||
|
vehicleType = value;
|
||||||
|
break;
|
||||||
|
case 'Customer:':
|
||||||
|
customer = value;
|
||||||
|
break;
|
||||||
|
case 'Destination:':
|
||||||
|
destination = value;
|
||||||
|
break;
|
||||||
|
case 'Operator:':
|
||||||
|
operator = value;
|
||||||
|
break;
|
||||||
|
case 'VRM:':
|
||||||
|
vrm = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for GPS button
|
||||||
|
if (row.text.contains('btn-opengps')) {
|
||||||
|
hasGps = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for standbys
|
||||||
|
if (row.text.contains('Standbys')) {
|
||||||
|
hasStandbys = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extract passenger count from selects
|
||||||
|
final select1 = row.querySelector('select[id^="cboPax1_"]');
|
||||||
|
final select2 = row.querySelector('select[id^="cboPax2_"]');
|
||||||
|
if (select1 != null && select2 != null) {
|
||||||
|
final pax1 = select1.querySelector('option[selected]')?.attributes['value'] ?? '0';
|
||||||
|
final pax2 = select2.querySelector('option[selected]')?.attributes['value'] ?? '0';
|
||||||
|
passengers = int.parse(pax1 + pax2);
|
||||||
|
|
||||||
|
// Extract vehicle ID from onchange attribute
|
||||||
|
final onChange = select1.attributes['onchange'];
|
||||||
|
if (onChange != null) {
|
||||||
|
final vidMatch = RegExp(r"'(\d+)'").allMatches(onChange).toList();
|
||||||
|
if (vidMatch.length >= 2) {
|
||||||
|
auditId = vidMatch[0].group(1);
|
||||||
|
vehicleId = vidMatch[1].group(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (time != null && type != null && coach != null) {
|
||||||
|
final timeKey = time.replaceAll(':', '');
|
||||||
|
final cpKey = '$vehicleId-$timeKey';
|
||||||
|
|
||||||
|
services.add(GtiService(
|
||||||
|
time: time,
|
||||||
|
type: type,
|
||||||
|
coach: coach,
|
||||||
|
vehicleType: vehicleType ?? '',
|
||||||
|
customer: customer ?? '',
|
||||||
|
destination: destination ?? '',
|
||||||
|
operator: operator ?? '',
|
||||||
|
vrm: vrm ?? '',
|
||||||
|
passengers: passengers,
|
||||||
|
vehicleId: vehicleId ?? '',
|
||||||
|
timeKey: timeKey,
|
||||||
|
auditId: auditId,
|
||||||
|
hasGps: hasGps,
|
||||||
|
hasStandbys: hasStandbys,
|
||||||
|
callingPattern: callingPatterns[cpKey] ?? [],
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
print('Skipping service - time: $time, type: $type, coach: $coach');
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// Skip malformed items
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return services;
|
||||||
|
}
|
||||||
|
|
||||||
115
lib/widgets/faded_scroll_view.dart
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
import 'dart:ui';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class FadedScrollView extends StatefulWidget {
|
||||||
|
final Widget child;
|
||||||
|
final double fadeHeight;
|
||||||
|
final double easingDistance;
|
||||||
|
final double maxBlur;
|
||||||
|
final ScrollController? controller;
|
||||||
|
final EdgeInsetsGeometry? padding;
|
||||||
|
|
||||||
|
const FadedScrollView({
|
||||||
|
super.key,
|
||||||
|
required this.child,
|
||||||
|
this.fadeHeight = 20.0,
|
||||||
|
this.easingDistance = 10.0,
|
||||||
|
this.maxBlur = 3.0,
|
||||||
|
this.controller,
|
||||||
|
this.padding,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<FadedScrollView> createState() => _FadedScrollViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _FadedScrollViewState extends State<FadedScrollView> {
|
||||||
|
late ScrollController _scrollController;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
_scrollController = widget.controller ?? ScrollController();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
if (widget.controller == null) {
|
||||||
|
_scrollController.dispose();
|
||||||
|
}
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return AnimatedBuilder(
|
||||||
|
animation: _scrollController,
|
||||||
|
builder: (context, child) {
|
||||||
|
final double offset = _scrollController.hasClients ? _scrollController.offset : 0.0;
|
||||||
|
final double fadeProgress = (offset / widget.easingDistance).clamp(0.0, 1.0);
|
||||||
|
final double currentBlur = widget.maxBlur * fadeProgress;
|
||||||
|
|
||||||
|
return Stack(
|
||||||
|
children: [
|
||||||
|
// Main content
|
||||||
|
ShaderMask(
|
||||||
|
shaderCallback: (Rect bounds) {
|
||||||
|
final double fadeStop = widget.fadeHeight / bounds.height;
|
||||||
|
final Color transparentColor = Colors.white.withOpacity(1.0 - fadeProgress);
|
||||||
|
|
||||||
|
return LinearGradient(
|
||||||
|
begin: Alignment.topCenter,
|
||||||
|
end: Alignment.bottomCenter,
|
||||||
|
colors: [
|
||||||
|
transparentColor,
|
||||||
|
Colors.white,
|
||||||
|
Colors.white,
|
||||||
|
],
|
||||||
|
stops: [0.0, fadeStop, 1.0],
|
||||||
|
).createShader(bounds);
|
||||||
|
},
|
||||||
|
blendMode: BlendMode.dstIn,
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
controller: _scrollController,
|
||||||
|
padding: widget.padding,
|
||||||
|
child: widget.child,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
// Single blur with extended fade area for smoother transition
|
||||||
|
if (currentBlur > 0)
|
||||||
|
Positioned(
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
height: widget.fadeHeight * 1.5, // Extend beyond fade area
|
||||||
|
child: ClipRect(
|
||||||
|
child: BackdropFilter(
|
||||||
|
filter: ImageFilter.blur(
|
||||||
|
sigmaX: currentBlur * 0.7, // Reduce intensity slightly
|
||||||
|
sigmaY: currentBlur * 0.7,
|
||||||
|
),
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
gradient: LinearGradient(
|
||||||
|
begin: Alignment.topCenter,
|
||||||
|
end: Alignment.bottomCenter,
|
||||||
|
colors: [
|
||||||
|
Colors.transparent,
|
||||||
|
Colors.transparent,
|
||||||
|
Colors.transparent,
|
||||||
|
Colors.black.withOpacity(0.0),
|
||||||
|
],
|
||||||
|
stops: [0.0, 0.6, 0.9, 1.0],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
219
lib/widgets/service_card.dart
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'package:flutter/material.dart' hide Colors, Divider, VerticalDivider;
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:proto_portal/scraper.dart';
|
||||||
|
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
||||||
|
|
||||||
|
class ServiceCard extends StatelessWidget {
|
||||||
|
final String type;
|
||||||
|
final String time;
|
||||||
|
final String diagram;
|
||||||
|
final String customer;
|
||||||
|
final String destination;
|
||||||
|
final String operator;
|
||||||
|
final String vrm;
|
||||||
|
final GtiService? service;
|
||||||
|
final GtiStation? station;
|
||||||
|
final bool showActions;
|
||||||
|
|
||||||
|
// Constructor for individual fields
|
||||||
|
ServiceCard({
|
||||||
|
required this.type,
|
||||||
|
required this.time,
|
||||||
|
required this.diagram,
|
||||||
|
required this.customer,
|
||||||
|
required this.destination,
|
||||||
|
required this.operator,
|
||||||
|
required this.vrm,
|
||||||
|
this.service,
|
||||||
|
this.station,
|
||||||
|
this.showActions = false,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Constructor that takes a GtiService
|
||||||
|
ServiceCard.fromService({
|
||||||
|
required GtiService service,
|
||||||
|
GtiStation? station,
|
||||||
|
bool showActions = false,
|
||||||
|
}) : this.service = service,
|
||||||
|
this.station = station,
|
||||||
|
this.showActions = showActions,
|
||||||
|
type = service.type,
|
||||||
|
time = service.time,
|
||||||
|
diagram = service.coach,
|
||||||
|
customer = service.customer,
|
||||||
|
destination = service.destination,
|
||||||
|
operator = service.operator,
|
||||||
|
vrm = service.vrm;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
// Convert type code to full word
|
||||||
|
String typeLabel = type;
|
||||||
|
if (type == 'D') {
|
||||||
|
typeLabel = 'Departure';
|
||||||
|
} else if (type == 'A') {
|
||||||
|
typeLabel = 'Arrival';
|
||||||
|
}
|
||||||
|
|
||||||
|
return OutlinedContainer(
|
||||||
|
width: double.infinity,
|
||||||
|
boxShadow: [
|
||||||
|
BoxShadow(
|
||||||
|
color: Colors.black.withOpacity(0.2),
|
||||||
|
blurRadius: 10,
|
||||||
|
spreadRadius: 2)
|
||||||
|
],
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
IntrinsicHeight(
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(24.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(typeLabel,
|
||||||
|
style: TextStyle(fontSize: 22))
|
||||||
|
.textLarge,
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
VerticalDivider(),
|
||||||
|
SizedBox(
|
||||||
|
width: 94,
|
||||||
|
child: _keyvalueRow(
|
||||||
|
key: "Time",
|
||||||
|
value: time,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
VerticalDivider(),
|
||||||
|
SizedBox(
|
||||||
|
width: 130,
|
||||||
|
child: _keyvalueRow(
|
||||||
|
key: "Diagram",
|
||||||
|
value: diagram,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Divider(),
|
||||||
|
|
||||||
|
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||||
|
child: _keyvalueRow(
|
||||||
|
key: "Customer",
|
||||||
|
value: customer,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Divider(),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||||
|
child: _keyvalueRow(
|
||||||
|
key: "Destination",
|
||||||
|
value: destination,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Divider(),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 10),
|
||||||
|
child: IntrinsicHeight(
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: _keyvalueRow(
|
||||||
|
key: "Operator",
|
||||||
|
value: operator,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
VerticalDivider(),
|
||||||
|
SizedBox(
|
||||||
|
width: 120,
|
||||||
|
child: _keyvalueRow(
|
||||||
|
key: "VRM",
|
||||||
|
value: vrm.isNotEmpty ? vrm : "N/A",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
if (showActions) ...[
|
||||||
|
Divider(),
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
ButtonGroup(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: OutlineButton(
|
||||||
|
onPressed: service != null && station != null
|
||||||
|
? () {
|
||||||
|
// Encode service as base64
|
||||||
|
final serviceJson = jsonEncode(service!.toJson());
|
||||||
|
final serviceBase64 = base64Encode(utf8.encode(serviceJson));
|
||||||
|
|
||||||
|
final stationJson = jsonEncode({
|
||||||
|
'label': station!.label,
|
||||||
|
'crs': station!.crs,
|
||||||
|
});
|
||||||
|
final stationBase64 = base64Encode(utf8.encode(stationJson));
|
||||||
|
|
||||||
|
GoRouter.of(context).push(
|
||||||
|
Uri(
|
||||||
|
path: '/audit',
|
||||||
|
queryParameters: {
|
||||||
|
'service': serviceBase64,
|
||||||
|
'station': stationBase64,
|
||||||
|
},
|
||||||
|
).toString(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
: null,
|
||||||
|
child: Text("Audit"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: PrimaryButton(
|
||||||
|
onPressed: () {},
|
||||||
|
child: Text("Depart"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _keyvalueRow({
|
||||||
|
required String key,
|
||||||
|
required String value,
|
||||||
|
}) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(12.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(key).h4,
|
||||||
|
|
||||||
|
Text(value).small
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
1
linux/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
flutter/ephemeral
|
||||||
128
linux/CMakeLists.txt
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
# Project-level configuration.
|
||||||
|
cmake_minimum_required(VERSION 3.13)
|
||||||
|
project(runner LANGUAGES CXX)
|
||||||
|
|
||||||
|
# The name of the executable created for the application. Change this to change
|
||||||
|
# the on-disk name of your application.
|
||||||
|
set(BINARY_NAME "proto_portal")
|
||||||
|
# The unique GTK application identifier for this application. See:
|
||||||
|
# https://wiki.gnome.org/HowDoI/ChooseApplicationID
|
||||||
|
set(APPLICATION_ID "net.imbenji.proto_portal")
|
||||||
|
|
||||||
|
# Explicitly opt in to modern CMake behaviors to avoid warnings with recent
|
||||||
|
# versions of CMake.
|
||||||
|
cmake_policy(SET CMP0063 NEW)
|
||||||
|
|
||||||
|
# Load bundled libraries from the lib/ directory relative to the binary.
|
||||||
|
set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
|
||||||
|
|
||||||
|
# Root filesystem for cross-building.
|
||||||
|
if(FLUTTER_TARGET_PLATFORM_SYSROOT)
|
||||||
|
set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT})
|
||||||
|
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Define build configuration options.
|
||||||
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
|
set(CMAKE_BUILD_TYPE "Debug" CACHE
|
||||||
|
STRING "Flutter build mode" FORCE)
|
||||||
|
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
|
||||||
|
"Debug" "Profile" "Release")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Compilation settings that should be applied to most targets.
|
||||||
|
#
|
||||||
|
# Be cautious about adding new options here, as plugins use this function by
|
||||||
|
# default. In most cases, you should add new options to specific targets instead
|
||||||
|
# of modifying this function.
|
||||||
|
function(APPLY_STANDARD_SETTINGS TARGET)
|
||||||
|
target_compile_features(${TARGET} PUBLIC cxx_std_14)
|
||||||
|
target_compile_options(${TARGET} PRIVATE -Wall -Werror)
|
||||||
|
target_compile_options(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:-O3>")
|
||||||
|
target_compile_definitions(${TARGET} PRIVATE "$<$<NOT:$<CONFIG:Debug>>:NDEBUG>")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Flutter library and tool build rules.
|
||||||
|
set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
|
||||||
|
add_subdirectory(${FLUTTER_MANAGED_DIR})
|
||||||
|
|
||||||
|
# System-level dependencies.
|
||||||
|
find_package(PkgConfig REQUIRED)
|
||||||
|
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
|
||||||
|
|
||||||
|
# Application build; see runner/CMakeLists.txt.
|
||||||
|
add_subdirectory("runner")
|
||||||
|
|
||||||
|
# Run the Flutter tool portions of the build. This must not be removed.
|
||||||
|
add_dependencies(${BINARY_NAME} flutter_assemble)
|
||||||
|
|
||||||
|
# Only the install-generated bundle's copy of the executable will launch
|
||||||
|
# correctly, since the resources must in the right relative locations. To avoid
|
||||||
|
# people trying to run the unbundled copy, put it in a subdirectory instead of
|
||||||
|
# the default top-level location.
|
||||||
|
set_target_properties(${BINARY_NAME}
|
||||||
|
PROPERTIES
|
||||||
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Generated plugin build rules, which manage building the plugins and adding
|
||||||
|
# them to the application.
|
||||||
|
include(flutter/generated_plugins.cmake)
|
||||||
|
|
||||||
|
|
||||||
|
# === Installation ===
|
||||||
|
# By default, "installing" just makes a relocatable bundle in the build
|
||||||
|
# directory.
|
||||||
|
set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle")
|
||||||
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
||||||
|
set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Start with a clean build bundle directory every time.
|
||||||
|
install(CODE "
|
||||||
|
file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\")
|
||||||
|
" COMPONENT Runtime)
|
||||||
|
|
||||||
|
set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
|
||||||
|
set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
|
||||||
|
|
||||||
|
install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
|
||||||
|
COMPONENT Runtime)
|
||||||
|
|
||||||
|
install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
|
||||||
|
COMPONENT Runtime)
|
||||||
|
|
||||||
|
install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
|
||||||
|
COMPONENT Runtime)
|
||||||
|
|
||||||
|
foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES})
|
||||||
|
install(FILES "${bundled_library}"
|
||||||
|
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
|
||||||
|
COMPONENT Runtime)
|
||||||
|
endforeach(bundled_library)
|
||||||
|
|
||||||
|
# Copy the native assets provided by the build.dart from all packages.
|
||||||
|
set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/")
|
||||||
|
install(DIRECTORY "${NATIVE_ASSETS_DIR}"
|
||||||
|
DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
|
||||||
|
COMPONENT Runtime)
|
||||||
|
|
||||||
|
# Fully re-copy the assets directory on each build to avoid having stale files
|
||||||
|
# from a previous install.
|
||||||
|
set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
|
||||||
|
install(CODE "
|
||||||
|
file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
|
||||||
|
" COMPONENT Runtime)
|
||||||
|
install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
|
||||||
|
DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
|
||||||
|
|
||||||
|
# Install the AOT library on non-Debug builds only.
|
||||||
|
if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
|
||||||
|
install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
|
||||||
|
COMPONENT Runtime)
|
||||||
|
endif()
|
||||||
88
linux/flutter/CMakeLists.txt
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
# This file controls Flutter-level build steps. It should not be edited.
|
||||||
|
cmake_minimum_required(VERSION 3.10)
|
||||||
|
|
||||||
|
set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
|
||||||
|
|
||||||
|
# Configuration provided via flutter tool.
|
||||||
|
include(${EPHEMERAL_DIR}/generated_config.cmake)
|
||||||
|
|
||||||
|
# TODO: Move the rest of this into files in ephemeral. See
|
||||||
|
# https://github.com/flutter/flutter/issues/57146.
|
||||||
|
|
||||||
|
# Serves the same purpose as list(TRANSFORM ... PREPEND ...),
|
||||||
|
# which isn't available in 3.10.
|
||||||
|
function(list_prepend LIST_NAME PREFIX)
|
||||||
|
set(NEW_LIST "")
|
||||||
|
foreach(element ${${LIST_NAME}})
|
||||||
|
list(APPEND NEW_LIST "${PREFIX}${element}")
|
||||||
|
endforeach(element)
|
||||||
|
set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# === Flutter Library ===
|
||||||
|
# System-level dependencies.
|
||||||
|
find_package(PkgConfig REQUIRED)
|
||||||
|
pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0)
|
||||||
|
pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0)
|
||||||
|
pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0)
|
||||||
|
|
||||||
|
set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so")
|
||||||
|
|
||||||
|
# Published to parent scope for install step.
|
||||||
|
set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
|
||||||
|
set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
|
||||||
|
set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
|
||||||
|
set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE)
|
||||||
|
|
||||||
|
list(APPEND FLUTTER_LIBRARY_HEADERS
|
||||||
|
"fl_basic_message_channel.h"
|
||||||
|
"fl_binary_codec.h"
|
||||||
|
"fl_binary_messenger.h"
|
||||||
|
"fl_dart_project.h"
|
||||||
|
"fl_engine.h"
|
||||||
|
"fl_json_message_codec.h"
|
||||||
|
"fl_json_method_codec.h"
|
||||||
|
"fl_message_codec.h"
|
||||||
|
"fl_method_call.h"
|
||||||
|
"fl_method_channel.h"
|
||||||
|
"fl_method_codec.h"
|
||||||
|
"fl_method_response.h"
|
||||||
|
"fl_plugin_registrar.h"
|
||||||
|
"fl_plugin_registry.h"
|
||||||
|
"fl_standard_message_codec.h"
|
||||||
|
"fl_standard_method_codec.h"
|
||||||
|
"fl_string_codec.h"
|
||||||
|
"fl_value.h"
|
||||||
|
"fl_view.h"
|
||||||
|
"flutter_linux.h"
|
||||||
|
)
|
||||||
|
list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/")
|
||||||
|
add_library(flutter INTERFACE)
|
||||||
|
target_include_directories(flutter INTERFACE
|
||||||
|
"${EPHEMERAL_DIR}"
|
||||||
|
)
|
||||||
|
target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}")
|
||||||
|
target_link_libraries(flutter INTERFACE
|
||||||
|
PkgConfig::GTK
|
||||||
|
PkgConfig::GLIB
|
||||||
|
PkgConfig::GIO
|
||||||
|
)
|
||||||
|
add_dependencies(flutter flutter_assemble)
|
||||||
|
|
||||||
|
# === Flutter tool backend ===
|
||||||
|
# _phony_ is a non-existent file to force this command to run every time,
|
||||||
|
# since currently there's no way to get a full input/output list from the
|
||||||
|
# flutter tool.
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/_phony_
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E env
|
||||||
|
${FLUTTER_TOOL_ENVIRONMENT}
|
||||||
|
"${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh"
|
||||||
|
${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE}
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
add_custom_target(flutter_assemble DEPENDS
|
||||||
|
"${FLUTTER_LIBRARY}"
|
||||||
|
${FLUTTER_LIBRARY_HEADERS}
|
||||||
|
)
|
||||||
19
linux/flutter/generated_plugin_registrant.cc
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// Generated file. Do not edit.
|
||||||
|
//
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
|
||||||
|
#include "generated_plugin_registrant.h"
|
||||||
|
|
||||||
|
#include <irondash_engine_context/irondash_engine_context_plugin.h>
|
||||||
|
#include <super_native_extensions/super_native_extensions_plugin.h>
|
||||||
|
|
||||||
|
void fl_register_plugins(FlPluginRegistry* registry) {
|
||||||
|
g_autoptr(FlPluginRegistrar) irondash_engine_context_registrar =
|
||||||
|
fl_plugin_registry_get_registrar_for_plugin(registry, "IrondashEngineContextPlugin");
|
||||||
|
irondash_engine_context_plugin_register_with_registrar(irondash_engine_context_registrar);
|
||||||
|
g_autoptr(FlPluginRegistrar) super_native_extensions_registrar =
|
||||||
|
fl_plugin_registry_get_registrar_for_plugin(registry, "SuperNativeExtensionsPlugin");
|
||||||
|
super_native_extensions_plugin_register_with_registrar(super_native_extensions_registrar);
|
||||||
|
}
|
||||||
15
linux/flutter/generated_plugin_registrant.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
//
|
||||||
|
// Generated file. Do not edit.
|
||||||
|
//
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
|
|
||||||
|
#ifndef GENERATED_PLUGIN_REGISTRANT_
|
||||||
|
#define GENERATED_PLUGIN_REGISTRANT_
|
||||||
|
|
||||||
|
#include <flutter_linux/flutter_linux.h>
|
||||||
|
|
||||||
|
// Registers Flutter plugins.
|
||||||
|
void fl_register_plugins(FlPluginRegistry* registry);
|
||||||
|
|
||||||
|
#endif // GENERATED_PLUGIN_REGISTRANT_
|
||||||
25
linux/flutter/generated_plugins.cmake
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#
|
||||||
|
# Generated file, do not edit.
|
||||||
|
#
|
||||||
|
|
||||||
|
list(APPEND FLUTTER_PLUGIN_LIST
|
||||||
|
irondash_engine_context
|
||||||
|
super_native_extensions
|
||||||
|
)
|
||||||
|
|
||||||
|
list(APPEND FLUTTER_FFI_PLUGIN_LIST
|
||||||
|
)
|
||||||
|
|
||||||
|
set(PLUGIN_BUNDLED_LIBRARIES)
|
||||||
|
|
||||||
|
foreach(plugin ${FLUTTER_PLUGIN_LIST})
|
||||||
|
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin})
|
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
|
||||||
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
|
||||||
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
|
||||||
|
endforeach(plugin)
|
||||||
|
|
||||||
|
foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
|
||||||
|
add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin})
|
||||||
|
list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
|
||||||
|
endforeach(ffi_plugin)
|
||||||
26
linux/runner/CMakeLists.txt
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.13)
|
||||||
|
project(runner LANGUAGES CXX)
|
||||||
|
|
||||||
|
# Define the application target. To change its name, change BINARY_NAME in the
|
||||||
|
# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer
|
||||||
|
# work.
|
||||||
|
#
|
||||||
|
# Any new source files that you add to the application should be added here.
|
||||||
|
add_executable(${BINARY_NAME}
|
||||||
|
"main.cc"
|
||||||
|
"my_application.cc"
|
||||||
|
"${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Apply the standard set of build settings. This can be removed for applications
|
||||||
|
# that need different build settings.
|
||||||
|
apply_standard_settings(${BINARY_NAME})
|
||||||
|
|
||||||
|
# Add preprocessor definitions for the application ID.
|
||||||
|
add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}")
|
||||||
|
|
||||||
|
# Add dependency libraries. Add any application-specific dependencies here.
|
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE flutter)
|
||||||
|
target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK)
|
||||||
|
|
||||||
|
target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
|
||||||
6
linux/runner/main.cc
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#include "my_application.h"
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
g_autoptr(MyApplication) app = my_application_new();
|
||||||
|
return g_application_run(G_APPLICATION(app), argc, argv);
|
||||||
|
}
|
||||||
144
linux/runner/my_application.cc
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
#include "my_application.h"
|
||||||
|
|
||||||
|
#include <flutter_linux/flutter_linux.h>
|
||||||
|
#ifdef GDK_WINDOWING_X11
|
||||||
|
#include <gdk/gdkx.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "flutter/generated_plugin_registrant.h"
|
||||||
|
|
||||||
|
struct _MyApplication {
|
||||||
|
GtkApplication parent_instance;
|
||||||
|
char** dart_entrypoint_arguments;
|
||||||
|
};
|
||||||
|
|
||||||
|
G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION)
|
||||||
|
|
||||||
|
// Called when first Flutter frame received.
|
||||||
|
static void first_frame_cb(MyApplication* self, FlView *view)
|
||||||
|
{
|
||||||
|
gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implements GApplication::activate.
|
||||||
|
static void my_application_activate(GApplication* application) {
|
||||||
|
MyApplication* self = MY_APPLICATION(application);
|
||||||
|
GtkWindow* window =
|
||||||
|
GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application)));
|
||||||
|
|
||||||
|
// Use a header bar when running in GNOME as this is the common style used
|
||||||
|
// by applications and is the setup most users will be using (e.g. Ubuntu
|
||||||
|
// desktop).
|
||||||
|
// If running on X and not using GNOME then just use a traditional title bar
|
||||||
|
// in case the window manager does more exotic layout, e.g. tiling.
|
||||||
|
// If running on Wayland assume the header bar will work (may need changing
|
||||||
|
// if future cases occur).
|
||||||
|
gboolean use_header_bar = TRUE;
|
||||||
|
#ifdef GDK_WINDOWING_X11
|
||||||
|
GdkScreen* screen = gtk_window_get_screen(window);
|
||||||
|
if (GDK_IS_X11_SCREEN(screen)) {
|
||||||
|
const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen);
|
||||||
|
if (g_strcmp0(wm_name, "GNOME Shell") != 0) {
|
||||||
|
use_header_bar = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (use_header_bar) {
|
||||||
|
GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new());
|
||||||
|
gtk_widget_show(GTK_WIDGET(header_bar));
|
||||||
|
gtk_header_bar_set_title(header_bar, "proto_portal");
|
||||||
|
gtk_header_bar_set_show_close_button(header_bar, TRUE);
|
||||||
|
gtk_window_set_titlebar(window, GTK_WIDGET(header_bar));
|
||||||
|
} else {
|
||||||
|
gtk_window_set_title(window, "proto_portal");
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_window_set_default_size(window, 1280, 720);
|
||||||
|
|
||||||
|
g_autoptr(FlDartProject) project = fl_dart_project_new();
|
||||||
|
fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments);
|
||||||
|
|
||||||
|
FlView* view = fl_view_new(project);
|
||||||
|
GdkRGBA background_color;
|
||||||
|
// Background defaults to black, override it here if necessary, e.g. #00000000 for transparent.
|
||||||
|
gdk_rgba_parse(&background_color, "#000000");
|
||||||
|
fl_view_set_background_color(view, &background_color);
|
||||||
|
gtk_widget_show(GTK_WIDGET(view));
|
||||||
|
gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view));
|
||||||
|
|
||||||
|
// Show the window when Flutter renders.
|
||||||
|
// Requires the view to be realized so we can start rendering.
|
||||||
|
g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), self);
|
||||||
|
gtk_widget_realize(GTK_WIDGET(view));
|
||||||
|
|
||||||
|
fl_register_plugins(FL_PLUGIN_REGISTRY(view));
|
||||||
|
|
||||||
|
gtk_widget_grab_focus(GTK_WIDGET(view));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implements GApplication::local_command_line.
|
||||||
|
static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) {
|
||||||
|
MyApplication* self = MY_APPLICATION(application);
|
||||||
|
// Strip out the first argument as it is the binary name.
|
||||||
|
self->dart_entrypoint_arguments = g_strdupv(*arguments + 1);
|
||||||
|
|
||||||
|
g_autoptr(GError) error = nullptr;
|
||||||
|
if (!g_application_register(application, nullptr, &error)) {
|
||||||
|
g_warning("Failed to register: %s", error->message);
|
||||||
|
*exit_status = 1;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_application_activate(application);
|
||||||
|
*exit_status = 0;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implements GApplication::startup.
|
||||||
|
static void my_application_startup(GApplication* application) {
|
||||||
|
//MyApplication* self = MY_APPLICATION(object);
|
||||||
|
|
||||||
|
// Perform any actions required at application startup.
|
||||||
|
|
||||||
|
G_APPLICATION_CLASS(my_application_parent_class)->startup(application);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implements GApplication::shutdown.
|
||||||
|
static void my_application_shutdown(GApplication* application) {
|
||||||
|
//MyApplication* self = MY_APPLICATION(object);
|
||||||
|
|
||||||
|
// Perform any actions required at application shutdown.
|
||||||
|
|
||||||
|
G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implements GObject::dispose.
|
||||||
|
static void my_application_dispose(GObject* object) {
|
||||||
|
MyApplication* self = MY_APPLICATION(object);
|
||||||
|
g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev);
|
||||||
|
G_OBJECT_CLASS(my_application_parent_class)->dispose(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void my_application_class_init(MyApplicationClass* klass) {
|
||||||
|
G_APPLICATION_CLASS(klass)->activate = my_application_activate;
|
||||||
|
G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line;
|
||||||
|
G_APPLICATION_CLASS(klass)->startup = my_application_startup;
|
||||||
|
G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown;
|
||||||
|
G_OBJECT_CLASS(klass)->dispose = my_application_dispose;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void my_application_init(MyApplication* self) {}
|
||||||
|
|
||||||
|
MyApplication* my_application_new() {
|
||||||
|
// Set the program name to the application ID, which helps various systems
|
||||||
|
// like GTK and desktop environments map this running application to its
|
||||||
|
// corresponding .desktop file. This ensures better integration by allowing
|
||||||
|
// the application to be recognized beyond its binary name.
|
||||||
|
g_set_prgname(APPLICATION_ID);
|
||||||
|
|
||||||
|
return MY_APPLICATION(g_object_new(my_application_get_type(),
|
||||||
|
"application-id", APPLICATION_ID,
|
||||||
|
"flags", G_APPLICATION_NON_UNIQUE,
|
||||||
|
nullptr));
|
||||||
|
}
|
||||||
18
linux/runner/my_application.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#ifndef FLUTTER_MY_APPLICATION_H_
|
||||||
|
#define FLUTTER_MY_APPLICATION_H_
|
||||||
|
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION,
|
||||||
|
GtkApplication)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* my_application_new:
|
||||||
|
*
|
||||||
|
* Creates a new Flutter-based application.
|
||||||
|
*
|
||||||
|
* Returns: a new #MyApplication.
|
||||||
|
*/
|
||||||
|
MyApplication* my_application_new();
|
||||||
|
|
||||||
|
#endif // FLUTTER_MY_APPLICATION_H_
|
||||||
7
macos/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# Flutter-related
|
||||||
|
**/Flutter/ephemeral/
|
||||||
|
**/Pods/
|
||||||
|
|
||||||
|
# Xcode-related
|
||||||
|
**/dgph
|
||||||
|
**/xcuserdata/
|
||||||
2
macos/Flutter/Flutter-Debug.xcconfig
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
|
||||||
|
#include "ephemeral/Flutter-Generated.xcconfig"
|
||||||
2
macos/Flutter/Flutter-Release.xcconfig
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
|
||||||
|
#include "ephemeral/Flutter-Generated.xcconfig"
|
||||||
20
macos/Flutter/GeneratedPluginRegistrant.swift
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
//
|
||||||
|
// Generated file. Do not edit.
|
||||||
|
//
|
||||||
|
|
||||||
|
import FlutterMacOS
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
import device_info_plus
|
||||||
|
import irondash_engine_context
|
||||||
|
import path_provider_foundation
|
||||||
|
import shared_preferences_foundation
|
||||||
|
import super_native_extensions
|
||||||
|
|
||||||
|
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
|
||||||
|
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
|
||||||
|
IrondashEngineContextPlugin.register(with: registry.registrar(forPlugin: "IrondashEngineContextPlugin"))
|
||||||
|
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
|
||||||
|
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
|
||||||
|
SuperNativeExtensionsPlugin.register(with: registry.registrar(forPlugin: "SuperNativeExtensionsPlugin"))
|
||||||
|
}
|
||||||
42
macos/Podfile
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
platform :osx, '10.15'
|
||||||
|
|
||||||
|
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
|
||||||
|
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
|
||||||
|
|
||||||
|
project 'Runner', {
|
||||||
|
'Debug' => :debug,
|
||||||
|
'Profile' => :release,
|
||||||
|
'Release' => :release,
|
||||||
|
}
|
||||||
|
|
||||||
|
def flutter_root
|
||||||
|
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__)
|
||||||
|
unless File.exist?(generated_xcode_build_settings_path)
|
||||||
|
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first"
|
||||||
|
end
|
||||||
|
|
||||||
|
File.foreach(generated_xcode_build_settings_path) do |line|
|
||||||
|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
|
||||||
|
return matches[1].strip if matches
|
||||||
|
end
|
||||||
|
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\""
|
||||||
|
end
|
||||||
|
|
||||||
|
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
|
||||||
|
|
||||||
|
flutter_macos_podfile_setup
|
||||||
|
|
||||||
|
target 'Runner' do
|
||||||
|
use_frameworks!
|
||||||
|
|
||||||
|
flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__))
|
||||||
|
target 'RunnerTests' do
|
||||||
|
inherit! :search_paths
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
post_install do |installer|
|
||||||
|
installer.pods_project.targets.each do |target|
|
||||||
|
flutter_additional_macos_build_settings(target)
|
||||||
|
end
|
||||||
|
end
|
||||||
41
macos/Podfile.lock
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
PODS:
|
||||||
|
- device_info_plus (0.0.1):
|
||||||
|
- FlutterMacOS
|
||||||
|
- FlutterMacOS (1.0.0)
|
||||||
|
- irondash_engine_context (0.0.1):
|
||||||
|
- FlutterMacOS
|
||||||
|
- path_provider_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- super_native_extensions (0.0.1):
|
||||||
|
- FlutterMacOS
|
||||||
|
|
||||||
|
DEPENDENCIES:
|
||||||
|
- device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`)
|
||||||
|
- FlutterMacOS (from `Flutter/ephemeral`)
|
||||||
|
- irondash_engine_context (from `Flutter/ephemeral/.symlinks/plugins/irondash_engine_context/macos`)
|
||||||
|
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
|
||||||
|
- super_native_extensions (from `Flutter/ephemeral/.symlinks/plugins/super_native_extensions/macos`)
|
||||||
|
|
||||||
|
EXTERNAL SOURCES:
|
||||||
|
device_info_plus:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos
|
||||||
|
FlutterMacOS:
|
||||||
|
:path: Flutter/ephemeral
|
||||||
|
irondash_engine_context:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/plugins/irondash_engine_context/macos
|
||||||
|
path_provider_foundation:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin
|
||||||
|
super_native_extensions:
|
||||||
|
:path: Flutter/ephemeral/.symlinks/plugins/super_native_extensions/macos
|
||||||
|
|
||||||
|
SPEC CHECKSUMS:
|
||||||
|
device_info_plus: 1b14eed9bf95428983aed283a8d51cce3d8c4215
|
||||||
|
FlutterMacOS: d0db08ddef1a9af05a5ec4b724367152bb0500b1
|
||||||
|
irondash_engine_context: da62996ee25616d2f01bbeb85dc115d813359478
|
||||||
|
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
|
||||||
|
super_native_extensions: 85efee3a7495b46b04befcfc86ed12069264ebf3
|
||||||
|
|
||||||
|
PODFILE CHECKSUM: 54d867c82ac51cbd61b565781b9fada492027009
|
||||||
|
|
||||||
|
COCOAPODS: 1.16.2
|
||||||
801
macos/Runner.xcodeproj/project.pbxproj
Normal file
@@ -0,0 +1,801 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 54;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXAggregateTarget section */
|
||||||
|
33CC111A2044C6BA0003C045 /* Flutter Assemble */ = {
|
||||||
|
isa = PBXAggregateTarget;
|
||||||
|
buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */;
|
||||||
|
buildPhases = (
|
||||||
|
33CC111E2044C6BF0003C045 /* ShellScript */,
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = "Flutter Assemble";
|
||||||
|
productName = FLX;
|
||||||
|
};
|
||||||
|
/* End PBXAggregateTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; };
|
||||||
|
335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; };
|
||||||
|
33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; };
|
||||||
|
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
|
||||||
|
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
|
||||||
|
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
|
||||||
|
42F60261A133D2F0674FFB5D /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A6E8C13AB3C5B10CF6E0F8C6 /* Pods_RunnerTests.framework */; };
|
||||||
|
45BB90941780FEDD8BDD55B9 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3BD2E38B65F8F56E494D685 /* Pods_Runner.framework */; };
|
||||||
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 33CC10EC2044A3C60003C045;
|
||||||
|
remoteInfo = Runner;
|
||||||
|
};
|
||||||
|
33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 33CC10E52044A3C60003C045 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 33CC111A2044C6BA0003C045;
|
||||||
|
remoteInfo = FLX;
|
||||||
|
};
|
||||||
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
|
33CC110E2044A8840003C045 /* Bundle Framework */ = {
|
||||||
|
isa = PBXCopyFilesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
dstPath = "";
|
||||||
|
dstSubfolderSpec = 10;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
name = "Bundle Framework";
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
001D3F2B0F1CD4997573DFAD /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
0DC929C925027362B6BE92F7 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
23E1A3C30F9D1DDE151A6F5B /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
|
||||||
|
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = "<group>"; };
|
||||||
|
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = "<group>"; };
|
||||||
|
33CC10ED2044A3C60003C045 /* proto_portal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = proto_portal.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
|
33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = "<group>"; };
|
||||||
|
33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
|
||||||
|
33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = "<group>"; };
|
||||||
|
33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = "<group>"; };
|
||||||
|
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = "<group>"; };
|
||||||
|
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
|
||||||
|
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = "<group>"; };
|
||||||
|
4A33656F5331A7B8A238A00E /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
6173B9E0EEE5AC22E1A99CC0 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
|
||||||
|
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = "<group>"; };
|
||||||
|
A6E8C13AB3C5B10CF6E0F8C6 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
B3BD2E38B65F8F56E494D685 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
D85BC6492C8C15B32415CC89 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
331C80D2294CF70F00263BE5 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
42F60261A133D2F0674FFB5D /* Pods_RunnerTests.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
33CC10EA2044A3C60003C045 /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
45BB90941780FEDD8BDD55B9 /* Pods_Runner.framework in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
331C80D6294CF71000263BE5 /* RunnerTests */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
331C80D7294CF71000263BE5 /* RunnerTests.swift */,
|
||||||
|
);
|
||||||
|
path = RunnerTests;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
33BA886A226E78AF003329D5 /* Configs */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
33E5194F232828860026EE4D /* AppInfo.xcconfig */,
|
||||||
|
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
||||||
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
||||||
|
333000ED22D3DE5D00554162 /* Warnings.xcconfig */,
|
||||||
|
);
|
||||||
|
path = Configs;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
33CC10E42044A3C60003C045 = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
33FAB671232836740065AC1E /* Runner */,
|
||||||
|
33CEB47122A05771004F2AC0 /* Flutter */,
|
||||||
|
331C80D6294CF71000263BE5 /* RunnerTests */,
|
||||||
|
33CC10EE2044A3C60003C045 /* Products */,
|
||||||
|
D73912EC22F37F3D000D13A0 /* Frameworks */,
|
||||||
|
A0ABD68065AAF7CBBD5748D9 /* Pods */,
|
||||||
|
);
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
33CC10EE2044A3C60003C045 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
33CC10ED2044A3C60003C045 /* proto_portal.app */,
|
||||||
|
331C80D5294CF71000263BE5 /* RunnerTests.xctest */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
33CC11242044D66E0003C045 /* Resources */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
33CC10F22044A3C60003C045 /* Assets.xcassets */,
|
||||||
|
33CC10F42044A3C60003C045 /* MainMenu.xib */,
|
||||||
|
33CC10F72044A3C60003C045 /* Info.plist */,
|
||||||
|
);
|
||||||
|
name = Resources;
|
||||||
|
path = ..;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
33CEB47122A05771004F2AC0 /* Flutter */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */,
|
||||||
|
33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */,
|
||||||
|
33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */,
|
||||||
|
33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */,
|
||||||
|
);
|
||||||
|
path = Flutter;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
33FAB671232836740065AC1E /* Runner */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
33CC10F02044A3C60003C045 /* AppDelegate.swift */,
|
||||||
|
33CC11122044BFA00003C045 /* MainFlutterWindow.swift */,
|
||||||
|
33E51913231747F40026EE4D /* DebugProfile.entitlements */,
|
||||||
|
33E51914231749380026EE4D /* Release.entitlements */,
|
||||||
|
33CC11242044D66E0003C045 /* Resources */,
|
||||||
|
33BA886A226E78AF003329D5 /* Configs */,
|
||||||
|
);
|
||||||
|
path = Runner;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
A0ABD68065AAF7CBBD5748D9 /* Pods */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
4A33656F5331A7B8A238A00E /* Pods-Runner.debug.xcconfig */,
|
||||||
|
001D3F2B0F1CD4997573DFAD /* Pods-Runner.release.xcconfig */,
|
||||||
|
23E1A3C30F9D1DDE151A6F5B /* Pods-Runner.profile.xcconfig */,
|
||||||
|
D85BC6492C8C15B32415CC89 /* Pods-RunnerTests.debug.xcconfig */,
|
||||||
|
6173B9E0EEE5AC22E1A99CC0 /* Pods-RunnerTests.release.xcconfig */,
|
||||||
|
0DC929C925027362B6BE92F7 /* Pods-RunnerTests.profile.xcconfig */,
|
||||||
|
);
|
||||||
|
name = Pods;
|
||||||
|
path = Pods;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
D73912EC22F37F3D000D13A0 /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
B3BD2E38B65F8F56E494D685 /* Pods_Runner.framework */,
|
||||||
|
A6E8C13AB3C5B10CF6E0F8C6 /* Pods_RunnerTests.framework */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
331C80D4294CF70F00263BE5 /* RunnerTests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
|
||||||
|
buildPhases = (
|
||||||
|
DA7402F5EDD540C7F2F60277 /* [CP] Check Pods Manifest.lock */,
|
||||||
|
331C80D1294CF70F00263BE5 /* Sources */,
|
||||||
|
331C80D2294CF70F00263BE5 /* Frameworks */,
|
||||||
|
331C80D3294CF70F00263BE5 /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
331C80DA294CF71000263BE5 /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = RunnerTests;
|
||||||
|
productName = RunnerTests;
|
||||||
|
productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
|
};
|
||||||
|
33CC10EC2044A3C60003C045 /* Runner */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
|
||||||
|
buildPhases = (
|
||||||
|
363501C3C5FBD2A2F8FB592B /* [CP] Check Pods Manifest.lock */,
|
||||||
|
33CC10E92044A3C60003C045 /* Sources */,
|
||||||
|
33CC10EA2044A3C60003C045 /* Frameworks */,
|
||||||
|
33CC10EB2044A3C60003C045 /* Resources */,
|
||||||
|
33CC110E2044A8840003C045 /* Bundle Framework */,
|
||||||
|
3399D490228B24CF009A79C7 /* ShellScript */,
|
||||||
|
CD28D5F681770A4E0D907113 /* [CP] Embed Pods Frameworks */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
33CC11202044C79F0003C045 /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = Runner;
|
||||||
|
productName = Runner;
|
||||||
|
productReference = 33CC10ED2044A3C60003C045 /* proto_portal.app */;
|
||||||
|
productType = "com.apple.product-type.application";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
33CC10E52044A3C60003C045 /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
BuildIndependentTargetsInParallel = YES;
|
||||||
|
LastSwiftUpdateCheck = 0920;
|
||||||
|
LastUpgradeCheck = 1510;
|
||||||
|
ORGANIZATIONNAME = "";
|
||||||
|
TargetAttributes = {
|
||||||
|
331C80D4294CF70F00263BE5 = {
|
||||||
|
CreatedOnToolsVersion = 14.0;
|
||||||
|
TestTargetID = 33CC10EC2044A3C60003C045;
|
||||||
|
};
|
||||||
|
33CC10EC2044A3C60003C045 = {
|
||||||
|
CreatedOnToolsVersion = 9.2;
|
||||||
|
LastSwiftMigration = 1100;
|
||||||
|
ProvisioningStyle = Automatic;
|
||||||
|
SystemCapabilities = {
|
||||||
|
com.apple.Sandbox = {
|
||||||
|
enabled = 1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
33CC111A2044C6BA0003C045 = {
|
||||||
|
CreatedOnToolsVersion = 9.2;
|
||||||
|
ProvisioningStyle = Manual;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */;
|
||||||
|
compatibilityVersion = "Xcode 9.3";
|
||||||
|
developmentRegion = en;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
Base,
|
||||||
|
);
|
||||||
|
mainGroup = 33CC10E42044A3C60003C045;
|
||||||
|
productRefGroup = 33CC10EE2044A3C60003C045 /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
33CC10EC2044A3C60003C045 /* Runner */,
|
||||||
|
331C80D4294CF70F00263BE5 /* RunnerTests */,
|
||||||
|
33CC111A2044C6BA0003C045 /* Flutter Assemble */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
331C80D3294CF70F00263BE5 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
33CC10EB2044A3C60003C045 /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */,
|
||||||
|
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
|
3399D490228B24CF009A79C7 /* ShellScript */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
alwaysOutOfDate = 1;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n";
|
||||||
|
};
|
||||||
|
33CC111E2044C6BF0003C045 /* ShellScript */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
Flutter/ephemeral/FlutterInputs.xcfilelist,
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
Flutter/ephemeral/tripwire,
|
||||||
|
);
|
||||||
|
outputFileListPaths = (
|
||||||
|
Flutter/ephemeral/FlutterOutputs.xcfilelist,
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
|
||||||
|
};
|
||||||
|
363501C3C5FBD2A2F8FB592B /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
CD28D5F681770A4E0D907113 /* [CP] Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
||||||
|
);
|
||||||
|
name = "[CP] Embed Pods Frameworks";
|
||||||
|
outputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
DA7402F5EDD540C7F2F60277 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
331C80D1294CF70F00263BE5 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
33CC10E92044A3C60003C045 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */,
|
||||||
|
33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */,
|
||||||
|
335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXTargetDependency section */
|
||||||
|
331C80DA294CF71000263BE5 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 33CC10EC2044A3C60003C045 /* Runner */;
|
||||||
|
targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
33CC11202044C79F0003C045 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */;
|
||||||
|
targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
|
/* Begin PBXVariantGroup section */
|
||||||
|
33CC10F42044A3C60003C045 /* MainMenu.xib */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
33CC10F52044A3C60003C045 /* Base */,
|
||||||
|
);
|
||||||
|
name = MainMenu.xib;
|
||||||
|
path = Runner;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXVariantGroup section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
331C80DB294CF71000263BE5 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = D85BC6492C8C15B32415CC89 /* Pods-RunnerTests.debug.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = net.imbenji.protoPortal.RunnerTests;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/proto_portal.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/proto_portal";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
331C80DC294CF71000263BE5 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 6173B9E0EEE5AC22E1A99CC0 /* Pods-RunnerTests.release.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = net.imbenji.protoPortal.RunnerTests;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/proto_portal.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/proto_portal";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
331C80DD294CF71000263BE5 /* Profile */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 0DC929C925027362B6BE92F7 /* Pods-RunnerTests.profile.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
MARKETING_VERSION = 1.0;
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = net.imbenji.protoPortal.RunnerTests;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/proto_portal.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/proto_portal";
|
||||||
|
};
|
||||||
|
name = Profile;
|
||||||
|
};
|
||||||
|
338D0CE9231458BD00FA5F75 /* Profile */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "-";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEAD_CODE_STRIPPING = YES;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
SDKROOT = macosx;
|
||||||
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||||
|
};
|
||||||
|
name = Profile;
|
||||||
|
};
|
||||||
|
338D0CEA231458BD00FA5F75 /* Profile */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/../Frameworks",
|
||||||
|
);
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
};
|
||||||
|
name = Profile;
|
||||||
|
};
|
||||||
|
338D0CEB231458BD00FA5F75 /* Profile */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Manual;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
};
|
||||||
|
name = Profile;
|
||||||
|
};
|
||||||
|
33CC10F92044A3C60003C045 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "-";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEAD_CODE_STRIPPING = YES;
|
||||||
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
|
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
SDKROOT = macosx;
|
||||||
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
33CC10FA2044A3C60003C045 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||||
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
|
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
|
CODE_SIGN_IDENTITY = "-";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
DEAD_CODE_STRIPPING = YES;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.15;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
SDKROOT = macosx;
|
||||||
|
SWIFT_COMPILATION_MODE = wholemodule;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
33CC10FC2044A3C60003C045 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/../Frameworks",
|
||||||
|
);
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
33CC10FD2044A3C60003C045 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements;
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/../Frameworks",
|
||||||
|
);
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
33CC111C2044C6BA0003C045 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Manual;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
33CC111D2044C6BA0003C045 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
331C80DB294CF71000263BE5 /* Debug */,
|
||||||
|
331C80DC294CF71000263BE5 /* Release */,
|
||||||
|
331C80DD294CF71000263BE5 /* Profile */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
33CC10F92044A3C60003C045 /* Debug */,
|
||||||
|
33CC10FA2044A3C60003C045 /* Release */,
|
||||||
|
338D0CE9231458BD00FA5F75 /* Profile */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
33CC10FC2044A3C60003C045 /* Debug */,
|
||||||
|
33CC10FD2044A3C60003C045 /* Release */,
|
||||||
|
338D0CEA231458BD00FA5F75 /* Profile */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
33CC111C2044C6BA0003C045 /* Debug */,
|
||||||
|
33CC111D2044C6BA0003C045 /* Release */,
|
||||||
|
338D0CEB231458BD00FA5F75 /* Profile */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = 33CC10E52044A3C60003C045 /* Project object */;
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>IDEDidComputeMac32BitWarning</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1510"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
|
BuildableName = "proto_portal.app"
|
||||||
|
BlueprintName = "Runner"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
|
BuildableName = "proto_portal.app"
|
||||||
|
BlueprintName = "Runner"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO"
|
||||||
|
parallelizable = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "331C80D4294CF70F00263BE5"
|
||||||
|
BuildableName = "RunnerTests.xctest"
|
||||||
|
BlueprintName = "RunnerTests"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
enableGPUValidationMode = "1"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
|
BuildableName = "proto_portal.app"
|
||||||
|
BlueprintName = "Runner"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Profile"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "33CC10EC2044A3C60003C045"
|
||||||
|
BuildableName = "proto_portal.app"
|
||||||
|
BlueprintName = "Runner"
|
||||||
|
ReferencedContainer = "container:Runner.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
||||||
10
macos/Runner.xcworkspace/contents.xcworkspacedata
generated
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "group:Runner.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
<FileRef
|
||||||
|
location = "group:Pods/Pods.xcodeproj">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>IDEDidComputeMac32BitWarning</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
13
macos/Runner/AppDelegate.swift
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import Cocoa
|
||||||
|
import FlutterMacOS
|
||||||
|
|
||||||
|
@main
|
||||||
|
class AppDelegate: FlutterAppDelegate {
|
||||||
|
override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"size" : "16x16",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "app_icon_16.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "16x16",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "app_icon_32.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "32x32",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "app_icon_32.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "32x32",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "app_icon_64.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "128x128",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "app_icon_128.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "128x128",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "app_icon_256.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "256x256",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "app_icon_256.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "256x256",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "app_icon_512.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "512x512",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "app_icon_512.png",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size" : "512x512",
|
||||||
|
"idiom" : "mac",
|
||||||
|
"filename" : "app_icon_1024.png",
|
||||||
|
"scale" : "2x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 101 KiB |
BIN
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
BIN
macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png
Normal file
|
After Width: | Height: | Size: 520 B |