From 5b90fc0c30a458db9efb3213a61f2990771decce Mon Sep 17 00:00:00 2001 From: zaelgohary Date: Thu, 18 Sep 2025 14:40:56 +0300 Subject: [PATCH 01/22] Add tray icon and close-to-tray behavior in macOS/Windows, keep VPN running when UI closes and resync UI on relaunch in android, keep tunnel running when UI terminates and resync UI on relaunch in ios, sync UI with native tunnel status on init/resume in flutter --- .../tech/threefold/mycelium/MainActivity.kt | 27 +++- .../tech/threefold/mycelium/TunService.kt | 16 +++ ios/Runner/AppDelegate.swift | 29 ++++- lib/main.dart | 120 ++++++++++++++++-- macos/Flutter/GeneratedPluginRegistrant.swift | 6 + pubspec.lock | 80 ++++++++++++ pubspec.yaml | 3 + .../flutter/generated_plugin_registrant.cc | 9 ++ windows/flutter/generated_plugins.cmake | 3 + 9 files changed, 277 insertions(+), 16 deletions(-) diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt index 161cdcd..d7fb8f7 100644 --- a/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt @@ -5,6 +5,7 @@ import android.app.Activity import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.content.SharedPreferences import android.content.IntentFilter import android.net.VpnService import android.os.Build @@ -27,9 +28,11 @@ class MainActivity: FlutterActivity() { private var vpnPermissionSecretKey: ByteArray? = null private lateinit var channel : MethodChannel + private lateinit var prefs: SharedPreferences override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) + prefs = getSharedPreferences("mycelium_prefs", MODE_PRIVATE) channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, channelName) channel.setMethodCallHandler { // This method is invoked on the main thread. @@ -56,6 +59,17 @@ class MainActivity: FlutterActivity() { Log.d(tag, "stopping VPN") result.success(stopCmdSent) } + "queryStatus" -> { + // Immediately report last known state while also querying the service + val running = prefs.getBoolean("mycelium_running", false) + if (running) { + channel.invokeMethod("notifyMyceliumStarted","") + } else { + channel.invokeMethod("notifyMyceliumFinished","") + } + queryStatus() + result.success(true) + } else -> result.notImplemented() } } @@ -69,6 +83,9 @@ class MainActivity: FlutterActivity() { TunService.EVENT_MYCELIUM_FINISHED -> { channel.invokeMethod("notifyMyceliumFinished","") } + TunService.EVENT_MYCELIUM_RUNNING -> { + channel.invokeMethod("notifyMyceliumStarted", "") + } TunService.EVENT_MYCELIUM_FAILED -> { channel.invokeMethod("notifyMyceliumFailed", "") } @@ -129,6 +146,12 @@ class MainActivity: FlutterActivity() { return true } + private fun queryStatus() { + val intent = Intent(this, TunService::class.java) + intent.action = TunService.ACTION_QUERY + startService(intent) + } + @SuppressLint("UnspecifiedRegisterReceiverFlag", "WrongConstant") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -177,10 +200,6 @@ class MainActivity: FlutterActivity() { override fun onDestroy() { Log.e(tag, "onDestroy") - - Log.i(tag, "onDestroy:Stopping VPN service") - stopVpn() - super.onDestroy() // Activity is about to be destroyed. diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt index de09d69..5a635af 100644 --- a/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt @@ -1,6 +1,8 @@ package tech.threefold.mycelium import android.content.Intent +import android.content.Context +import android.content.SharedPreferences import android.net.VpnService import android.os.ParcelFileDescriptor import android.system.OsConstants @@ -20,13 +22,16 @@ class TunService : VpnService(), CoroutineScope { companion object { const val ACTION_START = "tech.threefold.mycelium.TunService.START" const val ACTION_STOP = "tech.threefold.mycelium.TunService.STOP" + const val ACTION_QUERY = "tech.threefold.mycelium.TunService.QUERY" const val EVENT_INTENT = "tech.threefold.mycelium.TunService.EVENT" const val EVENT_MYCELIUM_FAILED = "mycelium_failed" const val EVENT_MYCELIUM_FINISHED = "mycelium_finished" + const val EVENT_MYCELIUM_RUNNING = "mycelium_running" } private var started = AtomicBoolean() private var parcel: ParcelFileDescriptor? = null + private lateinit var prefs: SharedPreferences private val job = Job() @@ -36,6 +41,7 @@ class TunService : VpnService(), CoroutineScope { override fun onCreate() { Log.d(tag, "tun service created") super.onCreate() + prefs = getSharedPreferences("mycelium_prefs", Context.MODE_PRIVATE) } override fun onDestroy() { @@ -63,6 +69,14 @@ class TunService : VpnService(), CoroutineScope { start(peers.toList(), secretKey) START_STICKY } + ACTION_QUERY -> { + if (started.get()) { + sendMyceliumEvent(EVENT_MYCELIUM_RUNNING) + } else { + sendMyceliumEvent(EVENT_MYCELIUM_FINISHED) + } + START_NOT_STICKY + } else -> { Log.e(tag, "unknown command") @@ -75,6 +89,7 @@ class TunService : VpnService(), CoroutineScope { if (!started.compareAndSet(false, true)) { return 0 } + prefs.edit().putBoolean("mycelium_running", true).apply() val nodeAddress = addressFromSecretKey(secretKey) Log.i(tag, "creating TUN device with node address: $nodeAddress") @@ -127,6 +142,7 @@ class TunService : VpnService(), CoroutineScope { Log.d(tag, "got stop when not started") return } + prefs.edit().putBoolean("mycelium_running", false).apply() if (stopMycelium) { stopMycelium() } diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index c0ad808..4ce086b 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -60,6 +60,9 @@ import OSLog self.flutterTunnelStatus = .stopped self.stopMycelium() result(true) + case "queryStatus": + self.queryStatus() + result(true) default: result(FlutterMethodNotImplemented) } @@ -76,7 +79,6 @@ import OSLog override func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. // Insert code here to handle when the app is about to terminate - self.stopMycelium() super.applicationWillTerminate(application) } @@ -227,6 +229,31 @@ import OSLog self.vpnManager?.connection.stopVPNTunnel() } + func queryStatus() { + NETunnelProviderManager.loadAllFromPreferences { (providers: [NETunnelProviderManager]?, error: Error?) in + if let error = error { + errlog("queryStatus loadAllFromPref failed:" + error.localizedDescription) + self.flutterChannel?.invokeMethod("notifyMyceliumFinished", arguments: nil) + return + } + guard let providers = providers else { + self.flutterChannel?.invokeMethod("notifyMyceliumFinished", arguments: nil) + return + } + let myProvider = providers.first(where: { $0.protocolConfiguration?.serverAddress==self.vpnServerAddress }) + if let vpnManager = myProvider { + switch vpnManager.connection.status { + case .connected, .connecting, .reasserting: + self.flutterChannel?.invokeMethod("notifyMyceliumStarted", arguments: nil) + default: + self.flutterChannel?.invokeMethod("notifyMyceliumFinished", arguments: nil) + } + } else { + self.flutterChannel?.invokeMethod("notifyMyceliumFinished", arguments: nil) + } + } + } + /* TODO: add some handlers to below func func applicationWillResignActive(_ application: UIApplication) { diff --git a/lib/main.dart b/lib/main.dart index da2fe39..67f6b81 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -7,7 +7,8 @@ import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; import 'package:logging/logging.dart'; import 'package:flutter_desktop_sleep/flutter_desktop_sleep.dart'; -import 'package:flutter_window_close/flutter_window_close.dart'; +import 'package:tray_manager/tray_manager.dart'; +import 'package:window_manager/window_manager.dart'; import 'myceliumflut_ffi_binding.dart'; @@ -45,7 +46,7 @@ class MyApp extends StatefulWidget { State createState() => _MyAppState(); } -class _MyAppState extends State { +class _MyAppState extends State with TrayListener, WindowListener, WidgetsBindingObserver { static const platform = MethodChannel("tech.threefold.mycelium/tun"); String _nodeAddr = ''; var privKey = Uint8List(0); @@ -58,6 +59,7 @@ class _MyAppState extends State { void initState() { textEditController = TextEditingController(text: ''); super.initState(); + WidgetsBinding.instance.addObserver(this); initPlatformState(); platform.setMethodCallHandler((MethodCall call) async { methodHandler(call.method); @@ -87,16 +89,32 @@ class _MyAppState extends State { } }); - // only for windows because macos already has own handler - if (Platform.isWindows) { - FlutterWindowClose.setWindowShouldCloseHandler(() async { - _logger.info("Window close handler"); - if (_isStarted) { - stopMycelium(); - } - return true; - }); + _initDesktopLifecycle(); + } + + Future _initDesktopLifecycle() async { + if (!(Platform.isMacOS || Platform.isWindows)) { + return; } + + await windowManager.ensureInitialized(); + windowManager.addListener(this); + await windowManager.setPreventClose(true); + + trayManager.addListener(this); + await trayManager.setIcon('assets/images/mycelium_icon.png'); + final items = [ + MenuItem(key: 'show', label: 'Show Window'), + MenuItem(key: 'hide', label: 'Hide Window'), + MenuItem.separator(), + MenuItem(key: 'toggle', label: 'Start/Stop Mycelium'), + MenuItem.separator(), + MenuItem(key: 'quit', label: 'Quit'), + ]; + await trayManager.setContextMenu(Menu(items: items)); + + // Optional: start minimized to tray when app launches on desktop + // await windowManager.hide(); } void methodHandler(String methodName) { @@ -172,6 +190,15 @@ class _MyAppState extends State { setState(() { _nodeAddr = nodeAddr; }); + + // Query native layer for current VPN status to sync UI + if (!isUseDylib()) { + try { + await platform.invokeMethod('queryStatus'); + } catch (e) { + _logger.warning("queryStatus not implemented: $e"); + } + } } // start/stop mycelium button variables @@ -187,6 +214,11 @@ class _MyAppState extends State { void dispose() { // Clean up the controller when the widget is disposed. textEditController.dispose(); + if (Platform.isMacOS || Platform.isWindows) { + windowManager.removeListener(this); + trayManager.removeListener(this); + } + WidgetsBinding.instance.removeObserver(this); super.dispose(); } @@ -374,6 +406,17 @@ class _MyAppState extends State { ); } + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (state == AppLifecycleState.resumed) { + if (!isUseDylib()) { + platform.invokeMethod('queryStatus').catchError((e) { + _logger.warning("queryStatus on resume failed: $e"); + }); + } + } + } + void startMycelium() { if (_isStarted) { _logger.warning("Mycelium already started"); @@ -487,6 +530,61 @@ class _MyAppState extends State { isRestartVisible = true; }); } + // Window lifecycle handlers + @override + void onWindowClose() async { + // Intercept close to keep app running in tray + await windowManager.hide(); + } + + // Tray handlers + @override + void onTrayIconMouseDown() async { + if (await windowManager.isVisible()) { + await windowManager.hide(); + } else { + await windowManager.show(); + await windowManager.focus(); + } + } + + @override + void onTrayMenuItemClick(MenuItem menuItem) async { + switch (menuItem.key) { + case 'show': + await windowManager.show(); + await windowManager.focus(); + break; + case 'hide': + await windowManager.hide(); + break; + case 'toggle': + if (!_isStarted) { + startMycelium(); + } else { + stopMycelium(); + } + break; + case 'quit': + if (_isStarted) { + stopMycelium(); + } + // Give a brief moment for stop to propagate + await Future.delayed(const Duration(milliseconds: 200)); + // Terminate application + if (Platform.isMacOS) { + // Use existing plugin to terminate if available + try { + _flutterDesktopSleepPlugin.terminateApp(); + } catch (_) { + exit(0); + } + } else { + exit(0); + } + break; + } + } } double physicalPxToLogicalPx(BuildContext context, double physicalPx) { diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 4a9bd05..fac8422 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -8,9 +8,15 @@ import Foundation import flutter_desktop_sleep import flutter_window_close import path_provider_foundation +import screen_retriever_macos +import tray_manager +import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FlutterDesktopSleepPlugin.register(with: registry.registrar(forPlugin: "FlutterDesktopSleepPlugin")) FlutterWindowClosePlugin.register(with: registry.registrar(forPlugin: "FlutterWindowClosePlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) + TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin")) + WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index aa97a70..dab95a2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -207,6 +207,14 @@ packages: description: flutter source: sdk version: "0.0.0" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + url: "https://pub.dev" + source: hosted + version: "4.9.0" leak_tracker: dependency: transitive description: @@ -263,6 +271,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.11.1" + menu_base: + dependency: transitive + description: + name: menu_base + sha256: "820368014a171bd1241030278e6c2617354f492f5c703d7b7d4570a6b8b84405" + url: "https://pub.dev" + source: hosted + version: "0.1.1" meta: dependency: transitive description: @@ -359,6 +375,54 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.2" + screen_retriever: + dependency: transitive + description: + name: screen_retriever + sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_linux: + dependency: transitive + description: + name: screen_retriever_linux + sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_macos: + dependency: transitive + description: + name: screen_retriever_macos + sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_platform_interface: + dependency: transitive + description: + name: screen_retriever_platform_interface + sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_windows: + dependency: transitive + description: + name: screen_retriever_windows + sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + shortid: + dependency: transitive + description: + name: shortid + sha256: d0b40e3dbb50497dad107e19c54ca7de0d1a274eb9b4404991e443dadb9ebedb + url: "https://pub.dev" + source: hosted + version: "0.1.2" sky_engine: dependency: transitive description: flutter @@ -420,6 +484,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.3" + tray_manager: + dependency: "direct main" + description: + name: tray_manager + sha256: bdc3ac6c36f3d12d871459e4a9822705ce5a1165a17fa837103bc842719bf3f7 + url: "https://pub.dev" + source: hosted + version: "0.2.4" typed_data: dependency: transitive description: @@ -460,6 +532,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.4" + window_manager: + dependency: "direct main" + description: + name: window_manager + sha256: "732896e1416297c63c9e3fb95aea72d0355f61390263982a47fd519169dc5059" + url: "https://pub.dev" + source: hosted + version: "0.4.3" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index f5c01b8..6565905 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -42,6 +42,8 @@ dependencies: path: 1.9.0 ffi: 2.1.3 flutter_window_close: ^1.2.0 + tray_manager: ^0.2.3 + window_manager: ^0.4.2 dev_dependencies: flutter_test: @@ -75,6 +77,7 @@ flutter: - assets/images/mycelium_top.svg - assets/images/mycelium_top.png - assets/dll/winmycelium.dll + - assets/images/mycelium_icon.png # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index f7b19c3..cfd9569 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -8,10 +8,19 @@ #include #include +#include +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { FlutterDesktopSleepPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterDesktopSleepPluginCApi")); FlutterWindowClosePluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterWindowClosePlugin")); + ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi")); + TrayManagerPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("TrayManagerPlugin")); + WindowManagerPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("WindowManagerPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 4f6d1f5..ffa7675 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -5,6 +5,9 @@ list(APPEND FLUTTER_PLUGIN_LIST flutter_desktop_sleep flutter_window_close + screen_retriever_windows + tray_manager + window_manager ) list(APPEND FLUTTER_FFI_PLUGIN_LIST From edc90aa4da6286abee66cf5635ce250be1465fff Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Fri, 19 Sep 2025 22:34:57 +0300 Subject: [PATCH 02/22] some fixes --- .../tech/threefold/mycelium/MainActivity.kt | 21 + .../tech/threefold/mycelium/TunService.kt | 10 +- .../mycelium/rust/uniffi/mycelmob/mycelmob.kt | 90 + ios/Runner/AppDelegate.swift | 26 +- ios/Runner/mycelmob.swift | 594 +++++++ lib/features/home/home_screen.dart | 7 +- lib/myceliumflut_ffi_binding.dart | 188 ++- lib/services/ffi/mycelium_service.dart | 14 +- macos/Runner/MainFlutterWindow.swift | 25 + macos/Runner/mycelmob.swift | 286 ++-- mycelffi/src/lib.rs | 61 +- mycelmob/Cargo.lock | 1462 ++++++++++++++--- pubspec.lock | 16 + 13 files changed, 2330 insertions(+), 470 deletions(-) create mode 100644 ios/Runner/mycelmob.swift diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt index b8f28da..e7ea012 100644 --- a/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt @@ -16,6 +16,8 @@ import io.flutter.plugin.common.MethodChannel import tech.threefold.mycelium.rust.uniffi.mycelmob.addressFromSecretKey import tech.threefold.mycelium.rust.uniffi.mycelmob.generateSecretKey import tech.threefold.mycelium.rust.uniffi.mycelmob.getPeerStatus +import tech.threefold.mycelium.rust.uniffi.mycelmob.proxyConnect +import tech.threefold.mycelium.rust.uniffi.mycelmob.proxyDisconnect private const val tag = "[Myceliumflut]" @@ -66,6 +68,25 @@ class MainActivity: FlutterActivity() { result.error("PEER_STATUS_ERROR", e.message, null) } } + "proxyConnect" -> { + try { + val remote = call.argument("remote") ?: "" + val proxyResult = proxyConnect(remote) + result.success(proxyResult) + } catch (e: Exception) { + Log.e(tag, "Error in proxyConnect: ${e.message}") + result.error("PROXY_CONNECT_ERROR", e.message, null) + } + } + "proxyDisconnect" -> { + try { + val proxyResult = proxyDisconnect() + result.success(proxyResult) + } catch (e: Exception) { + Log.e(tag, "Error in proxyDisconnect: ${e.message}") + result.error("PROXY_DISCONNECT_ERROR", e.message, null) + } + } else -> result.notImplemented() } } diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt index de09d69..9a3bc45 100644 --- a/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt @@ -81,11 +81,13 @@ class TunService : VpnService(), CoroutineScope { val builder = Builder() .addAddress(nodeAddress, 64) .addRoute("400::", 7) - .allowBypass() + .addDnsServer("8.8.8.8") + .addDnsServer("8.8.4.4") + .addDnsServer("2001:4860:4860::8888") + .addDnsServer("2001:4860:4860::8844") .allowFamily(OsConstants.AF_INET) - //.allowFamily(OsConstants.AF_INET6) - //.setBlocking(true) - //.setMtu(1400) + .allowFamily(OsConstants.AF_INET6) + .setMtu(1420) .setSession("mycelium") diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/rust/uniffi/mycelmob/mycelmob.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/rust/uniffi/mycelmob/mycelmob.kt index 68d87e2..89875f9 100644 --- a/android/app/src/main/kotlin/tech/threefold/mycelium/rust/uniffi/mycelmob/mycelmob.kt +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/rust/uniffi/mycelmob/mycelmob.kt @@ -714,6 +714,16 @@ internal interface UniffiForeignFutureCompleteVoid : com.sun.jna.Callback { + + + + + + + + + + @@ -750,10 +760,20 @@ internal interface UniffiLib : Library { ): Int fun uniffi_mycelmob_fn_func_hello_mycelios(uniffi_out_err: UniffiRustCallStatus, ): RustBuffer.ByValue + fun uniffi_mycelmob_fn_func_list_proxies(uniffi_out_err: UniffiRustCallStatus, + ): RustBuffer.ByValue + fun uniffi_mycelmob_fn_func_proxy_connect(`remote`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, + ): RustBuffer.ByValue + fun uniffi_mycelmob_fn_func_proxy_disconnect(uniffi_out_err: UniffiRustCallStatus, + ): RustBuffer.ByValue fun uniffi_mycelmob_fn_func_start_mycelium(`peers`: RustBuffer.ByValue,`tunFd`: Int,`secretKey`: RustBuffer.ByValue,uniffi_out_err: UniffiRustCallStatus, ): Unit + fun uniffi_mycelmob_fn_func_start_proxy_probe(uniffi_out_err: UniffiRustCallStatus, + ): RustBuffer.ByValue fun uniffi_mycelmob_fn_func_stop_mycelium(uniffi_out_err: UniffiRustCallStatus, ): Unit + fun uniffi_mycelmob_fn_func_stop_proxy_probe(uniffi_out_err: UniffiRustCallStatus, + ): RustBuffer.ByValue fun ffi_mycelmob_rustbuffer_alloc(`size`: Long,uniffi_out_err: UniffiRustCallStatus, ): RustBuffer.ByValue fun ffi_mycelmob_rustbuffer_from_bytes(`bytes`: ForeignBytes.ByValue,uniffi_out_err: UniffiRustCallStatus, @@ -876,10 +896,20 @@ internal interface UniffiLib : Library { ): Short fun uniffi_mycelmob_checksum_func_hello_mycelios( ): Short + fun uniffi_mycelmob_checksum_func_list_proxies( + ): Short + fun uniffi_mycelmob_checksum_func_proxy_connect( + ): Short + fun uniffi_mycelmob_checksum_func_proxy_disconnect( + ): Short fun uniffi_mycelmob_checksum_func_start_mycelium( ): Short + fun uniffi_mycelmob_checksum_func_start_proxy_probe( + ): Short fun uniffi_mycelmob_checksum_func_stop_mycelium( ): Short + fun uniffi_mycelmob_checksum_func_stop_proxy_probe( + ): Short fun ffi_mycelmob_uniffi_contract_version( ): Int @@ -912,12 +942,27 @@ private fun uniffiCheckApiChecksums(lib: UniffiLib) { if (lib.uniffi_mycelmob_checksum_func_hello_mycelios() != 48239.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_mycelmob_checksum_func_list_proxies() != 65480.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_mycelmob_checksum_func_proxy_connect() != 60646.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_mycelmob_checksum_func_proxy_disconnect() != 62431.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_mycelmob_checksum_func_start_mycelium() != 61012.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_mycelmob_checksum_func_start_proxy_probe() != 23502.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_mycelmob_checksum_func_stop_mycelium() != 28488.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_mycelmob_checksum_func_stop_proxy_probe() != 19306.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } } // Async support @@ -1135,6 +1180,33 @@ public object FfiConverterSequenceString: FfiConverterRustBuffer { + return FfiConverterSequenceString.lift( + uniffiRustCall() { _status -> + UniffiLib.INSTANCE.uniffi_mycelmob_fn_func_list_proxies( + _status) +} + ) + } + + fun `proxyConnect`(`remote`: kotlin.String): List { + return FfiConverterSequenceString.lift( + uniffiRustCall() { _status -> + UniffiLib.INSTANCE.uniffi_mycelmob_fn_func_proxy_connect( + FfiConverterString.lower(`remote`),_status) +} + ) + } + + fun `proxyDisconnect`(): List { + return FfiConverterSequenceString.lift( + uniffiRustCall() { _status -> + UniffiLib.INSTANCE.uniffi_mycelmob_fn_func_proxy_disconnect( + _status) +} + ) + } + fun `startMycelium`(`peers`: List, `tunFd`: kotlin.Int, `secretKey`: kotlin.ByteArray) = uniffiRustCall() { _status -> @@ -1143,6 +1215,15 @@ public object FfiConverterSequenceString: FfiConverterRustBuffer { + return FfiConverterSequenceString.lift( + uniffiRustCall() { _status -> + UniffiLib.INSTANCE.uniffi_mycelmob_fn_func_start_proxy_probe( + _status) +} + ) + } + fun `stopMycelium`() = uniffiRustCall() { _status -> @@ -1151,5 +1232,14 @@ public object FfiConverterSequenceString: FfiConverterRustBuffer { + return FfiConverterSequenceString.lift( + uniffiRustCall() { _status -> + UniffiLib.INSTANCE.uniffi_mycelmob_fn_func_stop_proxy_probe( + _status) +} + ) + } + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 5f970b5..2eb5131 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -61,8 +61,30 @@ import OSLog self.stopMycelium() result(true) case "getPeerStatus": - let peerStatus = getPeerStatus() - result(peerStatus) + do { + let peerStatus = getPeerStatus() + result(peerStatus) + } catch { + debuglog("Error getting peer status: \(error.localizedDescription)") + result(FlutterError(code: "PEER_STATUS_ERROR", message: error.localizedDescription, details: nil)) + } + case "proxyConnect": + do { + let remote = call.arguments as? String ?? "" + let proxyResult = proxyConnect(remote: remote) + result(proxyResult) + } catch { + debuglog("Error in proxyConnect: \(error.localizedDescription)") + result(FlutterError(code: "PROXY_CONNECT_ERROR", message: error.localizedDescription, details: nil)) + } + case "proxyDisconnect": + do { + let proxyResult = proxyDisconnect() + result(proxyResult) + } catch { + debuglog("Error in proxyDisconnect: \(error.localizedDescription)") + result(FlutterError(code: "PROXY_DISCONNECT_ERROR", message: error.localizedDescription, details: nil)) + } default: result(FlutterMethodNotImplemented) } diff --git a/ios/Runner/mycelmob.swift b/ios/Runner/mycelmob.swift new file mode 100644 index 0000000..66a2fc8 --- /dev/null +++ b/ios/Runner/mycelmob.swift @@ -0,0 +1,594 @@ +// This file was autogenerated by some hot garbage in the `uniffi` crate. +// Trust me, you don't want to mess with it! + +// swiftlint:disable all +import Foundation + +// Depending on the consumer's build setup, the low-level FFI code +// might be in a separate module, or it might be compiled inline into +// this module. This is a bit of light hackery to work with both. +#if canImport(mycelmobFFI) +import mycelmobFFI +#endif + +fileprivate extension RustBuffer { + // Allocate a new buffer, copying the contents of a `UInt8` array. + init(bytes: [UInt8]) { + let rbuf = bytes.withUnsafeBufferPointer { ptr in + RustBuffer.from(ptr) + } + self.init(capacity: rbuf.capacity, len: rbuf.len, data: rbuf.data) + } + + static func empty() -> RustBuffer { + RustBuffer(capacity: 0, len:0, data: nil) + } + + static func from(_ ptr: UnsafeBufferPointer) -> RustBuffer { + try! rustCall { ffi_mycelmob_rustbuffer_from_bytes(ForeignBytes(bufferPointer: ptr), $0) } + } + + // Frees the buffer in place. + // The buffer must not be used after this is called. + func deallocate() { + try! rustCall { ffi_mycelmob_rustbuffer_free(self, $0) } + } +} + +fileprivate extension ForeignBytes { + init(bufferPointer: UnsafeBufferPointer) { + self.init(len: Int32(bufferPointer.count), data: bufferPointer.baseAddress) + } +} + +// For every type used in the interface, we provide helper methods for conveniently +// lifting and lowering that type from C-compatible data, and for reading and writing +// values of that type in a buffer. + +// Helper classes/extensions that don't change. +// Someday, this will be in a library of its own. + +fileprivate extension Data { + init(rustBuffer: RustBuffer) { + self.init( + bytesNoCopy: rustBuffer.data!, + count: Int(rustBuffer.len), + deallocator: .none + ) + } +} + +// Define reader functionality. Normally this would be defined in a class or +// struct, but we use standalone functions instead in order to make external +// types work. +// +// With external types, one swift source file needs to be able to call the read +// method on another source file's FfiConverter, but then what visibility +// should Reader have? +// - If Reader is fileprivate, then this means the read() must also +// be fileprivate, which doesn't work with external types. +// - If Reader is internal/public, we'll get compile errors since both source +// files will try define the same type. +// +// Instead, the read() method and these helper functions input a tuple of data + +fileprivate func createReader(data: Data) -> (data: Data, offset: Data.Index) { + (data: data, offset: 0) +} + +// Reads an integer at the current offset, in big-endian order, and advances +// the offset on success. Throws if reading the integer would move the +// offset past the end of the buffer. +fileprivate func readInt(_ reader: inout (data: Data, offset: Data.Index)) throws -> T { + let range = reader.offset...size + guard reader.data.count >= range.upperBound else { + throw UniffiInternalError.bufferOverflow + } + if T.self == UInt8.self { + let value = reader.data[reader.offset] + reader.offset += 1 + return value as! T + } + var value: T = 0 + let _ = withUnsafeMutableBytes(of: &value, { reader.data.copyBytes(to: $0, from: range)}) + reader.offset = range.upperBound + return value.bigEndian +} + +// Reads an arbitrary number of bytes, to be used to read +// raw bytes, this is useful when lifting strings +fileprivate func readBytes(_ reader: inout (data: Data, offset: Data.Index), count: Int) throws -> Array { + let range = reader.offset..<(reader.offset+count) + guard reader.data.count >= range.upperBound else { + throw UniffiInternalError.bufferOverflow + } + var value = [UInt8](repeating: 0, count: count) + value.withUnsafeMutableBufferPointer({ buffer in + reader.data.copyBytes(to: buffer, from: range) + }) + reader.offset = range.upperBound + return value +} + +// Reads a float at the current offset. +fileprivate func readFloat(_ reader: inout (data: Data, offset: Data.Index)) throws -> Float { + return Float(bitPattern: try readInt(&reader)) +} + +// Reads a float at the current offset. +fileprivate func readDouble(_ reader: inout (data: Data, offset: Data.Index)) throws -> Double { + return Double(bitPattern: try readInt(&reader)) +} + +// Indicates if the offset has reached the end of the buffer. +fileprivate func hasRemaining(_ reader: (data: Data, offset: Data.Index)) -> Bool { + return reader.offset < reader.data.count +} + +// Define writer functionality. Normally this would be defined in a class or +// struct, but we use standalone functions instead in order to make external +// types work. See the above discussion on Readers for details. + +fileprivate func createWriter() -> [UInt8] { + return [] +} + +fileprivate func writeBytes(_ writer: inout [UInt8], _ byteArr: S) where S: Sequence, S.Element == UInt8 { + writer.append(contentsOf: byteArr) +} + +// Writes an integer in big-endian order. +// +// Warning: make sure what you are trying to write +// is in the correct type! +fileprivate func writeInt(_ writer: inout [UInt8], _ value: T) { + var value = value.bigEndian + withUnsafeBytes(of: &value) { writer.append(contentsOf: $0) } +} + +fileprivate func writeFloat(_ writer: inout [UInt8], _ value: Float) { + writeInt(&writer, value.bitPattern) +} + +fileprivate func writeDouble(_ writer: inout [UInt8], _ value: Double) { + writeInt(&writer, value.bitPattern) +} + +// Protocol for types that transfer other types across the FFI. This is +// analogous to the Rust trait of the same name. +fileprivate protocol FfiConverter { + associatedtype FfiType + associatedtype SwiftType + + static func lift(_ value: FfiType) throws -> SwiftType + static func lower(_ value: SwiftType) -> FfiType + static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> SwiftType + static func write(_ value: SwiftType, into buf: inout [UInt8]) +} + +// Types conforming to `Primitive` pass themselves directly over the FFI. +fileprivate protocol FfiConverterPrimitive: FfiConverter where FfiType == SwiftType { } + +extension FfiConverterPrimitive { +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public static func lift(_ value: FfiType) throws -> SwiftType { + return value + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public static func lower(_ value: SwiftType) -> FfiType { + return value + } +} + +// Types conforming to `FfiConverterRustBuffer` lift and lower into a `RustBuffer`. +// Used for complex types where it's hard to write a custom lift/lower. +fileprivate protocol FfiConverterRustBuffer: FfiConverter where FfiType == RustBuffer {} + +extension FfiConverterRustBuffer { +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public static func lift(_ buf: RustBuffer) throws -> SwiftType { + var reader = createReader(data: Data(rustBuffer: buf)) + let value = try read(from: &reader) + if hasRemaining(reader) { + throw UniffiInternalError.incompleteData + } + buf.deallocate() + return value + } + +#if swift(>=5.8) + @_documentation(visibility: private) +#endif + public static func lower(_ value: SwiftType) -> RustBuffer { + var writer = createWriter() + write(value, into: &writer) + return RustBuffer(bytes: writer) + } +} +// An error type for FFI errors. These errors occur at the UniFFI level, not +// the library level. +fileprivate enum UniffiInternalError: LocalizedError { + case bufferOverflow + case incompleteData + case unexpectedOptionalTag + case unexpectedEnumCase + case unexpectedNullPointer + case unexpectedRustCallStatusCode + case unexpectedRustCallError + case unexpectedStaleHandle + case rustPanic(_ message: String) + + public var errorDescription: String? { + switch self { + case .bufferOverflow: return "Reading the requested value would read past the end of the buffer" + case .incompleteData: return "The buffer still has data after lifting its containing value" + case .unexpectedOptionalTag: return "Unexpected optional tag; should be 0 or 1" + case .unexpectedEnumCase: return "Raw enum value doesn't match any cases" + case .unexpectedNullPointer: return "Raw pointer value was null" + case .unexpectedRustCallStatusCode: return "Unexpected RustCallStatus code" + case .unexpectedRustCallError: return "CALL_ERROR but no errorClass specified" + case .unexpectedStaleHandle: return "The object in the handle map has been dropped already" + case let .rustPanic(message): return message + } + } +} + +fileprivate extension NSLock { + func withLock(f: () throws -> T) rethrows -> T { + self.lock() + defer { self.unlock() } + return try f() + } +} + +fileprivate let CALL_SUCCESS: Int8 = 0 +fileprivate let CALL_ERROR: Int8 = 1 +fileprivate let CALL_UNEXPECTED_ERROR: Int8 = 2 +fileprivate let CALL_CANCELLED: Int8 = 3 + +fileprivate extension RustCallStatus { + init() { + self.init( + code: CALL_SUCCESS, + errorBuf: RustBuffer.init( + capacity: 0, + len: 0, + data: nil + ) + ) + } +} + +private func rustCall(_ callback: (UnsafeMutablePointer) -> T) throws -> T { + let neverThrow: ((RustBuffer) throws -> Never)? = nil + return try makeRustCall(callback, errorHandler: neverThrow) +} + +private func rustCallWithError( + _ errorHandler: @escaping (RustBuffer) throws -> E, + _ callback: (UnsafeMutablePointer) -> T) throws -> T { + try makeRustCall(callback, errorHandler: errorHandler) +} + +private func makeRustCall( + _ callback: (UnsafeMutablePointer) -> T, + errorHandler: ((RustBuffer) throws -> E)? +) throws -> T { + uniffiEnsureInitialized() + var callStatus = RustCallStatus.init() + let returnedVal = callback(&callStatus) + try uniffiCheckCallStatus(callStatus: callStatus, errorHandler: errorHandler) + return returnedVal +} + +private func uniffiCheckCallStatus( + callStatus: RustCallStatus, + errorHandler: ((RustBuffer) throws -> E)? +) throws { + switch callStatus.code { + case CALL_SUCCESS: + return + + case CALL_ERROR: + if let errorHandler = errorHandler { + throw try errorHandler(callStatus.errorBuf) + } else { + callStatus.errorBuf.deallocate() + throw UniffiInternalError.unexpectedRustCallError + } + + case CALL_UNEXPECTED_ERROR: + // When the rust code sees a panic, it tries to construct a RustBuffer + // with the message. But if that code panics, then it just sends back + // an empty buffer. + if callStatus.errorBuf.len > 0 { + throw UniffiInternalError.rustPanic(try FfiConverterString.lift(callStatus.errorBuf)) + } else { + callStatus.errorBuf.deallocate() + throw UniffiInternalError.rustPanic("Rust panic") + } + + case CALL_CANCELLED: + fatalError("Cancellation not supported yet") + + default: + throw UniffiInternalError.unexpectedRustCallStatusCode + } +} + +private func uniffiTraitInterfaceCall( + callStatus: UnsafeMutablePointer, + makeCall: () throws -> T, + writeReturn: (T) -> () +) { + do { + try writeReturn(makeCall()) + } catch let error { + callStatus.pointee.code = CALL_UNEXPECTED_ERROR + callStatus.pointee.errorBuf = FfiConverterString.lower(String(describing: error)) + } +} + +private func uniffiTraitInterfaceCallWithError( + callStatus: UnsafeMutablePointer, + makeCall: () throws -> T, + writeReturn: (T) -> (), + lowerError: (E) -> RustBuffer +) { + do { + try writeReturn(makeCall()) + } catch let error as E { + callStatus.pointee.code = CALL_ERROR + callStatus.pointee.errorBuf = lowerError(error) + } catch { + callStatus.pointee.code = CALL_UNEXPECTED_ERROR + callStatus.pointee.errorBuf = FfiConverterString.lower(String(describing: error)) + } +} +fileprivate class UniffiHandleMap { + private var map: [UInt64: T] = [:] + private let lock = NSLock() + private var currentHandle: UInt64 = 1 + + func insert(obj: T) -> UInt64 { + lock.withLock { + let handle = currentHandle + currentHandle += 1 + map[handle] = obj + return handle + } + } + + func get(handle: UInt64) throws -> T { + try lock.withLock { + guard let obj = map[handle] else { + throw UniffiInternalError.unexpectedStaleHandle + } + return obj + } + } + + @discardableResult + func remove(handle: UInt64) throws -> T { + try lock.withLock { + guard let obj = map.removeValue(forKey: handle) else { + throw UniffiInternalError.unexpectedStaleHandle + } + return obj + } + } + + var count: Int { + get { + map.count + } + } +} + + +// Public interface members begin here. + + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterInt32: FfiConverterPrimitive { + typealias FfiType = Int32 + typealias SwiftType = Int32 + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Int32 { + return try lift(readInt(&buf)) + } + + public static func write(_ value: Int32, into buf: inout [UInt8]) { + writeInt(&buf, lower(value)) + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterString: FfiConverter { + typealias SwiftType = String + typealias FfiType = RustBuffer + + public static func lift(_ value: RustBuffer) throws -> String { + defer { + value.deallocate() + } + if value.data == nil { + return String() + } + let bytes = UnsafeBufferPointer(start: value.data!, count: Int(value.len)) + return String(bytes: bytes, encoding: String.Encoding.utf8)! + } + + public static func lower(_ value: String) -> RustBuffer { + return value.utf8CString.withUnsafeBufferPointer { ptr in + // The swift string gives us int8_t, we want uint8_t. + ptr.withMemoryRebound(to: UInt8.self) { ptr in + // The swift string gives us a trailing null byte, we don't want it. + let buf = UnsafeBufferPointer(rebasing: ptr.prefix(upTo: ptr.count - 1)) + return RustBuffer.from(buf) + } + } + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> String { + let len: Int32 = try readInt(&buf) + return String(bytes: try readBytes(&buf, count: Int(len)), encoding: String.Encoding.utf8)! + } + + public static func write(_ value: String, into buf: inout [UInt8]) { + let len = Int32(value.utf8.count) + writeInt(&buf, len) + writeBytes(&buf, value.utf8) + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterData: FfiConverterRustBuffer { + typealias SwiftType = Data + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Data { + let len: Int32 = try readInt(&buf) + return Data(try readBytes(&buf, count: Int(len))) + } + + public static func write(_ value: Data, into buf: inout [UInt8]) { + let len = Int32(value.count) + writeInt(&buf, len) + writeBytes(&buf, value) + } +} + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterSequenceString: FfiConverterRustBuffer { + typealias SwiftType = [String] + + public static func write(_ value: [String], into buf: inout [UInt8]) { + let len = Int32(value.count) + writeInt(&buf, len) + for item in value { + FfiConverterString.write(item, into: &buf) + } + } + + public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> [String] { + let len: Int32 = try readInt(&buf) + var seq = [String]() + seq.reserveCapacity(Int(len)) + for _ in 0 ..< len { + seq.append(try FfiConverterString.read(from: &buf)) + } + return seq + } +} +public func addressFromSecretKey(data: Data) -> String { + return try! FfiConverterString.lift(try! rustCall() { + uniffi_mycelmob_fn_func_address_from_secret_key( + FfiConverterData.lower(data),$0 + ) +}) +} +public func generateSecretKey() -> Data { + return try! FfiConverterData.lift(try! rustCall() { + uniffi_mycelmob_fn_func_generate_secret_key($0 + ) +}) +} +public func getPeerStatus() -> [String] { + return try! FfiConverterSequenceString.lift(try! rustCall() { + uniffi_mycelmob_fn_func_get_peer_status($0 + ) +}) +} +public func helloInt() -> Int32 { + return try! FfiConverterInt32.lift(try! rustCall() { + uniffi_mycelmob_fn_func_hello_int($0 + ) +}) +} +public func helloMycelios() -> String { + return try! FfiConverterString.lift(try! rustCall() { + uniffi_mycelmob_fn_func_hello_mycelios($0 + ) +}) +} +public func startMycelium(peers: [String], tunFd: Int32, secretKey: Data) {try! rustCall() { + uniffi_mycelmob_fn_func_start_mycelium( + FfiConverterSequenceString.lower(peers), + FfiConverterInt32.lower(tunFd), + FfiConverterData.lower(secretKey),$0 + ) +} +} +public func stopMycelium() {try! rustCall() { + uniffi_mycelmob_fn_func_stop_mycelium($0 + ) +} +} + +private enum InitializationResult { + case ok + case contractVersionMismatch + case apiChecksumMismatch +} +// Use a global variable to perform the versioning checks. Swift ensures that +// the code inside is only computed once. +private var initializationResult: InitializationResult = { + // Get the bindings contract version from our ComponentInterface + let bindings_contract_version = 26 + // Get the scaffolding contract version by calling the into the dylib + let scaffolding_contract_version = ffi_mycelmob_uniffi_contract_version() + if bindings_contract_version != scaffolding_contract_version { + return InitializationResult.contractVersionMismatch + } + if (uniffi_mycelmob_checksum_func_address_from_secret_key() != 39059) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_mycelmob_checksum_func_generate_secret_key() != 63601) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_mycelmob_checksum_func_get_peer_status() != 1198) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_mycelmob_checksum_func_hello_int() != 31063) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_mycelmob_checksum_func_hello_mycelios() != 48239) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_mycelmob_checksum_func_start_mycelium() != 61012) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_mycelmob_checksum_func_stop_mycelium() != 28488) { + return InitializationResult.apiChecksumMismatch + } + + return InitializationResult.ok +}() + +private func uniffiEnsureInitialized() { + switch initializationResult { + case .ok: + break + case .contractVersionMismatch: + fatalError("UniFFI contract version mismatch: try cleaning and rebuilding your project") + case .apiChecksumMismatch: + fatalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } +} + +// swiftlint:enable all \ No newline at end of file diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index a7887bc..20c7507 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -205,8 +205,7 @@ class _HeaderCardState extends State<_HeaderCard> { onChanged: (value) async { setState(() => _isSocks5Enabled = value); if (value) { - final result = - await widget.service.proxyConnect('127.0.0.1:1080'); + final result = await widget.service.proxyConnect(''); debugPrint('Proxy connect result: $result'); } else { final result = await widget.service.proxyDisconnect(); @@ -230,7 +229,8 @@ class _StatsRow extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final peersAsync = ref.watch(peersProvider); - final peersCount = peersAsync.maybeWhen(data: (list) => list.length, orElse: () => 0); + final peersCount = + peersAsync.maybeWhen(data: (list) => list.length, orElse: () => 0); Widget tileContent(IconData icon, String title, String value) => Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, @@ -279,4 +279,3 @@ class _StatsRow extends ConsumerWidget { // TODO: VPN implemented or not and if yes, how to get its data ? //TODO: How to get num of peers, bandwidth, uptime ?? //TODO: How to get All data in peers screen ? - \ No newline at end of file diff --git a/lib/myceliumflut_ffi_binding.dart b/lib/myceliumflut_ffi_binding.dart index e0794c0..7ea164a 100644 --- a/lib/myceliumflut_ffi_binding.dart +++ b/lib/myceliumflut_ffi_binding.dart @@ -102,14 +102,11 @@ String myFFAddressFromSecretKey(Uint8List data) { } typedef FuncRustStartMycelium = ffi.Void Function( - ffi.Pointer>, - ffi.IntPtr, - ffi.Pointer, - ffi.IntPtr); + ffi.Pointer>, ffi.Size, ffi.Pointer, ffi.Size); typedef FuncDartStartMycelium = void Function( ffi.Pointer>, int, ffi.Pointer, int); -Future myFFStartMycelium(List peers, Uint8List privKey) async { +Future myFFStartMycelium(List peers, Uint8List privKey) async { // Load the dynamic library final dylib = loadDll(); @@ -131,20 +128,25 @@ Future myFFStartMycelium(List peers, Uint8List privKey) async { final nativePrivKey = privKeyPtr.asTypedList(privKey.length); nativePrivKey.setAll(0, privKey); - // Call the Rust function - startMycelium(peerPtrs, peers.length, privKeyPtr, privKey.length); - - // Free the allocated memory - for (var i = 0; i < peers.length; i++) { - malloc.free(peerPtrs[i]); + try { + // Call the Rust function + startMycelium(peerPtrs, peers.length, privKeyPtr, privKey.length); + return true; + } catch (e) { + print('Error starting mycelium: $e'); + return false; + } finally { + // Free the allocated memory + for (var i = 0; i < peers.length; i++) { + malloc.free(peerPtrs[i]); + } + malloc.free(peerPtrs); + malloc.free(privKeyPtr); } - malloc.free(peerPtrs); - malloc.free(privKeyPtr); - return true; } -typedef FuncRustStopMycelium = ffi.Uint8 Function(); -typedef FuncDartStopMycelium = int Function(); +typedef FuncRustStopMycelium = ffi.Bool Function(); +typedef FuncDartStopMycelium = bool Function(); Future myFFStopMycelium() async { // Load the dynamic library @@ -155,7 +157,7 @@ Future myFFStopMycelium() async { .asFunction(); final result = stopMycelium(); - return result != 0; + return result; } typedef FuncRustGetPeerStatus = ffi.Void Function( @@ -168,80 +170,112 @@ typedef FuncDartFreePeerStatus = void Function( ffi.Pointer>, int); Future> myFFGetPeerStatus() async { - // Load the dynamic library - final dylib = loadDll(); - - final FuncDartGetPeerStatus getPeerStatus = dylib - .lookup>('ff_get_peer_status') - .asFunction(); - final FuncDartFreePeerStatus freePeerStatus = dylib - .lookup>('free_peer_status') - .asFunction(); - - final outPtr = malloc>>(); - final outLen = malloc(); - - getPeerStatus(outPtr, outLen); + final outPtr = calloc>>(); + final outLen = calloc(); + + try { + var dylib = loadDll(); + final ffGetPeerStatus = dylib + .lookup>('ff_get_peer_status') + .asFunction(); + + ffGetPeerStatus(outPtr, outLen); + + final length = outLen.value; + final ptr = outPtr.value; + + final List result = []; + for (int i = 0; i < length; i++) { + final stringPtr = ptr.elementAt(i).value; + if (stringPtr != nullptr) { + result.add(stringPtr.cast().toDartString()); + } + } - final ptr = outPtr.value; - final len = outLen.value; + // Free the memory + final freePeerStatus = dylib + .lookup>('free_peer_status') + .asFunction(); + freePeerStatus(ptr, length); - List peerStatusList = []; - for (int i = 0; i < len; i++) { - final stringPtr = ptr[i]; - if (stringPtr != ffi.nullptr) { - final dartString = stringPtr.cast().toDartString(); - peerStatusList.add(dartString); - } + return result; + } finally { + calloc.free(outPtr); + calloc.free(outLen); } +} - // Free the allocated memory - freePeerStatus(ptr, len); - malloc.free(outPtr); - malloc.free(outLen); +Future> myFFProxyConnect(String remote) async { + final outPtr = calloc>>(); + final outLen = calloc(); + final remotePtr = remote.toNativeUtf8(); - return peerStatusList; -} + try { + var dylib = loadDll(); + final ffProxyConnect = dylib + .lookup, Pointer>>, Pointer)>>('ff_proxy_connect') + .asFunction, Pointer>>, Pointer)>(); -final DynamicLibrary _dylib = Platform.isMacOS || Platform.isWindows - ? DynamicLibrary.open('libmycelium.dylib') - : DynamicLibrary.open('libmycelium.so'); + ffProxyConnect(remotePtr, outPtr, outLen); -typedef _ffiProxyConnectC = Pointer Function(Pointer); -typedef _ffiProxyConnectDart = Pointer Function(Pointer); + final length = outLen.value; + final ptr = outPtr.value; -typedef _ffiProxyDisconnectC = Pointer Function(); -typedef _ffiProxyDisconnectDart = Pointer Function(); + final List result = []; + for (int i = 0; i < length; i++) { + final stringPtr = ptr.elementAt(i).value; + if (stringPtr != nullptr) { + result.add(stringPtr.cast().toDartString()); + } + } -final _ffiProxyConnect = - _dylib.lookupFunction<_ffiProxyConnectC, _ffiProxyConnectDart>( - 'ffi_proxy_connect'); + // Free the memory + final freePeerStatus = dylib + .lookup>('free_peer_status') + .asFunction(); + freePeerStatus(ptr, length); + + return result; + } finally { + calloc.free(remotePtr); + calloc.free(outPtr); + calloc.free(outLen); + } +} -final _ffiProxyDisconnect = - _dylib.lookupFunction<_ffiProxyDisconnectC, _ffiProxyDisconnectDart>( - 'ffi_proxy_disconnect'); +Future> myFFProxyDisconnect() async { + final outPtr = calloc>>(); + final outLen = calloc(); -/// Helper to free strings -typedef _ffiFreeStringC = Void Function(Pointer); -typedef _ffiFreeStringDart = void Function(Pointer); -final _ffiFreeString = _dylib - .lookupFunction<_ffiFreeStringC, _ffiFreeStringDart>('ffi_free_string'); + try { + var dylib = loadDll(); + final ffProxyDisconnect = dylib + .lookup>('ff_proxy_disconnect') + .asFunction(); -List myFFProxyConnect(String remote) { - final remotePtr = remote.toNativeUtf8(); - final resultPtr = _ffiProxyConnect(remotePtr); - calloc.free(remotePtr); + ffProxyDisconnect(outPtr, outLen); - final result = resultPtr.toDartString(); - _ffiFreeString(resultPtr); + final length = outLen.value; + final ptr = outPtr.value; - return result.split(','); // convert "a,b,c" -> ["a","b","c"] -} + final List result = []; + for (int i = 0; i < length; i++) { + final stringPtr = ptr.elementAt(i).value; + if (stringPtr != nullptr) { + result.add(stringPtr.cast().toDartString()); + } + } -List myFFProxyDisconnect() { - final resultPtr = _ffiProxyDisconnect(); - final result = resultPtr.toDartString(); - _ffiFreeString(resultPtr); + // Free the memory + final freePeerStatus = dylib + .lookup>('free_peer_status') + .asFunction(); + freePeerStatus(ptr, length); - return result.split(','); + return result; + } finally { + calloc.free(outPtr); + calloc.free(outLen); + } } + diff --git a/lib/services/ffi/mycelium_service.dart b/lib/services/ffi/mycelium_service.dart index 9fc443f..846b16a 100644 --- a/lib/services/ffi/mycelium_service.dart +++ b/lib/services/ffi/mycelium_service.dart @@ -144,9 +144,6 @@ class MyceliumService { } Future> getPeerStatus() async { - if (_status != NodeStatus.connected) { - return []; - } try { List peerStatus; if (isUseDylib()) { @@ -158,7 +155,6 @@ class MyceliumService { await _platform.invokeMethod>('getPeerStatus'); peerStatus = result?.cast() ?? []; } - // Filter out the first element if it's "ok" (status indicator) if (peerStatus.isNotEmpty && peerStatus[0] == "ok") { peerStatus = peerStatus.sublist(1); @@ -177,7 +173,7 @@ class MyceliumService { Future> proxyConnect(String remote) async { try { if (isUseDylib()) { - return myFFProxyConnect(remote); + return await myFFProxyConnect(remote); } else { final result = await _platform.invokeMethod>( 'proxyConnect', @@ -186,21 +182,23 @@ class MyceliumService { return result?.cast() ?? []; } } catch (e) { - throw Exception("Failed to proxyConnect: $e"); + print("Failed to proxyConnect: $e"); + return ['Failed to connect proxy']; } } Future> proxyDisconnect() async { try { if (isUseDylib()) { - return myFFProxyDisconnect(); + return await myFFProxyDisconnect(); } else { final result = await _platform.invokeMethod>('proxyDisconnect'); return result?.cast() ?? []; } } catch (e) { - throw Exception("Failed to proxyDisconnect: $e"); + print("Failed to proxyDisconnect: $e"); + return ['Failed to disconnect proxy']; } } } diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift index 0ab1ad9..35ed01d 100644 --- a/macos/Runner/MainFlutterWindow.swift +++ b/macos/Runner/MainFlutterWindow.swift @@ -61,6 +61,31 @@ class MainFlutterWindow: NSWindow { self.flutterTunnelStatus = .stopped self.stopMycelium() result(true) + case "getPeerStatus": + do { + let peerStatus = getPeerStatus() + result(peerStatus) + } catch { + debuglog("Error getting peer status: \(error.localizedDescription)") + result(FlutterError(code: "PEER_STATUS_ERROR", message: error.localizedDescription, details: nil)) + } + case "proxyConnect": + do { + let remote = call.arguments as? String ?? "" + let proxyResult = proxyConnect(remote: remote) + result(proxyResult) + } catch { + debuglog("Error in proxyConnect: \(error.localizedDescription)") + result(FlutterError(code: "PROXY_CONNECT_ERROR", message: error.localizedDescription, details: nil)) + } + case "proxyDisconnect": + do { + let proxyResult = proxyDisconnect() + result(proxyResult) + } catch { + debuglog("Error in proxyDisconnect: \(error.localizedDescription)") + result(FlutterError(code: "PROXY_DISCONNECT_ERROR", message: error.localizedDescription, details: nil)) + } default: result(FlutterMethodNotImplemented) } diff --git a/macos/Runner/mycelmob.swift b/macos/Runner/mycelmob.swift index ed84c65..66a2fc8 100644 --- a/macos/Runner/mycelmob.swift +++ b/macos/Runner/mycelmob.swift @@ -8,10 +8,10 @@ import Foundation // might be in a separate module, or it might be compiled inline into // this module. This is a bit of light hackery to work with both. #if canImport(mycelmobFFI) - import mycelmobFFI +import mycelmobFFI #endif -private extension RustBuffer { +fileprivate extension RustBuffer { // Allocate a new buffer, copying the contents of a `UInt8` array. init(bytes: [UInt8]) { let rbuf = bytes.withUnsafeBufferPointer { ptr in @@ -21,7 +21,7 @@ private extension RustBuffer { } static func empty() -> RustBuffer { - RustBuffer(capacity: 0, len: 0, data: nil) + RustBuffer(capacity: 0, len:0, data: nil) } static func from(_ ptr: UnsafeBufferPointer) -> RustBuffer { @@ -35,7 +35,7 @@ private extension RustBuffer { } } -private extension ForeignBytes { +fileprivate extension ForeignBytes { init(bufferPointer: UnsafeBufferPointer) { self.init(len: Int32(bufferPointer.count), data: bufferPointer.baseAddress) } @@ -48,11 +48,13 @@ private extension ForeignBytes { // Helper classes/extensions that don't change. // Someday, this will be in a library of its own. -private extension Data { +fileprivate extension Data { init(rustBuffer: RustBuffer) { - // TODO: This copies the buffer. Can we read directly from a - // Rust buffer? - self.init(bytes: rustBuffer.data!, count: Int(rustBuffer.len)) + self.init( + bytesNoCopy: rustBuffer.data!, + count: Int(rustBuffer.len), + deallocator: .none + ) } } @@ -70,15 +72,15 @@ private extension Data { // // Instead, the read() method and these helper functions input a tuple of data -private func createReader(data: Data) -> (data: Data, offset: Data.Index) { +fileprivate func createReader(data: Data) -> (data: Data, offset: Data.Index) { (data: data, offset: 0) } // Reads an integer at the current offset, in big-endian order, and advances // the offset on success. Throws if reading the integer would move the // offset past the end of the buffer. -private func readInt(_ reader: inout (data: Data, offset: Data.Index)) throws -> T { - let range = reader.offset ..< reader.offset + MemoryLayout.size +fileprivate func readInt(_ reader: inout (data: Data, offset: Data.Index)) throws -> T { + let range = reader.offset...size guard reader.data.count >= range.upperBound else { throw UniffiInternalError.bufferOverflow } @@ -88,38 +90,38 @@ private func readInt(_ reader: inout (data: Data, offset: return value as! T } var value: T = 0 - let _ = withUnsafeMutableBytes(of: &value) { reader.data.copyBytes(to: $0, from: range) } + let _ = withUnsafeMutableBytes(of: &value, { reader.data.copyBytes(to: $0, from: range)}) reader.offset = range.upperBound return value.bigEndian } // Reads an arbitrary number of bytes, to be used to read // raw bytes, this is useful when lifting strings -private func readBytes(_ reader: inout (data: Data, offset: Data.Index), count: Int) throws -> [UInt8] { - let range = reader.offset ..< (reader.offset + count) +fileprivate func readBytes(_ reader: inout (data: Data, offset: Data.Index), count: Int) throws -> Array { + let range = reader.offset..<(reader.offset+count) guard reader.data.count >= range.upperBound else { throw UniffiInternalError.bufferOverflow } var value = [UInt8](repeating: 0, count: count) - value.withUnsafeMutableBufferPointer { buffer in + value.withUnsafeMutableBufferPointer({ buffer in reader.data.copyBytes(to: buffer, from: range) - } + }) reader.offset = range.upperBound return value } // Reads a float at the current offset. -private func readFloat(_ reader: inout (data: Data, offset: Data.Index)) throws -> Float { - return try Float(bitPattern: readInt(&reader)) +fileprivate func readFloat(_ reader: inout (data: Data, offset: Data.Index)) throws -> Float { + return Float(bitPattern: try readInt(&reader)) } // Reads a float at the current offset. -private func readDouble(_ reader: inout (data: Data, offset: Data.Index)) throws -> Double { - return try Double(bitPattern: readInt(&reader)) +fileprivate func readDouble(_ reader: inout (data: Data, offset: Data.Index)) throws -> Double { + return Double(bitPattern: try readInt(&reader)) } // Indicates if the offset has reached the end of the buffer. -private func hasRemaining(_ reader: (data: Data, offset: Data.Index)) -> Bool { +fileprivate func hasRemaining(_ reader: (data: Data, offset: Data.Index)) -> Bool { return reader.offset < reader.data.count } @@ -127,11 +129,11 @@ private func hasRemaining(_ reader: (data: Data, offset: Data.Index)) -> Bool { // struct, but we use standalone functions instead in order to make external // types work. See the above discussion on Readers for details. -private func createWriter() -> [UInt8] { +fileprivate func createWriter() -> [UInt8] { return [] } -private func writeBytes(_ writer: inout [UInt8], _ byteArr: S) where S: Sequence, S.Element == UInt8 { +fileprivate func writeBytes(_ writer: inout [UInt8], _ byteArr: S) where S: Sequence, S.Element == UInt8 { writer.append(contentsOf: byteArr) } @@ -139,22 +141,22 @@ private func writeBytes(_ writer: inout [UInt8], _ byteArr: S) where S: Seque // // Warning: make sure what you are trying to write // is in the correct type! -private func writeInt(_ writer: inout [UInt8], _ value: T) { +fileprivate func writeInt(_ writer: inout [UInt8], _ value: T) { var value = value.bigEndian withUnsafeBytes(of: &value) { writer.append(contentsOf: $0) } } -private func writeFloat(_ writer: inout [UInt8], _ value: Float) { +fileprivate func writeFloat(_ writer: inout [UInt8], _ value: Float) { writeInt(&writer, value.bitPattern) } -private func writeDouble(_ writer: inout [UInt8], _ value: Double) { +fileprivate func writeDouble(_ writer: inout [UInt8], _ value: Double) { writeInt(&writer, value.bitPattern) } // Protocol for types that transfer other types across the FFI. This is -// analogous go the Rust trait of the same name. -private protocol FfiConverter { +// analogous to the Rust trait of the same name. +fileprivate protocol FfiConverter { associatedtype FfiType associatedtype SwiftType @@ -165,13 +167,19 @@ private protocol FfiConverter { } // Types conforming to `Primitive` pass themselves directly over the FFI. -private protocol FfiConverterPrimitive: FfiConverter where FfiType == SwiftType {} +fileprivate protocol FfiConverterPrimitive: FfiConverter where FfiType == SwiftType { } extension FfiConverterPrimitive { +#if swift(>=5.8) + @_documentation(visibility: private) +#endif public static func lift(_ value: FfiType) throws -> SwiftType { return value } +#if swift(>=5.8) + @_documentation(visibility: private) +#endif public static func lower(_ value: SwiftType) -> FfiType { return value } @@ -179,9 +187,12 @@ extension FfiConverterPrimitive { // Types conforming to `FfiConverterRustBuffer` lift and lower into a `RustBuffer`. // Used for complex types where it's hard to write a custom lift/lower. -private protocol FfiConverterRustBuffer: FfiConverter where FfiType == RustBuffer {} +fileprivate protocol FfiConverterRustBuffer: FfiConverter where FfiType == RustBuffer {} extension FfiConverterRustBuffer { +#if swift(>=5.8) + @_documentation(visibility: private) +#endif public static func lift(_ buf: RustBuffer) throws -> SwiftType { var reader = createReader(data: Data(rustBuffer: buf)) let value = try read(from: &reader) @@ -192,16 +203,18 @@ extension FfiConverterRustBuffer { return value } +#if swift(>=5.8) + @_documentation(visibility: private) +#endif public static func lower(_ value: SwiftType) -> RustBuffer { - var writer = createWriter() - write(value, into: &writer) - return RustBuffer(bytes: writer) + var writer = createWriter() + write(value, into: &writer) + return RustBuffer(bytes: writer) } } - // An error type for FFI errors. These errors occur at the UniFFI level, not // the library level. -private enum UniffiInternalError: LocalizedError { +fileprivate enum UniffiInternalError: LocalizedError { case bufferOverflow case incompleteData case unexpectedOptionalTag @@ -227,24 +240,24 @@ private enum UniffiInternalError: LocalizedError { } } -private extension NSLock { +fileprivate extension NSLock { func withLock(f: () throws -> T) rethrows -> T { - lock() + self.lock() defer { self.unlock() } return try f() } } -private let CALL_SUCCESS: Int8 = 0 -private let CALL_ERROR: Int8 = 1 -private let CALL_UNEXPECTED_ERROR: Int8 = 2 -private let CALL_CANCELLED: Int8 = 3 +fileprivate let CALL_SUCCESS: Int8 = 0 +fileprivate let CALL_ERROR: Int8 = 1 +fileprivate let CALL_UNEXPECTED_ERROR: Int8 = 2 +fileprivate let CALL_CANCELLED: Int8 = 3 -private extension RustCallStatus { +fileprivate extension RustCallStatus { init() { self.init( code: CALL_SUCCESS, - errorBuf: RustBuffer( + errorBuf: RustBuffer.init( capacity: 0, len: 0, data: nil @@ -254,70 +267,70 @@ private extension RustCallStatus { } private func rustCall(_ callback: (UnsafeMutablePointer) -> T) throws -> T { - try makeRustCall(callback, errorHandler: nil) + let neverThrow: ((RustBuffer) throws -> Never)? = nil + return try makeRustCall(callback, errorHandler: neverThrow) } -private func rustCallWithError( - _ errorHandler: @escaping (RustBuffer) throws -> Error, - _ callback: (UnsafeMutablePointer) -> T -) throws -> T { +private func rustCallWithError( + _ errorHandler: @escaping (RustBuffer) throws -> E, + _ callback: (UnsafeMutablePointer) -> T) throws -> T { try makeRustCall(callback, errorHandler: errorHandler) } -private func makeRustCall( +private func makeRustCall( _ callback: (UnsafeMutablePointer) -> T, - errorHandler: ((RustBuffer) throws -> Error)? + errorHandler: ((RustBuffer) throws -> E)? ) throws -> T { uniffiEnsureInitialized() - var callStatus = RustCallStatus() + var callStatus = RustCallStatus.init() let returnedVal = callback(&callStatus) try uniffiCheckCallStatus(callStatus: callStatus, errorHandler: errorHandler) return returnedVal } -private func uniffiCheckCallStatus( +private func uniffiCheckCallStatus( callStatus: RustCallStatus, - errorHandler: ((RustBuffer) throws -> Error)? + errorHandler: ((RustBuffer) throws -> E)? ) throws { switch callStatus.code { - case CALL_SUCCESS: - return - - case CALL_ERROR: - if let errorHandler = errorHandler { - throw try errorHandler(callStatus.errorBuf) - } else { - callStatus.errorBuf.deallocate() - throw UniffiInternalError.unexpectedRustCallError - } + case CALL_SUCCESS: + return + + case CALL_ERROR: + if let errorHandler = errorHandler { + throw try errorHandler(callStatus.errorBuf) + } else { + callStatus.errorBuf.deallocate() + throw UniffiInternalError.unexpectedRustCallError + } - case CALL_UNEXPECTED_ERROR: - // When the rust code sees a panic, it tries to construct a RustBuffer - // with the message. But if that code panics, then it just sends back - // an empty buffer. - if callStatus.errorBuf.len > 0 { - throw try UniffiInternalError.rustPanic(FfiConverterString.lift(callStatus.errorBuf)) - } else { - callStatus.errorBuf.deallocate() - throw UniffiInternalError.rustPanic("Rust panic") - } + case CALL_UNEXPECTED_ERROR: + // When the rust code sees a panic, it tries to construct a RustBuffer + // with the message. But if that code panics, then it just sends back + // an empty buffer. + if callStatus.errorBuf.len > 0 { + throw UniffiInternalError.rustPanic(try FfiConverterString.lift(callStatus.errorBuf)) + } else { + callStatus.errorBuf.deallocate() + throw UniffiInternalError.rustPanic("Rust panic") + } - case CALL_CANCELLED: - fatalError("Cancellation not supported yet") + case CALL_CANCELLED: + fatalError("Cancellation not supported yet") - default: - throw UniffiInternalError.unexpectedRustCallStatusCode + default: + throw UniffiInternalError.unexpectedRustCallStatusCode } } private func uniffiTraitInterfaceCall( callStatus: UnsafeMutablePointer, makeCall: () throws -> T, - writeReturn: (T) -> Void + writeReturn: (T) -> () ) { do { try writeReturn(makeCall()) - } catch { + } catch let error { callStatus.pointee.code = CALL_UNEXPECTED_ERROR callStatus.pointee.errorBuf = FfiConverterString.lower(String(describing: error)) } @@ -326,7 +339,7 @@ private func uniffiTraitInterfaceCall( private func uniffiTraitInterfaceCallWithError( callStatus: UnsafeMutablePointer, makeCall: () throws -> T, - writeReturn: (T) -> Void, + writeReturn: (T) -> (), lowerError: (E) -> RustBuffer ) { do { @@ -339,8 +352,7 @@ private func uniffiTraitInterfaceCallWithError( callStatus.pointee.errorBuf = FfiConverterString.lower(String(describing: error)) } } - -private class UniffiHandleMap { +fileprivate class UniffiHandleMap { private var map: [UInt64: T] = [:] private let lock = NSLock() private var currentHandle: UInt64 = 1 @@ -354,7 +366,7 @@ private class UniffiHandleMap { } } - func get(handle: UInt64) throws -> T { + func get(handle: UInt64) throws -> T { try lock.withLock { guard let obj = map[handle] else { throw UniffiInternalError.unexpectedStaleHandle @@ -374,13 +386,20 @@ private class UniffiHandleMap { } var count: Int { - map.count + get { + map.count + } } } + // Public interface members begin here. -private struct FfiConverterInt32: FfiConverterPrimitive { + +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterInt32: FfiConverterPrimitive { typealias FfiType = Int32 typealias SwiftType = Int32 @@ -393,7 +412,10 @@ private struct FfiConverterInt32: FfiConverterPrimitive { } } -private struct FfiConverterString: FfiConverter { +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterString: FfiConverter { typealias SwiftType = String typealias FfiType = RustBuffer @@ -421,7 +443,7 @@ private struct FfiConverterString: FfiConverter { public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> String { let len: Int32 = try readInt(&buf) - return try String(bytes: readBytes(&buf, count: Int(len)), encoding: String.Encoding.utf8)! + return String(bytes: try readBytes(&buf, count: Int(len)), encoding: String.Encoding.utf8)! } public static func write(_ value: String, into buf: inout [UInt8]) { @@ -431,12 +453,15 @@ private struct FfiConverterString: FfiConverter { } } -private struct FfiConverterData: FfiConverterRustBuffer { +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterData: FfiConverterRustBuffer { typealias SwiftType = Data public static func read(from buf: inout (data: Data, offset: Data.Index)) throws -> Data { let len: Int32 = try readInt(&buf) - return try Data(readBytes(&buf, count: Int(len))) + return Data(try readBytes(&buf, count: Int(len))) } public static func write(_ value: Data, into buf: inout [UInt8]) { @@ -446,7 +471,10 @@ private struct FfiConverterData: FfiConverterRustBuffer { } } -private struct FfiConverterSequenceString: FfiConverterRustBuffer { +#if swift(>=5.8) +@_documentation(visibility: private) +#endif +fileprivate struct FfiConverterSequenceString: FfiConverterRustBuffer { typealias SwiftType = [String] public static func write(_ value: [String], into buf: inout [UInt8]) { @@ -462,51 +490,51 @@ private struct FfiConverterSequenceString: FfiConverterRustBuffer { var seq = [String]() seq.reserveCapacity(Int(len)) for _ in 0 ..< len { - try seq.append(FfiConverterString.read(from: &buf)) + seq.append(try FfiConverterString.read(from: &buf)) } return seq } } - public func addressFromSecretKey(data: Data) -> String { - return try! FfiConverterString.lift(try! rustCall { - uniffi_mycelmob_fn_func_address_from_secret_key( - FfiConverterData.lower(data), $0 - ) - }) + return try! FfiConverterString.lift(try! rustCall() { + uniffi_mycelmob_fn_func_address_from_secret_key( + FfiConverterData.lower(data),$0 + ) +}) } - public func generateSecretKey() -> Data { - return try! FfiConverterData.lift(try! rustCall { - uniffi_mycelmob_fn_func_generate_secret_key($0 - ) - }) + return try! FfiConverterData.lift(try! rustCall() { + uniffi_mycelmob_fn_func_generate_secret_key($0 + ) +}) +} +public func getPeerStatus() -> [String] { + return try! FfiConverterSequenceString.lift(try! rustCall() { + uniffi_mycelmob_fn_func_get_peer_status($0 + ) +}) } - public func helloInt() -> Int32 { - return try! FfiConverterInt32.lift(try! rustCall { - uniffi_mycelmob_fn_func_hello_int($0 - ) - }) + return try! FfiConverterInt32.lift(try! rustCall() { + uniffi_mycelmob_fn_func_hello_int($0 + ) +}) } - public func helloMycelios() -> String { - return try! FfiConverterString.lift(try! rustCall { - uniffi_mycelmob_fn_func_hello_mycelios($0 - ) - }) + return try! FfiConverterString.lift(try! rustCall() { + uniffi_mycelmob_fn_func_hello_mycelios($0 + ) +}) } - -public func startMycelium(peers: [String], tunFd: Int32, secretKey: Data) { try! rustCall { +public func startMycelium(peers: [String], tunFd: Int32, secretKey: Data) {try! rustCall() { uniffi_mycelmob_fn_func_start_mycelium( FfiConverterSequenceString.lower(peers), FfiConverterInt32.lower(tunFd), - FfiConverterData.lower(secretKey), $0 + FfiConverterData.lower(secretKey),$0 ) } } - -public func stopMycelium() { try! rustCall { +public func stopMycelium() {try! rustCall() { uniffi_mycelmob_fn_func_stop_mycelium($0 ) } @@ -517,10 +545,9 @@ private enum InitializationResult { case contractVersionMismatch case apiChecksumMismatch } - -// Use a global variables to perform the versioning checks. Swift ensures that +// Use a global variable to perform the versioning checks. Swift ensures that // the code inside is only computed once. -private var initializationResult: InitializationResult { +private var initializationResult: InitializationResult = { // Get the bindings contract version from our ComponentInterface let bindings_contract_version = 26 // Get the scaffolding contract version by calling the into the dylib @@ -528,27 +555,30 @@ private var initializationResult: InitializationResult { if bindings_contract_version != scaffolding_contract_version { return InitializationResult.contractVersionMismatch } - if uniffi_mycelmob_checksum_func_address_from_secret_key() != 39059 { + if (uniffi_mycelmob_checksum_func_address_from_secret_key() != 39059) { return InitializationResult.apiChecksumMismatch } - if uniffi_mycelmob_checksum_func_generate_secret_key() != 63601 { + if (uniffi_mycelmob_checksum_func_generate_secret_key() != 63601) { return InitializationResult.apiChecksumMismatch } - if uniffi_mycelmob_checksum_func_hello_int() != 31063 { + if (uniffi_mycelmob_checksum_func_get_peer_status() != 1198) { return InitializationResult.apiChecksumMismatch } - if uniffi_mycelmob_checksum_func_hello_mycelios() != 48239 { + if (uniffi_mycelmob_checksum_func_hello_int() != 31063) { return InitializationResult.apiChecksumMismatch } - if uniffi_mycelmob_checksum_func_start_mycelium() != 61012 { + if (uniffi_mycelmob_checksum_func_hello_mycelios() != 48239) { return InitializationResult.apiChecksumMismatch } - if uniffi_mycelmob_checksum_func_stop_mycelium() != 28488 { + if (uniffi_mycelmob_checksum_func_start_mycelium() != 61012) { + return InitializationResult.apiChecksumMismatch + } + if (uniffi_mycelmob_checksum_func_stop_mycelium() != 28488) { return InitializationResult.apiChecksumMismatch } return InitializationResult.ok -} +}() private func uniffiEnsureInitialized() { switch initializationResult { @@ -561,4 +591,4 @@ private func uniffiEnsureInitialized() { } } -// swiftlint:enable all +// swiftlint:enable all \ No newline at end of file diff --git a/mycelffi/src/lib.rs b/mycelffi/src/lib.rs index da3ec20..69d36e2 100644 --- a/mycelffi/src/lib.rs +++ b/mycelffi/src/lib.rs @@ -1,11 +1,11 @@ -use mobile::proxy::{proxy_connect, proxy_disconnect}; +use mobile::{proxy_connect, proxy_disconnect, generate_secret_key, address_from_secret_key, start_mycelium, stop_mycelium, get_peer_status}; use std::ffi::{CStr, CString}; use std::os::raw::c_char; #[no_mangle] pub extern "C" fn ff_generate_secret_key(out_ptr: *mut *mut u8, out_len: *mut usize) { - let secret_key = mobile::generate_secret_key(); + let secret_key = generate_secret_key(); let len = secret_key.len(); let ptr = secret_key.as_ptr(); @@ -27,11 +27,12 @@ pub extern "C" fn free_secret_key(ptr: *mut u8, len: usize) { Vec::from_raw_parts(ptr, len, len); } } + #[no_mangle] pub extern "C" fn ff_address_from_secret_key(data: *const u8, len: usize) -> *mut c_char { let slice = unsafe { std::slice::from_raw_parts(data, len) }; let vec = slice.to_vec(); - let address = mobile::address_from_secret_key(vec); + let address = address_from_secret_key(vec); let c_string = CString::new(address).unwrap(); c_string.into_raw() } @@ -65,18 +66,18 @@ pub extern "C" fn ff_start_mycelium( let priv_key: Vec = unsafe { std::slice::from_raw_parts(priv_key_ptr, priv_key_len).to_vec() }; - mobile::start_mycelium(peers, 0, priv_key); + start_mycelium(peers, 0, priv_key); } #[no_mangle] pub extern "C" fn ff_stop_mycelium() -> bool { - let result = mobile::stop_mycelium(); + let result = stop_mycelium(); result == "ok" } #[no_mangle] pub extern "C" fn ff_get_peer_status(out_ptr: *mut *mut *mut c_char, out_len: *mut usize) { - let peer_status = mobile::get_peer_status(); + let peer_status = get_peer_status(); let len = peer_status.len(); // Convert Vec to Vec<*mut c_char> @@ -117,17 +118,47 @@ pub extern "C" fn free_peer_status(ptr: *mut *mut c_char, len: usize) { } #[no_mangle] -pub extern "C" fn ff_proxy_connect(remote_str: *const c_char) -> bool { +pub extern "C" fn ff_proxy_connect(remote_str: *const c_char, out_ptr: *mut *mut *mut c_char, out_len: *mut usize) { let c_str = unsafe { CStr::from_ptr(remote_str) }; - let remote_str = c_str.to_string_lossy(); - let rt = tokio::runtime::Runtime::new().unwrap(); - let result = rt.block_on(proxy_connect(&remote_str)); - result == "ok" + let remote_string = c_str.to_string_lossy().into_owned(); + let result = proxy_connect(remote_string); + let len = result.len(); + + // Convert Vec to Vec<*mut c_char> + let c_strings: Vec<*mut c_char> = result + .into_iter() + .map(|s| CString::new(s).unwrap().into_raw()) + .collect(); + + let ptr = c_strings.as_ptr() as *mut *mut c_char; + + // Transfer ownership to the caller + std::mem::forget(c_strings); + + unsafe { + *out_ptr = ptr; + *out_len = len; + } } #[no_mangle] -pub extern "C" fn ff_proxy_disconnect() -> bool { - let rt = tokio::runtime::Runtime::new().unwrap(); - let result = rt.block_on(proxy_disconnect()); - result == "ok" +pub extern "C" fn ff_proxy_disconnect(out_ptr: *mut *mut *mut c_char, out_len: *mut usize) { + let result = proxy_disconnect(); + let len = result.len(); + + // Convert Vec to Vec<*mut c_char> + let c_strings: Vec<*mut c_char> = result + .into_iter() + .map(|s| CString::new(s).unwrap().into_raw()) + .collect(); + + let ptr = c_strings.as_ptr() as *mut *mut c_char; + + // Transfer ownership to the caller + std::mem::forget(c_strings); + + unsafe { + *out_ptr = ptr; + *out_len = len; + } } diff --git a/mycelmob/Cargo.lock b/mycelmob/Cargo.lock index 8bb12a0..2f5a45b 100644 --- a/mycelmob/Cargo.lock +++ b/mycelmob/Cargo.lock @@ -52,6 +52,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.12" @@ -82,9 +93,9 @@ checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e" [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -112,29 +123,29 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arc-swap" @@ -177,7 +188,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -195,12 +206,94 @@ dependencies = [ "nom", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "axum" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-extra" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45bf463831f5131b7d3c756525b305d40f1185b688565648a92e1392ca35713d" +dependencies = [ + "axum", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "serde", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.75" @@ -240,13 +333,33 @@ dependencies = [ "serde", ] +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + [[package]] name = "bindgen" version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags", + "bitflags 2.9.4", "cexpr", "clang-sys", "itertools", @@ -257,14 +370,20 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "bitflags" -version = "2.9.1" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "blake3" @@ -319,11 +438,11 @@ dependencies = [ [[package]] name = "camino" -version = "1.1.10" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +checksum = "e1de8bc0aa9e9385ceb3bf0c152e3a9b9544f6c4a912c8ae504e80c1f0368603" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -351,13 +470,24 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.29" +version = "1.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" +checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" dependencies = [ + "find-msvc-tools", "shlex", ] +[[package]] +name = "cdn-meta" +version = "0.1.0" +source = "git+https://github.com/threefoldtech/mycelium-cdn-registry#2fac04710b60502a5165f1b1d90671730346e977" +dependencies = [ + "aes-gcm", + "bincode 2.0.1", + "serde", +] + [[package]] name = "cexpr" version = "0.6.0" @@ -369,9 +499,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -402,9 +532,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.41" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" dependencies = [ "clap_builder", "clap_derive", @@ -412,9 +542,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.41" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" dependencies = [ "anstream", "anstyle", @@ -424,14 +554,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.41" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -446,6 +576,20 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", +] + [[package]] name = "constant_time_eq" version = "0.3.1" @@ -505,9 +649,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.2.0" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373b7c5dbd637569a2cca66e8d66b8c446a1e7bf064ea321d265d7b3dfe7c97e" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", "cpufeatures", @@ -526,7 +670,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -537,21 +681,32 @@ checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ "cfg-if", "crossbeam-utils", - "hashbrown", + "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.11", ] [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "dlopen2" version = "0.5.0" @@ -569,11 +724,26 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "etherparse" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff83a5facf1a7cbfef93cfb48d6d4fb6a1f42d8ac2341a96b3255acb4d4f860" +checksum = "b119b9796ff800751a220394b8b3613f26dd30c48f254f6837e64c464872d1c7" dependencies = [ "arrayvec", ] @@ -590,9 +760,21 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.3.0" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "foreign-types" @@ -609,6 +791,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + [[package]] name = "fs-err" version = "2.11.0" @@ -674,7 +865,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -753,7 +944,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] @@ -775,9 +966,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "goblin" @@ -790,6 +981,25 @@ dependencies = [ "scroll", ] +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hash32" version = "0.3.1" @@ -799,12 +1009,27 @@ dependencies = [ "byteorder", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "heapless" version = "0.8.0" @@ -821,6 +1046,235 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", +] + [[package]] name = "inout" version = "0.1.4" @@ -830,13 +1284,22 @@ dependencies = [ "generic-array", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + [[package]] name = "io-uring" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "bitflags", + "bitflags 2.9.4", "cfg-if", "libc", ] @@ -859,6 +1322,16 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -882,9 +1355,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" dependencies = [ "once_cell", "wasm-bindgen", @@ -908,9 +1381,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libloading" @@ -919,9 +1392,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-targets 0.53.3", ] +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + [[package]] name = "lock_api" version = "0.4.13" @@ -934,9 +1419,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "loom" @@ -951,6 +1436,15 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "lru" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +dependencies = [ + "hashbrown 0.12.3", +] + [[package]] name = "lru-slab" version = "0.1.2" @@ -959,13 +1453,19 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + [[package]] name = "memchr" version = "2.7.5" @@ -1026,11 +1526,11 @@ dependencies = [ [[package]] name = "mobile" version = "0.1.0" -source = "git+http://github.com/threefoldtech/mycelium?tag=v0.6.1#a9ba23d7bd020411be51cd2359775f6f11b159e4" +source = "git+http://github.com/threefoldtech/mycelium?tag=v0.6.2#de90821caad51ebe6b353027a0971d496e6cd78e" dependencies = [ "mycelium", "once_cell", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "tracing-android", @@ -1040,14 +1540,17 @@ dependencies = [ [[package]] name = "mycelium" -version = "0.6.1" -source = "git+http://github.com/threefoldtech/mycelium?tag=v0.6.1#a9ba23d7bd020411be51cd2359775f6f11b159e4" +version = "0.6.2" +source = "git+http://github.com/threefoldtech/mycelium?tag=v0.6.2#de90821caad51ebe6b353027a0971d496e6cd78e" dependencies = [ "aes-gcm", - "ahash", + "ahash 0.8.12", "arc-swap", + "axum", + "axum-extra", "blake3", "bytes", + "cdn-meta", "dashmap", "etherparse", "faster-hex", @@ -1063,6 +1566,9 @@ dependencies = [ "quinn", "rand", "rcgen", + "redis", + "reed-solomon-erasure", + "reqwest", "rtnetlink", "rustls", "serde", @@ -1083,20 +1589,22 @@ name = "mycelmob" version = "0.1.0" dependencies = [ "mobile", + "once_cell", + "tokio", "uniffi", ] [[package]] name = "netdev" -version = "0.34.1" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51305a587ceb5e3440e24e02a07f5d3d401d8d7edb71f59f6542ba705bd57483" +checksum = "daa1e3eaf125c54c21e6221df12dd2a0a682784a068782dd564c836c0f281b6d" dependencies = [ "dlopen2", "ipnet", "libc", - "netlink-packet-core", - "netlink-packet-route", + "netlink-packet-core 0.7.0", + "netlink-packet-route 0.22.0", "netlink-sys", "once_cell", "system-configuration", @@ -1114,6 +1622,15 @@ dependencies = [ "netlink-packet-utils", ] +[[package]] +name = "netlink-packet-core" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" +dependencies = [ + "paste", +] + [[package]] name = "netlink-packet-route" version = "0.22.0" @@ -1121,14 +1638,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0e7987b28514adf555dc1f9a5c30dfc3e50750bbaffb1aec41ca7b23dcd8e4" dependencies = [ "anyhow", - "bitflags", + "bitflags 2.9.4", "byteorder", "libc", "log", - "netlink-packet-core", + "netlink-packet-core 0.7.0", "netlink-packet-utils", ] +[[package]] +name = "netlink-packet-route" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ec2f5b6839be2a19d7fa5aab5bc444380f6311c2b693551cb80f45caaa7b5ef" +dependencies = [ + "bitflags 2.9.4", + "libc", + "log", + "netlink-packet-core 0.8.1", +] + [[package]] name = "netlink-packet-utils" version = "0.5.2" @@ -1143,16 +1672,16 @@ dependencies = [ [[package]] name = "netlink-proto" -version = "0.11.5" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72452e012c2f8d612410d89eea01e2d9b56205274abb35d53f60200b2ec41d60" +checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" dependencies = [ "bytes", "futures", "log", - "netlink-packet-core", + "netlink-packet-core 0.8.1", "netlink-sys", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -1174,7 +1703,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags", + "bitflags 2.9.4", "cfg-if", "cfg_aliases", "libc", @@ -1187,7 +1716,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags", + "bitflags 2.9.4", "cfg-if", "cfg_aliases", "libc", @@ -1206,21 +1735,21 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] -name = "nu-ansi-term" -version = "0.50.1" +name = "num-bigint" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "windows-sys 0.52.0", + "num-integer", + "num-traits", ] [[package]] @@ -1229,6 +1758,24 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.36.7" @@ -1262,7 +1809,7 @@ version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags", + "bitflags 2.9.4", "cfg-if", "foreign-types", "libc", @@ -1279,14 +1826,14 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "openssl-src" -version = "300.5.1+3.5.1" +version = "300.5.2+3.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "735230c832b28c000e3bc117119e6466a663ec73506bc0a9907ea4187508e42a" +checksum = "d270b79e2926f5150189d475bc7e9d2c69f9c4697b185fa917d5a32b792d21b4" dependencies = [ "cc", ] @@ -1305,10 +1852,15 @@ dependencies = [ ] [[package]] -name = "overload" -version = "0.1.1" +name = "parking_lot" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] [[package]] name = "parking_lot" @@ -1317,7 +1869,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.11", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", ] [[package]] @@ -1328,7 +1894,7 @@ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.17", "smallvec", "windows-targets 0.52.6", ] @@ -1349,6 +1915,12 @@ dependencies = [ "serde", ] +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1385,6 +1957,15 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1402,28 +1983,28 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.35" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "quinn" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -1433,7 +2014,7 @@ dependencies = [ "rustc-hash 2.1.1", "rustls", "socket2", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "web-time", @@ -1441,9 +2022,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.12" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "getrandom 0.3.3", @@ -1454,7 +2035,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time", @@ -1462,16 +2043,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -1491,9 +2072,9 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha", "rand_core 0.9.3", @@ -1529,9 +2110,9 @@ dependencies = [ [[package]] name = "rcgen" -version = "0.13.2" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +checksum = "4c83367ba62b3f1dbd0f086ede4e5ebfb4713fb234dbbc5807772a31245ff46d" dependencies = [ "pem", "ring", @@ -1540,58 +2121,128 @@ dependencies = [ "yasna", ] +[[package]] +name = "redis" +version = "0.32.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd3650deebc68526b304898b192fa4102a4ef0b9ada24da096559cb60e0eef8" +dependencies = [ + "bytes", + "cfg-if", + "combine", + "futures-util", + "itoa", + "num-bigint", + "percent-encoding", + "pin-project-lite", + "ryu", + "sha1_smol", + "socket2", + "tokio", + "tokio-util", + "url", +] + [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +dependencies = [ + "bitflags 2.9.4", +] + +[[package]] +name = "reed-solomon-erasure" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "7263373d500d4d4f505d43a2a662d475a894aa94503a1ee28e9188b5f3960d4f" dependencies = [ - "bitflags", + "libm", + "lru", + "parking_lot 0.11.2", + "smallvec", + "spin", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] -name = "regex-syntax" -version = "0.8.5" +name = "reqwest" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "mime", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] [[package]] name = "ring" @@ -1609,15 +2260,14 @@ dependencies = [ [[package]] name = "rtnetlink" -version = "0.16.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb5850b5aa2c9c0ae44f157694bbe85107a2e13d76eb3178d0e3ee96c410f57" +checksum = "08fd15aa4c64c34d0b3178e45ec6dad313a9f02b193376d501668a7950264bb7" dependencies = [ "futures", "log", - "netlink-packet-core", - "netlink-packet-route", - "netlink-packet-utils", + "netlink-packet-core 0.8.1", + "netlink-packet-route 0.25.1", "netlink-proto", "netlink-sys", "nix 0.29.0", @@ -1627,9 +2277,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -1654,9 +2304,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.29" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "once_cell", "ring", @@ -1678,9 +2328,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "ring", "rustls-pki-types", @@ -1689,9 +2339,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -1728,50 +2378,91 @@ checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde" -version = "1.0.219" +version = "1.0.225" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.225" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.225" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", ] +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sharded-slab" version = "0.1.7" @@ -1789,9 +2480,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -1804,9 +2495,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -1822,14 +2513,20 @@ checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" [[package]] name = "socket2" -version = "0.5.10" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1867,22 +2564,42 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "system-configuration" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags", + "bitflags 2.9.4", "core-foundation", "system-configuration-sys", ] @@ -1917,11 +2634,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.16", ] [[package]] @@ -1932,18 +2649,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1957,9 +2674,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -1972,25 +2689,35 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", ] +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -2003,9 +2730,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -2017,7 +2744,7 @@ dependencies = [ "slab", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2028,7 +2755,17 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f63835928ca123f1bef57abbcd23bb2ba0ac9ae1235f1e65bda0d06e7786bd" +dependencies = [ + "rustls", + "tokio", ] [[package]] @@ -2045,21 +2782,21 @@ dependencies = [ [[package]] name = "tokio-tun" -version = "0.13.2" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be25a316a2d10d0ddd46de9ddd73cdb4262678e1e52f4a32a31421f1e2b816b4" +checksum = "ef6cadea27ba297ef9124370e49af79913b9b979bffd6511f65702eefbce12fe" dependencies = [ "libc", - "nix 0.29.0", - "thiserror 2.0.12", + "nix 0.30.1", + "thiserror 2.0.16", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -2077,12 +2814,59 @@ dependencies = [ "serde", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.4", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -2107,7 +2891,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2137,7 +2921,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b1f47d22deb79c3f59fcf2a1f00f60cbdc05462bf17d1cd356c1fefa3f444bd" dependencies = [ - "nu-ansi-term 0.50.1", + "nu-ansi-term", "time", "tracing", "tracing-core", @@ -2154,21 +2938,21 @@ dependencies = [ "cc", "cfg-if", "once_cell", - "parking_lot", + "parking_lot 0.12.4", "tracing-core", "tracing-subscriber", ] [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", - "nu-ansi-term 0.46.0", + "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -2177,6 +2961,12 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "tun" version = "0.6.1" @@ -2208,9 +2998,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "uniffi" @@ -2269,7 +3059,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "802d2051a700e3ec894c79f80d2705b69d85844dafbbe5d1a92776f8f48b563a" dependencies = [ "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2292,14 +3082,14 @@ version = "0.28.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12c65a5b12ec544ef136693af8759fb9d11aefce740fb76916721e876639033b" dependencies = [ - "bincode", + "bincode 1.3.3", "camino", "fs-err", "once_cell", "proc-macro2", "quote", "serde", - "syn 2.0.104", + "syn 2.0.106", "toml", "uniffi_meta", ] @@ -2358,6 +3148,30 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -2382,6 +3196,21 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -2390,43 +3219,67 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2434,26 +3287,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" dependencies = [ "unicode-ident", ] +[[package]] +name = "web-sys" +version = "0.3.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "web-time" version = "1.1.0" @@ -2464,6 +3327,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "weedle2" version = "5.0.0" @@ -2523,6 +3395,41 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -2541,6 +3448,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -2574,10 +3490,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -2753,13 +3670,16 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "x25519-dalek" @@ -2782,24 +3702,69 @@ dependencies = [ "time", ] +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure", +] + [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", + "synstructure", ] [[package]] @@ -2819,5 +3784,38 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", +] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", ] diff --git a/pubspec.lock b/pubspec.lock index f75e38f..4de4970 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -210,6 +210,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.15.5" + http: + dependency: "direct main" + description: + name: http + sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 + url: "https://pub.dev" + source: hosted + version: "1.5.0" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" + url: "https://pub.dev" + source: hosted + version: "4.1.2" image: dependency: transitive description: From 4fc4c06387178e70f42c01884658dbea313fb91d Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sat, 20 Sep 2025 12:39:49 +0300 Subject: [PATCH 03/22] Socket forwarding not working --- .../threefold/mycelium/HttpToSocksProxy.kt | 320 ++++++++++++++++++ .../tech/threefold/mycelium/MainActivity.kt | 48 ++- .../tech/threefold/mycelium/ProxyTester.kt | 122 +++++++ .../tech/threefold/mycelium/SocksProxy.kt | 129 +++++++ .../tech/threefold/mycelium/TunService.kt | 48 ++- .../threefold/mycelium/TunToSocksForwarder.kt | 277 +++++++++++++++ ios/Runner/AppDelegate.swift | 24 ++ lib/features/home/home_screen.dart | 10 +- lib/myceliumflut_ffi_binding.dart | 108 ++++++ lib/services/ffi/mycelium_service.dart | 55 ++- macos/Runner/AppDelegate.swift | 75 ++++ mycelmob/src/lib.rs | 24 ++ 12 files changed, 1226 insertions(+), 14 deletions(-) create mode 100644 android/app/src/main/kotlin/tech/threefold/mycelium/HttpToSocksProxy.kt create mode 100644 android/app/src/main/kotlin/tech/threefold/mycelium/ProxyTester.kt create mode 100644 android/app/src/main/kotlin/tech/threefold/mycelium/SocksProxy.kt create mode 100644 android/app/src/main/kotlin/tech/threefold/mycelium/TunToSocksForwarder.kt diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/HttpToSocksProxy.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/HttpToSocksProxy.kt new file mode 100644 index 0000000..4359f1e --- /dev/null +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/HttpToSocksProxy.kt @@ -0,0 +1,320 @@ +package tech.threefold.mycelium + +import android.util.Log +import kotlinx.coroutines.* +import java.io.* +import java.net.* +import java.nio.charset.StandardCharsets + +/** + * HTTP-to-SOCKS proxy server that accepts HTTP requests and forwards them through SOCKS5 + * This bridges Android's HTTP proxy support with mycelium's SOCKS5 proxy + */ +class HttpToSocksProxy { + companion object { + private const val TAG = "HttpToSocksProxy" + private const val HTTP_PROXY_PORT = 8080 + private const val SOCKS_HOST = "127.0.0.1" + private const val SOCKS_PORT = 1080 + } + + private var serverSocket: ServerSocket? = null + private var isRunning = false + private var proxyJob: Job? = null + + /** + * Start the HTTP-to-SOCKS proxy server + */ + fun start() { + if (isRunning) { + Log.w(TAG, "HTTP-to-SOCKS proxy already running") + return + } + + isRunning = true + Log.i(TAG, "Starting HTTP-to-SOCKS proxy on port $HTTP_PROXY_PORT") + + // Test if mycelium SOCKS proxy is running + testSocksConnection() + + proxyJob = CoroutineScope(Dispatchers.IO).launch { + try { + serverSocket = ServerSocket(HTTP_PROXY_PORT) + Log.i(TAG, "HTTP-to-SOCKS proxy listening on port $HTTP_PROXY_PORT") + + while (isRunning) { + try { + val clientSocket = serverSocket?.accept() + if (clientSocket != null) { + Log.d(TAG, "New HTTP client connection from ${clientSocket.remoteSocketAddress}") + CoroutineScope(Dispatchers.IO).launch { + handleHttpClient(clientSocket) + } + } + } catch (e: Exception) { + if (isRunning) { + Log.e(TAG, "Error accepting HTTP client: ${e.message}") + } + } + } + } catch (e: Exception) { + Log.e(TAG, "HTTP-to-SOCKS proxy server error: ${e.message}") + } + } + } + + /** + * Stop the HTTP-to-SOCKS proxy server + */ + fun stop() { + Log.i(TAG, "Stopping HTTP-to-SOCKS proxy") + isRunning = false + proxyJob?.cancel() + + try { + serverSocket?.close() + } catch (e: Exception) { + Log.w(TAG, "Error closing server socket: ${e.message}") + } + serverSocket = null + } + + private suspend fun handleHttpClient(clientSocket: Socket) { + try { + val clientInput = BufferedReader(InputStreamReader(clientSocket.getInputStream())) + val clientOutput = clientSocket.getOutputStream() + + // Read HTTP request + val requestLine = clientInput.readLine() + if (requestLine == null) { + clientSocket.close() + return + } + + Log.d(TAG, "HTTP request: $requestLine") + + // Parse HTTP request + val parts = requestLine.split(" ") + if (parts.size < 3) { + sendHttpError(clientOutput, "400 Bad Request") + clientSocket.close() + return + } + + val method = parts[0] + val url = parts[1] + val httpVersion = parts[2] + + // Handle CONNECT method (HTTPS tunneling) + if (method == "CONNECT") { + handleHttpsConnect(url, clientInput, clientOutput, clientSocket) + } else { + // Handle regular HTTP requests + handleHttpRequest(method, url, httpVersion, clientInput, clientOutput, clientSocket) + } + + } catch (e: Exception) { + Log.e(TAG, "Error handling HTTP client: ${e.message}") + } finally { + try { + clientSocket.close() + } catch (e: Exception) { + Log.w(TAG, "Error closing client socket: ${e.message}") + } + } + } + + private suspend fun handleHttpsConnect( + hostPort: String, + clientInput: BufferedReader, + clientOutput: OutputStream, + clientSocket: Socket + ) { + try { + // Parse host:port + val parts = hostPort.split(":") + val host = parts[0] + val port = if (parts.size > 1) parts[1].toInt() else 443 + + Log.d(TAG, "HTTPS CONNECT to $host:$port") + + // Connect through SOCKS proxy + val socksSocket = connectThroughSocks(host, port) + if (socksSocket == null) { + sendHttpError(clientOutput, "502 Bad Gateway") + return + } + + // Send 200 Connection Established + clientOutput.write("HTTP/1.1 200 Connection Established\r\n\r\n".toByteArray()) + clientOutput.flush() + + // Start bidirectional forwarding + val job1 = CoroutineScope(Dispatchers.IO).launch { + forwardData(clientSocket.getInputStream(), socksSocket.getOutputStream(), "client->socks") + } + val job2 = CoroutineScope(Dispatchers.IO).launch { + forwardData(socksSocket.getInputStream(), clientOutput, "socks->client") + } + + // Wait for either direction to close + try { + job1.join() + } catch (e: Exception) { + // One direction closed, cancel the other + } + + job1.cancel() + job2.cancel() + socksSocket.close() + + } catch (e: Exception) { + Log.e(TAG, "Error in HTTPS CONNECT: ${e.message}") + } + } + + private suspend fun handleHttpRequest( + method: String, + url: String, + httpVersion: String, + clientInput: BufferedReader, + clientOutput: OutputStream, + clientSocket: Socket + ) { + try { + // Parse URL to extract host and port + val uri = URI(url) + val host = uri.host ?: return + val port = if (uri.port != -1) uri.port else 80 + + Log.d(TAG, "HTTP $method to $host:$port") + + // Connect through SOCKS proxy + val socksSocket = connectThroughSocks(host, port) + if (socksSocket == null) { + sendHttpError(clientOutput, "502 Bad Gateway") + return + } + + val socksOutput = socksSocket.getOutputStream() + val socksInput = socksSocket.getInputStream() + + // Forward the original request + socksOutput.write("$method ${uri.path}${if (uri.query != null) "?" + uri.query else ""} $httpVersion\r\n".toByteArray()) + + // Forward headers + var line: String? + while (clientInput.readLine().also { line = it } != null && line!!.isNotEmpty()) { + socksOutput.write("$line\r\n".toByteArray()) + } + socksOutput.write("\r\n".toByteArray()) + socksOutput.flush() + + // Forward response back to client + forwardData(socksInput, clientOutput, "socks->client") + socksSocket.close() + + } catch (e: Exception) { + Log.e(TAG, "Error in HTTP request: ${e.message}") + } + } + + private suspend fun connectThroughSocks(host: String, port: Int): Socket? { + return withContext(Dispatchers.IO) { + try { + val socksSocket = Socket(SOCKS_HOST, SOCKS_PORT) + socksSocket.soTimeout = 10000 + + val input = socksSocket.getInputStream() + val output = socksSocket.getOutputStream() + + // SOCKS5 handshake + output.write(byteArrayOf(0x05, 0x01, 0x00)) // Version 5, 1 method, no auth + output.flush() + + val authResponse = ByteArray(2) + if (input.read(authResponse) != 2 || authResponse[0] != 0x05.toByte() || authResponse[1] != 0x00.toByte()) { + Log.e(TAG, "SOCKS auth failed") + socksSocket.close() + return@withContext null + } + + // SOCKS5 connect request + val hostBytes = host.toByteArray(StandardCharsets.UTF_8) + val request = ByteArrayOutputStream() + request.write(0x05) // Version + request.write(0x01) // Connect command + request.write(0x00) // Reserved + request.write(0x03) // Domain name address type + request.write(hostBytes.size) // Domain name length + request.write(hostBytes) // Domain name + request.write(port shr 8) // Port high byte + request.write(port and 0xFF) // Port low byte + + output.write(request.toByteArray()) + output.flush() + + // Read connect response + val response = ByteArray(10) + val bytesRead = input.read(response) + if (bytesRead < 4 || response[0] != 0x05.toByte() || response[1] != 0x00.toByte()) { + Log.e(TAG, "SOCKS connect failed") + socksSocket.close() + return@withContext null + } + + Log.d(TAG, "Successfully connected to $host:$port through SOCKS") + socksSocket + } catch (e: Exception) { + Log.e(TAG, "Failed to connect through SOCKS: ${e.message}") + null + } + } + } + + private suspend fun forwardData(input: InputStream, output: OutputStream, direction: String) { + withContext(Dispatchers.IO) { + try { + val buffer = ByteArray(8192) + while (true) { + val bytesRead = input.read(buffer) + if (bytesRead <= 0) break + output.write(buffer, 0, bytesRead) + output.flush() + } + } catch (e: Exception) { + Log.d(TAG, "Data forwarding stopped ($direction): ${e.message}") + } + } + } + + private fun sendHttpError(output: OutputStream, error: String) { + try { + val response = "HTTP/1.1 $error\r\nContent-Length: 0\r\n\r\n" + output.write(response.toByteArray()) + output.flush() + } catch (e: Exception) { + Log.e(TAG, "Error sending HTTP error: ${e.message}") + } + } + + private fun testSocksConnection() { + CoroutineScope(Dispatchers.IO).launch { + try { + Log.i(TAG, "Testing connection to mycelium SOCKS proxy at $SOCKS_HOST:$SOCKS_PORT") + val testSocket = Socket() + testSocket.connect(InetSocketAddress(SOCKS_HOST, SOCKS_PORT), 5000) + testSocket.close() + Log.i(TAG, "✅ Mycelium SOCKS proxy is reachable at $SOCKS_HOST:$SOCKS_PORT") + } catch (e: Exception) { + Log.e(TAG, "❌ Cannot connect to mycelium SOCKS proxy at $SOCKS_HOST:$SOCKS_PORT: ${e.message}") + Log.e(TAG, "Make sure mycelium is running and SOCKS proxy is enabled") + } + } + } + + /** + * Get the port number this proxy is listening on + */ + fun getPort(): Int = HTTP_PROXY_PORT +} diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt index e7ea012..8b2c930 100644 --- a/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt @@ -18,6 +18,9 @@ import tech.threefold.mycelium.rust.uniffi.mycelmob.generateSecretKey import tech.threefold.mycelium.rust.uniffi.mycelmob.getPeerStatus import tech.threefold.mycelium.rust.uniffi.mycelmob.proxyConnect import tech.threefold.mycelium.rust.uniffi.mycelmob.proxyDisconnect +import tech.threefold.mycelium.rust.uniffi.mycelmob.startProxyProbe +import tech.threefold.mycelium.rust.uniffi.mycelmob.stopProxyProbe +import tech.threefold.mycelium.rust.uniffi.mycelmob.listProxies private const val tag = "[Myceliumflut]" @@ -25,9 +28,10 @@ class MainActivity: FlutterActivity() { private val channelName = "tech.threefold.mycelium/tun" private val vpnRequestCode = 0x0F - // these two variables are only used during VPN permission flow. + // these variables are only used during VPN permission flow. private var vpnPermissionPeers: List? = null private var vpnPermissionSecretKey: ByteArray? = null + private var vpnPermissionSocksEnabled: Boolean = false private lateinit var channel : MethodChannel @@ -50,8 +54,9 @@ class MainActivity: FlutterActivity() { "startVpn" -> { val peers = call.argument>("peers")!! val secretKey = call.argument("secretKey")!! - Log.d("tff", "peers = $peers") - val started = startVpn(peers, secretKey) + val socksEnabled = call.argument("socksEnabled") ?: false + Log.d("tff", "peers = $peers, socksEnabled = $socksEnabled") + val started = startVpn(peers, secretKey, socksEnabled) result.success(started) } "stopVpn" -> { @@ -87,6 +92,33 @@ class MainActivity: FlutterActivity() { result.error("PROXY_DISCONNECT_ERROR", e.message, null) } } + "startProxyProbe" -> { + try { + val proxyResult = startProxyProbe() + result.success(proxyResult) + } catch (e: Exception) { + Log.e(tag, "Error in startProxyProbe: ${e.message}") + result.error("START_PROXY_PROBE_ERROR", e.message, null) + } + } + "stopProxyProbe" -> { + try { + val proxyResult = stopProxyProbe() + result.success(proxyResult) + } catch (e: Exception) { + Log.e(tag, "Error in stopProxyProbe: ${e.message}") + result.error("STOP_PROXY_PROBE_ERROR", e.message, null) + } + } + "listProxies" -> { + try { + val proxyResult = listProxies() + result.success(proxyResult) + } catch (e: Exception) { + Log.e(tag, "Error in listProxies: ${e.message}") + result.error("LIST_PROXIES_ERROR", e.message, null) + } + } else -> result.notImplemented() } } @@ -115,7 +147,7 @@ class MainActivity: FlutterActivity() { if (requestCode == vpnRequestCode) { if (resultCode == Activity.RESULT_OK) { Log.i(tag, "VPN permission granted by the user") - startVpn(this.vpnPermissionPeers ?: emptyList(), this.vpnPermissionSecretKey ?: ByteArray(0)) + startVpn(this.vpnPermissionPeers ?: emptyList(), this.vpnPermissionSecretKey ?: ByteArray(0), this.vpnPermissionSocksEnabled) } else { // The user denied the VPN permission, // TODO: handle this case as needed @@ -125,19 +157,20 @@ class MainActivity: FlutterActivity() { } // checkAskVpnPermission will return true if we need to ask for permission, // false otherwise. - private fun checkAskVpnPermission(peers: List, secretKey: ByteArray): Boolean{ + private fun checkAskVpnPermission(peers: List, secretKey: ByteArray, socksEnabled: Boolean): Boolean{ val intent = VpnService.prepare(this) if (intent != null) { this.vpnPermissionPeers = peers this.vpnPermissionSecretKey = secretKey + this.vpnPermissionSocksEnabled = socksEnabled startActivityForResult(intent, vpnRequestCode) return true } else { return false } } - private fun startVpn(peers: List, secretKey: ByteArray): Boolean { - if (checkAskVpnPermission(peers, secretKey)) { + private fun startVpn(peers: List, secretKey: ByteArray, socksEnabled: Boolean = false): Boolean { + if (checkAskVpnPermission(peers, secretKey, socksEnabled)) { // need to ask for permission, so stop the flow here. // permission handler will be handled by onActivityResult function return false @@ -146,6 +179,7 @@ class MainActivity: FlutterActivity() { val intent = Intent(this, TunService::class.java) intent.action = TunService.ACTION_START intent.putExtra("secret_key", secretKey) + intent.putExtra("socks_enabled", socksEnabled) intent.putStringArrayListExtra("peers", ArrayList(peers)) startService(intent) diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/ProxyTester.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/ProxyTester.kt new file mode 100644 index 0000000..006cfca --- /dev/null +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/ProxyTester.kt @@ -0,0 +1,122 @@ +package tech.threefold.mycelium + +import android.util.Log +import kotlinx.coroutines.* +import java.io.* +import java.net.* + +/** + * Simple utility to test proxy connections and debug routing issues + */ +class ProxyTester { + companion object { + private const val TAG = "ProxyTester" + } + + /** + * Test if we can connect to the mycelium SOCKS proxy + */ + fun testSocksProxy() { + CoroutineScope(Dispatchers.IO).launch { + try { + Log.i(TAG, "Testing SOCKS proxy connection to 127.0.0.1:1080") + val socket = Socket() + socket.connect(InetSocketAddress("127.0.0.1", 1080), 5000) + + // Try SOCKS5 handshake + val output = socket.getOutputStream() + val input = socket.getInputStream() + + // Send SOCKS5 greeting + output.write(byteArrayOf(0x05, 0x01, 0x00)) // Version 5, 1 method, no auth + output.flush() + + // Read response + val response = ByteArray(2) + val bytesRead = input.read(response) + + if (bytesRead == 2 && response[0] == 0x05.toByte() && response[1] == 0x00.toByte()) { + Log.i(TAG, "✅ SOCKS proxy is working correctly") + } else { + Log.e(TAG, "❌ SOCKS proxy handshake failed: ${response.contentToString()}") + } + + socket.close() + } catch (e: Exception) { + Log.e(TAG, "❌ SOCKS proxy test failed: ${e.message}") + } + } + } + + /** + * Test HTTP request through our HTTP-to-SOCKS bridge + */ + fun testHttpProxy() { + CoroutineScope(Dispatchers.IO).launch { + try { + Log.i(TAG, "Testing HTTP proxy connection to 127.0.0.1:8080") + val socket = Socket() + socket.connect(InetSocketAddress("127.0.0.1", 8080), 5000) + + val output = socket.getOutputStream() + val input = BufferedReader(InputStreamReader(socket.getInputStream())) + + // Send simple HTTP request + val request = "GET http://httpbin.org/ip HTTP/1.1\r\n" + + "Host: httpbin.org\r\n" + + "Connection: close\r\n\r\n" + + output.write(request.toByteArray()) + output.flush() + + // Read response + val response = StringBuilder() + var line: String? + while (input.readLine().also { line = it } != null) { + response.append(line).append("\n") + if (response.length > 1000) break // Limit response size + } + + Log.i(TAG, "HTTP proxy response: $response") + socket.close() + } catch (e: Exception) { + Log.e(TAG, "❌ HTTP proxy test failed: ${e.message}") + } + } + } + + /** + * Test direct connection to check what IP we're actually using + */ + fun testDirectConnection() { + CoroutineScope(Dispatchers.IO).launch { + try { + Log.i(TAG, "Testing direct connection to httpbin.org") + val socket = Socket() + socket.connect(InetSocketAddress("httpbin.org", 80), 10000) + + val output = socket.getOutputStream() + val input = BufferedReader(InputStreamReader(socket.getInputStream())) + + val request = "GET /ip HTTP/1.1\r\n" + + "Host: httpbin.org\r\n" + + "Connection: close\r\n\r\n" + + output.write(request.toByteArray()) + output.flush() + + val response = StringBuilder() + var line: String? + while (input.readLine().also { line = it } != null) { + response.append(line).append("\n") + if (response.length > 1000) break + } + + Log.i(TAG, "Direct connection response: $response") + socket.close() + } catch (e: Exception) { + Log.e(TAG, "❌ Direct connection test failed: ${e.message}") + } + } + } +} diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/SocksProxy.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/SocksProxy.kt new file mode 100644 index 0000000..8211d3e --- /dev/null +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/SocksProxy.kt @@ -0,0 +1,129 @@ +package tech.threefold.mycelium + +import android.util.Log +import kotlinx.coroutines.* +import java.io.* +import java.net.* +import java.nio.ByteBuffer +import java.nio.channels.SocketChannel + +/** + * SOCKS5 client implementation for routing TUN traffic through local SOCKS proxy + */ +class SocksProxy { + companion object { + private const val TAG = "SocksProxy" + private const val SOCKS_VERSION = 0x05.toByte() + private const val SOCKS_CMD_CONNECT = 0x01.toByte() + private const val SOCKS_ATYP_IPV4 = 0x01.toByte() + private const val SOCKS_ATYP_IPV6 = 0x04.toByte() + private const val SOCKS_RSV = 0x00.toByte() + private const val SOCKS_AUTH_NONE = 0x00.toByte() + private const val SOCKS_SUCCESS = 0x00.toByte() + } + + /** + * Establish SOCKS5 connection to target through local proxy + */ + suspend fun connectThroughSocks(targetHost: String, targetPort: Int): Socket? { + return withContext(Dispatchers.IO) { + try { + val socksSocket = Socket("127.0.0.1", 1080) + socksSocket.soTimeout = 10000 // 10 second timeout + + val input = socksSocket.getInputStream() + val output = socksSocket.getOutputStream() + + // Step 1: Authentication negotiation + if (!performSocksHandshake(input, output)) { + Log.e(TAG, "SOCKS handshake failed") + socksSocket.close() + return@withContext null + } + + // Step 2: Connection request + if (!performSocksConnect(input, output, targetHost, targetPort)) { + Log.e(TAG, "SOCKS connect failed") + socksSocket.close() + return@withContext null + } + + Log.d(TAG, "Successfully connected to $targetHost:$targetPort through SOCKS") + socksSocket + } catch (e: Exception) { + Log.e(TAG, "Failed to connect through SOCKS: ${e.message}") + null + } + } + } + + private fun performSocksHandshake(input: InputStream, output: OutputStream): Boolean { + try { + // Send authentication methods + val authRequest = byteArrayOf( + SOCKS_VERSION, // Version + 0x01, // Number of methods + SOCKS_AUTH_NONE // No authentication + ) + output.write(authRequest) + output.flush() + + // Read server response + val response = ByteArray(2) + if (input.read(response) != 2) { + Log.e(TAG, "Failed to read SOCKS auth response") + return false + } + + if (response[0] != SOCKS_VERSION || response[1] != SOCKS_AUTH_NONE) { + Log.e(TAG, "SOCKS auth failed: version=${response[0]}, method=${response[1]}") + return false + } + + return true + } catch (e: Exception) { + Log.e(TAG, "SOCKS handshake error: ${e.message}") + return false + } + } + + private fun performSocksConnect(input: InputStream, output: OutputStream, host: String, port: Int): Boolean { + try { + val hostBytes = host.toByteArray() + val hostAddress = InetAddress.getByName(host).address + val request = byteArrayOf( + SOCKS_VERSION, // Version + SOCKS_CMD_CONNECT, // Command: CONNECT + SOCKS_RSV, // Reserved + SOCKS_ATYP_IPV4, // Address type: IPv4 + hostAddress[0], // IP byte 1 + hostAddress[1], // IP byte 2 + hostAddress[2], // IP byte 3 + hostAddress[3], // IP byte 4 + (port shr 8).toByte(), // Port high byte + (port and 0xFF).toByte() // Port low byte + ) + + output.write(request) + output.flush() + + // Read response + val response = ByteArray(10) // Max response size for IPv4 + val bytesRead = input.read(response) + if (bytesRead < 4) { + Log.e(TAG, "Invalid SOCKS connect response length: $bytesRead") + return false + } + + if (response[0] != SOCKS_VERSION || response[1] != SOCKS_SUCCESS) { + Log.e(TAG, "SOCKS connect failed: version=${response[0]}, status=${response[1]}") + return false + } + + return true + } catch (e: Exception) { + Log.e(TAG, "SOCKS connect error: ${e.message}") + return false + } + } +} diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt index 9a3bc45..3486dc4 100644 --- a/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/TunService.kt @@ -1,6 +1,7 @@ package tech.threefold.mycelium import android.content.Intent +import android.net.ProxyInfo import android.net.VpnService import android.os.ParcelFileDescriptor import android.system.OsConstants @@ -12,7 +13,6 @@ import tech.threefold.mycelium.rust.uniffi.mycelmob.stopMycelium import kotlinx.coroutines.* import kotlin.coroutines.CoroutineContext - private const val tag = "[TunService]" class TunService : VpnService(), CoroutineScope { @@ -27,6 +27,7 @@ class TunService : VpnService(), CoroutineScope { private var started = AtomicBoolean() private var parcel: ParcelFileDescriptor? = null + private var httpToSocksProxy: HttpToSocksProxy? = null private val job = Job() @@ -60,7 +61,8 @@ class TunService : VpnService(), CoroutineScope { ACTION_START -> { val secretKey = intent.getByteArrayExtra("secret_key") ?: ByteArray(0) val peers = intent.getStringArrayListExtra("peers") ?: emptyList() - start(peers.toList(), secretKey) + val socksEnabled = intent.getBooleanExtra("socks_enabled", false) + start(peers.toList(), secretKey, socksEnabled) START_STICKY } else -> { @@ -71,7 +73,7 @@ class TunService : VpnService(), CoroutineScope { } - private fun start(peers: List, secretKey: ByteArray): Int { + private fun start(peers: List, secretKey: ByteArray, socksEnabled: Boolean = false): Int { if (!started.compareAndSet(false, true)) { return 0 } @@ -90,6 +92,23 @@ class TunService : VpnService(), CoroutineScope { .setMtu(1420) .setSession("mycelium") + // If SOCKS proxy is enabled, route all internet traffic through VPN + if (socksEnabled) { + // Route all traffic except localhost to prevent loops + builder.addRoute("1.0.0.0", 8) // 1.0.0.0/8 + builder.addRoute("2.0.0.0", 7) // 2.0.0.0/7 (covers 2.0.0.0-3.255.255.255) + builder.addRoute("4.0.0.0", 6) // 4.0.0.0/6 (covers 4.0.0.0-7.255.255.255) + builder.addRoute("8.0.0.0", 5) // 8.0.0.0/5 (covers 8.0.0.0-15.255.255.255) + builder.addRoute("16.0.0.0", 4) // 16.0.0.0/4 (covers 16.0.0.0-31.255.255.255) + builder.addRoute("32.0.0.0", 3) // 32.0.0.0/3 (covers 32.0.0.0-63.255.255.255) + builder.addRoute("64.0.0.0", 2) // 64.0.0.0/2 (covers 64.0.0.0-127.255.255.255) + builder.addRoute("128.0.0.0", 1) // 128.0.0.0/1 (covers 128.0.0.0-255.255.255.255) + // This excludes 127.0.0.0/8 (localhost) to prevent SOCKS proxy loops + + // Set HTTP proxy to use our HTTP-to-SOCKS bridge + builder.setHttpProxy(ProxyInfo.buildDirectProxy("127.0.0.1", 8080)) + } + parcel = builder.establish() @@ -102,6 +121,21 @@ class TunService : VpnService(), CoroutineScope { } Log.d(tag, "starting mycelium with parcel fd: " + parcel.fd) + + // Start HTTP-to-SOCKS proxy bridge if SOCKS is enabled + if (socksEnabled) { + Log.i(tag, "Starting HTTP-to-SOCKS proxy bridge") + httpToSocksProxy = HttpToSocksProxy() + httpToSocksProxy?.start() + Log.i(tag, "SOCKS proxy enabled - HTTP traffic will be routed through 127.0.0.1:8080 -> 127.0.0.1:1080") + + // Run diagnostic tests + val tester = ProxyTester() + tester.testSocksProxy() + tester.testHttpProxy() + tester.testDirectConnection() + } + launch { try { startMycelium(peers, parcel.fd, secretKey) @@ -111,7 +145,7 @@ class TunService : VpnService(), CoroutineScope { sendMyceliumEvent(EVENT_MYCELIUM_FAILED) } else { Log.i(tag, "mycelium finished cleanly") - sendMyceliumEvent(EVENT_MYCELIUM_FINISHED) + stop(true) } } catch (e: Exception) { @@ -129,6 +163,12 @@ class TunService : VpnService(), CoroutineScope { Log.d(tag, "got stop when not started") return } + + // Stop HTTP-to-SOCKS proxy bridge + httpToSocksProxy?.stop() + httpToSocksProxy = null + Log.d(tag, "Cleaned up SOCKS proxy resources") + if (stopMycelium) { stopMycelium() } diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/TunToSocksForwarder.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/TunToSocksForwarder.kt new file mode 100644 index 0000000..c9633cc --- /dev/null +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/TunToSocksForwarder.kt @@ -0,0 +1,277 @@ +package tech.threefold.mycelium + +import android.os.ParcelFileDescriptor +import android.util.Log +import kotlinx.coroutines.* +import java.io.* +import java.net.* +import java.nio.ByteBuffer +import java.nio.channels.FileChannel +import java.util.concurrent.ConcurrentHashMap + +/** + * TUN-to-SOCKS forwarder that intercepts packets from TUN interface + * and routes them through the local SOCKS proxy + */ +class TunToSocksForwarder(private val tunFd: ParcelFileDescriptor) { + companion object { + private const val TAG = "TunToSocksForwarder" + private const val MTU = 1500 + private const val TCP_PROTOCOL = 6 + private const val UDP_PROTOCOL = 17 + } + + private val socksProxy = SocksProxy() + private val activeConnections = ConcurrentHashMap() + private var isRunning = false + private var forwarderJob: Job? = null + + /** + * Start the TUN-to-SOCKS forwarding process + */ + fun start() { + if (isRunning) { + Log.w(TAG, "Forwarder already running") + return + } + + isRunning = true + Log.i(TAG, "Starting TUN-to-SOCKS forwarder") + + forwarderJob = CoroutineScope(Dispatchers.IO).launch { + try { + val tunInput = FileInputStream(tunFd.fileDescriptor) + val tunOutput = FileOutputStream(tunFd.fileDescriptor) + val buffer = ByteArray(MTU) + + Log.i(TAG, "TUN forwarder started, reading packets...") + + while (isRunning) { + try { + val bytesRead = tunInput.read(buffer) + if (bytesRead > 0) { + Log.d(TAG, "Read $bytesRead bytes from TUN interface") + processPacket(buffer, bytesRead, tunOutput) + } else if (bytesRead == 0) { + // No data available, small delay to prevent busy waiting + delay(10) + } + } catch (e: Exception) { + if (isRunning) { + Log.e(TAG, "Error processing packet: ${e.message}") + delay(100) // Prevent rapid error loops + } + } + } + } catch (e: Exception) { + Log.e(TAG, "TUN forwarder error: ${e.message}") + } + } + } + + /** + * Stop the forwarder and close all connections + */ + fun stop() { + Log.i(TAG, "Stopping TUN-to-SOCKS forwarder") + isRunning = false + forwarderJob?.cancel() + + // Close all active connections + activeConnections.values.forEach { socket -> + try { + socket.close() + } catch (e: Exception) { + Log.w(TAG, "Error closing connection: ${e.message}") + } + } + activeConnections.clear() + } + + private suspend fun processPacket(buffer: ByteArray, length: Int, tunOutput: FileOutputStream) { + try { + val packet = parseIPPacket(buffer, length) ?: return + + // Only handle TCP for now (HTTP/HTTPS traffic) + if (packet.protocol != TCP_PROTOCOL) { + return + } + + val connectionKey = "${packet.srcIP}:${packet.srcPort}->${packet.dstIP}:${packet.dstPort}" + + // Check if this is a new connection + if (!activeConnections.containsKey(connectionKey)) { + handleNewConnection(packet, connectionKey, tunOutput) + } else { + // Forward data for existing connection + forwardData(packet, connectionKey, tunOutput) + } + } catch (e: Exception) { + Log.e(TAG, "Error processing packet: ${e.message}") + } + } + + private suspend fun handleNewConnection(packet: IPPacket, connectionKey: String, tunOutput: FileOutputStream) { + try { + Log.d(TAG, "New connection: $connectionKey") + + // Connect through SOCKS proxy + val socksSocket = socksProxy.connectThroughSocks(packet.dstIP, packet.dstPort) + if (socksSocket == null) { + Log.e(TAG, "Failed to establish SOCKS connection for $connectionKey") + return + } + + activeConnections[connectionKey] = socksSocket + + // Start forwarding data in both directions + CoroutineScope(Dispatchers.IO).launch { + forwardFromSocksToTun(socksSocket, packet, tunOutput, connectionKey) + } + + // Forward the initial packet data + if (packet.payload.isNotEmpty()) { + socksSocket.getOutputStream().write(packet.payload) + socksSocket.getOutputStream().flush() + } + + } catch (e: Exception) { + Log.e(TAG, "Error handling new connection: ${e.message}") + } + } + + private suspend fun forwardData(packet: IPPacket, connectionKey: String, tunOutput: FileOutputStream) { + try { + val socket = activeConnections[connectionKey] ?: return + + if (packet.payload.isNotEmpty()) { + socket.getOutputStream().write(packet.payload) + socket.getOutputStream().flush() + } + } catch (e: Exception) { + Log.e(TAG, "Error forwarding data: ${e.message}") + // Remove failed connection + activeConnections.remove(connectionKey)?.close() + } + } + + private suspend fun forwardFromSocksToTun( + socket: Socket, + originalPacket: IPPacket, + tunOutput: FileOutputStream, + connectionKey: String + ) { + try { + val input = socket.getInputStream() + val buffer = ByteArray(MTU) + + while (isRunning && !socket.isClosed) { + val bytesRead = input.read(buffer) + if (bytesRead <= 0) break + + // Create response packet and write to TUN + val responsePacket = createResponsePacket( + originalPacket, + buffer.copyOf(bytesRead) + ) + tunOutput.write(responsePacket) + tunOutput.flush() + } + } catch (e: Exception) { + Log.e(TAG, "Error forwarding from SOCKS to TUN: ${e.message}") + } finally { + activeConnections.remove(connectionKey) + try { + socket.close() + } catch (e: Exception) { + Log.w(TAG, "Error closing socket: ${e.message}") + } + } + } + + private fun parseIPPacket(buffer: ByteArray, length: Int): IPPacket? { + try { + if (length < 20) return null // Minimum IP header size + + val version = (buffer[0].toInt() shr 4) and 0xF + if (version != 4) return null // Only IPv4 for now + + val headerLength = (buffer[0].toInt() and 0xF) * 4 + val protocol = buffer[9].toInt() and 0xFF + + // Extract source and destination IPs + val srcIP = "${buffer[12].toUByte()}.${buffer[13].toUByte()}.${buffer[14].toUByte()}.${buffer[15].toUByte()}" + val dstIP = "${buffer[16].toUByte()}.${buffer[17].toUByte()}.${buffer[18].toUByte()}.${buffer[19].toUByte()}" + + if (protocol != TCP_PROTOCOL) return null + + // Extract TCP ports + val tcpHeaderOffset = headerLength + if (length < tcpHeaderOffset + 4) return null + + val srcPort = ((buffer[tcpHeaderOffset].toInt() and 0xFF) shl 8) or (buffer[tcpHeaderOffset + 1].toInt() and 0xFF) + val dstPort = ((buffer[tcpHeaderOffset + 2].toInt() and 0xFF) shl 8) or (buffer[tcpHeaderOffset + 3].toInt() and 0xFF) + + val tcpHeaderLength = ((buffer[tcpHeaderOffset + 12].toInt() and 0xFF) shr 4) * 4 + val payloadOffset = tcpHeaderOffset + tcpHeaderLength + val payload = if (payloadOffset < length) { + buffer.copyOfRange(payloadOffset, length) + } else { + byteArrayOf() + } + + return IPPacket(srcIP, srcPort, dstIP, dstPort, protocol, payload) + } catch (e: Exception) { + Log.e(TAG, "Error parsing IP packet: ${e.message}") + return null + } + } + + private fun createResponsePacket(originalPacket: IPPacket, payload: ByteArray): ByteArray { + // Create a simple TCP response packet + // This is a simplified implementation - in production you'd want proper TCP state management + val ipHeader = ByteArray(20) + val tcpHeader = ByteArray(20) + + // IP Header (simplified) + ipHeader[0] = 0x45.toByte() // Version 4, Header length 5*4=20 + ipHeader[1] = 0x00.toByte() // Type of service + val totalLength = 20 + 20 + payload.size + ipHeader[2] = (totalLength shr 8).toByte() + ipHeader[3] = (totalLength and 0xFF).toByte() + ipHeader[9] = TCP_PROTOCOL.toByte() + + // Source IP (swap with destination) + val dstIPParts = originalPacket.dstIP.split(".") + ipHeader[12] = dstIPParts[0].toInt().toByte() + ipHeader[13] = dstIPParts[1].toInt().toByte() + ipHeader[14] = dstIPParts[2].toInt().toByte() + ipHeader[15] = dstIPParts[3].toInt().toByte() + + // Destination IP (swap with source) + val srcIPParts = originalPacket.srcIP.split(".") + ipHeader[16] = srcIPParts[0].toInt().toByte() + ipHeader[17] = srcIPParts[1].toInt().toByte() + ipHeader[18] = srcIPParts[2].toInt().toByte() + ipHeader[19] = srcIPParts[3].toInt().toByte() + + // TCP Header (simplified) + tcpHeader[0] = (originalPacket.dstPort shr 8).toByte() + tcpHeader[1] = (originalPacket.dstPort and 0xFF).toByte() + tcpHeader[2] = (originalPacket.srcPort shr 8).toByte() + tcpHeader[3] = (originalPacket.srcPort and 0xFF).toByte() + tcpHeader[12] = 0x50.toByte() // Header length 5*4=20 + tcpHeader[13] = 0x18.toByte() // PSH + ACK flags + + return ipHeader + tcpHeader + payload + } + + data class IPPacket( + val srcIP: String, + val srcPort: Int, + val dstIP: String, + val dstPort: Int, + val protocol: Int, + val payload: ByteArray + ) +} diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 2eb5131..09b48d5 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -85,6 +85,30 @@ import OSLog debuglog("Error in proxyDisconnect: \(error.localizedDescription)") result(FlutterError(code: "PROXY_DISCONNECT_ERROR", message: error.localizedDescription, details: nil)) } + case "startProxyProbe": + do { + let proxyResult = startProxyProbe() + result(proxyResult) + } catch { + debuglog("Error in startProxyProbe: \(error.localizedDescription)") + result(FlutterError(code: "START_PROXY_PROBE_ERROR", message: error.localizedDescription, details: nil)) + } + case "stopProxyProbe": + do { + let proxyResult = stopProxyProbe() + result(proxyResult) + } catch { + debuglog("Error in stopProxyProbe: \(error.localizedDescription)") + result(FlutterError(code: "STOP_PROXY_PROBE_ERROR", message: error.localizedDescription, details: nil)) + } + case "listProxies": + do { + let proxyResult = listProxies() + result(proxyResult) + } catch { + debuglog("Error in listProxies: \(error.localizedDescription)") + result(FlutterError(code: "LIST_PROXIES_ERROR", message: error.localizedDescription, details: nil)) + } default: result(FlutterMethodNotImplemented) } diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index 20c7507..269d130 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -205,10 +205,18 @@ class _HeaderCardState extends State<_HeaderCard> { onChanged: (value) async { setState(() => _isSocks5Enabled = value); if (value) { - final result = await widget.service.proxyConnect(''); + // First start proxy probing to discover available proxies + await widget.service.startProxyProbe(); + // Wait a bit for probes to discover proxies + await Future.delayed(Duration(seconds: 10)); + // Then connect to best available proxy + final result = await widget.service.proxyConnect( + '[40a:152c:b85b:9646:5b71:d03a:eb27:2462]:1080'); debugPrint('Proxy connect result: $result'); } else { final result = await widget.service.proxyDisconnect(); + // Stop proxy probing when disabled + await widget.service.stopProxyProbe(); debugPrint('Proxy disconnect result: $result'); } }, diff --git a/lib/myceliumflut_ffi_binding.dart b/lib/myceliumflut_ffi_binding.dart index 7ea164a..7e21000 100644 --- a/lib/myceliumflut_ffi_binding.dart +++ b/lib/myceliumflut_ffi_binding.dart @@ -279,3 +279,111 @@ Future> myFFProxyDisconnect() async { } } +Future> myFFStartProxyProbe() async { + final outPtr = calloc>>(); + final outLen = calloc(); + + try { + var dylib = loadDll(); + final ffStartProxyProbe = dylib + .lookup>('ff_start_proxy_probe') + .asFunction(); + + ffStartProxyProbe(outPtr, outLen); + + final length = outLen.value; + final ptr = outPtr.value; + + final List result = []; + for (int i = 0; i < length; i++) { + final stringPtr = ptr.elementAt(i).value; + if (stringPtr != nullptr) { + result.add(stringPtr.cast().toDartString()); + } + } + + // Free the memory + final freePeerStatus = dylib + .lookup>('free_peer_status') + .asFunction(); + freePeerStatus(ptr, length); + + return result; + } finally { + calloc.free(outPtr); + calloc.free(outLen); + } +} + +Future> myFFStopProxyProbe() async { + final outPtr = calloc>>(); + final outLen = calloc(); + + try { + var dylib = loadDll(); + final ffStopProxyProbe = dylib + .lookup>('ff_stop_proxy_probe') + .asFunction(); + + ffStopProxyProbe(outPtr, outLen); + + final length = outLen.value; + final ptr = outPtr.value; + + final List result = []; + for (int i = 0; i < length; i++) { + final stringPtr = ptr.elementAt(i).value; + if (stringPtr != nullptr) { + result.add(stringPtr.cast().toDartString()); + } + } + + // Free the memory + final freePeerStatus = dylib + .lookup>('free_peer_status') + .asFunction(); + freePeerStatus(ptr, length); + + return result; + } finally { + calloc.free(outPtr); + calloc.free(outLen); + } +} + +Future> myFFListProxies() async { + final outPtr = calloc>>(); + final outLen = calloc(); + + try { + var dylib = loadDll(); + final ffListProxies = dylib + .lookup>('ff_list_proxies') + .asFunction(); + + ffListProxies(outPtr, outLen); + + final length = outLen.value; + final ptr = outPtr.value; + + final List result = []; + for (int i = 0; i < length; i++) { + final stringPtr = ptr.elementAt(i).value; + if (stringPtr != nullptr) { + result.add(stringPtr.cast().toDartString()); + } + } + + // Free the memory + final freePeerStatus = dylib + .lookup>('free_peer_status') + .asFunction(); + freePeerStatus(ptr, length); + + return result; + } finally { + calloc.free(outPtr); + calloc.free(outLen); + } +} + diff --git a/lib/services/ffi/mycelium_service.dart b/lib/services/ffi/mycelium_service.dart index 846b16a..77b47dd 100644 --- a/lib/services/ffi/mycelium_service.dart +++ b/lib/services/ffi/mycelium_service.dart @@ -85,8 +85,11 @@ class MyceliumService { return null; } - Future start(List peers) async { - print('MyceliumService: Starting with peers: $peers'); + bool _socksEnabled = false; + + Future start(List peers, {bool socksEnabled = false}) async { + print('MyceliumService: Starting with peers: $peers, SOCKS: $socksEnabled'); + _socksEnabled = socksEnabled; _status = NodeStatus.connecting; _statusController.add(_status); final cleaned = preprocessPeers(peers); @@ -108,6 +111,7 @@ class MyceliumService { final result = await _platform.invokeMethod('startVpn', { 'peers': cleaned, 'secretKey': key, + 'socksEnabled': socksEnabled, }); print('MyceliumService: startVpn result: $result'); } @@ -123,6 +127,8 @@ class MyceliumService { } } + bool get socksEnabled => _socksEnabled; + Future stop() async { try { if (isUseDylib()) { @@ -201,4 +207,49 @@ class MyceliumService { return ['Failed to disconnect proxy']; } } + + Future> startProxyProbe() async { + try { + if (isUseDylib()) { + return await myFFStartProxyProbe(); + } else { + final result = + await _platform.invokeMethod>('startProxyProbe'); + return result?.cast() ?? []; + } + } catch (e) { + print("Failed to startProxyProbe: $e"); + return ['Failed to start proxy probe']; + } + } + + Future> stopProxyProbe() async { + try { + if (isUseDylib()) { + return await myFFStopProxyProbe(); + } else { + final result = + await _platform.invokeMethod>('stopProxyProbe'); + return result?.cast() ?? []; + } + } catch (e) { + print("Failed to stopProxyProbe: $e"); + return ['Failed to stop proxy probe']; + } + } + + Future> listProxies() async { + try { + if (isUseDylib()) { + return await myFFListProxies(); + } else { + final result = + await _platform.invokeMethod>('listProxies'); + return result?.cast() ?? []; + } + } catch (e) { + print("Failed to listProxies: $e"); + return ['Failed to list proxies']; + } + } } diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index 14925f8..0ae15f0 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -5,6 +5,81 @@ import flutter_desktop_sleep @main class AppDelegate: FlutterAppDelegate { var _windowManager = FlutterDesktopSleepPlugin() + private var flutterChannel: FlutterMethodChannel? + + override func applicationDidFinishLaunching(_ notification: Notification) { + super.applicationDidFinishLaunching(notification) + + let controller: FlutterViewController = mainFlutterWindow?.contentViewController as! FlutterViewController + flutterChannel = FlutterMethodChannel(name: "tech.threefold.mycelium/tun", + binaryMessenger: controller.engine.binaryMessenger) + flutterChannel!.setMethodCallHandler({ + (call: FlutterMethodCall, result: FlutterResult) -> Void in + switch call.method { + case "generateSecretKey": + let key = generateSecretKey() + result(key) + case "addressFromSecretKey": + if let key = call.arguments as? FlutterStandardTypedData { + let nodeAddr = addressFromSecretKey(data: key.data) + result(nodeAddr) + } else { + result(FlutterError(code: "INVALID_ARGUMENT", message: "Expect secret key", details: nil)) + } + case "startVpn": + // macOS doesn't support VPN tunnel like iOS/Android + result(false) + case "stopVpn": + result(true) + case "getPeerStatus": + do { + let peerStatus = getPeerStatus() + result(peerStatus) + } catch { + result(FlutterError(code: "PEER_STATUS_ERROR", message: error.localizedDescription, details: nil)) + } + case "proxyConnect": + do { + let remote = call.arguments as? String ?? "" + let proxyResult = proxyConnect(remote: remote) + result(proxyResult) + } catch { + result(FlutterError(code: "PROXY_CONNECT_ERROR", message: error.localizedDescription, details: nil)) + } + case "proxyDisconnect": + do { + let proxyResult = proxyDisconnect() + result(proxyResult) + } catch { + result(FlutterError(code: "PROXY_DISCONNECT_ERROR", message: error.localizedDescription, details: nil)) + } + case "startProxyProbe": + do { + let proxyResult = startProxyProbe() + result(proxyResult) + } catch { + result(FlutterError(code: "START_PROXY_PROBE_ERROR", message: error.localizedDescription, details: nil)) + } + case "stopProxyProbe": + do { + let proxyResult = stopProxyProbe() + result(proxyResult) + } catch { + result(FlutterError(code: "STOP_PROXY_PROBE_ERROR", message: error.localizedDescription, details: nil)) + } + case "listProxies": + do { + let proxyResult = listProxies() + result(proxyResult) + } catch { + result(FlutterError(code: "LIST_PROXIES_ERROR", message: error.localizedDescription, details: nil)) + } + default: + result(FlutterMethodNotImplemented) + } + }) + } + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } diff --git a/mycelmob/src/lib.rs b/mycelmob/src/lib.rs index 0e53943..a919288 100644 --- a/mycelmob/src/lib.rs +++ b/mycelmob/src/lib.rs @@ -86,6 +86,30 @@ pub extern "C" fn ffi_proxy_disconnect() -> *mut c_char { CString::new(joined).unwrap().into_raw() } +#[no_mangle] +pub extern "C" fn ffi_start_proxy_probe() -> *mut c_char { + let result = start_proxy_probe(); + let joined = result.join(","); + + CString::new(joined).unwrap().into_raw() +} + +#[no_mangle] +pub extern "C" fn ffi_stop_proxy_probe() -> *mut c_char { + let result = stop_proxy_probe(); + let joined = result.join(","); + + CString::new(joined).unwrap().into_raw() +} + +#[no_mangle] +pub extern "C" fn ffi_list_proxies() -> *mut c_char { + let result = list_proxies(); + let joined = result.join(","); + + CString::new(joined).unwrap().into_raw() +} + /// Helper to free strings allocated by Rust #[no_mangle] pub extern "C" fn ffi_free_string(s: *mut c_char) { From a9304751c401f47a0eb3ac35512bfb0bf60501e2 Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sat, 20 Sep 2025 15:22:01 +0300 Subject: [PATCH 04/22] some updates --- lib/features/home/home_screen.dart | 226 +++- lib/features/home/widgets/traffic_chart.dart | 291 ++++ .../home/widgets/traffic_summary.dart | 144 ++ lib/features/peers/peers_screen.dart | 536 +++++++- .../peers/widgets/peer_details_sheet.dart | 103 +- lib/main.dart | 12 +- lib/models/peer_models.dart | 218 +++ lib/services/ffi/mycelium_service.dart | 84 +- lib/services/peers_service.dart | 23 + lib/services/ping_service.dart | 128 ++ lib/state/dynamic_traffic_providers.dart | 112 ++ lib/state/mycelium_providers.dart | 59 + lib/state/traffic_providers.dart | 167 +++ mycelffi/Cargo.lock | 1182 +++++++++++++++-- mycelffi/Cargo.toml | 2 +- mycelffi/src/lib.rs | 49 +- mycelmob/Cargo.lock | 3 +- mycelmob/Cargo.toml | 3 +- pubspec.lock | 16 + pubspec.yaml | 11 +- test/peer_status_test.dart | 120 ++ 21 files changed, 3184 insertions(+), 305 deletions(-) create mode 100644 lib/features/home/widgets/traffic_chart.dart create mode 100644 lib/features/home/widgets/traffic_summary.dart create mode 100644 lib/models/peer_models.dart create mode 100644 lib/services/ping_service.dart create mode 100644 lib/state/dynamic_traffic_providers.dart create mode 100644 lib/state/traffic_providers.dart create mode 100644 test/peer_status_test.dart diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index 269d130..c4f8ff0 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -1,12 +1,16 @@ +import 'dart:async'; import 'package:flutter/material.dart'; -// import 'package:mycelmob/mycelmob.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import '../../app/theme/tokens.dart'; +import '../../app/widgets/app_card.dart'; import '../../app/widgets/app_scaffold.dart'; import '../../app/widgets/app_button.dart'; -import '../../app/widgets/app_card.dart'; -import '../../app/theme/tokens.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; +import '../../models/peer_models.dart' as peer_models; +import '../../services/peers_service.dart'; import '../../state/mycelium_providers.dart'; import '../../services/ffi/mycelium_service.dart'; +import 'widgets/traffic_summary.dart'; +import '../../state/dynamic_traffic_providers.dart'; class HomeScreen extends ConsumerWidget { const HomeScreen({super.key}); @@ -15,6 +19,7 @@ class HomeScreen extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final statusAsync = ref.watch(nodeStatusProvider); final service = ref.read(myceliumServiceProvider); + final peersAsync = ref.watch(peersProvider); final status = statusAsync.asData?.value ?? NodeStatus.disconnected; final buttonColor = Theme.of(context).colorScheme.primary; @@ -51,12 +56,15 @@ class HomeScreen extends ConsumerWidget { _HeaderCard( status: status, onConnect: () async { - await service.start([ - 'tcp://185.69.166.7:9651', - 'tcp://188.40.132.242:9651', - 'tcp://209.159.146.190:9651', - 'tcp://5.223.43.251:9651' - ]); + final peers = peersAsync.asData?.value ?? []; + if (peers.isNotEmpty) { + await service.start(peers); + } else { + // Fallback to PeersService if no peers available + final peersService = PeersService(); + final fallbackPeers = await peersService.fetchPeers(); + await service.start(fallbackPeers); + } }, onDisconnect: () async { await service.stop(); @@ -65,6 +73,19 @@ class HomeScreen extends ConsumerWidget { ), const SizedBox(height: AppSpacing.xxl), const _StatsRow(), + const SizedBox(height: AppSpacing.xxl), + Consumer( + builder: (context, ref, child) { + final trafficStats = ref.watch(dynamicTrafficProvider); + + return TrafficSummary( + totalUpload: trafficStats.totalUploadFormatted, + totalDownload: trafficStats.totalDownloadFormatted, + peakUpload: trafficStats.peakUploadFormatted, + peakDownload: trafficStats.peakDownloadFormatted, + ); + }, + ), const SizedBox(height: AppSpacing.xxxl), ], ), @@ -104,6 +125,18 @@ class _HeaderCardState extends State<_HeaderCard> { Future stopMycelium() async { setState(() => _isLoading = true); + + // Stop proxy first if it's enabled + if (_isSocks5Enabled) { + try { + await widget.service.proxyDisconnect(); + await widget.service.stopProxyProbe(); + setState(() => _isSocks5Enabled = false); + } catch (e) { + print('Error stopping proxy: $e'); + } + } + await widget.onDisconnect(); setState(() => _isLoading = false); } @@ -183,71 +216,146 @@ class _HeaderCardState extends State<_HeaderCard> { ), ), ), - const SizedBox(height: AppSpacing.lg), - AppCard( - margin: EdgeInsets.zero, - child: ExpansionTile( - title: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: const [ - Flexible( - child: Text('Advanced Options', - overflow: TextOverflow.ellipsis), + if (widget.status == NodeStatus.connected) ...[ + const SizedBox(height: AppSpacing.lg), + AppCard( + margin: EdgeInsets.zero, + child: ExpansionTile( + title: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: const [ + Flexible( + child: Text('Advanced Options', + overflow: TextOverflow.ellipsis), + ), + Icon(Icons.expand_more), + ], + ), + children: [ + ListTile( + title: const Text('Enable SOCKS5 tunneling as VPN'), + trailing: Switch( + value: _isSocks5Enabled, + onChanged: (value) async { + setState(() => _isSocks5Enabled = value); + if (value) { + // First start proxy probing to discover available proxies + await widget.service.startProxyProbe(); + // Wait a bit for probes to discover proxies + await Future.delayed(Duration(seconds: 10)); + // Then connect to best available proxy + final result = await widget.service.proxyConnect( + '[40a:152c:b85b:9646:5b71:d03a:eb27:2462]:1080'); + debugPrint('Proxy connect result: $result'); + } else { + final result = await widget.service.proxyDisconnect(); + // Stop proxy probing when disabled + await widget.service.stopProxyProbe(); + debugPrint('Proxy disconnect result: $result'); + } + }, + ), ), - Icon(Icons.expand_more), ], ), - children: [ - ListTile( - title: const Text('Enable SOCKS5 tunneling as VPN'), - trailing: Switch( - value: _isSocks5Enabled, - onChanged: (value) async { - setState(() => _isSocks5Enabled = value); - if (value) { - // First start proxy probing to discover available proxies - await widget.service.startProxyProbe(); - // Wait a bit for probes to discover proxies - await Future.delayed(Duration(seconds: 10)); - // Then connect to best available proxy - final result = await widget.service.proxyConnect( - '[40a:152c:b85b:9646:5b71:d03a:eb27:2462]:1080'); - debugPrint('Proxy connect result: $result'); - } else { - final result = await widget.service.proxyDisconnect(); - // Stop proxy probing when disabled - await widget.service.stopProxyProbe(); - debugPrint('Proxy disconnect result: $result'); - } - }, - ), - ), - ], ), - ), + ], ], ), ); } } -class _StatsRow extends ConsumerWidget { +class _StatsRow extends ConsumerStatefulWidget { const _StatsRow(); @override - Widget build(BuildContext context, WidgetRef ref) { - final peersAsync = ref.watch(peersProvider); - final peersCount = - peersAsync.maybeWhen(data: (list) => list.length, orElse: () => 0); + ConsumerState<_StatsRow> createState() => _StatsRowState(); +} + +class _StatsRowState extends ConsumerState<_StatsRow> { + List peerStatus = []; + Timer? _refreshTimer; + Timer? _uptimeTimer; + + @override + void initState() { + super.initState(); + _fetchPeerStatus(); + _refreshTimer = Timer.periodic(const Duration(seconds: 5), (_) { + _fetchPeerStatus(); + }); + _uptimeTimer = Timer.periodic(const Duration(seconds: 1), (_) { + // Trigger rebuild to update uptime display + if (mounted) setState(() {}); + }); + } + + @override + void dispose() { + _refreshTimer?.cancel(); + _uptimeTimer?.cancel(); + super.dispose(); + } + + Future _fetchPeerStatus() async { + try { + final service = MyceliumService(); + final status = await service.getPeerStatus(); + setState(() { + peerStatus = status; + }); + } catch (e) { + // Handle error silently + } + } + + + Map _calculateNetworkTraffic() { + int totalRx = 0; + int totalTx = 0; + + for (final peer in peerStatus) { + totalRx += peer.rxBytes; + totalTx += peer.txBytes; + } + + final totalTraffic = totalRx + totalTx; + return { + 'total': peer_models.PeerStats.formatBytes(totalTraffic), + 'rx': peer_models.PeerStats.formatBytes(totalRx), + 'tx': peer_models.PeerStats.formatBytes(totalTx), + }; + } + + int _getConnectedPeersCount() { + return peerStatus.where((peer) => + peer.connectionState == peer_models.ConnectionState.connected + ).length; + } + + @override + Widget build(BuildContext context) { + final uptimeNotifier = ref.read(uptimeProvider.notifier); + final connectedPeers = _getConnectedPeersCount(); + final networkTraffic = _calculateNetworkTraffic(); + final uptime = uptimeNotifier.formattedUptime; Widget tileContent(IconData icon, String title, String value) => Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, children: [ Icon(icon), const SizedBox(height: AppSpacing.sm), - Text(title, style: Theme.of(context).textTheme.labelMedium), + Text( + title, + style: Theme.of(context).textTheme.labelMedium, + textAlign: TextAlign.center, + ), const SizedBox(height: AppSpacing.xs), - Text(value, style: Theme.of(context).textTheme.titleMedium), + Text( + value, + style: Theme.of(context).textTheme.titleMedium, + textAlign: TextAlign.center, + ), ], ); @@ -259,7 +367,7 @@ class _StatsRow extends ConsumerWidget { child: AppCard( margin: EdgeInsets.zero, padding: const EdgeInsets.all(AppSpacing.md), - child: tileContent(Icons.people, 'Peers', '$peersCount'), + child: tileContent(Icons.people, 'Connected Peers', '$connectedPeers'), ), ), const SizedBox(width: AppSpacing.lg), @@ -267,7 +375,7 @@ class _StatsRow extends ConsumerWidget { child: AppCard( margin: EdgeInsets.zero, padding: const EdgeInsets.all(AppSpacing.md), - child: tileContent(Icons.podcasts, 'Bandwidth', '2 MB/s'), + child: tileContent(Icons.podcasts, 'Total Traffic', networkTraffic['total'] ?? '0 B'), ), ), const SizedBox(width: AppSpacing.lg), @@ -275,7 +383,7 @@ class _StatsRow extends ConsumerWidget { child: AppCard( margin: EdgeInsets.zero, padding: const EdgeInsets.all(AppSpacing.md), - child: tileContent(Icons.access_time, 'Uptime', '2h 34m'), + child: tileContent(Icons.access_time, 'Uptime', uptime), ), ), ], diff --git a/lib/features/home/widgets/traffic_chart.dart b/lib/features/home/widgets/traffic_chart.dart new file mode 100644 index 0000000..9cbb14b --- /dev/null +++ b/lib/features/home/widgets/traffic_chart.dart @@ -0,0 +1,291 @@ +import 'package:flutter/material.dart'; +import 'package:fl_chart/fl_chart.dart'; +import '../../../app/theme/tokens.dart'; + +class TrafficChart extends StatelessWidget { + final List data; + final String title; + + const TrafficChart({ + super.key, + required this.data, + this.title = 'Traffic Overview (24h)', + }); + + @override + Widget build(BuildContext context) { + return Container( + height: 200, + padding: const EdgeInsets.all(AppSpacing.md), + decoration: BoxDecoration( + color: Theme.of(context).cardColor, + borderRadius: BorderRadius.circular(12), + border: Border.all( + color: Theme.of(context).dividerColor.withOpacity(0.1), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + Icons.show_chart, + size: 20, + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox(width: 8), + Text( + title, + style: Theme.of(context).textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.w600, + ), + ), + ], + ), + const SizedBox(height: AppSpacing.md), + Expanded( + child: data.isEmpty + ? Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const CircularProgressIndicator(), + const SizedBox(height: 8), + Text( + 'Loading traffic data...', + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6), + ), + ), + ], + ), + ) + : data.length < 3 + ? Center( + child: Text( + 'Collecting data...', + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6), + ), + ), + ) + : LineChart( + LineChartData( + gridData: FlGridData( + show: true, + drawVerticalLine: false, + horizontalInterval: 2, + getDrawingHorizontalLine: (value) { + return FlLine( + color: Theme.of(context).dividerColor.withOpacity(0.1), + strokeWidth: 1, + ); + }, + ), + titlesData: FlTitlesData( + show: true, + rightTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false), + ), + topTitles: const AxisTitles( + sideTitles: SideTitles(showTitles: false), + ), + bottomTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + reservedSize: 30, + interval: 4, + getTitlesWidget: (double value, TitleMeta meta) { + final hour = value.toInt(); + if (hour % 4 == 0) { + return SideTitleWidget( + axisSide: meta.axisSide, + child: Text( + '${hour.toString().padLeft(2, '0')}:00', + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6), + ), + ), + ); + } + return const SizedBox.shrink(); + }, + ), + ), + leftTitles: AxisTitles( + sideTitles: SideTitles( + showTitles: true, + interval: 2, + reservedSize: 40, + getTitlesWidget: (double value, TitleMeta meta) { + return SideTitleWidget( + axisSide: meta.axisSide, + child: Text( + _formatBytes(value), + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6), + ), + ), + ); + }, + ), + ), + ), + borderData: FlBorderData(show: false), + minX: 0, + maxX: 23, + minY: 0, + maxY: _getMaxY(), + lineBarsData: [ + // Download area + LineChartBarData( + spots: data.asMap().entries.map((entry) { + return FlSpot(entry.key.toDouble(), entry.value.download); + }).toList(), + isCurved: true, + gradient: LinearGradient( + colors: [ + AppColors.success.withOpacity(0.8), + AppColors.success.withOpacity(0.3), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + barWidth: 0, + isStrokeCapRound: true, + dotData: const FlDotData(show: false), + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient( + colors: [ + AppColors.success.withOpacity(0.4), + AppColors.success.withOpacity(0.1), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + // Upload area (stacked on top) + LineChartBarData( + spots: data.asMap().entries.map((entry) { + return FlSpot(entry.key.toDouble(), entry.value.download + entry.value.upload); + }).toList(), + isCurved: true, + gradient: LinearGradient( + colors: [ + Theme.of(context).colorScheme.primary.withOpacity(0.8), + Theme.of(context).colorScheme.primary.withOpacity(0.3), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + barWidth: 0, + isStrokeCapRound: true, + dotData: const FlDotData(show: false), + belowBarData: BarAreaData( + show: true, + gradient: LinearGradient( + colors: [ + Theme.of(context).colorScheme.primary.withOpacity(0.4), + Theme.of(context).colorScheme.primary.withOpacity(0.1), + ], + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + ), + ), + ), + ], + ), + ), + ), + const SizedBox(height: AppSpacing.sm), + // Legend + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _LegendItem( + color: AppColors.success, + label: 'Download', + ), + const SizedBox(width: AppSpacing.md), + _LegendItem( + color: Theme.of(context).colorScheme.primary, + label: 'Upload', + ), + ], + ), + ], + ), + ); + } + + double _getMaxY() { + if (data.isEmpty) return 10; + + double maxValue = 0; + for (final point in data) { + final total = point.download + point.upload; + if (total > maxValue) { + maxValue = total; + } + } + + // Add 20% padding to the top + return maxValue * 1.2; + } + + String _formatBytes(double bytes) { + if (bytes < 1024) return '${bytes.toInt()}B'; + if (bytes < 1024 * 1024) return '${(bytes / 1024).toStringAsFixed(1)}K'; + if (bytes < 1024 * 1024 * 1024) return '${(bytes / (1024 * 1024)).toStringAsFixed(1)}M'; + return '${(bytes / (1024 * 1024 * 1024)).toStringAsFixed(1)}G'; + } +} + +class _LegendItem extends StatelessWidget { + final Color color; + final String label; + + const _LegendItem({ + required this.color, + required this.label, + }); + + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.min, + children: [ + Container( + width: 12, + height: 12, + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.circular(2), + ), + ), + const SizedBox(width: 4), + Text( + label, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Theme.of(context).colorScheme.onSurface.withOpacity(0.8), + ), + ), + ], + ); + } +} + +class TrafficDataPoint { + final double upload; + final double download; + final DateTime timestamp; + + TrafficDataPoint({ + required this.upload, + required this.download, + required this.timestamp, + }); +} diff --git a/lib/features/home/widgets/traffic_summary.dart b/lib/features/home/widgets/traffic_summary.dart new file mode 100644 index 0000000..da5436a --- /dev/null +++ b/lib/features/home/widgets/traffic_summary.dart @@ -0,0 +1,144 @@ +import 'package:flutter/material.dart'; +import '../../../app/theme/tokens.dart'; +import '../../../app/widgets/app_card.dart'; + +class TrafficSummary extends StatelessWidget { + final String totalUpload; + final String totalDownload; + final String peakUpload; + final String peakDownload; + + const TrafficSummary({ + super.key, + this.totalUpload = '0 B', + this.totalDownload = '0 B', + this.peakUpload = '0 B', + this.peakDownload = '0 B', + }); + + @override + Widget build(BuildContext context) { + return AppCard( + padding: const EdgeInsets.all(AppSpacing.md), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + Icons.analytics_outlined, + size: 20, + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox(width: 8), + Text( + 'Traffic Summary (24h)', + style: Theme.of(context).textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.w600, + ), + ), + ], + ), + const SizedBox(height: AppSpacing.md), + Row( + children: [ + Expanded( + child: _TrafficItem( + icon: Icons.upload, + label: 'Total Upload', + value: totalUpload, + color: Theme.of(context).colorScheme.primary, + ), + ), + const SizedBox(width: AppSpacing.md), + Expanded( + child: _TrafficItem( + icon: Icons.download, + label: 'Total Download', + value: totalDownload, + color: AppColors.success, + ), + ), + ], + ), + const SizedBox(height: AppSpacing.sm), + Row( + children: [ + Expanded( + child: _TrafficItem( + icon: Icons.trending_up, + label: 'Peak Upload', + value: peakUpload, + color: Theme.of(context).colorScheme.primary.withOpacity(0.7), + ), + ), + const SizedBox(width: AppSpacing.md), + Expanded( + child: _TrafficItem( + icon: Icons.trending_down, + label: 'Peak Download', + value: peakDownload, + color: AppColors.success.withOpacity(0.7), + ), + ), + ], + ), + ], + ), + ); + } +} + +class _TrafficItem extends StatelessWidget { + final IconData icon; + final String label; + final String value; + final Color color; + + const _TrafficItem({ + required this.icon, + required this.label, + required this.value, + required this.color, + }); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.all(AppSpacing.sm), + decoration: BoxDecoration( + color: color.withOpacity(0.1), + borderRadius: BorderRadius.circular(AppRadii.sm), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon(icon, size: 16, color: color), + const SizedBox(width: 4), + Expanded( + child: Text( + label, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: color, + fontWeight: FontWeight.w500, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + const SizedBox(height: 4), + Text( + value, + style: Theme.of(context).textTheme.titleSmall?.copyWith( + color: color, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ); + } +} diff --git a/lib/features/peers/peers_screen.dart b/lib/features/peers/peers_screen.dart index 4108ae6..b0924d0 100644 --- a/lib/features/peers/peers_screen.dart +++ b/lib/features/peers/peers_screen.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'package:flutter/material.dart'; import '../../app/widgets/app_scaffold.dart'; import '../../app/widgets/app_card.dart'; @@ -7,6 +8,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../state/mycelium_providers.dart'; import 'package:go_router/go_router.dart'; import '../../services/ffi/mycelium_service.dart'; +import '../../models/peer_models.dart' as peer_models; +import '../../services/ping_service.dart'; class PeersScreen extends ConsumerWidget { const PeersScreen({super.key}); @@ -65,13 +68,25 @@ class _PeersDataScreen extends ConsumerStatefulWidget { class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { String query = ''; - List peerStatus = []; + List peerStatus = []; String? peerStatusError; + Timer? _refreshTimer; + @override void initState() { super.initState(); _fetchPeerStatus(); + // Refresh peer status every 5 seconds + _refreshTimer = Timer.periodic(const Duration(seconds: 5), (_) { + _fetchPeerStatus(); + }); + } + + @override + void dispose() { + _refreshTimer?.cancel(); + super.dispose(); } Future _fetchPeerStatus() async { @@ -82,7 +97,15 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { peerStatus = status; peerStatusError = null; }); - print('Peer status: $status'); + print('Fetched ${status.length} peer statuses:'); + for (final peer in status) { + print( + ' - Endpoint: ${peer.endpoint}, State: ${peer.connectionState}, Type: ${peer.peerType}'); + } + print('Current peer list:'); + for (final peer in widget.peers) { + print(' - Peer: $peer'); + } } catch (e) { setState(() { peerStatusError = e.toString(); @@ -91,15 +114,108 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { } } + // Calculate peer summary statistics + Map _calculatePeerSummary() { + int connected = 0; + int slow = 0; + int down = 0; + + for (final peer in peerStatus) { + switch (peer.connectionState) { + case peer_models.ConnectionState.connected: + connected++; + break; + case peer_models.ConnectionState.connecting: + slow++; + break; + case peer_models.ConnectionState.disconnected: + case peer_models.ConnectionState.failed: + case peer_models.ConnectionState.unknown: + down++; + break; + } + } + + return { + 'connected': connected, + 'slow': slow, + 'down': down, + }; + } + + // Calculate total network traffic + Map _calculateNetworkTraffic() { + int totalRx = 0; + int totalTx = 0; + + for (final peer in peerStatus) { + totalRx += peer.rxBytes; + totalTx += peer.txBytes; + print('Peer ${peer.endpoint}: RX=${peer.rxBytes} TX=${peer.txBytes}'); + } + + print('Total network traffic: RX=$totalRx TX=$totalTx'); + return { + 'rx': peer_models.PeerStats.formatBytes(totalRx), + 'tx': peer_models.PeerStats.formatBytes(totalTx), + }; + } + + // Find peer status for a given peer address + peer_models.PeerStats? _findPeerStatus(String peerAddress) { + for (final peer in peerStatus) { + // Extract IP from peer address (remove tcp:// and port) + final peerIp = peerAddress.replaceAll('tcp://', '').split(':')[0]; + + // Handle different endpoint formats from Rust + String statusIp = peer.endpoint; + if (statusIp.contains('://')) { + // Format: tcp://ip:port or quic://ip:port + statusIp = statusIp.split('://')[1].split(':')[0]; + } else if (statusIp.contains(':')) { + // Format: ip:port + statusIp = statusIp.split(':')[0]; + } + + print( + 'Matching peer: "$peerIp" vs status: "$statusIp" (full endpoint: ${peer.endpoint}), status: ${peer.connectionState}'); + + // Try exact match first + if (peerIp == statusIp) { + print('✓ Found exact match for $peerAddress'); + return peer; + } + + // Try matching the full peer address with the endpoint + if (peerAddress == peer.endpoint) { + print('✓ Found full address match for $peerAddress'); + return peer; + } + } + print( + '✗ No match found for peer: $peerAddress in ${peerStatus.length} status entries'); + return null; + } + @override Widget build(BuildContext context) { final peersNotifier = ref.read(peersProvider.notifier); final userPeers = peersNotifier.userPeers; + final nodeStatusAsync = ref.watch(nodeStatusProvider); + final isMyceliumRunning = nodeStatusAsync.when( + data: (status) => status == NodeStatus.connected, + loading: () => false, + error: (_, __) => false, + ); + final filtered = query.isEmpty ? widget.peers : widget.peers .where((p) => p.toLowerCase().contains(query.toLowerCase())) .toList(); + + final peerSummary = _calculatePeerSummary(); + final networkTraffic = _calculateNetworkTraffic(); return AppScaffold( title: Column(crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Row( @@ -130,6 +246,7 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { _SearchAddBar( onChanged: (v) => setState(() => query = v), onAdd: () => _showAddPeerDialog(context, ref), + isDisabled: isMyceliumRunning, ), const SizedBox(height: AppSpacing.md), if (filtered.isEmpty) @@ -144,11 +261,13 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { itemBuilder: (_, index) { final p = filtered[index]; final isUserPeer = userPeers.contains(p); + final peerStat = _findPeerStatus(p); return _PeerTile( ip: p, country: "Unknown", - health: 0.8, isUserPeer: isUserPeer, + peerStats: peerStat, + isDisabled: isMyceliumRunning, ); }, ), @@ -170,13 +289,19 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { const SizedBox(height: AppSpacing.md), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: const [ + children: [ _SummaryItem( - label: '5', subtitle: 'Usable', color: Colors.green), + label: '${peerSummary['connected']}', + subtitle: 'Connected', + color: Colors.green), _SummaryItem( - label: '2', subtitle: 'Slow', color: Colors.orange), + label: '${peerSummary['slow']}', + subtitle: 'Connecting', + color: Colors.orange), _SummaryItem( - label: '1', subtitle: 'Down', color: Colors.red), + label: '${peerSummary['down']}', + subtitle: 'Down', + color: Colors.red), ], ), ], @@ -184,20 +309,10 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { ), const SizedBox(height: AppSpacing.md), if (peerStatusError != null) - Text('Error getting peer status: $peerStatusError', - style: TextStyle(color: Colors.red)), - if (peerStatus.isNotEmpty) AppCard( padding: const EdgeInsets.all(AppSpacing.md), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('Peer Status:', - style: Theme.of(context).textTheme.titleMedium), - const SizedBox(height: AppSpacing.sm), - ...peerStatus.map((status) => Text(status)).toList(), - ], - ), + child: Text('Error getting peer status: $peerStatusError', + style: TextStyle(color: Colors.red)), ), const SizedBox(height: AppSpacing.md), AppCard( @@ -217,10 +332,13 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { const SizedBox(height: AppSpacing.md), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: const [ - _SummaryItem(label: '10.5 MB/s', subtitle: 'Total Upload'), + children: [ _SummaryItem( - label: '20.5 MB/s', subtitle: 'Total Download'), + label: networkTraffic['rx'] ?? '0 B', + subtitle: 'Total Download'), + _SummaryItem( + label: networkTraffic['tx'] ?? '0 B', + subtitle: 'Total Upload'), ], ), ], @@ -235,7 +353,9 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { class _SearchAddBar extends ConsumerWidget { final VoidCallback onAdd; final ValueChanged? onChanged; - const _SearchAddBar({required this.onAdd, this.onChanged}); + final bool isDisabled; + const _SearchAddBar( + {required this.onAdd, this.onChanged, this.isDisabled = false}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -247,34 +367,164 @@ class _SearchAddBar extends ConsumerWidget { hintText: 'Search peers', prefixIcon: const Icon(Icons.search), ), - onChanged: onChanged, + onChanged: isDisabled ? null : onChanged, + enabled: !isDisabled, ), ), const SizedBox(width: AppSpacing.lg), FilledButton.icon( - onPressed: () => _showAddPeerDialog(context, ref), + onPressed: isDisabled ? null : () => _showAddPeerDialog(context, ref), icon: const Icon(Icons.add), - label: const Text('Add Peer'), + label: Text(isDisabled ? 'Mycelium Running' : 'Add Peer'), ), ], ); } } -class _PeerTile extends StatelessWidget { +class _PeerTile extends ConsumerStatefulWidget { final String ip; final String country; - final double health; final bool isUserPeer; + final peer_models.PeerStats? peerStats; + final bool isDisabled; const _PeerTile( {required this.ip, required this.country, - required this.health, - required this.isUserPeer}); + required this.isUserPeer, + this.peerStats, + this.isDisabled = false}); + + @override + ConsumerState<_PeerTile> createState() => _PeerTileState(); +} + +class _PeerTileState extends ConsumerState<_PeerTile> { + PingResult? _pingResult; + bool _isPinging = false; + Timer? _periodicPingTimer; + + @override + void initState() { + super.initState(); + // Start periodic ping for connected/connecting peers after a short delay + // to ensure widget is fully built + WidgetsBinding.instance.addPostFrameCallback((_) { + _startPeriodicPing(); + }); + } + + @override + void didUpdateWidget(_PeerTile oldWidget) { + super.didUpdateWidget(oldWidget); + // Restart periodic ping if peer status changed + if (oldWidget.peerStats?.connectionState != widget.peerStats?.connectionState) { + _periodicPingTimer?.cancel(); + _startPeriodicPing(); + } + } + + @override + void dispose() { + _periodicPingTimer?.cancel(); + super.dispose(); + } + + void _startPeriodicPing() { + // Only start periodic ping if peer is connected or connecting + if (widget.peerStats != null && + (widget.peerStats!.connectionState == peer_models.ConnectionState.connected || + widget.peerStats!.connectionState == peer_models.ConnectionState.connecting)) { + + print('Starting periodic ping for ${widget.ip}'); + + // Initial ping after 2 seconds + Timer(const Duration(seconds: 2), () { + if (mounted) { + print('Performing initial ping for ${widget.ip}'); + _performPingTest(isAutomatic: true); + } + }); + + // Then ping every 30 seconds + _periodicPingTimer = Timer.periodic(const Duration(seconds: 30), (_) { + if (mounted) { + print('Performing periodic ping for ${widget.ip}'); + _performPingTest(isAutomatic: true); + } + }); + } else { + print('Not starting periodic ping for ${widget.ip} - peer stats: ${widget.peerStats?.connectionState}'); + } + } + + Future _performPingTest({bool isAutomatic = false}) async { + if (!mounted) return; + + // Don't show loading indicator for automatic pings + if (!isAutomatic) { + setState(() { + _isPinging = true; + _pingResult = null; + }); + } + + try { + final pingService = ref.read(pingServiceProvider); + final pingResult = await pingService.ping(widget.ip); + + if (mounted) { + setState(() { + _pingResult = pingResult; + _isPinging = false; + }); + } + } catch (e) { + if (mounted) { + setState(() { + _pingResult = PingResult( + host: widget.ip, + latencyMs: null, + success: false, + timestamp: DateTime.now(), + ); + _isPinging = false; + }); + } + } + } @override Widget build(BuildContext context) { + // Determine connection status and color + Color connectionColor = Colors.grey; + String connectionStatus = 'Unknown'; + if (widget.peerStats != null) { + switch (widget.peerStats!.connectionState) { + case peer_models.ConnectionState.connected: + connectionColor = Colors.green; + connectionStatus = 'Connected'; + break; + case peer_models.ConnectionState.connecting: + connectionColor = Colors.orange; + connectionStatus = 'Connecting'; + break; + case peer_models.ConnectionState.disconnected: + connectionColor = Colors.grey; + connectionStatus = 'Disconnected'; + break; + case peer_models.ConnectionState.failed: + connectionColor = Colors.red; + connectionStatus = 'Failed'; + break; + case peer_models.ConnectionState.unknown: + connectionColor = Colors.grey; + connectionStatus = 'Unknown'; + break; + } + } + return AppCard( padding: const EdgeInsets.all(AppSpacing.lg), child: Column( @@ -282,68 +532,210 @@ class _PeerTile extends StatelessWidget { children: [ Row( children: [ - CircleAvatar( - radius: 16, - child: Text( - country.isNotEmpty - ? country.substring(0, 2).toUpperCase() - : "??", + Container( + width: 12, + height: 12, + decoration: BoxDecoration( + color: connectionColor, + shape: BoxShape.circle, ), ), - const SizedBox(width: AppSpacing.md), + const SizedBox(width: AppSpacing.sm), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - ip, - style: Theme.of(context).textTheme.titleMedium, + widget.ip.replaceAll('tcp://', ''), + style: Theme.of(context).textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.bold, + ), overflow: TextOverflow.ellipsis, ), const SizedBox(height: AppSpacing.xs), - Text( - country, - style: Theme.of(context).textTheme.bodyMedium, - overflow: TextOverflow.ellipsis, + Row( + children: [ + Text( + connectionStatus, + style: + Theme.of(context).textTheme.bodySmall?.copyWith( + color: connectionColor, + fontWeight: FontWeight.w500, + ), + ), + ], ), ], ), ), + // Add ping button when Mycelium is running (enabled for connecting and connected peers) + if (widget.peerStats != null && + (widget.peerStats!.connectionState == + peer_models.ConnectionState.connected || + widget.peerStats!.connectionState == + peer_models.ConnectionState.connecting)) ...[ + Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surface, + borderRadius: BorderRadius.circular(8), + border: Border.all( + color: Theme.of(context) + .colorScheme + .outline + .withOpacity(0.3), + ), + ), + child: IconButton( + icon: _isPinging + ? const SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : Icon( + Icons.speed, + size: 18, + color: Theme.of(context).colorScheme.primary, + ), + onPressed: _isPinging ? null : _performPingTest, + tooltip: 'Test ping', + constraints: const BoxConstraints( + minWidth: 36, + minHeight: 36, + ), + ), + ), + const SizedBox(width: AppSpacing.sm), + ], IconButton( icon: const Icon(Icons.more_horiz), - onPressed: () { - showModalBottomSheet( - context: context, - useSafeArea: true, - isScrollControlled: true, - showDragHandle: true, - builder: (_) => PeerDetailsSheet( - country: country, - ip: ip, - city: "", - latency: "", - status: "", - isUserPeer: isUserPeer, - ), - ); - }, + onPressed: widget.isDisabled + ? null + : () { + showModalBottomSheet( + context: context, + useSafeArea: true, + isScrollControlled: true, + showDragHandle: true, + builder: (_) => PeerDetailsSheet( + country: widget.country, + ip: widget.ip, + city: "", + latency: "", + status: connectionStatus, + isUserPeer: widget.isUserPeer, + ), + ); + }, ), ], ), - const SizedBox(height: AppSpacing.md), - ClipRRect( - borderRadius: BorderRadius.circular(4), - child: LinearProgressIndicator( - minHeight: 6, - value: health, - backgroundColor: Theme.of(context).colorScheme.surfaceVariant, - valueColor: AlwaysStoppedAnimation( - health > 0.7 - ? Colors.green - : (health > 0.3 ? Colors.orange : Colors.red), - ), + if (widget.peerStats != null) ...[ + const SizedBox(height: AppSpacing.md), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'RX: ${widget.peerStats!.formattedRxBytes}', + style: Theme.of(context).textTheme.bodySmall, + ), + Text( + 'TX: ${widget.peerStats!.formattedTxBytes}', + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Discovered: ${widget.peerStats!.formattedDiscovered}', + style: Theme.of(context).textTheme.bodySmall, + ), + if (widget.peerStats!.lastConnectedSeconds != null) + Text( + 'Last Connected: ${widget.peerStats!.formattedLastConnected}', + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + ), + ], + ), + if (_pingResult != null) ...[ + const SizedBox(height: AppSpacing.sm), + Container( + padding: const EdgeInsets.symmetric( + horizontal: AppSpacing.sm, + vertical: AppSpacing.xs, + ), + decoration: BoxDecoration( + color: _pingResult!.success + ? (_pingResult!.latencyMs! < 50 + ? AppColors.success.withOpacity(0.1) + : _pingResult!.latencyMs! < 150 + ? Colors.orange.withOpacity(0.1) + : AppColors.error.withOpacity(0.1)) + : AppColors.error.withOpacity(0.1), + borderRadius: BorderRadius.circular(6), + border: Border.all( + color: _pingResult!.success + ? (_pingResult!.latencyMs! < 50 + ? AppColors.success.withOpacity(0.3) + : _pingResult!.latencyMs! < 150 + ? Colors.orange.withOpacity(0.3) + : AppColors.error.withOpacity(0.3)) + : AppColors.error.withOpacity(0.3), + ), + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + _pingResult!.success + ? Icons.check_circle + : Icons.error, + size: 14, + color: _pingResult!.success + ? (_pingResult!.latencyMs! < 50 + ? AppColors.success + : _pingResult!.latencyMs! < 150 + ? Colors.orange + : AppColors.error) + : AppColors.error, + ), + const SizedBox(width: AppSpacing.xs), + Text( + _pingResult!.success + ? 'Ping: ${_pingResult!.latencyMs}ms' + : 'Ping: Failed', + style: + Theme.of(context).textTheme.bodySmall?.copyWith( + color: _pingResult!.success + ? (_pingResult!.latencyMs! < 50 + ? AppColors.success + : _pingResult!.latencyMs! < 150 + ? Colors.orange + : AppColors.error) + : AppColors.error, + fontWeight: FontWeight.w500, + ), + ), + ], + ), + ), + ], + ], ), - ), + ], ], ), ); diff --git a/lib/features/peers/widgets/peer_details_sheet.dart b/lib/features/peers/widgets/peer_details_sheet.dart index bcf36a7..7b45c6c 100644 --- a/lib/features/peers/widgets/peer_details_sheet.dart +++ b/lib/features/peers/widgets/peer_details_sheet.dart @@ -2,8 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../app/theme/tokens.dart'; import '../../../state/mycelium_providers.dart'; +import '../../../services/ping_service.dart'; -class PeerDetailsSheet extends ConsumerWidget { +class PeerDetailsSheet extends ConsumerStatefulWidget { final String ip; final String country; final String city; @@ -21,7 +22,46 @@ class PeerDetailsSheet extends ConsumerWidget { this.isUserPeer = false}); @override - Widget build(BuildContext context, WidgetRef ref) { + ConsumerState createState() => _PeerDetailsSheetState(); +} + +class _PeerDetailsSheetState extends ConsumerState { + PingResult? _pingResult; + bool _isPinging = false; + + Future _performPingTest() async { + setState(() { + _isPinging = true; + _pingResult = null; + }); + + try { + final pingService = ref.read(pingServiceProvider); + final result = await pingService.ping(widget.ip); + + if (mounted) { + setState(() { + _pingResult = result; + _isPinging = false; + }); + } + } catch (e) { + if (mounted) { + setState(() { + _pingResult = PingResult( + host: widget.ip, + latencyMs: null, + success: false, + timestamp: DateTime.now(), + ); + _isPinging = false; + }); + } + } + } + + @override + Widget build(BuildContext context) { final peersNotifier = ref.read(peersProvider.notifier); return Padding( padding: const EdgeInsets.all(AppSpacing.lg), @@ -39,27 +79,74 @@ class PeerDetailsSheet extends ConsumerWidget { const CircleAvatar(radius: 16, child: Text('US')), const SizedBox(width: AppSpacing.lg), Expanded( - child: Text(country, + child: Text(widget.country, style: Theme.of(context).textTheme.titleMedium, overflow: TextOverflow.ellipsis)), const SizedBox(width: AppSpacing.lg), - Text(latency, style: Theme.of(context).textTheme.labelMedium), + Text(_pingResult?.success == true + ? '${_pingResult!.latencyMs}ms' + : widget.latency, + style: Theme.of(context).textTheme.labelMedium?.copyWith( + color: _pingResult?.success == true + ? (_pingResult!.latencyMs! < 50 + ? AppColors.success + : _pingResult!.latencyMs! < 150 + ? Colors.orange + : AppColors.error) + : null, + )), ]), const SizedBox(height: AppSpacing.lg), + if (_pingResult != null) ...[ + Container( + padding: const EdgeInsets.all(AppSpacing.md), + decoration: BoxDecoration( + color: (_pingResult!.success ? AppColors.success : AppColors.error).withOpacity(0.1), + borderRadius: BorderRadius.circular(AppRadii.sm), + ), + child: Row( + children: [ + Icon( + _pingResult!.success ? Icons.check_circle : Icons.error, + color: _pingResult!.success ? AppColors.success : AppColors.error, + size: 20, + ), + const SizedBox(width: 8), + Expanded( + child: Text( + _pingResult!.success + ? 'Ping successful: ${_pingResult!.latencyMs}ms' + : 'Ping failed: Host unreachable', + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + color: _pingResult!.success ? AppColors.success : AppColors.error, + ), + ), + ), + ], + ), + ), + const SizedBox(height: AppSpacing.lg), + ], Row( children: [ Expanded( child: OutlinedButton( - onPressed: () {}, - child: const Text('Ping Test'), + onPressed: _isPinging ? null : _performPingTest, + child: _isPinging + ? const SizedBox( + height: 16, + width: 16, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : const Text('Ping Test'), ), ), - if (isUserPeer) ...[ + if (widget.isUserPeer) ...[ const SizedBox(width: AppSpacing.lg), Expanded( child: FilledButton.tonal( onPressed: () async { - await peersNotifier.removePeer(ip); + await peersNotifier.removePeer(widget.ip); if (context.mounted) { Navigator.of(context).pop(); } diff --git a/lib/main.dart b/lib/main.dart index 1140ece..5f9fc13 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:myceliumflut/features/home/home_screen.dart'; import 'app/theme/app_theme.dart'; import 'app/router/app_router.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -13,8 +12,8 @@ import 'package:path_provider/path_provider.dart'; import 'package:logging/logging.dart'; import 'package:flutter_desktop_sleep/flutter_desktop_sleep.dart'; import 'package:flutter_window_close/flutter_window_close.dart'; - import 'myceliumflut_ffi_binding.dart'; +import 'services/peers_service.dart'; final _logger = Logger('Mycelium'); @@ -151,12 +150,9 @@ class _MyAppState extends ConsumerState { privKey = await loadOrGeneratePrivKey(platform); peers = await loadPeers(); if (peers.isEmpty || (peers.length == 1 && peers[0].isEmpty)) { - peers = [ - 'tcp://185.69.166.7:9651', - 'tcp://188.40.132.242:9651', - 'tcp://209.159.146.190:9651', - 'tcp://5.223.43.251:9651' - ]; + // Use PeersService to fetch peers from GitHub with fallback + final peersService = PeersService(); + peers = await peersService.fetchPeers(); } textEditController = TextEditingController(text: peers.join('\n')); diff --git a/lib/models/peer_models.dart b/lib/models/peer_models.dart new file mode 100644 index 0000000..adbffd3 --- /dev/null +++ b/lib/models/peer_models.dart @@ -0,0 +1,218 @@ +/// Enum representing the type of peer connection +enum PeerType { + static, + discovered, + unknown; + + static PeerType fromString(String value) { + switch (value.toLowerCase()) { + case 'static': + return PeerType.static; + case 'discovered': + return PeerType.discovered; + default: + return PeerType.unknown; + } + } + + @override + String toString() { + switch (this) { + case PeerType.static: + return 'Static'; + case PeerType.discovered: + return 'Discovered'; + case PeerType.unknown: + return 'Unknown'; + } + } +} + +/// Enum representing the connection state of a peer +enum ConnectionState { + connected, + connecting, + disconnected, + failed, + unknown; + + static ConnectionState fromString(String value) { + switch (value.toLowerCase()) { + case 'alive': + return ConnectionState.connected; + case 'connecting': + return ConnectionState.connecting; + case 'dead': + return ConnectionState.disconnected; + case 'connected': + return ConnectionState.connected; + case 'disconnected': + return ConnectionState.disconnected; + case 'failed': + return ConnectionState.failed; + default: + return ConnectionState.unknown; + } + } + + @override + String toString() { + switch (this) { + case ConnectionState.connected: + return 'Connected'; + case ConnectionState.connecting: + return 'Connecting'; + case ConnectionState.disconnected: + return 'Disconnected'; + case ConnectionState.failed: + return 'Failed'; + case ConnectionState.unknown: + return 'Unknown'; + } + } +} + +/// Model representing detailed peer statistics and information +class PeerStats { + /// The protocol used by this peer (e.g., "tcp", "quic") + final String protocol; + + /// The socket address of the peer + final String address; + + /// The type of peer (static, discovered, etc.) + final PeerType peerType; + + /// Current connection state + final ConnectionState connectionState; + + /// Total bytes received from this peer + final int rxBytes; + + /// Total bytes transmitted to this peer + final int txBytes; + + /// Time since this peer was discovered (in seconds) + final int discoveredSeconds; + + /// Time since last successful connection (in seconds), null if never connected + final int? lastConnectedSeconds; + + const PeerStats({ + required this.protocol, + required this.address, + required this.peerType, + required this.connectionState, + required this.rxBytes, + required this.txBytes, + required this.discoveredSeconds, + this.lastConnectedSeconds, + }); + + /// Create PeerStats from a JSON map + factory PeerStats.fromJson(Map json) { + return PeerStats( + protocol: json['protocol'] as String, + address: json['address'] as String, + peerType: PeerType.fromString(json['peerType'] as String), + connectionState: ConnectionState.fromString(json['connectionState'] as String), + rxBytes: json['rxBytes'] as int, + txBytes: json['txBytes'] as int, + discoveredSeconds: json['discoveredSeconds'] as int, + lastConnectedSeconds: json['lastConnectedSeconds'] as int?, + ); + } + + /// Convert PeerStats to JSON map + Map toJson() { + return { + 'protocol': protocol, + 'address': address, + 'peerType': peerType.toString(), + 'connectionState': connectionState.toString(), + 'rxBytes': rxBytes, + 'txBytes': txBytes, + 'discoveredSeconds': discoveredSeconds, + 'lastConnectedSeconds': lastConnectedSeconds, + }; + } + + /// Format bytes in a human-readable way + static String formatBytes(int bytes) { + if (bytes < 1024) return '${bytes}B'; + if (bytes < 1024 * 1024) return '${(bytes / 1024).toStringAsFixed(2)}KB'; + if (bytes < 1024 * 1024 * 1024) return '${(bytes / (1024 * 1024)).toStringAsFixed(2)}MB'; + return '${(bytes / (1024 * 1024 * 1024)).toStringAsFixed(2)}GB'; + } + + /// Format seconds in a human-readable duration + static String formatDuration(int totalSeconds) { + final seconds = totalSeconds % 60; + final minutes = (totalSeconds ~/ 60) % 60; + final hours = (totalSeconds ~/ 3600) % 24; + final days = totalSeconds ~/ 86400; + + if (days > 0) { + return '${days}d ${hours}h ${minutes}m ${seconds}s'; + } else if (hours > 0) { + return '${hours}h ${minutes}m ${seconds}s'; + } else if (minutes > 0) { + return '${minutes}m ${seconds}s'; + } else { + return '${seconds}s'; + } + } + + /// Get formatted receive bytes + String get formattedRxBytes => formatBytes(rxBytes); + + /// Get formatted transmit bytes + String get formattedTxBytes => formatBytes(txBytes); + + /// Get formatted discovered duration + String get formattedDiscovered => formatDuration(discoveredSeconds); + + /// Get formatted last connected duration + String get formattedLastConnected { + if (lastConnectedSeconds == null) return 'Never connected'; + return formatDuration(lastConnectedSeconds!); + } + + /// Get the full endpoint string (protocol + address) + String get endpoint => '$protocol://$address'; + + @override + String toString() { + return 'PeerStats(protocol: $protocol, address: $address, type: $peerType, ' + 'state: $connectionState, rx: $formattedRxBytes, tx: $formattedTxBytes, ' + 'discovered: $formattedDiscovered, lastConnected: $formattedLastConnected)'; + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + return other is PeerStats && + other.protocol == protocol && + other.address == address && + other.peerType == peerType && + other.connectionState == connectionState && + other.rxBytes == rxBytes && + other.txBytes == txBytes && + other.discoveredSeconds == discoveredSeconds && + other.lastConnectedSeconds == lastConnectedSeconds; + } + + @override + int get hashCode { + return Object.hash( + protocol, + address, + peerType, + connectionState, + rxBytes, + txBytes, + discoveredSeconds, + lastConnectedSeconds, + ); + } +} diff --git a/lib/services/ffi/mycelium_service.dart b/lib/services/ffi/mycelium_service.dart index 77b47dd..365c7f5 100644 --- a/lib/services/ffi/mycelium_service.dart +++ b/lib/services/ffi/mycelium_service.dart @@ -1,9 +1,11 @@ import 'dart:async'; +import 'dart:convert'; import 'dart:io'; import 'package:flutter/services.dart'; import 'package:path_provider/path_provider.dart'; import '../../myceliumflut_ffi_binding.dart'; +import '../../models/peer_models.dart'; enum NodeStatus { disconnected, connecting, connected, failed } @@ -89,6 +91,7 @@ class MyceliumService { Future start(List peers, {bool socksEnabled = false}) async { print('MyceliumService: Starting with peers: $peers, SOCKS: $socksEnabled'); + print('MyceliumService: Platform check - isUseDylib(): ${isUseDylib()}'); _socksEnabled = socksEnabled; _status = NodeStatus.connecting; _statusController.add(_status); @@ -106,14 +109,22 @@ class MyceliumService { print('MyceliumService: Loaded key, starting VPN...'); try { if (isUseDylib()) { + print('MyceliumService: Using FFI dylib'); await myFFStartMycelium(cleaned, key); } else { + print('MyceliumService: Using platform channel'); final result = await _platform.invokeMethod('startVpn', { 'peers': cleaned, 'secretKey': key, 'socksEnabled': socksEnabled, }); print('MyceliumService: startVpn result: $result'); + if (result != true) { + print('MyceliumService: Platform channel returned false'); + _status = NodeStatus.failed; + _statusController.add(_status); + return false; + } } _status = NodeStatus.connected; _statusController.add(_status); @@ -149,29 +160,88 @@ class MyceliumService { } } - Future> getPeerStatus() async { + Future> getPeerStatus() async { try { - List peerStatus; + List peerStatusStrings; if (isUseDylib()) { // Windows platform - use FFI - peerStatus = await myFFGetPeerStatus(); + peerStatusStrings = await myFFGetPeerStatus(); } else { // Android/iOS platform - use platform channel final result = await _platform.invokeMethod>('getPeerStatus'); - peerStatus = result?.cast() ?? []; + peerStatusStrings = result?.cast() ?? []; } + // Filter out the first element if it's "ok" (status indicator) - if (peerStatus.isNotEmpty && peerStatus[0] == "ok") { - peerStatus = peerStatus.sublist(1); + if (peerStatusStrings.isNotEmpty && peerStatusStrings[0] == "ok") { + peerStatusStrings = peerStatusStrings.sublist(1); } - return peerStatus; + // Parse JSON strings into PeerStats objects + List peerStats = []; + for (String jsonString in peerStatusStrings) { + try { + final Map json = jsonDecode(jsonString); + peerStats.add(PeerStats.fromJson(json)); + } catch (e) { + print('Failed to parse peer JSON: $jsonString, error: $e'); + // Skip malformed entries + } + } + + return peerStats; } catch (e) { throw Exception("Failed to get peer status: $e"); } } + /// Get peer status as simple strings (backward compatibility) + Future> getPeerStatusStrings() async { + try { + final peerStats = await getPeerStatus(); + return peerStats.map((peer) => peer.toString()).toList(); + } catch (e) { + throw Exception("Failed to get peer status strings: $e"); + } + } + + /// Get node status as JSON string + Future getStatus() async { + try { + if (isUseDylib()) { + // Use existing peer status method for now + final peerStats = await getPeerStatus(); + final statusMap = { + 'peers': peerStats.map((p) => p.toJson()).toList(), + 'status': _status.toString(), + }; + return jsonEncode(statusMap); + } else { + // For mobile platforms, use getPeerStatus as fallback since getStatus isn't implemented + try { + final peerStats = await getPeerStatus(); + final statusMap = { + 'peers': peerStats.map((p) => p.toJson()).toList(), + 'status': _status.toString(), + }; + return jsonEncode(statusMap); + } catch (e) { + print("Failed to get peer status for mobile fallback: $e"); + // Return minimal status if peer status also fails + final statusMap = { + 'peers': >[], + 'status': _status.toString(), + }; + return jsonEncode(statusMap); + } + } + } catch (e) { + print("Failed to get status: $e"); + return null; + } + } + void dispose() { _statusController.close(); } diff --git a/lib/services/peers_service.dart b/lib/services/peers_service.dart index 0fca4cb..42d0f9e 100644 --- a/lib/services/peers_service.dart +++ b/lib/services/peers_service.dart @@ -1,5 +1,7 @@ import 'dart:convert'; import 'package:http/http.dart' as http; +import '../models/peer_models.dart'; +import 'ffi/mycelium_service.dart'; class PeersService { static const _url = @@ -35,4 +37,25 @@ class PeersService { return _fallbackPeers; } } + + Future> fetchPeerStats() async { + try { + final service = MyceliumService(); + final statusJson = await service.getStatus(); + + if (statusJson == null || statusJson.isEmpty) { + return []; + } + + final statusData = jsonDecode(statusJson); + final peersData = statusData['peers'] as List?; + + if (peersData == null) return []; + + return peersData.map((peerJson) => PeerStats.fromJson(peerJson)).toList(); + } catch (e) { + print("Error fetching peer stats: $e"); + return []; + } + } } diff --git a/lib/services/ping_service.dart b/lib/services/ping_service.dart new file mode 100644 index 0000000..2fe1523 --- /dev/null +++ b/lib/services/ping_service.dart @@ -0,0 +1,128 @@ +import 'dart:async'; +import 'dart:io'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class PingResult { + final String host; + final int? latencyMs; + final bool success; + final DateTime timestamp; + + const PingResult({ + required this.host, + this.latencyMs, + required this.success, + required this.timestamp, + }); +} + +class PingService { + static const List _defaultHosts = [ + '8.8.8.8', + '1.1.1.1', + 'google.com', + ]; + + Future ping(String host) async { + try { + // Extract hostname/IP from peer address if it contains protocol + String targetHost = host; + if (host.contains('://')) { + final uri = Uri.parse(host); + targetHost = uri.host; + } + + // Use actual socket connection to test reachability and measure latency + final stopwatch = Stopwatch()..start(); + + final socket = await Socket.connect( + targetHost, + 9651, // Mycelium default port + timeout: const Duration(seconds: 5), + ); + + stopwatch.stop(); + await socket.close(); + + return PingResult( + host: host, + latencyMs: stopwatch.elapsedMilliseconds, + success: true, + timestamp: DateTime.now(), + ); + } catch (e) { + print('Ping failed for $host: $e'); + return PingResult( + host: host, + latencyMs: null, + success: false, + timestamp: DateTime.now(), + ); + } + } + + Future> pingMultiple([List? hosts]) async { + final targetHosts = hosts ?? _defaultHosts; + final futures = targetHosts.map((host) => ping(host)); + return await Future.wait(futures); + } + + Future getAverageLatency([List? hosts]) async { + final results = await pingMultiple(hosts); + final successfulPings = + results.where((r) => r.success && r.latencyMs != null); + + if (successfulPings.isEmpty) return null; + + final totalLatency = successfulPings.fold( + 0, + (sum, result) => sum + (result.latencyMs ?? 0), + ); + + return (totalLatency / successfulPings.length).round(); + } +} + +// Provider for ping service +final pingServiceProvider = Provider((ref) { + return PingService(); +}); + +// Provider for current latency +final latencyProvider = StateNotifierProvider((ref) { + return LatencyNotifier(ref.read(pingServiceProvider)); +}); + +class LatencyNotifier extends StateNotifier { + final PingService _pingService; + Timer? _timer; + + LatencyNotifier(this._pingService) : super(null) { + _startPeriodicPing(); + } + + void _startPeriodicPing() { + // Initial ping + _updateLatency(); + + // Ping every 30 seconds + _timer = Timer.periodic(const Duration(seconds: 30), (_) { + _updateLatency(); + }); + } + + Future _updateLatency() async { + try { + final latency = await _pingService.getAverageLatency(); + state = latency; + } catch (e) { + print('LatencyNotifier: Error updating latency: $e'); + } + } + + @override + void dispose() { + _timer?.cancel(); + super.dispose(); + } +} diff --git a/lib/state/dynamic_traffic_providers.dart b/lib/state/dynamic_traffic_providers.dart new file mode 100644 index 0000000..3d16edb --- /dev/null +++ b/lib/state/dynamic_traffic_providers.dart @@ -0,0 +1,112 @@ +import 'dart:async'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'mycelium_providers.dart'; + +class TrafficStats { + final int totalUploadBytes; + final int totalDownloadBytes; + final int peakUploadBytesPerSec; + final int peakDownloadBytesPerSec; + final DateTime lastUpdated; + + const TrafficStats({ + required this.totalUploadBytes, + required this.totalDownloadBytes, + required this.peakUploadBytesPerSec, + required this.peakDownloadBytesPerSec, + required this.lastUpdated, + }); + + String get totalUploadFormatted => _formatBytes(totalUploadBytes); + String get totalDownloadFormatted => _formatBytes(totalDownloadBytes); + String get peakUploadFormatted => '${_formatBytes(peakUploadBytesPerSec)}/s'; + String get peakDownloadFormatted => + '${_formatBytes(peakDownloadBytesPerSec)}/s'; + + static String _formatBytes(int bytes) { + if (bytes < 1024) return '$bytes B'; + if (bytes < 1024 * 1024) return '${(bytes / 1024).toStringAsFixed(1)} KB'; + if (bytes < 1024 * 1024 * 1024) + return '${(bytes / (1024 * 1024)).toStringAsFixed(1)} MB'; + return '${(bytes / (1024 * 1024 * 1024)).toStringAsFixed(1)} GB'; + } +} + +// Provider for dynamic traffic statistics +final dynamicTrafficProvider = + StateNotifierProvider((ref) { + return DynamicTrafficNotifier(ref); +}); + +class DynamicTrafficNotifier extends StateNotifier { + final Ref _ref; + Timer? _timer; + int _previousTotalRx = 0; + int _previousTotalTx = 0; + int _maxRxRate = 0; + int _maxTxRate = 0; + + DynamicTrafficNotifier(this._ref) + : super(TrafficStats( + totalUploadBytes: 0, + totalDownloadBytes: 0, + peakUploadBytesPerSec: 0, + peakDownloadBytesPerSec: 0, + lastUpdated: DateTime.now(), + )) { + _startPeriodicUpdate(); + } + + void _startPeriodicUpdate() { + // Update every 2 seconds + _timer = Timer.periodic(const Duration(seconds: 2), (_) { + _updateTrafficStats(); + }); + } + + Future _updateTrafficStats() async { + try { + final peersService = _ref.read(peersServiceProvider); + final peerStats = await peersService.fetchPeerStats(); + + if (peerStats.isEmpty) return; + + int totalRx = 0; + int totalTx = 0; + + // Sum up traffic from all peer stats + for (final peer in peerStats) { + totalRx += peer.rxBytes; + totalTx += peer.txBytes; + } + + // Calculate rates (bytes per second over 2-second interval) + final rxRate = ((totalRx - _previousTotalRx) / 2).round(); + final txRate = ((totalTx - _previousTotalTx) / 2).round(); + + // Update peak rates + if (rxRate > _maxRxRate) _maxRxRate = rxRate; + if (txRate > _maxTxRate) _maxTxRate = txRate; + + // Update state + state = TrafficStats( + totalUploadBytes: totalTx, + totalDownloadBytes: totalRx, + peakUploadBytesPerSec: _maxTxRate, + peakDownloadBytesPerSec: _maxRxRate, + lastUpdated: DateTime.now(), + ); + + _previousTotalRx = totalRx; + _previousTotalTx = totalTx; + } catch (e) { + print('DynamicTrafficNotifier: Error updating traffic stats: $e'); + } + } + + @override + void dispose() { + _timer?.cancel(); + super.dispose(); + } +} diff --git a/lib/state/mycelium_providers.dart b/lib/state/mycelium_providers.dart index 0064f4c..9958f94 100644 --- a/lib/state/mycelium_providers.dart +++ b/lib/state/mycelium_providers.dart @@ -16,6 +16,65 @@ final nodeStatusProvider = StreamProvider((ref) { return ref.watch(myceliumServiceProvider).statusStream; }); +class UptimeNotifier extends StateNotifier { + Timer? _timer; + + UptimeNotifier() : super(null); + + void startUptime() { + if (state == null) { + state = DateTime.now(); + } + } + + void stopUptime() { + state = null; + } + + Duration? get uptime { + if (state == null) return null; + return DateTime.now().difference(state!); + } + + String get formattedUptime { + final duration = uptime; + if (duration == null) return '0s'; + + if (duration.inDays > 0) { + return '${duration.inDays}d ${duration.inHours % 24}h'; + } else if (duration.inHours > 0) { + return '${duration.inHours}h ${duration.inMinutes % 60}m'; + } else if (duration.inMinutes > 0) { + return '${duration.inMinutes}m ${duration.inSeconds % 60}s'; + } else { + return '${duration.inSeconds}s'; + } + } + + @override + void dispose() { + _timer?.cancel(); + super.dispose(); + } +} + +final uptimeProvider = StateNotifierProvider((ref) { + final notifier = UptimeNotifier(); + + // Listen to node status changes + ref.listen(nodeStatusProvider, (previous, next) { + next.whenData((status) { + if (status == NodeStatus.connected) { + notifier.startUptime(); + } else { + notifier.stopUptime(); + } + }); + }); + + return notifier; +}); + class PeersNotifier extends StateNotifier>> { final PeersService _service; final PeersRepository _repo; diff --git a/lib/state/traffic_providers.dart b/lib/state/traffic_providers.dart new file mode 100644 index 0000000..1b07b27 --- /dev/null +++ b/lib/state/traffic_providers.dart @@ -0,0 +1,167 @@ +import 'dart:async'; +import 'dart:math'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import '../services/peers_service.dart'; +import 'mycelium_providers.dart'; +import '../features/home/widgets/traffic_chart.dart'; +import '../models/peer_models.dart'; + +// Provider for historical traffic data +final trafficHistoryProvider = StateNotifierProvider>((ref) { + return TrafficHistoryNotifier(); +}); + +class TrafficHistoryNotifier extends StateNotifier> { + Timer? _timer; + + TrafficHistoryNotifier() : super([]) { + // Initialize with minimal data immediately + _initializeMinimalData(); + // Schedule full initialization after UI is ready + Future.microtask(() => _initializeDataAsync()); + } + + void _initializeMinimalData() { + // Add just a few data points to prevent empty chart errors + final now = DateTime.now(); + state = [ + TrafficDataPoint(upload: 0, download: 0, timestamp: now.subtract(const Duration(hours: 2))), + TrafficDataPoint(upload: 0, download: 0, timestamp: now.subtract(const Duration(hours: 1))), + TrafficDataPoint(upload: 0, download: 0, timestamp: now), + ]; + } + + void _initializeDataAsync() async { + try { + // Small delay to ensure UI is rendered first + await Future.delayed(const Duration(milliseconds: 500)); + _initializeData(); + _startPeriodicUpdates(); + } catch (e) { + print('TrafficHistoryNotifier: Error initializing data: $e'); + // Keep minimal data on error + } + } + + void _initializeData() { + // Initialize with 24 hours of sample data (one point per hour) + final now = DateTime.now(); + final List initialData = []; + + for (int i = 23; i >= 0; i--) { + final timestamp = now.subtract(Duration(hours: i)); + // Generate some sample data with realistic patterns + final baseUpload = _generateRealisticTraffic(i, isUpload: true); + final baseDownload = _generateRealisticTraffic(i, isUpload: false); + + initialData.add(TrafficDataPoint( + upload: baseUpload, + download: baseDownload, + timestamp: timestamp, + )); + } + + state = initialData; + } + + double _generateRealisticTraffic(int hourAgo, {required bool isUpload}) { + final random = Random(hourAgo + (isUpload ? 1000 : 0)); + + // Create realistic daily patterns + final hour = (24 - hourAgo) % 24; + double baseActivity = 1.0; + + // Higher activity during day hours (8-22), lower at night + if (hour >= 8 && hour <= 22) { + baseActivity = 0.5 + 0.5 * sin((hour - 8) * pi / 14); + } else { + baseActivity = 0.1 + 0.2 * random.nextDouble(); + } + + // Upload is typically lower than download + final multiplier = isUpload ? 0.3 : 1.0; + + // Generate bytes (in MB range for visibility) + final baseMB = baseActivity * multiplier * (2 + 6 * random.nextDouble()); + return baseMB * 1024 * 1024; // Convert to bytes + } + + void _startPeriodicUpdates() { + _timer = Timer.periodic(const Duration(minutes: 5), (timer) { + _updateWithCurrentTraffic(); + }); + } + + void _updateWithCurrentTraffic() { + // In a real implementation, this would get actual traffic data + // For now, we'll simulate realistic updates + final now = DateTime.now(); + final random = Random(); + + // Remove oldest data point and add new one + final newData = List.from(state); + if (newData.length >= 24) { + newData.removeAt(0); + } + + // Generate new data point with some randomness + final upload = 0.5 + 2.0 * random.nextDouble(); // 0.5-2.5 MB + final download = 1.0 + 4.0 * random.nextDouble(); // 1-5 MB + + newData.add(TrafficDataPoint( + upload: upload * 1024 * 1024, // Convert to bytes + download: download * 1024 * 1024, + timestamp: now, + )); + + state = newData; + } + + void updateWithPeerData(List peerStats) { + // This method can be called to update with real peer traffic data + if (peerStats.isEmpty) return; + + final now = DateTime.now(); + double totalUpload = 0; + double totalDownload = 0; + + for (final peer in peerStats) { + totalUpload += peer.txBytes.toDouble(); + totalDownload += peer.rxBytes.toDouble(); + } + + // Update the most recent data point or add a new one + final newData = List.from(state); + if (newData.isNotEmpty) { + final lastPoint = newData.last; + final timeDiff = now.difference(lastPoint.timestamp); + + if (timeDiff.inMinutes < 30) { + // Update the last point if it's recent + newData[newData.length - 1] = TrafficDataPoint( + upload: totalUpload, + download: totalDownload, + timestamp: now, + ); + } else { + // Add new point + if (newData.length >= 24) { + newData.removeAt(0); + } + newData.add(TrafficDataPoint( + upload: totalUpload, + download: totalDownload, + timestamp: now, + )); + } + } + + state = newData; + } + + @override + void dispose() { + _timer?.cancel(); + super.dispose(); + } +} diff --git a/mycelffi/Cargo.lock b/mycelffi/Cargo.lock index fab9236..8bdf63b 100644 --- a/mycelffi/Cargo.lock +++ b/mycelffi/Cargo.lock @@ -52,6 +52,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.12" @@ -104,12 +115,94 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "axum" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-extra" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45bf463831f5131b7d3c756525b305d40f1185b688565648a92e1392ca35713d" +dependencies = [ + "axum", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "serde", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.75" @@ -131,13 +224,33 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + [[package]] name = "bindgen" version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags", + "bitflags 2.9.1", "cexpr", "clang-sys", "itertools", @@ -151,6 +264,12 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.9.1" @@ -217,6 +336,16 @@ dependencies = [ "shlex", ] +[[package]] +name = "cdn-meta" +version = "0.1.0" +source = "git+https://github.com/threefoldtech/mycelium-cdn-registry#2fac04710b60502a5165f1b1d90671730346e977" +dependencies = [ + "aes-gcm", + "bincode", + "serde", +] + [[package]] name = "cexpr" version = "0.6.0" @@ -259,6 +388,20 @@ dependencies = [ "libloading", ] +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", + "tokio-util", +] + [[package]] name = "constant_time_eq" version = "0.3.1" @@ -350,10 +493,10 @@ checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ "cfg-if", "crossbeam-utils", - "hashbrown", + "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core", + "parking_lot_core 0.9.11", ] [[package]] @@ -365,6 +508,17 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "dlopen2" version = "0.5.0" @@ -382,11 +536,26 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + [[package]] name = "etherparse" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff83a5facf1a7cbfef93cfb48d6d4fb6a1f42d8ac2341a96b3255acb4d4f860" +checksum = "b119b9796ff800751a220394b8b3613f26dd30c48f254f6837e64c464872d1c7" dependencies = [ "arrayvec", ] @@ -407,6 +576,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "foreign-types" version = "0.3.2" @@ -422,6 +597,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + [[package]] name = "futures" version = "0.3.31" @@ -583,6 +767,25 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hash32" version = "0.3.1" @@ -592,12 +795,27 @@ dependencies = [ "byteorder", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "heapless" version = "0.8.0" @@ -608,6 +826,235 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-util" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.5.10", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +dependencies = [ + "equivalent", + "hashbrown 0.16.0", +] + [[package]] name = "inout" version = "0.1.4" @@ -617,13 +1064,22 @@ dependencies = [ "generic-array", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + [[package]] name = "io-uring" version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" dependencies = [ - "bitflags", + "bitflags 2.9.1", "cfg-if", "libc", ] @@ -646,6 +1102,16 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "itertools" version = "0.13.0" @@ -689,9 +1155,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libloading" @@ -703,6 +1169,18 @@ dependencies = [ "windows-targets 0.53.2", ] +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + [[package]] name = "lock_api" version = "0.4.13" @@ -732,6 +1210,15 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "lru" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a" +dependencies = [ + "hashbrown 0.12.3", +] + [[package]] name = "lru-slab" version = "0.1.2" @@ -740,13 +1227,19 @@ checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + [[package]] name = "memchr" version = "2.7.5" @@ -762,6 +1255,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -791,10 +1290,10 @@ dependencies = [ [[package]] name = "mobile" version = "0.1.0" -source = "git+http://github.com/threefoldtech/mycelium?tag=v0.6.1#a9ba23d7bd020411be51cd2359775f6f11b159e4" dependencies = [ "mycelium", "once_cell", + "serde_json", "thiserror 2.0.12", "tokio", "tracing", @@ -812,14 +1311,16 @@ dependencies = [ [[package]] name = "mycelium" -version = "0.6.1" -source = "git+http://github.com/threefoldtech/mycelium?tag=v0.6.1#a9ba23d7bd020411be51cd2359775f6f11b159e4" +version = "0.6.2" dependencies = [ "aes-gcm", - "ahash", + "ahash 0.8.12", "arc-swap", + "axum", + "axum-extra", "blake3", "bytes", + "cdn-meta", "dashmap", "etherparse", "faster-hex", @@ -835,6 +1336,9 @@ dependencies = [ "quinn", "rand", "rcgen", + "redis", + "reed-solomon-erasure", + "reqwest", "rtnetlink", "rustls", "serde", @@ -852,15 +1356,15 @@ dependencies = [ [[package]] name = "netdev" -version = "0.34.1" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51305a587ceb5e3440e24e02a07f5d3d401d8d7edb71f59f6542ba705bd57483" +checksum = "daa1e3eaf125c54c21e6221df12dd2a0a682784a068782dd564c836c0f281b6d" dependencies = [ "dlopen2", "ipnet", "libc", - "netlink-packet-core", - "netlink-packet-route", + "netlink-packet-core 0.7.0", + "netlink-packet-route 0.22.0", "netlink-sys", "once_cell", "system-configuration", @@ -878,6 +1382,15 @@ dependencies = [ "netlink-packet-utils", ] +[[package]] +name = "netlink-packet-core" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" +dependencies = [ + "paste", +] + [[package]] name = "netlink-packet-route" version = "0.22.0" @@ -885,14 +1398,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0e7987b28514adf555dc1f9a5c30dfc3e50750bbaffb1aec41ca7b23dcd8e4" dependencies = [ "anyhow", - "bitflags", + "bitflags 2.9.1", "byteorder", "libc", "log", - "netlink-packet-core", + "netlink-packet-core 0.7.0", "netlink-packet-utils", ] +[[package]] +name = "netlink-packet-route" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ec2f5b6839be2a19d7fa5aab5bc444380f6311c2b693551cb80f45caaa7b5ef" +dependencies = [ + "bitflags 2.9.1", + "libc", + "log", + "netlink-packet-core 0.8.1", +] + [[package]] name = "netlink-packet-utils" version = "0.5.2" @@ -907,14 +1432,14 @@ dependencies = [ [[package]] name = "netlink-proto" -version = "0.11.5" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72452e012c2f8d612410d89eea01e2d9b56205274abb35d53f60200b2ec41d60" +checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" dependencies = [ "bytes", "futures", "log", - "netlink-packet-core", + "netlink-packet-core 0.8.1", "netlink-sys", "thiserror 2.0.12", ] @@ -938,7 +1463,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags", + "bitflags 2.9.1", "cfg-if", "cfg_aliases", "libc", @@ -951,7 +1476,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags", + "bitflags 2.9.1", "cfg-if", "cfg_aliases", "libc", @@ -970,21 +1495,21 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] -name = "nu-ansi-term" -version = "0.50.1" +name = "num-bigint" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "windows-sys 0.52.0", + "num-integer", + "num-traits", ] [[package]] @@ -993,6 +1518,24 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.36.7" @@ -1020,7 +1563,7 @@ version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags", + "bitflags 2.9.1", "cfg-if", "foreign-types", "libc", @@ -1063,10 +1606,15 @@ dependencies = [ ] [[package]] -name = "overload" -version = "0.1.1" +name = "parking_lot" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core 0.8.6", +] [[package]] name = "parking_lot" @@ -1075,7 +1623,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", - "parking_lot_core", + "parking_lot_core 0.9.11", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "winapi", ] [[package]] @@ -1086,7 +1648,7 @@ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.13", "smallvec", "windows-targets 0.52.6", ] @@ -1107,6 +1669,12 @@ dependencies = [ "serde", ] +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -1137,6 +1705,15 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1173,9 +1750,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -1184,7 +1761,7 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.1", "rustls", - "socket2", + "socket2 0.5.10", "thiserror 2.0.12", "tokio", "tracing", @@ -1221,7 +1798,7 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2", + "socket2 0.5.10", "tracing", "windows-sys 0.59.0", ] @@ -1243,9 +1820,9 @@ checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha", "rand_core 0.9.3", @@ -1281,9 +1858,9 @@ dependencies = [ [[package]] name = "rcgen" -version = "0.13.2" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +checksum = "4c83367ba62b3f1dbd0f086ede4e5ebfb4713fb234dbbc5807772a31245ff46d" dependencies = [ "pem", "ring", @@ -1293,12 +1870,56 @@ dependencies = [ ] [[package]] -name = "redox_syscall" -version = "0.5.13" +name = "redis" +version = "0.32.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd3650deebc68526b304898b192fa4102a4ef0b9ada24da096559cb60e0eef8" +dependencies = [ + "bytes", + "cfg-if", + "combine", + "futures-util", + "itoa", + "num-bigint", + "percent-encoding", + "pin-project-lite", + "ryu", + "sha1_smol", + "socket2 0.6.0", + "tokio", + "tokio-util", + "url", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "reed-solomon-erasure" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "7263373d500d4d4f505d43a2a662d475a894aa94503a1ee28e9188b5f3960d4f" dependencies = [ - "bitflags", + "libm", + "lru", + "parking_lot 0.11.2", + "smallvec", + "spin", ] [[package]] @@ -1309,17 +1930,8 @@ checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -1330,20 +1942,55 @@ checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] -name = "regex-syntax" -version = "0.8.5" +name = "reqwest" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "js-sys", + "log", + "mime", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", +] [[package]] name = "ring" @@ -1361,15 +2008,14 @@ dependencies = [ [[package]] name = "rtnetlink" -version = "0.16.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb5850b5aa2c9c0ae44f157694bbe85107a2e13d76eb3178d0e3ee96c410f57" +checksum = "08fd15aa4c64c34d0b3178e45ec6dad313a9f02b193376d501668a7950264bb7" dependencies = [ "futures", "log", - "netlink-packet-core", - "netlink-packet-route", - "netlink-packet-utils", + "netlink-packet-core 0.8.1", + "netlink-packet-route 0.25.1", "netlink-proto", "netlink-sys", "nix 0.29.0", @@ -1406,9 +2052,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.29" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "once_cell", "ring", @@ -1430,9 +2076,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "ring", "rustls-pki-types", @@ -1445,6 +2091,12 @@ version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + [[package]] name = "scoped-tls" version = "1.0.1" @@ -1483,6 +2135,46 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "serde_json" +version = "1.0.143" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + [[package]] name = "sharded-slab" version = "0.1.7" @@ -1529,6 +2221,22 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -1563,13 +2271,33 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] + [[package]] name = "system-configuration" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags", + "bitflags 2.9.1", "core-foundation", "system-configuration-sys", ] @@ -1664,6 +2392,16 @@ dependencies = [ "time-core", ] +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.9.0" @@ -1681,9 +2419,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.1" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -1693,9 +2431,9 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1709,6 +2447,16 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "tokio-rustls" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f63835928ca123f1bef57abbcd23bb2ba0ac9ae1235f1e65bda0d06e7786bd" +dependencies = [ + "rustls", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.17" @@ -1723,21 +2471,21 @@ dependencies = [ [[package]] name = "tokio-tun" -version = "0.13.2" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be25a316a2d10d0ddd46de9ddd73cdb4262678e1e52f4a32a31421f1e2b816b4" +checksum = "ef6cadea27ba297ef9124370e49af79913b9b979bffd6511f65702eefbce12fe" dependencies = [ "libc", - "nix 0.29.0", + "nix 0.30.1", "thiserror 2.0.12", "tokio", ] [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -1746,12 +2494,59 @@ dependencies = [ "tokio", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1806,7 +2601,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b1f47d22deb79c3f59fcf2a1f00f60cbdc05462bf17d1cd356c1fefa3f444bd" dependencies = [ - "nu-ansi-term 0.50.1", + "nu-ansi-term", "time", "tracing", "tracing-core", @@ -1823,21 +2618,21 @@ dependencies = [ "cc", "cfg-if", "once_cell", - "parking_lot", + "parking_lot 0.12.4", "tracing-core", "tracing-subscriber", ] [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", - "nu-ansi-term 0.46.0", + "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -1846,6 +2641,12 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "tun" version = "0.6.1" @@ -1891,6 +2692,30 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "valuable" version = "0.1.1" @@ -1909,6 +2734,21 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -1932,6 +2772,7 @@ checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] @@ -1949,6 +2790,19 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.100" @@ -1981,6 +2835,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "web-time" version = "1.1.0" @@ -1991,6 +2855,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki-roots" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "winapi" version = "0.3.9" @@ -2041,6 +2914,41 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -2276,9 +3184,15 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags", + "bitflags 2.9.1", ] +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + [[package]] name = "x25519-dalek" version = "2.0.1" @@ -2300,6 +3214,30 @@ dependencies = [ "time", ] +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.8.26" @@ -2320,6 +3258,27 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", + "synstructure", +] + [[package]] name = "zeroize" version = "1.8.1" @@ -2339,3 +3298,36 @@ dependencies = [ "quote", "syn 2.0.104", ] + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.104", +] diff --git a/mycelffi/Cargo.toml b/mycelffi/Cargo.toml index cd409e7..d7dca6f 100644 --- a/mycelffi/Cargo.toml +++ b/mycelffi/Cargo.toml @@ -9,4 +9,4 @@ crate-type = ["cdylib"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -mobile = { git = "http://github.com/threefoldtech/mycelium", package = "mobile", tag = "v0.6.1" } +mobile = { path = "../../mycelium/mobile" } diff --git a/mycelffi/src/lib.rs b/mycelffi/src/lib.rs index 69d36e2..a1ae52c 100644 --- a/mycelffi/src/lib.rs +++ b/mycelffi/src/lib.rs @@ -1,4 +1,4 @@ -use mobile::{proxy_connect, proxy_disconnect, generate_secret_key, address_from_secret_key, start_mycelium, stop_mycelium, get_peer_status}; +use mobile::{generate_secret_key, address_from_secret_key, start_mycelium, stop_mycelium, get_peer_status}; use std::ffi::{CStr, CString}; use std::os::raw::c_char; @@ -117,48 +117,5 @@ pub extern "C" fn free_peer_status(ptr: *mut *mut c_char, len: usize) { } } -#[no_mangle] -pub extern "C" fn ff_proxy_connect(remote_str: *const c_char, out_ptr: *mut *mut *mut c_char, out_len: *mut usize) { - let c_str = unsafe { CStr::from_ptr(remote_str) }; - let remote_string = c_str.to_string_lossy().into_owned(); - let result = proxy_connect(remote_string); - let len = result.len(); - - // Convert Vec to Vec<*mut c_char> - let c_strings: Vec<*mut c_char> = result - .into_iter() - .map(|s| CString::new(s).unwrap().into_raw()) - .collect(); - - let ptr = c_strings.as_ptr() as *mut *mut c_char; - - // Transfer ownership to the caller - std::mem::forget(c_strings); - - unsafe { - *out_ptr = ptr; - *out_len = len; - } -} - -#[no_mangle] -pub extern "C" fn ff_proxy_disconnect(out_ptr: *mut *mut *mut c_char, out_len: *mut usize) { - let result = proxy_disconnect(); - let len = result.len(); - - // Convert Vec to Vec<*mut c_char> - let c_strings: Vec<*mut c_char> = result - .into_iter() - .map(|s| CString::new(s).unwrap().into_raw()) - .collect(); - - let ptr = c_strings.as_ptr() as *mut *mut c_char; - - // Transfer ownership to the caller - std::mem::forget(c_strings); - - unsafe { - *out_ptr = ptr; - *out_len = len; - } -} +// Note: Proxy functions are handled through the mobile uniffi bindings instead of FFI +// These functions would require async runtime setup which is complex for FFI diff --git a/mycelmob/Cargo.lock b/mycelmob/Cargo.lock index 2f5a45b..f42af07 100644 --- a/mycelmob/Cargo.lock +++ b/mycelmob/Cargo.lock @@ -1526,10 +1526,10 @@ dependencies = [ [[package]] name = "mobile" version = "0.1.0" -source = "git+http://github.com/threefoldtech/mycelium?tag=v0.6.2#de90821caad51ebe6b353027a0971d496e6cd78e" dependencies = [ "mycelium", "once_cell", + "serde_json", "thiserror 2.0.16", "tokio", "tracing", @@ -1541,7 +1541,6 @@ dependencies = [ [[package]] name = "mycelium" version = "0.6.2" -source = "git+http://github.com/threefoldtech/mycelium?tag=v0.6.2#de90821caad51ebe6b353027a0971d496e6cd78e" dependencies = [ "aes-gcm", "ahash 0.8.12", diff --git a/mycelmob/Cargo.toml b/mycelmob/Cargo.toml index 835cd03..a7cedcb 100644 --- a/mycelmob/Cargo.toml +++ b/mycelmob/Cargo.toml @@ -11,13 +11,12 @@ name = "mycelmob" [dependencies] uniffi = { version = "0.28.2", features = ["cli"] } -mobile = { git = "http://github.com/threefoldtech/mycelium", package = "mobile", tag = "v0.6.2", features = [ +mobile = { path = "../../mycelium/mobile", features = [ "mactunfd", ] } tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync"] } once_cell = "1.19" -#mobile = { path = "../../mycelium/mobile" } [build-dependencies] uniffi = { version = "0.28.2", features = ["build"] } diff --git a/pubspec.lock b/pubspec.lock index 4de4970..f4b9146 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -105,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.8" + equatable: + dependency: transitive + description: + name: equatable + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" + url: "https://pub.dev" + source: hosted + version: "2.0.7" fake_async: dependency: transitive description: @@ -129,6 +137,14 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" + fl_chart: + dependency: "direct main" + description: + name: fl_chart + sha256: d0f0d49112f2f4b192481c16d05b6418bd7820e021e265a3c22db98acf7ed7fb + url: "https://pub.dev" + source: hosted + version: "0.68.0" flutter: dependency: "direct main" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index d432f00..85f7613 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,20 +32,21 @@ dependencies: sdk: flutter convert: ^3.0.1 crypto: ^3.0.1 - go_router: ^14.2.7 - flutter_riverpod: ^2.5.1 + go_router: ^14.8.1 + flutter_riverpod: ^2.6.1 shared_preferences: ^2.3.2 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.6 - path_provider: ^2.0.2 - logging: ^1.0.1 + path_provider: ^2.1.4 + logging: ^1.2.0 flutter_desktop_sleep: ^0.0.2 path: 1.9.0 - ffi: 2.1.3 + ffi: ^2.1.3 flutter_window_close: ^1.2.0 http: ^1.5.0 + fl_chart: ^0.68.0 dev_dependencies: flutter_test: diff --git a/test/peer_status_test.dart b/test/peer_status_test.dart new file mode 100644 index 0000000..f1c7f25 --- /dev/null +++ b/test/peer_status_test.dart @@ -0,0 +1,120 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:myceliumflut/models/peer_models.dart'; +import 'dart:convert'; + +void main() { + group('PeerStats', () { + test('should parse JSON correctly', () { + final jsonString = ''' + { + "protocol": "tcp", + "address": "185.69.166.7:9651", + "peerType": "Static", + "connectionState": "Connected", + "rxBytes": 1048576, + "txBytes": 2097152, + "discoveredSeconds": 3600, + "lastConnectedSeconds": 1800 + } + '''; + + final json = jsonDecode(jsonString); + final peerStats = PeerStats.fromJson(json); + + expect(peerStats.protocol, equals('tcp')); + expect(peerStats.address, equals('185.69.166.7:9651')); + expect(peerStats.peerType, equals(PeerType.static)); + expect(peerStats.connectionState, equals(ConnectionState.connected)); + expect(peerStats.rxBytes, equals(1048576)); + expect(peerStats.txBytes, equals(2097152)); + expect(peerStats.discoveredSeconds, equals(3600)); + expect(peerStats.lastConnectedSeconds, equals(1800)); + }); + + test('should format bytes correctly', () { + expect(PeerStats.formatBytes(1024), equals('1.00KB')); + expect(PeerStats.formatBytes(1048576), equals('1.00MB')); + expect(PeerStats.formatBytes(1073741824), equals('1.00GB')); + expect(PeerStats.formatBytes(512), equals('512B')); + }); + + test('should format duration correctly', () { + expect(PeerStats.formatDuration(30), equals('30s')); + expect(PeerStats.formatDuration(90), equals('1m 30s')); + expect(PeerStats.formatDuration(3661), equals('1h 1m 1s')); + expect(PeerStats.formatDuration(90061), equals('1d 1h 1m 1s')); + }); + + test('should handle null lastConnectedSeconds', () { + final jsonString = ''' + { + "protocol": "tcp", + "address": "185.69.166.7:9651", + "peerType": "Discovered", + "connectionState": "Disconnected", + "rxBytes": 0, + "txBytes": 0, + "discoveredSeconds": 60, + "lastConnectedSeconds": null + } + '''; + + final json = jsonDecode(jsonString); + final peerStats = PeerStats.fromJson(json); + + expect(peerStats.lastConnectedSeconds, isNull); + expect(peerStats.formattedLastConnected, equals('Never connected')); + }); + + test('should create endpoint correctly', () { + final peerStats = PeerStats( + protocol: 'tcp', + address: '185.69.166.7:9651', + peerType: PeerType.static, + connectionState: ConnectionState.connected, + rxBytes: 1024, + txBytes: 2048, + discoveredSeconds: 3600, + lastConnectedSeconds: 1800, + ); + + expect(peerStats.endpoint, equals('tcp://185.69.166.7:9651')); + }); + }); + + group('PeerType', () { + test('should parse from string correctly', () { + expect(PeerType.fromString('static'), equals(PeerType.static)); + expect(PeerType.fromString('Static'), equals(PeerType.static)); + expect(PeerType.fromString('STATIC'), equals(PeerType.static)); + expect(PeerType.fromString('discovered'), equals(PeerType.discovered)); + expect(PeerType.fromString('unknown_type'), equals(PeerType.unknown)); + }); + + test('should convert to string correctly', () { + expect(PeerType.static.toString(), equals('Static')); + expect(PeerType.discovered.toString(), equals('Discovered')); + expect(PeerType.unknown.toString(), equals('Unknown')); + }); + }); + + group('ConnectionState', () { + test('should parse from string correctly', () { + expect(ConnectionState.fromString('connected'), equals(ConnectionState.connected)); + expect(ConnectionState.fromString('Connected'), equals(ConnectionState.connected)); + expect(ConnectionState.fromString('CONNECTED'), equals(ConnectionState.connected)); + expect(ConnectionState.fromString('connecting'), equals(ConnectionState.connecting)); + expect(ConnectionState.fromString('disconnected'), equals(ConnectionState.disconnected)); + expect(ConnectionState.fromString('failed'), equals(ConnectionState.failed)); + expect(ConnectionState.fromString('unknown_state'), equals(ConnectionState.unknown)); + }); + + test('should convert to string correctly', () { + expect(ConnectionState.connected.toString(), equals('Connected')); + expect(ConnectionState.connecting.toString(), equals('Connecting')); + expect(ConnectionState.disconnected.toString(), equals('Disconnected')); + expect(ConnectionState.failed.toString(), equals('Failed')); + expect(ConnectionState.unknown.toString(), equals('Unknown')); + }); + }); +} From 743d98d415d0675917386d2e0918b17f98024f36 Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sat, 20 Sep 2025 15:51:15 +0300 Subject: [PATCH 05/22] Add geo location --- lib/features/peers/peers_screen.dart | 85 ++++++++++++++++++-- lib/models/peer_models.dart | 7 ++ lib/services/geolocation_service.dart | 108 ++++++++++++++++++++++++++ lib/state/geolocation_providers.dart | 48 ++++++++++++ 4 files changed, 240 insertions(+), 8 deletions(-) create mode 100644 lib/services/geolocation_service.dart create mode 100644 lib/state/geolocation_providers.dart diff --git a/lib/features/peers/peers_screen.dart b/lib/features/peers/peers_screen.dart index b0924d0..f7dfefb 100644 --- a/lib/features/peers/peers_screen.dart +++ b/lib/features/peers/peers_screen.dart @@ -10,6 +10,7 @@ import 'package:go_router/go_router.dart'; import '../../services/ffi/mycelium_service.dart'; import '../../models/peer_models.dart' as peer_models; import '../../services/ping_service.dart'; +import '../../state/geolocation_providers.dart'; class PeersScreen extends ConsumerWidget { const PeersScreen({super.key}); @@ -107,10 +108,12 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { print(' - Peer: $peer'); } } catch (e) { + // Don't show error when Mycelium is not running - this is expected setState(() { - peerStatusError = e.toString(); + peerStatus = []; + peerStatusError = null; }); - print('Error getting peer status: $e'); + print('Mycelium not running or error getting peer status: $e'); } } @@ -511,7 +514,7 @@ class _PeerTileState extends ConsumerState<_PeerTile> { connectionStatus = 'Connecting'; break; case peer_models.ConnectionState.disconnected: - connectionColor = Colors.grey; + connectionColor = Colors.red; connectionStatus = 'Disconnected'; break; case peer_models.ConnectionState.failed: @@ -545,12 +548,78 @@ class _PeerTileState extends ConsumerState<_PeerTile> { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - widget.ip.replaceAll('tcp://', ''), - style: Theme.of(context).textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.bold, + Row( + children: [ + Expanded( + child: Text( + widget.ip.replaceAll('tcp://', ''), + style: Theme.of(context).textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.bold, + ), + overflow: TextOverflow.ellipsis, ), - overflow: TextOverflow.ellipsis, + ), + ], + ), + // Location info row + Consumer( + builder: (context, ref, child) { + final locationAsync = ref.watch(peerLocationProvider(widget.ip)); + + print('Location widget for ${widget.ip}: $locationAsync'); + + if (locationAsync != null && locationAsync.country != 'Unknown') { + final geoService = ref.read(geolocationServiceProvider); + return Padding( + padding: const EdgeInsets.only(top: 4.0), + child: Row( + children: [ + Text( + geoService.getFlagEmoji(locationAsync.countryCode), + style: const TextStyle(fontSize: 16), + ), + const SizedBox(width: 6), + Expanded( + child: Text( + locationAsync.city.isNotEmpty + ? '${locationAsync.country} • ${locationAsync.city}' + : locationAsync.country, + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Theme.of(context).colorScheme.onSurface.withOpacity(0.7), + ), + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + ); + } + + // Show loading indicator while fetching + if (locationAsync == null) { + return Padding( + padding: const EdgeInsets.only(top: 4.0), + child: Row( + children: [ + const SizedBox( + width: 12, + height: 12, + child: CircularProgressIndicator(strokeWidth: 1.5), + ), + const SizedBox(width: 8), + Text( + 'Loading location...', + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Theme.of(context).colorScheme.onSurface.withOpacity(0.5), + ), + ), + ], + ), + ); + } + + return const SizedBox.shrink(); + }, ), const SizedBox(height: AppSpacing.xs), Row( diff --git a/lib/models/peer_models.dart b/lib/models/peer_models.dart index adbffd3..5ef0605 100644 --- a/lib/models/peer_models.dart +++ b/lib/models/peer_models.dart @@ -1,3 +1,5 @@ +import '../services/geolocation_service.dart'; + /// Enum representing the type of peer connection enum PeerType { static, @@ -97,6 +99,9 @@ class PeerStats { /// Time since last successful connection (in seconds), null if never connected final int? lastConnectedSeconds; + + /// Location information for this peer (country, city, etc.) + final LocationInfo? locationInfo; const PeerStats({ required this.protocol, @@ -107,6 +112,7 @@ class PeerStats { required this.txBytes, required this.discoveredSeconds, this.lastConnectedSeconds, + this.locationInfo, }); /// Create PeerStats from a JSON map @@ -134,6 +140,7 @@ class PeerStats { 'txBytes': txBytes, 'discoveredSeconds': discoveredSeconds, 'lastConnectedSeconds': lastConnectedSeconds, + // Note: locationInfo is not serialized as it's fetched separately }; } diff --git a/lib/services/geolocation_service.dart b/lib/services/geolocation_service.dart new file mode 100644 index 0000000..725e75b --- /dev/null +++ b/lib/services/geolocation_service.dart @@ -0,0 +1,108 @@ +import 'dart:convert'; +import 'package:http/http.dart' as http; + +class LocationInfo { + final String country; + final String countryCode; + final String city; + final String region; + final double? latitude; + final double? longitude; + + const LocationInfo({ + required this.country, + required this.countryCode, + required this.city, + required this.region, + this.latitude, + this.longitude, + }); + + factory LocationInfo.fromGridTFJson(Map json) { + return LocationInfo( + country: json['country_name'] ?? 'Unknown', + countryCode: json['country_code'] ?? 'XX', + city: json['city_name'] ?? '', + region: json['subdivision'] ?? '', + latitude: json['latitude']?.toDouble(), + longitude: json['longitude']?.toDouble(), + ); + } + + factory LocationInfo.unknown() { + return const LocationInfo( + country: 'Unknown', + countryCode: 'XX', + city: '', + region: '', + ); + } +} + +class GeolocationService { + static const String _apiUrl = 'https://geoip.grid.tf'; + static final Map _cache = {}; + + Future getLocationForIP(String ip) async { + // Check cache first + if (_cache.containsKey(ip)) { + print('Cache hit for $ip: ${_cache[ip]!.country}'); + return _cache[ip]!; + } + + try { + // Extract IP from peer address if it contains protocol + String targetIP = ip; + if (ip.contains('://')) { + final uri = Uri.parse(ip); + targetIP = uri.host; + } else if (ip.contains(':')) { + // Format: ip:port + targetIP = ip.split(':')[0]; + } + + print('Making API call to: $_apiUrl with X-Real-IP: $targetIP'); + final response = await http.get( + Uri.parse(_apiUrl), + headers: { + 'Accept': 'application/json', + 'X-Real-IP': targetIP, + }, + ).timeout(const Duration(seconds: 10)); + + print('API response status: ${response.statusCode}'); + print('API response body: ${response.body}'); + + if (response.statusCode == 200) { + final data = jsonDecode(response.body); + final locationInfo = LocationInfo.fromGridTFJson(data); + print('Parsed location: ${locationInfo.country}, ${locationInfo.city}'); + _cache[ip] = locationInfo; + return locationInfo; + } else { + print('API returned non-200 status: ${response.statusCode}'); + } + } catch (e) { + print('Geolocation error for $ip: $e'); + } + + // Return unknown location and cache it + final unknownLocation = LocationInfo.unknown(); + _cache[ip] = unknownLocation; + print('Returning unknown location for $ip'); + return unknownLocation; + } + + String getFlagEmoji(String countryCode) { + if (countryCode.length != 2) return '🏳️'; + + final codePoints = countryCode.toUpperCase().codeUnits; + final flag = String.fromCharCode(0x1F1E6 + codePoints[0] - 0x41) + + String.fromCharCode(0x1F1E6 + codePoints[1] - 0x41); + return flag; + } + + void clearCache() { + _cache.clear(); + } +} diff --git a/lib/state/geolocation_providers.dart b/lib/state/geolocation_providers.dart new file mode 100644 index 0000000..46ebdeb --- /dev/null +++ b/lib/state/geolocation_providers.dart @@ -0,0 +1,48 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import '../services/geolocation_service.dart'; + +// Provider for geolocation service +final geolocationServiceProvider = Provider((ref) { + return GeolocationService(); +}); + +// Provider for peer location cache +final peerLocationProvider = StateNotifierProvider.family((ref, peerAddress) { + return PeerLocationNotifier(ref.read(geolocationServiceProvider), peerAddress); +}); + +class PeerLocationNotifier extends StateNotifier { + final GeolocationService _geolocationService; + final String _peerAddress; + + PeerLocationNotifier(this._geolocationService, this._peerAddress) : super(null) { + _fetchLocation(); + } + + Future _fetchLocation() async { + try { + // Extract IP from address (remove tcp:// prefix if present) + String cleanIP = _peerAddress.replaceAll('tcp://', ''); + if (cleanIP.contains(':')) { + cleanIP = cleanIP.split(':')[0]; // Remove port if present + } + + print('Fetching location for peer: $_peerAddress -> cleaned IP: $cleanIP'); + final location = await _geolocationService.getLocationForIP(cleanIP); + print('Location result for $cleanIP: ${location.country}, ${location.city}'); + + if (mounted) { + state = location; + } + } catch (e) { + print('Error fetching location for $_peerAddress: $e'); + if (mounted) { + state = LocationInfo.unknown(); + } + } + } + + void refresh() { + _fetchLocation(); + } +} From 5e8e6e539a4aa4d329bdfd0f704f60476b870d17 Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sat, 20 Sep 2025 19:24:04 +0300 Subject: [PATCH 06/22] Fixes --- lib/features/home/home_screen.dart | 362 +++++++++++++++++-------- lib/features/peers/peers_screen.dart | 70 +++-- lib/services/ffi/mycelium_service.dart | 36 ++- lib/services/geolocation_service.dart | 13 +- lib/state/geolocation_providers.dart | 2 - 5 files changed, 308 insertions(+), 175 deletions(-) diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index c4f8ff0..bb30736 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -50,44 +50,58 @@ class HomeScreen extends ConsumerWidget { ), currentIndex: 0, onTabSelected: null, - child: ListView( - children: [ - const SizedBox(height: AppSpacing.xxl), - _HeaderCard( - status: status, - onConnect: () async { - final peers = peersAsync.asData?.value ?? []; - if (peers.isNotEmpty) { - await service.start(peers); - } else { - // Fallback to PeersService if no peers available - final peersService = PeersService(); - final fallbackPeers = await peersService.fetchPeers(); - await service.start(fallbackPeers); - } - }, - onDisconnect: () async { - await service.stop(); - }, - service: service, - ), - const SizedBox(height: AppSpacing.xxl), - const _StatsRow(), - const SizedBox(height: AppSpacing.xxl), - Consumer( - builder: (context, ref, child) { - final trafficStats = ref.watch(dynamicTrafficProvider); - - return TrafficSummary( - totalUpload: trafficStats.totalUploadFormatted, - totalDownload: trafficStats.totalDownloadFormatted, - peakUpload: trafficStats.peakUploadFormatted, - peakDownload: trafficStats.peakDownloadFormatted, + child: ListView.builder( + itemCount: 5, + itemBuilder: (context, index) { + switch (index) { + case 0: + return const SizedBox(height: AppSpacing.xxl); + case 1: + return _HeaderCard( + status: status, + onConnect: () async { + final peers = peersAsync.asData?.value ?? []; + if (peers.isNotEmpty) { + await service.start(peers); + } else { + // Fallback to PeersService if no peers available + final peersService = PeersService(); + final fallbackPeers = await peersService.fetchPeers(); + await service.start(fallbackPeers); + } + }, + onDisconnect: () async { + await service.stop(); + }, + service: service, ); - }, - ), - const SizedBox(height: AppSpacing.xxxl), - ], + case 2: + return Column( + children: [ + const SizedBox(height: AppSpacing.xxl), + const _StatsRow(), + const SizedBox(height: AppSpacing.xxl), + ], + ); + case 3: + return Consumer( + builder: (context, ref, child) { + final trafficStats = ref.watch(dynamicTrafficProvider); + + return TrafficSummary( + totalUpload: trafficStats.totalUploadFormatted, + totalDownload: trafficStats.totalDownloadFormatted, + peakUpload: trafficStats.peakUploadFormatted, + peakDownload: trafficStats.peakDownloadFormatted, + ); + }, + ); + case 4: + return const SizedBox(height: AppSpacing.xxxl); + default: + return const SizedBox.shrink(); + } + }, ), ); } @@ -266,35 +280,138 @@ class _HeaderCardState extends State<_HeaderCard> { } } -class _StatsRow extends ConsumerStatefulWidget { +class _StatsRow extends ConsumerWidget { const _StatsRow(); @override - ConsumerState<_StatsRow> createState() => _StatsRowState(); + Widget build(BuildContext context, WidgetRef ref) { + final nodeStatusAsync = ref.watch(nodeStatusProvider); + final uptimeNotifier = ref.watch(uptimeProvider.notifier); + + return nodeStatusAsync.when( + loading: () => _buildStatsCards(context, [], uptimeNotifier), + error: (error, stack) => _buildStatsCards(context, [], uptimeNotifier), + data: (status) { + if (status == NodeStatus.connected) { + return _ConnectedStatsRow(uptimeNotifier: uptimeNotifier); + } else { + return _buildStatsCards(context, [], uptimeNotifier); + } + }, + ); + } + + Widget _buildStatsCards(BuildContext context, List peerStatus, UptimeNotifier uptimeNotifier) { + final networkTraffic = _calculateNetworkTraffic(peerStatus); + + return Row( + children: [ + Expanded( + child: AppCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Connected Peers', + style: Theme.of(context).textTheme.titleSmall, + ), + const SizedBox(height: AppSpacing.xs), + Text( + '${peerStatus.length}', + style: Theme.of(context).textTheme.headlineMedium?.copyWith( + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + const SizedBox(width: AppSpacing.md), + Expanded( + child: AppCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Uptime', + style: Theme.of(context).textTheme.titleSmall, + ), + const SizedBox(height: AppSpacing.xs), + Text( + uptimeNotifier.formattedUptime, + style: Theme.of(context).textTheme.headlineMedium?.copyWith( + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + const SizedBox(width: AppSpacing.md), + Expanded( + child: AppCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Traffic', + style: Theme.of(context).textTheme.titleSmall, + ), + const SizedBox(height: AppSpacing.xs), + Text( + '↓${networkTraffic['rx']} ↑${networkTraffic['tx']}', + style: Theme.of(context).textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ], + ); + } + + Map _calculateNetworkTraffic(List peerStatus) { + int totalRx = 0; + int totalTx = 0; + + for (final peer in peerStatus) { + totalRx += peer.rxBytes; + totalTx += peer.txBytes; + } + return { + 'rx': peer_models.PeerStats.formatBytes(totalRx), + 'tx': peer_models.PeerStats.formatBytes(totalTx), + }; + } } -class _StatsRowState extends ConsumerState<_StatsRow> { +class _ConnectedStatsRow extends ConsumerStatefulWidget { + final UptimeNotifier uptimeNotifier; + + const _ConnectedStatsRow({required this.uptimeNotifier}); + + @override + ConsumerState<_ConnectedStatsRow> createState() => _ConnectedStatsRowState(); +} + +class _ConnectedStatsRowState extends ConsumerState<_ConnectedStatsRow> { List peerStatus = []; Timer? _refreshTimer; - Timer? _uptimeTimer; @override void initState() { super.initState(); _fetchPeerStatus(); - _refreshTimer = Timer.periodic(const Duration(seconds: 5), (_) { + _refreshTimer = Timer.periodic(const Duration(seconds: 10), (_) { _fetchPeerStatus(); }); - _uptimeTimer = Timer.periodic(const Duration(seconds: 1), (_) { - // Trigger rebuild to update uptime display - if (mounted) setState(() {}); - }); } @override void dispose() { _refreshTimer?.cancel(); - _uptimeTimer?.cancel(); super.dispose(); } @@ -302,14 +419,91 @@ class _StatsRowState extends ConsumerState<_StatsRow> { try { final service = MyceliumService(); final status = await service.getPeerStatus(); - setState(() { - peerStatus = status; - }); + if (mounted) { + setState(() { + peerStatus = status; + }); + } } catch (e) { - // Handle error silently + if (mounted) { + setState(() { + peerStatus = []; + }); + } } } + @override + Widget build(BuildContext context) { + final networkTraffic = _calculateNetworkTraffic(); + + return Row( + children: [ + Expanded( + child: AppCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Connected Peers', + style: Theme.of(context).textTheme.titleSmall, + ), + const SizedBox(height: AppSpacing.xs), + Text( + '${peerStatus.length}', + style: Theme.of(context).textTheme.headlineMedium?.copyWith( + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + const SizedBox(width: AppSpacing.md), + Expanded( + child: AppCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Uptime', + style: Theme.of(context).textTheme.titleSmall, + ), + const SizedBox(height: AppSpacing.xs), + Text( + widget.uptimeNotifier.formattedUptime, + style: Theme.of(context).textTheme.headlineMedium?.copyWith( + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + const SizedBox(width: AppSpacing.md), + Expanded( + child: AppCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Traffic', + style: Theme.of(context).textTheme.titleSmall, + ), + const SizedBox(height: AppSpacing.xs), + Text( + '↓${networkTraffic['rx']} ↑${networkTraffic['tx']}', + style: Theme.of(context).textTheme.titleMedium?.copyWith( + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ], + ); + } Map _calculateNetworkTraffic() { int totalRx = 0; @@ -328,70 +522,4 @@ class _StatsRowState extends ConsumerState<_StatsRow> { }; } - int _getConnectedPeersCount() { - return peerStatus.where((peer) => - peer.connectionState == peer_models.ConnectionState.connected - ).length; - } - - @override - Widget build(BuildContext context) { - final uptimeNotifier = ref.read(uptimeProvider.notifier); - final connectedPeers = _getConnectedPeersCount(); - final networkTraffic = _calculateNetworkTraffic(); - final uptime = uptimeNotifier.formattedUptime; - Widget tileContent(IconData icon, String title, String value) => Column( - mainAxisSize: MainAxisSize.min, - children: [ - Icon(icon), - const SizedBox(height: AppSpacing.sm), - Text( - title, - style: Theme.of(context).textTheme.labelMedium, - textAlign: TextAlign.center, - ), - const SizedBox(height: AppSpacing.xs), - Text( - value, - style: Theme.of(context).textTheme.titleMedium, - textAlign: TextAlign.center, - ), - ], - ); - - return Padding( - padding: const EdgeInsets.symmetric(horizontal: AppSpacing.lg), - child: Row( - children: [ - Expanded( - child: AppCard( - margin: EdgeInsets.zero, - padding: const EdgeInsets.all(AppSpacing.md), - child: tileContent(Icons.people, 'Connected Peers', '$connectedPeers'), - ), - ), - const SizedBox(width: AppSpacing.lg), - Expanded( - child: AppCard( - margin: EdgeInsets.zero, - padding: const EdgeInsets.all(AppSpacing.md), - child: tileContent(Icons.podcasts, 'Total Traffic', networkTraffic['total'] ?? '0 B'), - ), - ), - const SizedBox(width: AppSpacing.lg), - Expanded( - child: AppCard( - margin: EdgeInsets.zero, - padding: const EdgeInsets.all(AppSpacing.md), - child: tileContent(Icons.access_time, 'Uptime', uptime), - ), - ), - ], - ), - ); - } } - -// TODO: VPN implemented or not and if yes, how to get its data ? -//TODO: How to get num of peers, bandwidth, uptime ?? -//TODO: How to get All data in peers screen ? diff --git a/lib/features/peers/peers_screen.dart b/lib/features/peers/peers_screen.dart index f7dfefb..0139a73 100644 --- a/lib/features/peers/peers_screen.dart +++ b/lib/features/peers/peers_screen.dart @@ -77,10 +77,23 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { @override void initState() { super.initState(); - _fetchPeerStatus(); - // Refresh peer status every 5 seconds - _refreshTimer = Timer.periodic(const Duration(seconds: 5), (_) { - _fetchPeerStatus(); + _startConditionalPolling(); + } + + void _startConditionalPolling() { + // Only start polling if mounted and Mycelium is connected + WidgetsBinding.instance.addPostFrameCallback((_) { + if (!mounted) return; + + final nodeStatusAsync = ref.read(nodeStatusProvider); + nodeStatusAsync.whenData((status) { + if (mounted && status == NodeStatus.connected) { + _fetchPeerStatus(); + _refreshTimer = Timer.periodic(const Duration(seconds: 10), (_) { + if (mounted) _fetchPeerStatus(); + }); + } + }); }); } @@ -91,29 +104,27 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { } Future _fetchPeerStatus() async { + if (!mounted) return; + try { final service = MyceliumService(); final status = await service.getPeerStatus(); - setState(() { - peerStatus = status; - peerStatusError = null; - }); - print('Fetched ${status.length} peer statuses:'); - for (final peer in status) { - print( - ' - Endpoint: ${peer.endpoint}, State: ${peer.connectionState}, Type: ${peer.peerType}'); - } - print('Current peer list:'); - for (final peer in widget.peers) { - print(' - Peer: $peer'); + if (mounted) { + setState(() { + peerStatus = status; + peerStatusError = null; + }); } } catch (e) { - // Don't show error when Mycelium is not running - this is expected - setState(() { - peerStatus = []; - peerStatusError = null; - }); - print('Mycelium not running or error getting peer status: $e'); + // Stop polling on errors to prevent spam + _refreshTimer?.cancel(); + _refreshTimer = null; + if (mounted) { + setState(() { + peerStatus = []; + peerStatusError = null; + }); + } } } @@ -154,10 +165,7 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { for (final peer in peerStatus) { totalRx += peer.rxBytes; totalTx += peer.txBytes; - print('Peer ${peer.endpoint}: RX=${peer.rxBytes} TX=${peer.txBytes}'); } - - print('Total network traffic: RX=$totalRx TX=$totalTx'); return { 'rx': peer_models.PeerStats.formatBytes(totalRx), 'tx': peer_models.PeerStats.formatBytes(totalTx), @@ -180,23 +188,16 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { statusIp = statusIp.split(':')[0]; } - print( - 'Matching peer: "$peerIp" vs status: "$statusIp" (full endpoint: ${peer.endpoint}), status: ${peer.connectionState}'); - // Try exact match first if (peerIp == statusIp) { - print('✓ Found exact match for $peerAddress'); return peer; } // Try matching the full peer address with the endpoint if (peerAddress == peer.endpoint) { - print('✓ Found full address match for $peerAddress'); return peer; } } - print( - '✗ No match found for peer: $peerAddress in ${peerStatus.length} status entries'); return null; } @@ -440,12 +441,10 @@ class _PeerTileState extends ConsumerState<_PeerTile> { (widget.peerStats!.connectionState == peer_models.ConnectionState.connected || widget.peerStats!.connectionState == peer_models.ConnectionState.connecting)) { - print('Starting periodic ping for ${widget.ip}'); // Initial ping after 2 seconds Timer(const Duration(seconds: 2), () { if (mounted) { - print('Performing initial ping for ${widget.ip}'); _performPingTest(isAutomatic: true); } }); @@ -453,12 +452,10 @@ class _PeerTileState extends ConsumerState<_PeerTile> { // Then ping every 30 seconds _periodicPingTimer = Timer.periodic(const Duration(seconds: 30), (_) { if (mounted) { - print('Performing periodic ping for ${widget.ip}'); _performPingTest(isAutomatic: true); } }); } else { - print('Not starting periodic ping for ${widget.ip} - peer stats: ${widget.peerStats?.connectionState}'); } } @@ -566,7 +563,6 @@ class _PeerTileState extends ConsumerState<_PeerTile> { builder: (context, ref, child) { final locationAsync = ref.watch(peerLocationProvider(widget.ip)); - print('Location widget for ${widget.ip}: $locationAsync'); if (locationAsync != null && locationAsync.country != 'Unknown') { final geoService = ref.read(geolocationServiceProvider); diff --git a/lib/services/ffi/mycelium_service.dart b/lib/services/ffi/mycelium_service.dart index 365c7f5..49f509d 100644 --- a/lib/services/ffi/mycelium_service.dart +++ b/lib/services/ffi/mycelium_service.dart @@ -173,20 +173,33 @@ class MyceliumService { peerStatusStrings = result?.cast() ?? []; } - // Filter out the first element if it's "ok" (status indicator) - if (peerStatusStrings.isNotEmpty && peerStatusStrings[0] == "ok") { - peerStatusStrings = peerStatusStrings.sublist(1); + // Check for error responses first + if (peerStatusStrings.isNotEmpty) { + final firstResponse = peerStatusStrings[0]; + if (firstResponse.startsWith('err_')) { + // Handle error responses like "err_node_timeout" + throw Exception('Mycelium service error: $firstResponse'); + } + + // Filter out the first element if it's "ok" (status indicator) + if (firstResponse == "ok") { + peerStatusStrings = peerStatusStrings.sublist(1); + } } // Parse JSON strings into PeerStats objects List peerStats = []; for (String jsonString in peerStatusStrings) { try { + // Skip empty or error strings + if (jsonString.trim().isEmpty || jsonString.startsWith('err_')) { + continue; + } + final Map json = jsonDecode(jsonString); peerStats.add(PeerStats.fromJson(json)); } catch (e) { - print('Failed to parse peer JSON: $jsonString, error: $e'); - // Skip malformed entries + // Skip malformed entries silently to prevent spam } } @@ -218,7 +231,15 @@ class MyceliumService { }; return jsonEncode(statusMap); } else { - // For mobile platforms, use getPeerStatus as fallback since getStatus isn't implemented + // For mobile platforms, don't call getPeerStatus if service is not running + if (_status != NodeStatus.connected) { + final statusMap = { + 'peers': >[], + 'status': _status.toString(), + }; + return jsonEncode(statusMap); + } + try { final peerStats = await getPeerStatus(); final statusMap = { @@ -227,8 +248,7 @@ class MyceliumService { }; return jsonEncode(statusMap); } catch (e) { - print("Failed to get peer status for mobile fallback: $e"); - // Return minimal status if peer status also fails + // Silent fallback for mobile when service is unavailable final statusMap = { 'peers': >[], 'status': _status.toString(), diff --git a/lib/services/geolocation_service.dart b/lib/services/geolocation_service.dart index 725e75b..916ac6a 100644 --- a/lib/services/geolocation_service.dart +++ b/lib/services/geolocation_service.dart @@ -46,7 +46,6 @@ class GeolocationService { Future getLocationForIP(String ip) async { // Check cache first if (_cache.containsKey(ip)) { - print('Cache hit for $ip: ${_cache[ip]!.country}'); return _cache[ip]!; } @@ -61,35 +60,27 @@ class GeolocationService { targetIP = ip.split(':')[0]; } - print('Making API call to: $_apiUrl with X-Real-IP: $targetIP'); final response = await http.get( Uri.parse(_apiUrl), headers: { 'Accept': 'application/json', 'X-Real-IP': targetIP, }, - ).timeout(const Duration(seconds: 10)); - - print('API response status: ${response.statusCode}'); - print('API response body: ${response.body}'); + ).timeout(const Duration(seconds: 5)); if (response.statusCode == 200) { final data = jsonDecode(response.body); final locationInfo = LocationInfo.fromGridTFJson(data); - print('Parsed location: ${locationInfo.country}, ${locationInfo.city}'); _cache[ip] = locationInfo; return locationInfo; - } else { - print('API returned non-200 status: ${response.statusCode}'); } } catch (e) { - print('Geolocation error for $ip: $e'); + // Silent error handling for performance } // Return unknown location and cache it final unknownLocation = LocationInfo.unknown(); _cache[ip] = unknownLocation; - print('Returning unknown location for $ip'); return unknownLocation; } diff --git a/lib/state/geolocation_providers.dart b/lib/state/geolocation_providers.dart index 46ebdeb..0e284a0 100644 --- a/lib/state/geolocation_providers.dart +++ b/lib/state/geolocation_providers.dart @@ -27,9 +27,7 @@ class PeerLocationNotifier extends StateNotifier { cleanIP = cleanIP.split(':')[0]; // Remove port if present } - print('Fetching location for peer: $_peerAddress -> cleaned IP: $cleanIP'); final location = await _geolocationService.getLocationForIP(cleanIP); - print('Location result for $cleanIP: ${location.country}, ${location.city}'); if (mounted) { state = location; From e0d2c2c93c5b95cd68533fe3fc25a3f1d0193229 Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sat, 20 Sep 2025 19:32:56 +0300 Subject: [PATCH 07/22] Fix the number of peers --- lib/features/home/home_screen.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index bb30736..fb1ec9f 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -433,9 +433,16 @@ class _ConnectedStatsRowState extends ConsumerState<_ConnectedStatsRow> { } } + int _getConnectedPeersCount() { + return peerStatus.where((peer) => + peer.connectionState == peer_models.ConnectionState.connected + ).length; + } + @override Widget build(BuildContext context) { final networkTraffic = _calculateNetworkTraffic(); + final connectedCount = _getConnectedPeersCount(); return Row( children: [ @@ -450,7 +457,7 @@ class _ConnectedStatsRowState extends ConsumerState<_ConnectedStatsRow> { ), const SizedBox(height: AppSpacing.xs), Text( - '${peerStatus.length}', + '$connectedCount', style: Theme.of(context).textTheme.headlineMedium?.copyWith( fontWeight: FontWeight.bold, ), From 62e17ebac54ca51e8c5659ccbe65a8691bdd1b1e Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sat, 20 Sep 2025 19:52:45 +0300 Subject: [PATCH 08/22] Fix the traffic data --- lib/features/home/home_screen.dart | 58 +++++++++++++++--------- lib/state/dynamic_traffic_providers.dart | 27 ++++++++--- 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index fb1ec9f..06555d8 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -87,7 +87,7 @@ class HomeScreen extends ConsumerWidget { return Consumer( builder: (context, ref, child) { final trafficStats = ref.watch(dynamicTrafficProvider); - + return TrafficSummary( totalUpload: trafficStats.totalUploadFormatted, totalDownload: trafficStats.totalDownloadFormatted, @@ -139,7 +139,7 @@ class _HeaderCardState extends State<_HeaderCard> { Future stopMycelium() async { setState(() => _isLoading = true); - + // Stop proxy first if it's enabled if (_isSocks5Enabled) { try { @@ -150,7 +150,7 @@ class _HeaderCardState extends State<_HeaderCard> { print('Error stopping proxy: $e'); } } - + await widget.onDisconnect(); setState(() => _isLoading = false); } @@ -287,7 +287,7 @@ class _StatsRow extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final nodeStatusAsync = ref.watch(nodeStatusProvider); final uptimeNotifier = ref.watch(uptimeProvider.notifier); - + return nodeStatusAsync.when( loading: () => _buildStatsCards(context, [], uptimeNotifier), error: (error, stack) => _buildStatsCards(context, [], uptimeNotifier), @@ -301,19 +301,21 @@ class _StatsRow extends ConsumerWidget { ); } - Widget _buildStatsCards(BuildContext context, List peerStatus, UptimeNotifier uptimeNotifier) { + Widget _buildStatsCards(BuildContext context, + List peerStatus, UptimeNotifier uptimeNotifier) { final networkTraffic = _calculateNetworkTraffic(peerStatus); - + return Row( children: [ Expanded( child: AppCard( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( 'Connected Peers', style: Theme.of(context).textTheme.titleSmall, + textAlign: TextAlign.center, ), const SizedBox(height: AppSpacing.xs), Text( @@ -321,6 +323,7 @@ class _StatsRow extends ConsumerWidget { style: Theme.of(context).textTheme.headlineMedium?.copyWith( fontWeight: FontWeight.bold, ), + textAlign: TextAlign.center, ), ], ), @@ -330,11 +333,12 @@ class _StatsRow extends ConsumerWidget { Expanded( child: AppCard( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( 'Uptime', style: Theme.of(context).textTheme.titleSmall, + textAlign: TextAlign.center, ), const SizedBox(height: AppSpacing.xs), Text( @@ -342,6 +346,7 @@ class _StatsRow extends ConsumerWidget { style: Theme.of(context).textTheme.headlineMedium?.copyWith( fontWeight: FontWeight.bold, ), + textAlign: TextAlign.center, ), ], ), @@ -351,18 +356,20 @@ class _StatsRow extends ConsumerWidget { Expanded( child: AppCard( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( 'Traffic', style: Theme.of(context).textTheme.titleSmall, + textAlign: TextAlign.center, ), const SizedBox(height: AppSpacing.xs), Text( - '↓${networkTraffic['rx']} ↑${networkTraffic['tx']}', + networkTraffic['total'] ?? '0 B', style: Theme.of(context).textTheme.titleMedium?.copyWith( fontWeight: FontWeight.bold, ), + textAlign: TextAlign.center, ), ], ), @@ -372,7 +379,8 @@ class _StatsRow extends ConsumerWidget { ); } - Map _calculateNetworkTraffic(List peerStatus) { + Map _calculateNetworkTraffic( + List peerStatus) { int totalRx = 0; int totalTx = 0; @@ -380,16 +388,18 @@ class _StatsRow extends ConsumerWidget { totalRx += peer.rxBytes; totalTx += peer.txBytes; } + final totalTraffic = totalRx + totalTx; return { 'rx': peer_models.PeerStats.formatBytes(totalRx), 'tx': peer_models.PeerStats.formatBytes(totalTx), + 'total': peer_models.PeerStats.formatBytes(totalTraffic), }; } } class _ConnectedStatsRow extends ConsumerStatefulWidget { final UptimeNotifier uptimeNotifier; - + const _ConnectedStatsRow({required this.uptimeNotifier}); @override @@ -434,26 +444,28 @@ class _ConnectedStatsRowState extends ConsumerState<_ConnectedStatsRow> { } int _getConnectedPeersCount() { - return peerStatus.where((peer) => - peer.connectionState == peer_models.ConnectionState.connected - ).length; + return peerStatus + .where((peer) => + peer.connectionState == peer_models.ConnectionState.connected) + .length; } @override Widget build(BuildContext context) { final networkTraffic = _calculateNetworkTraffic(); final connectedCount = _getConnectedPeersCount(); - + return Row( children: [ Expanded( child: AppCard( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( 'Connected Peers', style: Theme.of(context).textTheme.titleSmall, + textAlign: TextAlign.center, ), const SizedBox(height: AppSpacing.xs), Text( @@ -461,6 +473,7 @@ class _ConnectedStatsRowState extends ConsumerState<_ConnectedStatsRow> { style: Theme.of(context).textTheme.headlineMedium?.copyWith( fontWeight: FontWeight.bold, ), + textAlign: TextAlign.center, ), ], ), @@ -470,11 +483,12 @@ class _ConnectedStatsRowState extends ConsumerState<_ConnectedStatsRow> { Expanded( child: AppCard( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( 'Uptime', style: Theme.of(context).textTheme.titleSmall, + textAlign: TextAlign.center, ), const SizedBox(height: AppSpacing.xs), Text( @@ -482,6 +496,7 @@ class _ConnectedStatsRowState extends ConsumerState<_ConnectedStatsRow> { style: Theme.of(context).textTheme.headlineMedium?.copyWith( fontWeight: FontWeight.bold, ), + textAlign: TextAlign.center, ), ], ), @@ -491,18 +506,20 @@ class _ConnectedStatsRowState extends ConsumerState<_ConnectedStatsRow> { Expanded( child: AppCard( child: Column( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( 'Traffic', style: Theme.of(context).textTheme.titleSmall, + textAlign: TextAlign.center, ), const SizedBox(height: AppSpacing.xs), Text( - '↓${networkTraffic['rx']} ↑${networkTraffic['tx']}', + networkTraffic['total'] ?? '0 B', style: Theme.of(context).textTheme.titleMedium?.copyWith( fontWeight: FontWeight.bold, ), + textAlign: TextAlign.center, ), ], ), @@ -528,5 +545,4 @@ class _ConnectedStatsRowState extends ConsumerState<_ConnectedStatsRow> { 'tx': peer_models.PeerStats.formatBytes(totalTx), }; } - } diff --git a/lib/state/dynamic_traffic_providers.dart b/lib/state/dynamic_traffic_providers.dart index 3d16edb..d7a06de 100644 --- a/lib/state/dynamic_traffic_providers.dart +++ b/lib/state/dynamic_traffic_providers.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'mycelium_providers.dart'; +import '../services/ffi/mycelium_service.dart'; class TrafficStats { final int totalUploadBytes; @@ -66,8 +67,15 @@ class DynamicTrafficNotifier extends StateNotifier { Future _updateTrafficStats() async { try { - final peersService = _ref.read(peersServiceProvider); - final peerStats = await peersService.fetchPeerStats(); + // Check if Mycelium is connected before fetching stats + final nodeStatusAsync = _ref.read(nodeStatusProvider); + final nodeStatus = nodeStatusAsync.asData?.value; + + if (nodeStatus != NodeStatus.connected) return; + + // Use MyceliumService directly to get peer stats like the home screen does + final myceliumService = _ref.read(myceliumServiceProvider); + final peerStats = await myceliumService.getPeerStatus(); if (peerStats.isEmpty) return; @@ -81,17 +89,22 @@ class DynamicTrafficNotifier extends StateNotifier { } // Calculate rates (bytes per second over 2-second interval) - final rxRate = ((totalRx - _previousTotalRx) / 2).round(); - final txRate = ((totalTx - _previousTotalTx) / 2).round(); + final rxRate = _previousTotalRx > 0 ? ((totalRx - _previousTotalRx) / 2).round() : 0; + final txRate = _previousTotalTx > 0 ? ((totalTx - _previousTotalTx) / 2).round() : 0; // Update peak rates if (rxRate > _maxRxRate) _maxRxRate = rxRate; if (txRate > _maxTxRate) _maxTxRate = txRate; - // Update state + // Accumulate total traffic instead of replacing it + final currentState = state; + final newTotalUpload = currentState.totalUploadBytes + (totalTx - _previousTotalTx).abs(); + final newTotalDownload = currentState.totalDownloadBytes + (totalRx - _previousTotalRx).abs(); + + // Update state with accumulated totals state = TrafficStats( - totalUploadBytes: totalTx, - totalDownloadBytes: totalRx, + totalUploadBytes: _previousTotalTx == 0 ? totalTx : newTotalUpload, + totalDownloadBytes: _previousTotalRx == 0 ? totalRx : newTotalDownload, peakUploadBytesPerSec: _maxTxRate, peakDownloadBytesPerSec: _maxRxRate, lastUpdated: DateTime.now(), From b36d4ffbb5c21bea2e653545e433203124a342bd Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sat, 20 Sep 2025 20:05:55 +0300 Subject: [PATCH 09/22] Adjust colors and add animation --- lib/app/theme/app_theme.dart | 14 ++- lib/app/widgets/app_button.dart | 25 +++-- lib/features/home/home_screen.dart | 105 ++++++++++++++++++--- lib/features/settings/settings_screen.dart | 16 ++-- 4 files changed, 133 insertions(+), 27 deletions(-) diff --git a/lib/app/theme/app_theme.dart b/lib/app/theme/app_theme.dart index 93b358f..e845b86 100644 --- a/lib/app/theme/app_theme.dart +++ b/lib/app/theme/app_theme.dart @@ -56,7 +56,12 @@ class AppTheme { } return colorScheme.primary; }), - foregroundColor: MaterialStateProperty.all(Colors.white), + foregroundColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.disabled)) { + return colorScheme.onSurface.withOpacity(0.38); + } + return colorScheme.onPrimary; + }), minimumSize: MaterialStateProperty.all(const Size.fromHeight(48)), shape: MaterialStateProperty.all( RoundedRectangleBorder( @@ -136,7 +141,12 @@ class AppTheme { } return colorScheme.primary; }), - foregroundColor: MaterialStateProperty.all(Colors.white), + foregroundColor: MaterialStateProperty.resolveWith((states) { + if (states.contains(MaterialState.disabled)) { + return colorScheme.onSurface.withOpacity(0.38); + } + return colorScheme.onPrimary; + }), minimumSize: MaterialStateProperty.all(const Size.fromHeight(48)), shape: MaterialStateProperty.all( RoundedRectangleBorder( diff --git a/lib/app/widgets/app_button.dart b/lib/app/widgets/app_button.dart index e59cffa..8f1a008 100644 --- a/lib/app/widgets/app_button.dart +++ b/lib/app/widgets/app_button.dart @@ -7,7 +7,12 @@ class AppButton extends StatelessWidget { final bool isPrimary; final bool isLoading; - const AppButton({super.key, required this.label, this.onPressed, this.isPrimary = true, this.isLoading = false}); + const AppButton( + {super.key, + required this.label, + this.onPressed, + this.isPrimary = true, + this.isLoading = false}); @override Widget build(BuildContext context) { @@ -15,18 +20,26 @@ class AppButton extends StatelessWidget { ? Theme.of(context).elevatedButtonTheme.style : ElevatedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Colors.white, + foregroundColor: Theme.of(context).colorScheme.onSecondary, minimumSize: const Size.fromHeight(48), - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(AppRadii.md)), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppRadii.md)), ); return ElevatedButton( onPressed: isLoading ? null : onPressed, style: style, child: isLoading - ? const SizedBox(width: 18, height: 18, child: CircularProgressIndicator(strokeWidth: 2)) + ? SizedBox( + width: 18, + height: 18, + child: CircularProgressIndicator( + strokeWidth: 2, + valueColor: AlwaysStoppedAnimation( + Theme.of(context).colorScheme.onPrimary, + ), + ), + ) : Text(label), ); } } - - diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index 06555d8..9a4201e 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -124,21 +124,87 @@ class _HeaderCard extends StatefulWidget { State<_HeaderCard> createState() => _HeaderCardState(); } -class _HeaderCardState extends State<_HeaderCard> { +class _HeaderCardState extends State<_HeaderCard> + with TickerProviderStateMixin { bool _isLoading = false; bool _isSocks5Enabled = false; + late AnimationController _pulseController; + late AnimationController _rotationController; + late Animation _pulseAnimation; + late Animation _rotationAnimation; + + @override + void initState() { + super.initState(); + _pulseController = AnimationController( + duration: const Duration(seconds: 2), + vsync: this, + ); + _rotationController = AnimationController( + duration: const Duration(milliseconds: 1500), + vsync: this, + ); + _pulseAnimation = Tween( + begin: 0.8, + end: 1.2, + ).animate(CurvedAnimation( + parent: _pulseController, + curve: Curves.easeInOut, + )); + _rotationAnimation = Tween( + begin: 0.0, + end: 1.0, + ).animate(CurvedAnimation( + parent: _rotationController, + curve: Curves.easeInOut, + )); + } + + @override + void dispose() { + _pulseController.dispose(); + _rotationController.dispose(); + super.dispose(); + } + + @override + void didUpdateWidget(_HeaderCard oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.status != widget.status) { + _updateAnimations(); + } + } + + void _updateAnimations() { + final isConnected = widget.status == NodeStatus.connected; + final isConnecting = _isLoading || widget.status == NodeStatus.connecting; + + if (isConnecting) { + _rotationController.repeat(); + _pulseController.stop(); + } else if (isConnected) { + _rotationController.stop(); + _pulseController.repeat(reverse: true); + } else { + _rotationController.stop(); + _pulseController.stop(); + } + } bool get isRestartVisible => widget.status == NodeStatus.connected && !_isLoading; Future startMycelium() async { setState(() => _isLoading = true); + _updateAnimations(); await widget.onConnect(); setState(() => _isLoading = false); + _updateAnimations(); } Future stopMycelium() async { setState(() => _isLoading = true); + _updateAnimations(); // Stop proxy first if it's enabled if (_isSocks5Enabled) { @@ -153,6 +219,7 @@ class _HeaderCardState extends State<_HeaderCard> { await widget.onDisconnect(); setState(() => _isLoading = false); + _updateAnimations(); } @override @@ -164,14 +231,29 @@ class _HeaderCardState extends State<_HeaderCard> { child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ - CircleAvatar( - radius: 28, - backgroundColor: Theme.of(context).colorScheme.primaryContainer, - child: Icon( - isConnected ? Icons.wifi : Icons.wifi_off, - size: 32, - color: Theme.of(context).colorScheme.onPrimaryContainer, - ), + AnimatedBuilder( + animation: + Listenable.merge([_pulseController, _rotationController]), + builder: (context, child) { + return Transform.scale( + scale: isConnected ? _pulseAnimation.value : 1.0, + child: Transform.rotate( + angle: isConnecting + ? _rotationAnimation.value * 2 * 3.14159 + : 0.0, + child: CircleAvatar( + radius: 28, + backgroundColor: + Theme.of(context).colorScheme.primaryContainer, + child: Icon( + isConnected ? Icons.wifi : Icons.wifi_off, + size: 32, + color: Theme.of(context).colorScheme.onPrimaryContainer, + ), + ), + ), + ); + }, ), const SizedBox(height: AppSpacing.lg), Text( @@ -205,13 +287,14 @@ class _HeaderCardState extends State<_HeaderCard> { height: 48, child: ElevatedButton( style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).cardColor, - foregroundColor: Theme.of(context).colorScheme.onSurface, + backgroundColor: Theme.of(context).colorScheme.surfaceVariant, + foregroundColor: Theme.of(context).colorScheme.onSurfaceVariant, padding: const EdgeInsets.symmetric(horizontal: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), textStyle: const TextStyle(fontSize: 16), + elevation: 0, ), child: const Text.rich( TextSpan( diff --git a/lib/features/settings/settings_screen.dart b/lib/features/settings/settings_screen.dart index 33068b1..5b4756a 100644 --- a/lib/features/settings/settings_screen.dart +++ b/lib/features/settings/settings_screen.dart @@ -65,7 +65,7 @@ class SettingsScreen extends ConsumerWidget { icon: CircleAvatar( radius: 14, backgroundColor: Theme.of(context).colorScheme.primary, - foregroundColor: Colors.white, + foregroundColor: Theme.of(context).colorScheme.onPrimary, child: const Text('M', style: TextStyle(fontWeight: FontWeight.bold)), ), @@ -78,7 +78,7 @@ class SettingsScreen extends ConsumerWidget { icon: CircleAvatar( radius: 14, backgroundColor: Theme.of(context).colorScheme.primary, - foregroundColor: Colors.white, + foregroundColor: Theme.of(context).colorScheme.onPrimary, child: const Icon(Icons.phone_android, size: 16), ), title: 'Mobile App', @@ -98,7 +98,7 @@ class SettingsScreen extends ConsumerWidget { CircleAvatar( radius: 14, backgroundColor: Theme.of(context).colorScheme.primary, - foregroundColor: Colors.white, + foregroundColor: Theme.of(context).colorScheme.onPrimary, child: const Icon(Icons.color_lens, size: 16), ), const SizedBox(width: 10), @@ -124,7 +124,7 @@ class SettingsScreen extends ConsumerWidget { style: Theme.of(context) .textTheme .bodySmall - ?.copyWith(color: Colors.grey), + ?.copyWith(color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6)), ), ], ), @@ -142,11 +142,11 @@ class SettingsScreen extends ConsumerWidget { mainAxisAlignment: MainAxisAlignment.center, children: [ Text( - '© 2024 Mycelium Network', + ' 2024 Mycelium Network', style: Theme.of(context) .textTheme .bodySmall - ?.copyWith(color: Colors.grey), + ?.copyWith(color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6)), textAlign: TextAlign.center, ), const SizedBox(height: 4), @@ -155,7 +155,7 @@ class SettingsScreen extends ConsumerWidget { style: Theme.of(context) .textTheme .bodySmall - ?.copyWith(color: Colors.grey), + ?.copyWith(color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6)), textAlign: TextAlign.center, ), ], @@ -194,7 +194,7 @@ class _InfoRowWithSubtitle extends StatelessWidget { Text(title, style: textTheme.bodyMedium), Text( subtitle, - style: textTheme.bodySmall?.copyWith(color: Colors.grey), + style: textTheme.bodySmall?.copyWith(color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6)), ), ], ), From 27bf8fba1eaaa72e212dcaa28a1f7a43af440f8e Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sun, 21 Sep 2025 15:01:46 +0300 Subject: [PATCH 10/22] Fix button colors --- lib/app/widgets/app_button.dart | 57 +++++++++++++++++++++++------- lib/features/home/home_screen.dart | 5 ++- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/lib/app/widgets/app_button.dart b/lib/app/widgets/app_button.dart index 8f1a008..df3dbfa 100644 --- a/lib/app/widgets/app_button.dart +++ b/lib/app/widgets/app_button.dart @@ -6,25 +6,58 @@ class AppButton extends StatelessWidget { final VoidCallback? onPressed; final bool isPrimary; final bool isLoading; + final Color? backgroundColor; + final Color? foregroundColor; const AppButton( {super.key, required this.label, this.onPressed, this.isPrimary = true, - this.isLoading = false}); + this.isLoading = false, + this.backgroundColor, + this.foregroundColor}); @override Widget build(BuildContext context) { - final style = isPrimary - ? Theme.of(context).elevatedButtonTheme.style - : ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.secondary, - foregroundColor: Theme.of(context).colorScheme.onSecondary, - minimumSize: const Size.fromHeight(48), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(AppRadii.md)), - ); + ButtonStyle? style; + + if (backgroundColor != null || foregroundColor != null) { + // Use custom colors if provided + style = ElevatedButton.styleFrom( + backgroundColor: + backgroundColor ?? Theme.of(context).colorScheme.primary, + foregroundColor: + foregroundColor ?? Theme.of(context).colorScheme.onPrimary, + minimumSize: const Size.fromHeight(48), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppRadii.md)), + ); + } else { + // Use existing logic for primary/secondary + style = isPrimary + ? Theme.of(context).elevatedButtonTheme.style + : ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.secondary, + foregroundColor: Theme.of(context).colorScheme.onSecondary, + minimumSize: const Size.fromHeight(48), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(AppRadii.md)), + ); + } + + // Determine the correct color for the loading indicator + Color loadingColor; + if (foregroundColor != null) { + loadingColor = foregroundColor!; + } else if (backgroundColor != null) { + loadingColor = Theme.of(context).colorScheme.onPrimary; + } else if (isPrimary) { + loadingColor = Theme.of(context).colorScheme.onPrimary; + } else { + loadingColor = Theme.of(context).colorScheme.onSecondary; + } + return ElevatedButton( onPressed: isLoading ? null : onPressed, style: style, @@ -34,9 +67,7 @@ class AppButton extends StatelessWidget { height: 18, child: CircularProgressIndicator( strokeWidth: 2, - valueColor: AlwaysStoppedAnimation( - Theme.of(context).colorScheme.onPrimary, - ), + valueColor: AlwaysStoppedAnimation(loadingColor), ), ) : Text(label), diff --git a/lib/features/home/home_screen.dart b/lib/features/home/home_screen.dart index 9a4201e..85633b8 100644 --- a/lib/features/home/home_screen.dart +++ b/lib/features/home/home_screen.dart @@ -278,6 +278,8 @@ class _HeaderCardState extends State<_HeaderCard> label: isConnected ? 'Stop Mycelium' : 'Start Mycelium', onPressed: isConnected ? stopMycelium : startMycelium, isLoading: isConnecting, + backgroundColor: isConnected ? Colors.red : null, + foregroundColor: isConnected ? Colors.white : null, ), const SizedBox(height: AppSpacing.lg), Visibility( @@ -288,7 +290,8 @@ class _HeaderCardState extends State<_HeaderCard> child: ElevatedButton( style: ElevatedButton.styleFrom( backgroundColor: Theme.of(context).colorScheme.surfaceVariant, - foregroundColor: Theme.of(context).colorScheme.onSurfaceVariant, + foregroundColor: + Theme.of(context).colorScheme.onSurfaceVariant, padding: const EdgeInsets.symmetric(horizontal: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), From 08473b8fa6ce1e52e12cf09edeb918fa422a1f07 Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sun, 21 Sep 2025 15:02:00 +0300 Subject: [PATCH 11/22] Fix geo location --- lib/services/geolocation_service.dart | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/services/geolocation_service.dart b/lib/services/geolocation_service.dart index 916ac6a..eaa1f2b 100644 --- a/lib/services/geolocation_service.dart +++ b/lib/services/geolocation_service.dart @@ -61,10 +61,9 @@ class GeolocationService { } final response = await http.get( - Uri.parse(_apiUrl), + Uri.parse(_apiUrl).replace(queryParameters: {'ip': targetIP}), headers: { 'Accept': 'application/json', - 'X-Real-IP': targetIP, }, ).timeout(const Duration(seconds: 5)); @@ -86,10 +85,10 @@ class GeolocationService { String getFlagEmoji(String countryCode) { if (countryCode.length != 2) return '🏳️'; - + final codePoints = countryCode.toUpperCase().codeUnits; final flag = String.fromCharCode(0x1F1E6 + codePoints[0] - 0x41) + - String.fromCharCode(0x1F1E6 + codePoints[1] - 0x41); + String.fromCharCode(0x1F1E6 + codePoints[1] - 0x41); return flag; } From a28f2c84b4d1480377f69ea2d78a391652518104 Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sun, 21 Sep 2025 15:35:17 +0300 Subject: [PATCH 12/22] Adjust the title spacing --- lib/features/peers/peers_screen.dart | 77 +++++++++++++--------- lib/features/settings/settings_screen.dart | 33 ++++++---- 2 files changed, 66 insertions(+), 44 deletions(-) diff --git a/lib/features/peers/peers_screen.dart b/lib/features/peers/peers_screen.dart index 0139a73..0dfcc0b 100644 --- a/lib/features/peers/peers_screen.dart +++ b/lib/features/peers/peers_screen.dart @@ -26,12 +26,10 @@ class PeersScreen extends ConsumerWidget { icon: const Icon(Icons.arrow_back), onPressed: () => context.go('/'), ), - const Spacer(), const Text( 'Peers', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), - const Spacer(), ], ), Divider( @@ -84,7 +82,7 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { // Only start polling if mounted and Mycelium is connected WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; - + final nodeStatusAsync = ref.read(nodeStatusProvider); nodeStatusAsync.whenData((status) { if (mounted && status == NodeStatus.connected) { @@ -105,7 +103,7 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { Future _fetchPeerStatus() async { if (!mounted) return; - + try { final service = MyceliumService(); final status = await service.getPeerStatus(); @@ -228,12 +226,10 @@ class _PeersDataScreenState extends ConsumerState<_PeersDataScreen> { icon: const Icon(Icons.arrow_back), onPressed: () => context.go('/'), ), - const Spacer(), const Text( 'Peers', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), - const Spacer(), ], ), Divider( @@ -423,7 +419,8 @@ class _PeerTileState extends ConsumerState<_PeerTile> { void didUpdateWidget(_PeerTile oldWidget) { super.didUpdateWidget(oldWidget); // Restart periodic ping if peer status changed - if (oldWidget.peerStats?.connectionState != widget.peerStats?.connectionState) { + if (oldWidget.peerStats?.connectionState != + widget.peerStats?.connectionState) { _periodicPingTimer?.cancel(); _startPeriodicPing(); } @@ -438,25 +435,24 @@ class _PeerTileState extends ConsumerState<_PeerTile> { void _startPeriodicPing() { // Only start periodic ping if peer is connected or connecting if (widget.peerStats != null && - (widget.peerStats!.connectionState == peer_models.ConnectionState.connected || - widget.peerStats!.connectionState == peer_models.ConnectionState.connecting)) { - - + (widget.peerStats!.connectionState == + peer_models.ConnectionState.connected || + widget.peerStats!.connectionState == + peer_models.ConnectionState.connecting)) { // Initial ping after 2 seconds Timer(const Duration(seconds: 2), () { if (mounted) { _performPingTest(isAutomatic: true); } }); - + // Then ping every 30 seconds _periodicPingTimer = Timer.periodic(const Duration(seconds: 30), (_) { if (mounted) { _performPingTest(isAutomatic: true); } }); - } else { - } + } else {} } Future _performPingTest({bool isAutomatic = false}) async { @@ -550,7 +546,10 @@ class _PeerTileState extends ConsumerState<_PeerTile> { Expanded( child: Text( widget.ip.replaceAll('tcp://', ''), - style: Theme.of(context).textTheme.titleMedium?.copyWith( + style: Theme.of(context) + .textTheme + .titleMedium + ?.copyWith( fontWeight: FontWeight.bold, ), overflow: TextOverflow.ellipsis, @@ -561,28 +560,37 @@ class _PeerTileState extends ConsumerState<_PeerTile> { // Location info row Consumer( builder: (context, ref, child) { - final locationAsync = ref.watch(peerLocationProvider(widget.ip)); - - - if (locationAsync != null && locationAsync.country != 'Unknown') { - final geoService = ref.read(geolocationServiceProvider); + final locationAsync = + ref.watch(peerLocationProvider(widget.ip)); + + if (locationAsync != null && + locationAsync.country != 'Unknown') { + final geoService = + ref.read(geolocationServiceProvider); return Padding( padding: const EdgeInsets.only(top: 4.0), child: Row( children: [ Text( - geoService.getFlagEmoji(locationAsync.countryCode), + geoService + .getFlagEmoji(locationAsync.countryCode), style: const TextStyle(fontSize: 16), ), const SizedBox(width: 6), Expanded( child: Text( - locationAsync.city.isNotEmpty + locationAsync.city.isNotEmpty ? '${locationAsync.country} • ${locationAsync.city}' : locationAsync.country, - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: Theme.of(context).colorScheme.onSurface.withOpacity(0.7), - ), + style: Theme.of(context) + .textTheme + .bodySmall + ?.copyWith( + color: Theme.of(context) + .colorScheme + .onSurface + .withOpacity(0.7), + ), overflow: TextOverflow.ellipsis, ), ), @@ -590,7 +598,7 @@ class _PeerTileState extends ConsumerState<_PeerTile> { ), ); } - + // Show loading indicator while fetching if (locationAsync == null) { return Padding( @@ -600,20 +608,27 @@ class _PeerTileState extends ConsumerState<_PeerTile> { const SizedBox( width: 12, height: 12, - child: CircularProgressIndicator(strokeWidth: 1.5), + child: CircularProgressIndicator( + strokeWidth: 1.5), ), const SizedBox(width: 8), Text( 'Loading location...', - style: Theme.of(context).textTheme.bodySmall?.copyWith( - color: Theme.of(context).colorScheme.onSurface.withOpacity(0.5), - ), + style: Theme.of(context) + .textTheme + .bodySmall + ?.copyWith( + color: Theme.of(context) + .colorScheme + .onSurface + .withOpacity(0.5), + ), ), ], ), ); } - + return const SizedBox.shrink(); }, ), diff --git a/lib/features/settings/settings_screen.dart b/lib/features/settings/settings_screen.dart index 5b4756a..423f5d9 100644 --- a/lib/features/settings/settings_screen.dart +++ b/lib/features/settings/settings_screen.dart @@ -24,13 +24,10 @@ class SettingsScreen extends ConsumerWidget { icon: const Icon(Icons.arrow_back), onPressed: () => context.go('/'), ), - const Spacer(), const Text( 'Settings', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold), ), - const Spacer(), - const SizedBox(width: 48), ], ), Divider( @@ -124,7 +121,11 @@ class SettingsScreen extends ConsumerWidget { style: Theme.of(context) .textTheme .bodySmall - ?.copyWith(color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6)), + ?.copyWith( + color: Theme.of(context) + .colorScheme + .onSurface + .withOpacity(0.6)), ), ], ), @@ -143,19 +144,21 @@ class SettingsScreen extends ConsumerWidget { children: [ Text( ' 2024 Mycelium Network', - style: Theme.of(context) - .textTheme - .bodySmall - ?.copyWith(color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6)), + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Theme.of(context) + .colorScheme + .onSurface + .withOpacity(0.6)), textAlign: TextAlign.center, ), const SizedBox(height: 4), Text( 'Decentralized networking for everyone', - style: Theme.of(context) - .textTheme - .bodySmall - ?.copyWith(color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6)), + style: Theme.of(context).textTheme.bodySmall?.copyWith( + color: Theme.of(context) + .colorScheme + .onSurface + .withOpacity(0.6)), textAlign: TextAlign.center, ), ], @@ -194,7 +197,11 @@ class _InfoRowWithSubtitle extends StatelessWidget { Text(title, style: textTheme.bodyMedium), Text( subtitle, - style: textTheme.bodySmall?.copyWith(color: Theme.of(context).colorScheme.onSurface.withOpacity(0.6)), + style: textTheme.bodySmall?.copyWith( + color: Theme.of(context) + .colorScheme + .onSurface + .withOpacity(0.6)), ), ], ), From bc60f3d9b5025f878e4ec582f1bfe674b69eb355 Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sun, 21 Sep 2025 16:35:57 +0300 Subject: [PATCH 13/22] Adjust the add peer dialog and peer ip --- lib/features/peers/peers_screen.dart | 122 ++++++++++++++++++++------- 1 file changed, 93 insertions(+), 29 deletions(-) diff --git a/lib/features/peers/peers_screen.dart b/lib/features/peers/peers_screen.dart index 0dfcc0b..74a667c 100644 --- a/lib/features/peers/peers_screen.dart +++ b/lib/features/peers/peers_screen.dart @@ -545,7 +545,9 @@ class _PeerTileState extends ConsumerState<_PeerTile> { children: [ Expanded( child: Text( - widget.ip.replaceAll('tcp://', ''), + widget.ip + .replaceAll('tcp://', '') + .replaceAll(':9651', ''), style: Theme.of(context) .textTheme .titleMedium @@ -889,34 +891,96 @@ void _showAddPeerDialog(BuildContext context, WidgetRef ref) { showDialog( context: context, - builder: (context) => AlertDialog( - title: const Text('Add Peer'), - content: TextField( - controller: controller, - decoration: const InputDecoration( - hintText: 'Enter peer IP (e.g. 185.69.166.7)', - ), - keyboardType: TextInputType.url, - ), - actions: [ - TextButton( - onPressed: () => Navigator.of(context).pop(), - child: const Text('Cancel'), - ), - ElevatedButton( - onPressed: () async { - final ip = controller.text.trim(); - if (ip.isNotEmpty) { - final formattedPeer = - ip.startsWith('tcp://') ? ip : 'tcp://$ip:9651'; - - await peersNotifier.addPeer(formattedPeer); - } - Navigator.of(context).pop(); - }, - child: const Text('Add'), - ), - ], + builder: (context) => StatefulBuilder( + builder: (context, setState) { + bool isValidIP = _isValidIP(controller.text.trim()); + String? errorText = controller.text.trim().isNotEmpty && !isValidIP + ? 'Please enter a valid IP address' + : null; + + return AlertDialog( + title: const Text('Add Peer'), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextField( + controller: controller, + decoration: InputDecoration( + hintText: 'Enter peer IP (e.g. 185.69.166.7)', + errorText: errorText, + border: const OutlineInputBorder(), + ), + keyboardType: TextInputType.url, + onChanged: (value) => setState(() {}), + ), + if (errorText == null && controller.text.trim().isNotEmpty) + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Row( + children: [ + Icon( + Icons.check_circle, + size: 16, + color: Colors.green, + ), + const SizedBox(width: 4), + Text( + 'Valid IP address', + style: TextStyle( + color: Colors.green, + fontSize: 12, + ), + ), + ], + ), + ), + ], + ), + actions: [ + TextButton( + onPressed: isValidIP && controller.text.trim().isNotEmpty + ? () async { + final ip = controller.text.trim(); + final formattedPeer = + ip.startsWith('tcp://') ? ip : 'tcp://$ip:9651'; + + await peersNotifier.addPeer(formattedPeer); + Navigator.of(context).pop(); + } + : null, + style: ElevatedButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.primary, + foregroundColor: Theme.of(context).colorScheme.onPrimary, + ), + child: const Text('Add'), + ), + TextButton( + onPressed: () => Navigator.of(context).pop(), + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.secondaryContainer, + foregroundColor: + Theme.of(context).colorScheme.onSecondaryContainer, + ), + child: const Text('Cancel'), + ), + ], + ); + }, ), ); } + +bool _isValidIP(String ip) { + if (ip.isEmpty) return false; + + // IPv4 regex + final ipv4Regex = RegExp( + r'^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$'); + + // IPv6 regex (simplified) + final ipv6Regex = + RegExp(r'^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::1$|^::$'); + + return ipv4Regex.hasMatch(ip) || ipv6Regex.hasMatch(ip); +} From c9b69a853cb8734f9478b501aa09948be5d7c18b Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sun, 21 Sep 2025 17:52:44 +0300 Subject: [PATCH 14/22] Change the country style --- lib/features/peers/peers_screen.dart | 89 +++++++++++++++++----------- 1 file changed, 54 insertions(+), 35 deletions(-) diff --git a/lib/features/peers/peers_screen.dart b/lib/features/peers/peers_screen.dart index 74a667c..41e96ab 100644 --- a/lib/features/peers/peers_screen.dart +++ b/lib/features/peers/peers_screen.dart @@ -528,15 +528,48 @@ class _PeerTileState extends ConsumerState<_PeerTile> { children: [ Row( children: [ - Container( - width: 12, - height: 12, - decoration: BoxDecoration( - color: connectionColor, - shape: BoxShape.circle, - ), + // Country flag circle or globe for unknown countries + Consumer( + builder: (context, ref, child) { + final locationAsync = + ref.watch(peerLocationProvider(widget.ip)); + + if (locationAsync != null && + locationAsync.country != 'Unknown') { + final geoService = ref.read(geolocationServiceProvider); + return Container( + width: 32, + height: 32, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.primaryContainer, + shape: BoxShape.circle, + ), + child: Center( + child: Text( + geoService.getFlagEmoji(locationAsync.countryCode), + style: const TextStyle(fontSize: 18), + ), + ), + ); + } + + // Show globe icon for unknown countries or while loading + return Container( + width: 32, + height: 32, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceVariant, + shape: BoxShape.circle, + ), + child: Icon( + Icons.public, + size: 18, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ); + }, ), - const SizedBox(width: AppSpacing.sm), + const SizedBox(width: AppSpacing.md), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -567,36 +600,22 @@ class _PeerTileState extends ConsumerState<_PeerTile> { if (locationAsync != null && locationAsync.country != 'Unknown') { - final geoService = - ref.read(geolocationServiceProvider); return Padding( padding: const EdgeInsets.only(top: 4.0), - child: Row( - children: [ - Text( - geoService - .getFlagEmoji(locationAsync.countryCode), - style: const TextStyle(fontSize: 16), - ), - const SizedBox(width: 6), - Expanded( - child: Text( - locationAsync.city.isNotEmpty - ? '${locationAsync.country} • ${locationAsync.city}' - : locationAsync.country, - style: Theme.of(context) - .textTheme - .bodySmall - ?.copyWith( - color: Theme.of(context) - .colorScheme - .onSurface - .withOpacity(0.7), - ), - overflow: TextOverflow.ellipsis, + child: Text( + locationAsync.city.isNotEmpty + ? '${locationAsync.country} • ${locationAsync.city}' + : locationAsync.country, + style: Theme.of(context) + .textTheme + .bodySmall + ?.copyWith( + color: Theme.of(context) + .colorScheme + .onSurface + .withOpacity(0.7), ), - ), - ], + overflow: TextOverflow.ellipsis, ), ); } From 5fbd77ac99607ac3cd5254344951ec5703f40aad Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sun, 21 Sep 2025 18:36:45 +0300 Subject: [PATCH 15/22] Update the peers looking --- lib/features/peers/peers_screen.dart | 65 +++++++++++++++++++--------- 1 file changed, 44 insertions(+), 21 deletions(-) diff --git a/lib/features/peers/peers_screen.dart b/lib/features/peers/peers_screen.dart index 41e96ab..6a16473 100644 --- a/lib/features/peers/peers_screen.dart +++ b/lib/features/peers/peers_screen.dart @@ -708,27 +708,50 @@ class _PeerTileState extends ConsumerState<_PeerTile> { ), const SizedBox(width: AppSpacing.sm), ], - IconButton( - icon: const Icon(Icons.more_horiz), - onPressed: widget.isDisabled - ? null - : () { - showModalBottomSheet( - context: context, - useSafeArea: true, - isScrollControlled: true, - showDragHandle: true, - builder: (_) => PeerDetailsSheet( - country: widget.country, - ip: widget.ip, - city: "", - latency: "", - status: connectionStatus, - isUserPeer: widget.isUserPeer, - ), - ); - }, - ), + // Show delete icon only for user-added peers + if (widget.isUserPeer) + IconButton( + icon: Icon( + Icons.delete_outline, + color: Colors.red.shade400, + ), + onPressed: widget.isDisabled + ? null + : () async { + // Show confirmation dialog + final confirmed = await showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Delete Peer'), + content: Text( + 'Are you sure you want to delete this peer?\n\n${widget.ip.replaceAll('tcp://', '').replaceAll(':9651', '')}', + ), + actions: [ + TextButton( + onPressed: () => + Navigator.of(context).pop(false), + child: const Text('Cancel'), + ), + TextButton( + onPressed: () => + Navigator.of(context).pop(true), + style: TextButton.styleFrom( + foregroundColor: Colors.red, + ), + child: const Text('Delete'), + ), + ], + ), + ); + + if (confirmed == true) { + final peersNotifier = + ref.read(peersProvider.notifier); + await peersNotifier.removePeer(widget.ip); + } + }, + tooltip: 'Delete peer', + ), ], ), if (widget.peerStats != null) ...[ From a1e7975110ed0ded0d5f0ab526ac895dbac35d54 Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Sun, 21 Sep 2025 18:41:18 +0300 Subject: [PATCH 16/22] Remove the container around the speed test --- lib/features/peers/peers_screen.dart | 47 ++++++++++------------------ 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/lib/features/peers/peers_screen.dart b/lib/features/peers/peers_screen.dart index 6a16473..5b9b9cd 100644 --- a/lib/features/peers/peers_screen.dart +++ b/lib/features/peers/peers_screen.dart @@ -675,38 +675,25 @@ class _PeerTileState extends ConsumerState<_PeerTile> { peer_models.ConnectionState.connected || widget.peerStats!.connectionState == peer_models.ConnectionState.connecting)) ...[ - Container( - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surface, - borderRadius: BorderRadius.circular(8), - border: Border.all( - color: Theme.of(context) - .colorScheme - .outline - .withOpacity(0.3), - ), - ), - child: IconButton( - icon: _isPinging - ? const SizedBox( - width: 16, - height: 16, - child: CircularProgressIndicator(strokeWidth: 2), - ) - : Icon( - Icons.speed, - size: 18, - color: Theme.of(context).colorScheme.primary, - ), - onPressed: _isPinging ? null : _performPingTest, - tooltip: 'Test ping', - constraints: const BoxConstraints( - minWidth: 36, - minHeight: 36, - ), + IconButton( + icon: _isPinging + ? const SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : Icon( + Icons.speed, + size: 18, + color: Theme.of(context).colorScheme.primary, + ), + onPressed: _isPinging ? null : _performPingTest, + tooltip: 'Test ping', + constraints: const BoxConstraints( + minWidth: 36, + minHeight: 36, ), ), - const SizedBox(width: AppSpacing.sm), ], // Show delete icon only for user-added peers if (widget.isUserPeer) From 62d5bbaf3cde591b492b6417a11b8d16a56c0cc5 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Sep 2025 22:06:03 +0300 Subject: [PATCH 17/22] Fix start mycelium blocking --- lib/myceliumflut_ffi_binding.dart | 17 +- lib/services/ffi/mycelium_service.dart | 2 +- mycelffi/Cargo.lock | 421 +++++++++++++++---------- 3 files changed, 275 insertions(+), 165 deletions(-) diff --git a/lib/myceliumflut_ffi_binding.dart b/lib/myceliumflut_ffi_binding.dart index 7e21000..49422f3 100644 --- a/lib/myceliumflut_ffi_binding.dart +++ b/lib/myceliumflut_ffi_binding.dart @@ -107,10 +107,23 @@ typedef FuncDartStartMycelium = void Function( ffi.Pointer>, int, ffi.Pointer, int); Future myFFStartMycelium(List peers, Uint8List privKey) async { + // Run the blocking FFI call in a separate isolate to prevent UI freezing + final result = compute(_startMyceliumInIsolate, { + 'peers': peers, + 'privKey': privKey, + }); + return result; +} + +// Function to run in isolate +bool _startMyceliumInIsolate(Map args) { + final List peers = args['peers']; + final Uint8List privKey = args['privKey']; + // Load the dynamic library final dylib = loadDll(); -// Look up the function + // Look up the function final FuncDartStartMycelium startMycelium = dylib .lookup>('ff_start_mycelium') .asFunction(); @@ -129,7 +142,7 @@ Future myFFStartMycelium(List peers, Uint8List privKey) async { nativePrivKey.setAll(0, privKey); try { - // Call the Rust function + // Call the Rust function (this is the blocking call) startMycelium(peerPtrs, peers.length, privKeyPtr, privKey.length); return true; } catch (e) { diff --git a/lib/services/ffi/mycelium_service.dart b/lib/services/ffi/mycelium_service.dart index 49f509d..0833e1a 100644 --- a/lib/services/ffi/mycelium_service.dart +++ b/lib/services/ffi/mycelium_service.dart @@ -110,7 +110,7 @@ class MyceliumService { try { if (isUseDylib()) { print('MyceliumService: Using FFI dylib'); - await myFFStartMycelium(cleaned, key); + myFFStartMycelium(cleaned, key); } else { print('MyceliumService: Using platform channel'); final result = await _platform.invokeMethod('startVpn', { diff --git a/mycelffi/Cargo.lock b/mycelffi/Cargo.lock index 8bdf63b..e940c6f 100644 --- a/mycelffi/Cargo.lock +++ b/mycelffi/Cargo.lock @@ -93,9 +93,9 @@ checksum = "85965b6739a430150bdd138e2374a98af0c3ee0d030b3bb7fc3bddff58d0102e" [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arc-swap" @@ -250,7 +250,7 @@ version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cexpr", "clang-sys", "itertools", @@ -261,7 +261,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -272,9 +272,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "blake3" @@ -329,10 +329,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.29" +version = "1.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" +checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" dependencies = [ + "find-msvc-tools", "shlex", ] @@ -357,9 +358,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -461,9 +462,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "4.2.0" +version = "4.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373b7c5dbd637569a2cca66e8d66b8c446a1e7bf064ea321d265d7b3dfe7c97e" +checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", "cpufeatures", @@ -482,7 +483,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -501,9 +502,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", ] @@ -516,7 +517,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -545,6 +546,19 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -572,9 +586,15 @@ dependencies = [ [[package]] name = "fiat-crypto" -version = "0.3.0" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd1e32ddd350061ae6edb1b082d7c54915b5c672c389143b9a63403a109f24" +checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" + +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" [[package]] name = "fnv" @@ -662,7 +682,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -741,7 +761,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] @@ -763,9 +783,9 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "h2" @@ -826,6 +846,12 @@ dependencies = [ "stable_deref_trait", ] +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "http" version = "1.3.1" @@ -872,6 +898,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "humantime" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" + [[package]] name = "hyper" version = "1.7.0" @@ -930,7 +962,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.5.10", + "socket2", "system-configuration", "tokio", "tower-service", @@ -1075,11 +1107,11 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "libc", ] @@ -1112,6 +1144,17 @@ dependencies = [ "serde", ] +[[package]] +name = "is-terminal" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "itertools" version = "0.13.0" @@ -1129,9 +1172,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" dependencies = [ "once_cell", "wasm-bindgen", @@ -1161,12 +1204,12 @@ checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-link 0.2.0", ] [[package]] @@ -1193,9 +1236,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "loom" @@ -1291,10 +1334,12 @@ dependencies = [ name = "mobile" version = "0.1.0" dependencies = [ + "env_logger", + "log", "mycelium", "once_cell", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "tracing-android", @@ -1398,7 +1443,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0e7987b28514adf555dc1f9a5c30dfc3e50750bbaffb1aec41ca7b23dcd8e4" dependencies = [ "anyhow", - "bitflags 2.9.1", + "bitflags 2.9.4", "byteorder", "libc", "log", @@ -1412,7 +1457,7 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ec2f5b6839be2a19d7fa5aab5bc444380f6311c2b693551cb80f45caaa7b5ef" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "libc", "log", "netlink-packet-core 0.8.1", @@ -1441,7 +1486,7 @@ dependencies = [ "log", "netlink-packet-core 0.8.1", "netlink-sys", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -1463,7 +1508,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "cfg_aliases", "libc", @@ -1476,7 +1521,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "cfg_aliases", "libc", @@ -1563,7 +1608,7 @@ version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "foreign-types", "libc", @@ -1580,14 +1625,14 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "openssl-src" -version = "300.5.1+3.5.1" +version = "300.5.2+3.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "735230c832b28c000e3bc117119e6466a663ec73506bc0a9907ea4187508e42a" +checksum = "d270b79e2926f5150189d475bc7e9d2c69f9c4697b185fa917d5a32b792d21b4" dependencies = [ "cc", ] @@ -1648,7 +1693,7 @@ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.17", "smallvec", "windows-targets 0.52.6", ] @@ -1731,19 +1776,19 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.35" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -1761,8 +1806,8 @@ dependencies = [ "quinn-udp", "rustc-hash 2.1.1", "rustls", - "socket2 0.5.10", - "thiserror 2.0.12", + "socket2", + "thiserror 2.0.16", "tokio", "tracing", "web-time", @@ -1770,9 +1815,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.12" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "getrandom 0.3.3", @@ -1783,7 +1828,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time", @@ -1791,16 +1836,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -1885,7 +1930,7 @@ dependencies = [ "pin-project-lite", "ryu", "sha1_smol", - "socket2 0.6.0", + "socket2", "tokio", "tokio-util", "url", @@ -1902,11 +1947,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", ] [[package]] @@ -1924,9 +1969,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", @@ -1936,9 +1981,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", @@ -1947,9 +1992,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "reqwest" @@ -2025,9 +2070,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -2087,9 +2132,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -2111,50 +2156,62 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.226" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.143" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -2192,18 +2249,18 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" @@ -2211,16 +2268,6 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "socket2" version = "0.6.0" @@ -2262,9 +2309,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -2288,7 +2335,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2297,7 +2344,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "core-foundation", "system-configuration-sys", ] @@ -2312,6 +2359,15 @@ dependencies = [ "libc", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -2323,11 +2379,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.16", ] [[package]] @@ -2338,18 +2394,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2363,9 +2419,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -2378,15 +2434,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -2404,9 +2460,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -2431,7 +2487,7 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2 0.6.0", + "socket2", "tokio-macros", "windows-sys 0.59.0", ] @@ -2444,7 +2500,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2477,7 +2533,7 @@ checksum = "ef6cadea27ba297ef9124370e49af79913b9b979bffd6511f65702eefbce12fe" dependencies = [ "libc", "nix 0.30.1", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", ] @@ -2516,7 +2572,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "bytes", "futures-util", "http", @@ -2571,7 +2627,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2672,9 +2728,9 @@ checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "universal-hash" @@ -2757,44 +2813,54 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" dependencies = [ - "wit-bindgen-rt", + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" dependencies = [ "cfg-if", "js-sys", @@ -2805,9 +2871,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2815,31 +2881,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" dependencies = [ "js-sys", "wasm-bindgen", @@ -2880,6 +2946,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2920,13 +2995,19 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + [[package]] name = "windows-registry" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-link", + "windows-link 0.1.3", "windows-result", "windows-strings", ] @@ -2937,7 +3018,7 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -2946,7 +3027,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -2967,6 +3048,24 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -3000,10 +3099,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link 0.1.3", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -3179,13 +3279,10 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" @@ -3234,28 +3331,28 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3275,7 +3372,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] @@ -3296,7 +3393,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3329,5 +3426,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] From 607919495787511ea1e75b05c7833e2eed0491d8 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Sun, 21 Sep 2025 23:14:32 +0300 Subject: [PATCH 18/22] Add flag as windows doesn't support the emojis --- lib/features/peers/peers_screen.dart | 5 +---- lib/services/geolocation_service.dart | 24 ++++++++++++++++++++++++ pubspec.lock | 24 ++++++++++++++++++++++++ pubspec.yaml | 1 + 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/lib/features/peers/peers_screen.dart b/lib/features/peers/peers_screen.dart index 5b9b9cd..74ab210 100644 --- a/lib/features/peers/peers_screen.dart +++ b/lib/features/peers/peers_screen.dart @@ -545,10 +545,7 @@ class _PeerTileState extends ConsumerState<_PeerTile> { shape: BoxShape.circle, ), child: Center( - child: Text( - geoService.getFlagEmoji(locationAsync.countryCode), - style: const TextStyle(fontSize: 18), - ), + child: geoService.getFlagWidget(locationAsync.countryCode), ), ); } diff --git a/lib/services/geolocation_service.dart b/lib/services/geolocation_service.dart index eaa1f2b..d8b6dec 100644 --- a/lib/services/geolocation_service.dart +++ b/lib/services/geolocation_service.dart @@ -1,4 +1,7 @@ import 'dart:convert'; +import 'dart:io'; +import 'package:country_flags/country_flags.dart'; +import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; class LocationInfo { @@ -95,4 +98,25 @@ class GeolocationService { void clearCache() { _cache.clear(); } + + Widget getFlagWidget(String countryCode) { + if (countryCode.length != 2) { + return Icon( + Icons.public, + size: 18, + ); + } + if (Platform.isAndroid || Platform.isIOS) { + return Text( + getFlagEmoji(countryCode), + style: const TextStyle(fontSize: 18), + ); + } else { + return CountryFlag.fromCountryCode( + countryCode, + height: 12, + width: 18, + ); + } + } } diff --git a/pubspec.lock b/pubspec.lock index f4b9146..d8f881c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -81,6 +81,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.2" + country_flags: + dependency: "direct main" + description: + name: country_flags + sha256: "66726c7070d60c2f90c4a1d58980e9188fa04335d6287e98aef835461019c3c2" + url: "https://pub.dev" + source: hosted + version: "3.2.0" crypto: dependency: "direct main" description: @@ -255,6 +263,22 @@ packages: description: flutter source: sdk version: "0.0.0" + jovial_misc: + dependency: transitive + description: + name: jovial_misc + sha256: "4301011027d87b8b919cb862db84071a34448eadbb32cc8d40fe505424dfe69a" + url: "https://pub.dev" + source: hosted + version: "0.9.2" + jovial_svg: + dependency: transitive + description: + name: jovial_svg + sha256: "08dd24b800d48796c9c0227acb96eb00c6cacccb1d7de58d79fc924090049868" + url: "https://pub.dev" + source: hosted + version: "1.1.28" leak_tracker: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 85f7613..01ff4c4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,6 +47,7 @@ dependencies: flutter_window_close: ^1.2.0 http: ^1.5.0 fl_chart: ^0.68.0 + country_flags: ^3.2.0 dev_dependencies: flutter_test: From d663754e80b186b835e98760f113afd636b2d694 Mon Sep 17 00:00:00 2001 From: AhmedHanafy725 Date: Mon, 22 Sep 2025 11:36:31 +0300 Subject: [PATCH 19/22] Fix merge conflict --- .../tech/threefold/mycelium/MainActivity.kt | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 4 +- pubspec.lock | 80 +++++++++---------- 3 files changed, 43 insertions(+), 42 deletions(-) diff --git a/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt b/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt index 075e654..baaea61 100644 --- a/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt +++ b/android/app/src/main/kotlin/tech/threefold/mycelium/MainActivity.kt @@ -121,6 +121,7 @@ class MainActivity: FlutterActivity() { Log.e(tag, "Error in listProxies: ${e.message}") result.error("LIST_PROXIES_ERROR", e.message, null) } + } "queryStatus" -> { // Immediately report last known state while also querying the service val running = prefs.getBoolean("mycelium_running", false) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 7fc55fd..977ed63 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -8,8 +8,8 @@ import Foundation import flutter_desktop_sleep import flutter_window_close import path_provider_foundation -import shared_preferences_foundation import screen_retriever_macos +import shared_preferences_foundation import tray_manager import window_manager @@ -17,8 +17,8 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FlutterDesktopSleepPlugin.register(with: registry.registrar(forPlugin: "FlutterDesktopSleepPlugin")) FlutterWindowClosePlugin.register(with: registry.registrar(forPlugin: "FlutterWindowClosePlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) - SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) TrayManagerPlugin.register(with: registry.registrar(forPlugin: "TrayManagerPlugin")) WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index f41a2db..9722e63 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -455,6 +455,46 @@ packages: url: "https://pub.dev" source: hosted version: "2.6.1" + screen_retriever: + dependency: transitive + description: + name: screen_retriever + sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_linux: + dependency: transitive + description: + name: screen_retriever_linux + sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_macos: + dependency: transitive + description: + name: screen_retriever_macos + sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_platform_interface: + dependency: transitive + description: + name: screen_retriever_platform_interface + sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 + url: "https://pub.dev" + source: hosted + version: "0.2.0" + screen_retriever_windows: + dependency: transitive + description: + name: screen_retriever_windows + sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" + url: "https://pub.dev" + source: hosted + version: "0.2.0" shared_preferences: dependency: "direct main" description: @@ -511,46 +551,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.1" - screen_retriever: - dependency: transitive - description: - name: screen_retriever - sha256: "570dbc8e4f70bac451e0efc9c9bb19fa2d6799a11e6ef04f946d7886d2e23d0c" - url: "https://pub.dev" - source: hosted - version: "0.2.0" - screen_retriever_linux: - dependency: transitive - description: - name: screen_retriever_linux - sha256: f7f8120c92ef0784e58491ab664d01efda79a922b025ff286e29aa123ea3dd18 - url: "https://pub.dev" - source: hosted - version: "0.2.0" - screen_retriever_macos: - dependency: transitive - description: - name: screen_retriever_macos - sha256: "71f956e65c97315dd661d71f828708bd97b6d358e776f1a30d5aa7d22d78a149" - url: "https://pub.dev" - source: hosted - version: "0.2.0" - screen_retriever_platform_interface: - dependency: transitive - description: - name: screen_retriever_platform_interface - sha256: ee197f4581ff0d5608587819af40490748e1e39e648d7680ecf95c05197240c0 - url: "https://pub.dev" - source: hosted - version: "0.2.0" - screen_retriever_windows: - dependency: transitive - description: - name: screen_retriever_windows - sha256: "449ee257f03ca98a57288ee526a301a430a344a161f9202b4fcc38576716fe13" - url: "https://pub.dev" - source: hosted - version: "0.2.0" shortid: dependency: transitive description: From 4192279be4f3149bd7721d819d45399f27875024 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Mon, 22 Sep 2025 12:52:14 +0300 Subject: [PATCH 20/22] Fix tray icon on windows --- assets/images/tray_icon.png | Bin 0 -> 22552 bytes .../AppIcon.appiconset/Contents.json | 123 +----------- .../Icon-App-1024x1024@1x.png | Bin 122364 -> 124188 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 681 -> 687 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1652 -> 1646 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 2768 -> 2763 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1141 -> 1135 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 2698 -> 2685 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 4424 -> 4424 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1652 -> 1646 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 3901 -> 3915 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 6565 -> 6498 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 2219 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 5217 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 2612 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 6169 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 6565 -> 6498 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 11000 -> 10916 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 3499 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 8249 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 3738 -> 3717 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 8910 -> 8772 bytes .../Icon-App-83.5x83.5@2x.png | Bin 10000 -> 9878 bytes lib/main.dart | 176 ++++++++++++++++-- .../AppIcon.appiconset/Contents.json | 132 ++++++------- .../AppIcon.appiconset/app_icon_1024.png | Bin 102994 -> 148316 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 5680 -> 8548 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 520 -> 645 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 14142 -> 20666 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 1066 -> 1545 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 36406 -> 51001 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 2218 -> 3723 bytes macos/Runner/Info.plist | 2 +- pubspec.lock | 24 +++ pubspec.yaml | 11 +- windows/runner/resources/app_icon.ico | Bin 33772 -> 2586 bytes 36 files changed, 260 insertions(+), 208 deletions(-) create mode 100644 assets/images/tray_icon.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png diff --git a/assets/images/tray_icon.png b/assets/images/tray_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..68ec30256e0c1c30693473f2b2ff257dc668605e GIT binary patch literal 22552 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 Ppbey}X`q2szyIuSe?H%L literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fa..d0d98aa 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"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":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@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"}} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index 1a42d6c8a334a38ee1919057f7e138bd5190b53a..9951c4c7962ab2eefb9628f68cbbf80491651ca3 100644 GIT binary patch literal 124188 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�v~Q=!Bsv)#uMnB*ExtuxKZJdtOp6~7rQ&rY1v-*N7y zr7yT(U62YPC8zi&w-GI-*<-*DNvr>uDEhrao<`}c6p*kr{eq5wGb-jwkk*#>fi zwEtU^jNnR>ykK^~Mi#~(q+5^?p+{zcq}i2r7hbUOjCBh>`R)5Y_1*jKdt{&N^(7`xCJif9oTR8R zhH^Dv#<2gK^rzLNQsIog^ivVkQAp#A6H#?|)hB}%Z8-#=xl&6A)th^}tPVB38Ub|i)Ri$N4XORxG#IYj+ zWkWAG=wGyPkGPL%5qgyoXgl^|MYHN)7Na`$6!}n3lHl8pa6phUw+8i83uRUSur&C_ z*`gJsm@5FDTV6V@t_i~2I{WwL3RV|n|H|^<*d305{i|}Dvws9$g!L4mr;BJ2(g@4> ze`hT{_mmZHxN!$#|2fBs?0+K2UuBB%=H+wd_I0gV(Esso-gDQzj~yHy<9ACO8Ad@x zUXAwYMgtr&I*qs*e9C+ZOmSMlX^PlJ-{x;X9WcINR?mf}EWhU54cpc(?Cq-ZyOI63 z3jRLx7k~E2%Wk`AXLm>CV_*6OUqXpGz{C;qqr%XcM_e-KwVR7b!R?+EDhRavRGu0w z9l)qg?hp3q0A{-k84Y!SKy^;WW;%esIx~w~9rXW+XbGi{0w|#X=(6H$Q5sn81BO&N zxbSLHdC22~xqP<&^6Wos`&WyICi`cdhw$sPPAhk`5-<)GL< zV+TE5)eE<+`opWwJbmM06xsg~KseqavT#=S?(OT=E*|{XZ{G8{yB>IO??LveJrdqu zPJ$}A4p2u~T|3N7J2M#d;LWLjg>|UXasxB>$rF~%xoZ3R=bp88-J(IHOj=R;OceBt zWI|3^zwpgB@7%NR@YjFzdtok&I>3aX*gT}RyqDUFZV4TLC-cq_+6urvRg-l9qq^30 z0Ic^8dkpiQ2eNel%fuh74*9bPm4~fdQ3YW7&3nfma=I*o<_Z8ay2MGMMG!}SHF&(m zbk&c}7A<2~ZpQcH)upS|>WB^^&$~hYrEuPi0YQaFR2K?-IPmGT@kUnOu03u1H zin9ba#$}LDEhneuH!}DFPH;-ynUqdcERzV!LCMNMPsceM7hiMkhVxHaI}nsdcid{@y%Lbvx$fE+oV=0H z_HQ-D&ZS<6%IImb{fyZ7MVDr=ARDoFmVjpe^v~RZ?kmna;gwgNe)8G{7?-yiL^OdK zJ}c+>GD~^`{R$abO4w?K`*{2uFL8=0zp+%wTrZ@D$bo0LPGSKT>cw zNql(|X6lRjk~w6+q`^EmAVa~NdAu^c<9x0Pg(K08@9jmj_-f#rw@*e*O54c z0Z+wlHAMkPFfxau9@dVavQNS?-?nSr)8;MUt>qeH2`q@!Ayfq|^fA(thh7e_8m)r# zTb-e>I{RV0YXvZuoc?4knZ>P+o&X@|ll`tDLLf4nQ&KigLTLp66Gy3y@Ice!1mOxM zI{KBFNdBZruS(;lG}wYgz5~MpyT5{QE9U_JvH`ZU0Kb17)YMinJQcy}e68~5HEkB& zy!MNV+Gz=x?0?~$-rX0R__8avp169RJbWU)#G?l3drbzrJDz#!iWT$v)+`+S)OYT^ z_u+k5?+j|rxu`o(HP-@?#yBDBys+Ro1IGn`yd;eJ)7TwlGji#Y&x3<~owrh0fX-Uw;s$wI*`$qsNivZFEkCWI4bL(05%SWEN z=dt~1MzYKp`aXT#7%FL+DDnidrUoiqHq|t6Po^V5X#j)Dx8M#pcX0{!Z{@~TqEK7>Ehz3jMq><9Mw5v$qBMjhg{=nX?DM=+*1Y+q zox8Rzljl6d(LGt<;n?$ce#**u?|u2MCA0e8{n;OLGmWVR6zc$lMhB`Ujf7m({=X8ItyW{OIIk&f#zV%Z-%)dl6#q~xeQ#BzGd>JvN(e!avS384! z3+|H*tEIG6Nm2>*qrh`<_D@LPtnS-izU#^}SLfIGd1^vvo?tr!kYHs|2MB>}QN!x!TvRyv^lLN;K-1Uj&804wGF+5rOJaA=fzwi3D^X^D z+$36o@m$D$G*3;|ExlctAaJa(%9+n;EQ-2ONkj>>O4Q4`07bM0PL7T9fHjUk`wwI+ z#r{Jz7qI_QEp#5T-9@ajwC422-}25t9N;UfYcpNKiRVkBeqoeoKyZjuhiM-O+$A zI%VzudCkuG16_>JRCZk6pA1`ApkdM;brY5ln(6h!Pe z!l%=`-uc~+fAg0K9?d6-hWErk z5BQ=DN~`RkfQG3998-{-`X?1EI+E#@;0M-jKcrImo9oYi&GSw|?1fa~$qUd^c z0Hjp`=UeK}d<4(s(KW(?JE#K~Iw#!#0QH-QvS_08S%@nDlMAfQ1LjUaA@;8>SU5K9 zUsl9J{U1&CA1EsLT#@}BEl3fL=_(Xnxp?69H*DYij7@{Rod_(hMjU(OWVg}Cx;rZ$ zzIDgTp1tnxKl`I^|N4=q_YY-_hCZRMDVPp`6P)F$L!*Tm|0sZ2K|!F;vJIyHC20A= z{!4D&`Re6!me20thXY6Uf4rb{fD2Avx^&^C|KET7_#>bD(Zf$1#DYz-2|6wX1OfT1 zb0&aFP^<%ZMo(cb;iBWq%f4p7(x$k+s{@ocwV?R9h?y%?k@H-p4nPbYpc3bVV}Vi% zK(zn23L^VDt|YlGOX?X0es9R4{@A%<+){^um!$q-g+W~KSsi3W*f(@J^~YeH(KILo z+=2=k>3J@!OxDhE;ziGOtnHrD0&*dhTW9AFcK@$iF23xXwVky}4EQq@kmhp&BfsaK zxZvcKJ3n>TeINPS-QW1hBPgR=HOejqu!91UG|3ty8|PdaP3An!Mm#;?E8*0i5P7v3 z_>|MpQMuxrb=U6P^6Zo6b7qO7CVIS~;?=HQGV8V1p0Q?0|9d}i*H7-XPZzN>O802qn$Un9yxxV5ou0PF%==2FXk25^A? zvwMmegXF#+&GK9};Ft!=RYc@XA}0zX8o zUbT4OPp?1aigVXh(=@XGsRO+;xTo_aJ2$VMJMiJT_x#)U9yoMhgzgJyWv-<$LaV4z zM{FrTN#dhrxg|>VSML6#boHUn`fTe=MRfDn+5 z@@EoY8cMpO($A&1jQuuHaYfwluNlAkTb&17Nt9JEhWBU>A|NJxe1;#uy9g4DRh_xr~bRU{+JV=bkFeZ|S!;B^5rGnrp&Y zLKR`pwe|&HA7;BV^B+%IJMY%#pLPAETR7c}?0>3(@5Ri2IPb(|tL6`GShMgW-@fR-XRooUVksy6=l||^olH7Nz zSr#J~Am!YQD0KikEf!S6XCx!Ya6||-&(#5Zjl{~z2`W~~Mqx!lk3o(OzzIc_Q6~Eh zN0bC9|I$h*02usPa&%=+Z@djsx5V+m2 zr>lC}`o-7mSpU4UR(Ew&V(h7@4E~9GI%`)y|(aj9wL7;hXI?&abSzJqlHHi?A-l(wMHB?|fp+8=9#@au<=A4Vp zSsmH`v;cRvsHFJHvlpGVt`~QtpZv-%AA0;i&gJQ1jtbE30UR)d2M8hrH^${s0E_I{ z;^ z+55Ne`}DnIYgyD;(-PgLkfu=Otb!Ej1{Sj7MF8tP7H3fj^pG@6aju;mBNe1nxd{2l zgIlSmBD*?2-yld&HI|~_uZRUhVJCjez2-6w5ZwTf;7Tg3g6-SYCJ1X)s2NJG0AQ(D zM3e;^N^ErU^MLDYA=OlcHTy^4^?Eb`Ij)Fg%owCmSzzIC!$xr~Uq!^pVx2;WiLbg) zMe4brvZ08(r4?A+%&rJN5wuveG2}F#@Zq14t1dX z=T~kyacS@W{qntE|M740tMv3%a~(h|1t8xX;RO*xQ8@i4X+^Zk zjnV7ND>_@Hl5AQ%fA`rZJnyVEYnJqKdJy~Jv;hB1)k@{1*Im`yxAbp6^xa2?vd5l0 zh~g0e3UKc&LHZO+B6rOenAj~guCgHC@FGCu>69u^t50Z}6%o13TikO+rEL>5D^d;f zv>g77jR$F75j#bM>j2gY0FRp@>{jh9*(ZP&4WT7h0FX2zMU;geFPNTuBYq?>ZZH2w z4hzdz4u+DWRYP(gsNQ3e_vH###HIpmZzsSH5F@9PLBo8gd64}hPU7V+b~C~tU>0d} zA;cl&PQte7rx;)V?9I2nVEd+3^M#2hvaaa^u``&Ef$okMpTBAK?12w2>i^W&?>TsI zM27h;8XmwNN2O`b!W-NjNM~v~hs!c>o*lEr2Q{`;UVkAxG)jJN&S3Ysr>(g5y!Gd; zUpTw36QRidry1x5&5X|Y*Is^BZ%5a+?|$@O{@<^D_vn6gnt0R!Y-(m?m~9k}4b2T-m|EM-zn%94Qy z7jFM4L`!=B+I+-M0Ae!^t|Y>ABFV9~U>h$L7`6>dyE)xrGcml*?SR-$8qDRZNDpGs zI>XEk%68d(Ve^pmD#p^vs3w)7$Uo4oU^Sl8k~W?s#G{iWq1(*6YL%B*_QRq!C&E0ucIoWrZeP3moHd(P%&jCz)Iz5z)KS5gUUc%NO)L8PdOz^l zAK&xf6Bx;0(e0@N2s0Lt)V3X-{g9x-5f`wf6E~QiOz#FA0;1D33}8b|bE1uskiZRB zgbG%EoE3v$MJ{I`#wo`6ztt4nZ^IsTBp{Qp0uV7#U}fg!O09@#Wet90|7w%+P}vSN z`wv+Pi`l;@Lpc`0v1@A~*earF^YorV!2X-Tcmsh~fs1a=WXSi&+12d+&R1Ts?Urk| z%^U1Nk^N6|D8{^GPS0z0u3FR8`H^q@^fTYRw=veB{@9@i8zy)X>cOAu0Cl;9>l>N| zb&=72q|<+yaZ3N6Kf7n+s`=OMSof?`moJ{%E5>=G{?is%DxxbE58Qa!mfr5#`~U5( zpFgly8(!L32jDOaQ|3TIa_^1xiVXP=vS=3?_q9snIwXkP%dvppiKR8!~tO91b|v961HL2I&xs}rv%EM0}#JQ%Mink$n${dfRxASD$Up{ zj}ha(7GqZO+m)$sPOp=p$^2+7?GhV38e`O8mAtT$ja zTjpxd1pvkVnVeoWzyFV~IqRiYp4!t{Ly`T@6!4wFX@Z|~_M$aQI##ckea9Dn_TZj_ z)U&??u~uv%VFv|d4MO-*fE7Gk3`ZI|HmPt&o(z}U^u?)1M##2}i(l}JO&gcaK5fms z?v4tI?0-f;hGr*=X7^ru@ut46>U%%=gCE}WXd~l5 zv2}UE-flcxbtZv(V&q@+#AUPIwD6Q?ojB+HU%2OEU%5LM``l($rVzChK!iIG(KqBk z#%Thh{gf%0&l0sXxqSP&H(tGM%c^<&c;o2tKf}O71I_90zWSm~YnRV?*By6$=9~8n zjf~SH0&sz6NE<+LZ(9d&7_bFwWkFIP26Oy+D+26aE-0E0;>!i^U|%|T3s@0gu29?jy9ELbavyqzf`4Jc4t^pu zNIW_Fq-F1U!=+o+EzGibxYEo7m*FYKowe%un^*5VdCea^=hWx@<-hOQcR0V5wPc!M z_BE;lz=HxXH~eFL>|fI+v6Bt+F1K;n?AJg4jB9sp;A$t|#2hj6z`tx)t$NPpW!p9` zzWvibeA7RE_2A*rdOcGyT-pcrDYse_0+YGdkdN$arXjFdE|e$t5Yz=EjbvUDh(1U&iRRJJ3fJL>8gmVG_wlB;rA z_HyO;+vL-F*>O>FwnV7R2zIEEAgec~{BSMUeU|basYxyZQ_XZJ_MaxW!3f+l&s_87 zn|J2ypKT9qgICbr;3T`=$j)59@Dp#k;+A)Q`N#L|N!i%VN*L^gMUSs4uyC>Lh+jXSxDwVK|t`;6g{`s?2L1rcdV zx_{4nih#K&1~zS%aU*!6)mOq_Wgv{EaS>AUqJ+-c1P;6MSouv7U$FJaqW#9zKpv4& z=u*@WQAy}-NhC#G#N?yo3P3yu;0VBbawVZ&K>Xwj9*D9POtgOD$|(K?6*~yc@}f__Em7v7H4}Bz`j{rDleWX$x`C0wR?($ths| z^X^?I-geW@jjQKH+kaaj?*O^_ch-i5AAH@j{`%wJzvJt7*T*xuGq{-!U|1Tl2vkDd zen@Ct-zk9&`7Fy8%p2N7 zxoL5FLb3m9nv6F{Uw6mn-hTb^g#%0H4^R#l*?*fMWt)RHE}Q-CTP{57gvD?F#9hC6 zR+i^JmG6?x)FNv8_KC@)z*QOEkh zL?MQNBteIJf(xESKZT8Czx0FOCM?*PTnY$v3~5~;K=d}VUNX*?^>o!s~`nr!M zyF=3$vPD(c#StW=yyWS)pkYK(2xA?BVFu4dlYo|1j4etEo&dle^F4LJ;+k zR%atd0h)AZYktCF0gaifZweR;Y<)>iC(;OPBWQXDgUt8gBz2eUA7NQfU_%$5YxKM! zsd<6zUtG5h`$!p2+$_piVJr|}t;X24e`7^q212S!l{C%S|CyVX{^vVx80_n;*BeQa zME2j#-~obiy1#wnqJO^ineY6MpZw!ze)80TVIp8^%p_MC$-nJG{@L8{liSYKrls zGNNELrT!6FfagS%M2kedoC^?Fb)&IoLXabg%@!552++t(fvXk-)LcTq#9~ryS5zBX zyu1Xb5jPjB!eIYm;f*^11?>5{Vb)yW?HKS#GKbA0uhE`JRVSF2 zQfm8eJoo&KpLpx@bE%uN|No!8Gl7%isPBDM_gs6<-uJz_rPXcAl4V)gmM+b5R zuIldD?OE+TzpvM;*`Au}>YkaZ|5g8gB4LjBYB1yBNq1~{Xo7T+!t833#*53%f6Hwt>lGZKne&}nrYL1(6CmM@q>#qk4V)CQJpDG$j-GwKDwlz^%ZQ0O+w zGQjHE8l5W8_qj7~^(RsX;97x_o?ID#;^y$zT3LJ`d?Kp(=rtW6oPAWtE@}Z_LZXEb z5R)Qh^%x3(B|eHXNV=L}wr*U$QP1vL_tB~HSisJinQ%L z45{{RkR~4h*SCG?Kf+=oyW-POg-C7mDt=DpiqIN)ZC zEw(e~qvuFFd) zA9#s6ezij>{mZLXZU6e*NVQEuGwX9HZk{1(Eq(WYUwP%Z3vJQg4eNmP52E3*I`#*q zJe9cRyakKfD&GFDcR%vXzNA5Oc`GbG1Yhp{c0YJdnXjQ-zN4l3Yah61{h|)W3x&Y) z4+`UEr?pJO_`%1nzWw9>^~ry~*Kn&9GByKs09W*v>2tY3OKtO5akj|sK zL%Kl(>5%5=MnJklx_aF{*r_}0x+2&_P zqtlLCPj;rWeeNXpKHI}f+hn;cLyIOao&?Iwn`f6^_b}+FH~W!&so!}Qg!dNF63_pm zhK1n5+ld59H22n7xB}F2`Tb5ec6pSyt(M~s=b*epz`G;mvLF6l=x$59lN?egs^$TN zF%q5;RR~`KbE`~Bv?;0lUAK;pa;c#|(RfTW5!Z7_`&9v{R|wKk=c1gMv4W$zFd=_M zWK3Gr5!NROx#-mS8~4OLZ#3|taY0W@tGWycaNg1E1YYYYXZViqz&Q=I4qwrsu`ts^_g=?EfW| zLTAs~DLfewu<9Kep0j>QHQ8D|jRkyn?=sz8LO8uMm4)UqHbbnzgX_L)>D&sf_K;_4 zP>XMuB_7_|CQmw?IMwxxbJTf4F+yComQAf_q*NwxTxnpfgk(HQFgEV>`*kLrzu!^J z0{WYBJQu{>pshY3#bXD=uW<=^-GCe7e5!yHcAhLzNDjwOSzX~!cu`MEKuZfnCNr1y zMHXP0qA-0-cxRzgRc0CV;KF;!wxJ7a@Zg5pSxjc2G9Jq?20- zi3OGZIc%>Qj+kmd;hz7r=nPfL&}Pk=u~pr9Li{Oq0-$#|buf4?Ch zTNd9@*}6%Bis>NYKSNi%?gSeE@H3~75!2oG@uOzJcq!OTSJE3QZW`j6?vV0kHl;KC z@2lCeH*N+-b<>Z-2pUFGX~k}-iOFeKyLsHyglI|BQ#wr?-%xS+xa-*)tm6vAoIU40 zR(TzoDaFT6gK09Fx8O8Y@O<&XfV_z?GMxwU9pj?`6hX2xLb1af;s=FnO99$U;mnET zlcast=FQvDy?ZXj;}CpB0U^E~KVWgg)2nt>=9(__)>!E3o_UJ^bckGxiHge+>0(d9|M^8je4!%E&y2CG19QKG1pExDBZmYe~J zr+L`|V3Cd{UG&rDHiW5wq0`aa&p_|)XO#r;?G*C66MGx4yn|l{+cZyc(yi#{uT7{* zX0B1e{q5>Fk}KWw(eDU-G@fT^O&P4@B^i&oH_aJL|(8 zO4oT=E<6@BBo`qVS!U@~?;|&JpxnjfXKWF``xT2 zv*!#T7mWxTkhugLk&gYv2pW4NgTpGTsrnx?&MMmwN+hgIF8sZ^=5ZYRWw7ytg#&%1_ zS$;~9lY(5*EmYdlVAY>RyTztQViGu^blE7Pk7Ge<5=60S`ncT|j|KWRh$$NO^&&(hio z;!xkS-FabF+iDyTA{pY^NR+X+tb_dCh%QEg##Dn;km@KR_Qudc9PcDXY<6bu`+!o6 z>+$$1a3-yvFqA2SrVDyP+s~1^dZ+@<;WYdbIN~7^b9bSFQfkxS&F!hIs8!tfX;1|F ztBS;GQ&zFL{QGe&j1~J%+ucX2n}ttFc&Mf(6?p0-Fk!sFes=JsopLohss~Bw;X+}3BG(thUifv@dlJ{47`ffnTE=q zV#FAGlHxsToWvE0_+Yyaz_J-<`B}W|TWojJ6xv2+#AE*RQdHO#f2<_8c+ zJT|tXUlNMAnViH^sCfz4tk*foDQRt8gM1F+t?sUZI(7KQMSOd!j26$%h%v5Bg*FBq z1w<|6k2jU^MsWFj%<)@C#gk*_;Y#*Ua8EIg0RgR|o8>dHr1nqX+g%e(#xtHl*uY#< zbdNA)qRS9xx$w&F>a{%wJ;}>C z;!SzEUTgy_w*5rjUe@`G<9Zyw*yQ&(d7+e4UoQ12rYqwH>ul7X#9(Q@^wZr@`I`wK z(e)W%EkfWiTeSira8oRWsG(uZrwzY@9X)j)HLTe?Eg(Mm^(6ahl1k?VieD>)3*Vr1 zGGEO`-mu4N+}JyK#(`>Z^%usfo^E{CZdkSGGy zCrk#fl9Pa!@dyNPlNhsenXdYX84CTetZ?qKLIkseY zI8^=?Ib+fFPAdm}taUyW$JZv&s1(p?rY=&zPLEN0Lo@Q0$TS=0PZB{tXZq|1LN4Da zobNe|DcwRG=KaSFlc{nZ>v>F&A{DyGg#vRXfKS&%ee7Ze^TP&*O{1yr4Z_%)h!m5-0KGEd-rNEo?2^*JHy7LLehi2bB%2G2{T^%xhX{$2XQ z+)c#2q4WBoVbzVw+t;9oe#f8V^xlNI!G8rr?X;GR+bs?C4R>X_9PcquuqmoO9EpJJ z)Ddd`nlY3I;2Db2XH$2_IxkpmmE5IUv-?CIOi3=@zCr?pkyLtuZTiq-Wuo3s4^qF0 zS@-k+p5a;H6qF{0NyL}d<}I#}f^h(Boi0H9vri^JevZW=NuQ;xL-y3_JjVK%8;>Cji z{$w}{a6gKiu6K*MleGN~uH8jiy>s;IC!&lZTRgZ$ zh>ePBl-({FA*WhTVqG;K)PnrOmwB4s+MHtKlCL*Zyly&4x8dDrd@1tVv%9`ZEfpih9dqT0K{{is9AmF8*zG)Aeye)%B+*vmt+HSw|D~!}NA@vj7^uQVx@( zP&qrWo{g& z=%s!QUf9RzKn}C#;7vpkf2X`=2PI6TZZ#%M_ifVkU$v6S*iMm~SbM*7%bQ9!2>6R1 zhUWIg<(xEe3iu-Uls!MO^Upj8MwJYI5)C0qR`nI^62XTOj+j_rs_ew=Jb1Rk`N`)~ z-AkZY61XEfSK?3Dh{?glNFd@WOJQ}l5l_~Olic#I`#qL@<^7=iUJ3q?8lYM>+)H@f zdh7t+E(;OH%6Wza-3v87Km5+5aGDTezfH`b^UVHi*)fCQl4>B=A(i;iaw>YHwEDxD zneGBz#2ZW%W|FTQ*FKn`VikV@+#Ef}Blsv-MNLx^dvfrKlCKm!8ZzH=!h05JX)%mb zHnLlifpl5#LQ?>)@@;3uH1)&LSscQEO;C+LwjbmfXZ`Yd-$>Xe zQPEuVCuo0ZE_e z4=g(XoNbNv8woLUk-WE%rIu)Rp-04Lz6w6tPEn>jN`vaUE+GJs37w4183BszJ$PyQ z-Ar4)JzqxN4n6eegV`7_tqA8h%9zkJzp{6w=XbE*c!Rw;1L7bdr)y23j88_AekLte zDFbrS1-!}ApxXqT@&rt`rv9rPi|CO<$rBKoyV1d*GV@j>=Kbf7Q3jW-k4=WPM-@bC zLSq=yAOHZD7cW%!cX7g=E`lLrIk|EXvU|t%9PsqRz0Tnf8YFmN3dX6^Kkd|6Wf9H&LrI?4ges#lh|xwKYF@b zJf~gUbs063v*POy`WexdfE_ziNW8gz5>BqyiZs3e_hyu0(!1IqMlq1&4_tu`b+dDW zuMP?-_gx!0mD9FU{j~X(*=lhKp*Vb?Sgy;Z|54Cp73NgSANb5(neUYZhZci45Tk+b z^D;CwzXvqh?V_(F{TNj=4|C95+8+9zQ-+%)cyT<2+zxXh$ik0i{AZjJZze+z+e>?tM1 z2I{!We{IIH3szPYU2XW?{4rlK`i8BiA%UVQ<%+Mf0N-ePRD6RQQ;NEB?+SntnRR>) zm>^TrwkUKlZ8MK7$_rn^GZTn9S)G9k7a+_-sDT#{m8{(8Hjy;}DtfUg%4^We$flV+9{erP;TEmGa4^J9-HD9#J6A`5L z`?Ve6gEqZ_uY(mKoQ1aEIHPHi+&lpElr+Q3#yNF}!f7PaU9^tg)-K|;AFkTunmvs~ zzGa(?Yn_^HZej-V?&%3{>$!nb z#2 z8MzqJ!-bJjhTt*T#uDI)7(OVDa>08RsiprRYPy1c$NRkYBY++ONs}eD3PBd5O-RXN zKe+5tX8n_?%9nj6xq_w*A(-2pJ~1}FGML~{Do|)V8E$l*l=n8vMS4(5j7{brTz*W zNy`_w|Apf@f_>fRRd8eM2y{m9w|7f>XCcnR8^*m-Z-3@pCG2upK_7pC@=x0I2ZkXe z6({Ux&KqlMP3ah3t{H=zE{4&1%ZtJcdkKPCCsb?sE(eBZ;0Ry)n@%;Dtgi?CnlZ26 zTQz(I8$%R&NSQdk#w$ka^cJS z_J~jcwEJp4;)k!(^iKKE+H?1pyn(eHK6HSJdkC+?o4ii@v1r#oti2`GY_CiA7j4FO zp(QlDSN`6^N>37{0_V+G4Re8U~)5T*W=PkA>y(9^kloV0QovPMIfPk z2vBHlWbnvOO8z7M!+R&r;)6&vnbR+$2LS+DyKL3hfGAA&4yb{LxA;Gwq&nc7z&otKx2Ob*~rk6DhQeTu9j@Wj<%s~lxYQ*iOyxYjP9R; z7siMuF8SE&tu%++sX4)7MdULyt1Ds0Ww8I#rW(Q)RxOpFcI)A~Usl%xKdFRlcIfmv zH8Ego!1+8`W!&bK8#L*F`V3<#4H=`X+y#A!%SL;a>5cJr}h|h%d-DEkX(syc6 zR=wF+kIQkJO}7+jlyzL%7t#RR96bVBgYAF>>1bK+LLbsE#vZ_4}i-h&V_>5r>8D-J-}nNyhrOL+59*Q8V0EIDm<5Z3+dr&O`#cuI z4Dh_$cG(jC+EM>i=5n1etzW)CkqA6BLyd+bPu*><%N2*}rCX0M>CGg)hSJg~aI9jVlkXc^0M$luYE3`Ecujx8IF(Y z-jA#f>F%*%20^t=NC%=_0Y;c2IaJ0d7C8(eQhN2|~f7 ziU6s|V-7+<(Tl&6bmE|Mmz!MQ@Vm_AZhCf_s;)x4#IEOIyVOzg&> zb3y8s>EvgcR|G(Ju-FbQf6Uu>JXV*7VXFtJzZeI zm#P8y$8WyX)54dl&u0$qTAH+uKHlIO7t80G4c^;3o2TJ;$wI~HWzNEmjTU#o(qe=X zsi6Xf4Q;8H8oGPuANgn1d^?>$%ZTeBh!z_QB)* z1FgHghFqUl*HQ1Y{l|?{j@zSw>w_|#PRD!qzRwFdXFw&h-JursRIUnXot@IgSA zrv3}A0EYkqDTj7NnF-UQ^Ix|{eLGvj=r5nbif5N@RTx5gWGO`*sE-VU3XI&8)s}Rw z5g5x*!P)efbmsUP5h|j3?GXX!g1f1nfbM>L)wY;O3&_RWCK6y8@=W#J`x{3H{!&D} zC~j#B)ATRuO#;7)H&^5=u?Pe?nlBAL5QxlV^*iwa)DEU}RVg+`K1^e^h%26_1wMPd z0N$``0pr$1USJ3B@&E6tu-j`skbj`wX2?`Pre_M+rz5*atI3DGn3)A-?B@)?FJF|Z| z!=hy$)<7=#h{+%yU>r~IVjf8{COHKjDdOBxX80VFh2l?xbs+h3u_x`PV#@o9pAwq2 zyU&eaHa!{7Ab1h^HR``Ir<@(N3&}@AX*^5uHB4eSYigC~w9cW!p26BA_Z0ciz)xW5ybeQC^ffPR>K=dj%VqEf9tW1t=2ItV*f%OWS|2JuVjz1R}I$m}mMIu!b%^?<|3a#-?XXi8{Z|0$hP!U!o;PojyLdkYy>` zqEW1wIuiO^EloviRd8=Xzy!vbQuZ-ra_oM{^dAloJOa1+z(d2)xNSKFa;D zn*ZI-9*!~VE~V_*!y6e2$&FVj9kLGC?)z3Q6iv7nqQPPFt`92+=3QTDBYuKciACn` zTVaWOt?9^n@^vt}9?D3zQb+T_gDGL=?k1!ae5lO2Q)fJ|>ncGe)OpO&-NyR+Zfzj( z`$sHquZ^iH8EqLG_T`4?qu#)g-#~M-Ubwst%_G#UaD3ojV}wGorjrzBJ)mVo8Zsez zx8zR&xJ=M!!aFO^WGsB#><+N6yRoEunT_g0<(p4Mu^S@IhPqfkFz<=Z+80eP_6Luy znN}MO3Tqr5>-gEg*NwLs^WzPy`#j_t8n-9_|LML;e9@!wQOIT1{(a-D-{EUf_T!HXPxnU|jo{?)0kj7Dd5 zUVZZ%gjOUgCY%lLkDL3uJ0;`sv%hPv0LME@&yi==Ri{ngWiJA!U~BM5b!(25=sC~D zl`273eEsV)jeNg?%bw-4rcadSInXf}gl{U*Q~u|JV>AP~pK{;nV)DbJ@f?(wx5`-f z&u`zX#W9#P*1)p)Q+9RpTn+kFTz=OFz2{XqT|MV>U}OK29Xh6798Bn~D+`>j*nRho zhvY~eR1kb1&mpRYn)o*F?;-6Zk&UKo;`M;1Ayielu=5k^%b9TFYJ148oC7FG=e#Fa zy&xAGr(1Jq5&fmJvE~f)vZWcgl z`eH&O#hpa8h?Sa)=RjDe>%Ie(=Q=PGzn6bht{#-U6fn!yVt|6mUaDA+skho&) zX7F%HMCs4Gbfsfb_!+WAvA%umpsAV=Al;ZUG%#;oWMJOCL$U}Jm9)p1DK*%+2PG?e z;%3m!xDDO_2-JF%7V3~hrN zuTN6+1FNz#wL&BSfIo*+BAWTJ_U+hF%N2$D%Vs(Bc6dU#x;BA7ic!!>#rH$XXyGhe z>U0BpA_h#_XK*^HUSAOuHEOs5_R{(-rd7cJy~!RT-P3m?o)ZqT-KQS}O?z>2JynEo zI`a`crn?f#-pN^{t6IF~utpNjntK8IaZ(*0nqtsq>MId|=~h9>)QkjN3SaY^?;4Rd z#Asd>Fao}9T|8IbR5UHbkh6L?m*E5+O&+mH^u={yC_qnUMKZ+)91RAe-5O^NoF)RB z4B9Qkj0tYrjUNtRN>Vdya_)|6eO>eNJBx}jPxbC*@x9*}3eK6wAuitZVQCc!*9}8b zt*HD0YdbpUZu8kZF|9{Eb}nKsY)~o!-YXH_0;)KOJ!)xv8HAP6hOewwEzb$iK3n{`XI^9VxrHVuIzWx;*4Glm@Ii!O++r{N z#f#-g`fX3?LIgyt8&gVAclHYbeY_Pi__d=+lnH!$>OXK61o(?Qx#h}LZ^Q{Ecrf91iGXx3Ku7Q8vjOzC04VB!@Z8u^=P5;L83Wwm}6JtV5^X|;@!+AzY@MrpF z;G^Dza!IM4b_1uOjP!3n!BZN7UV6WH?TnoIj#IR>3uvBTEK)C>JlBA!n-(fYWOF^u%cSR3hcWM=1(cE;l;KiixP@Ynn@f*l~A*(^4K0)VEyWsr(P4ixGBo zl}}JEI)4U=Uy~>KjSX+-1xYq)(-*5I1b*-zwr?;E&Wsh?_%b^X{pqQA)l|H6^KS8s-NO&uzhcNg+O8bSnq zB6i85xKVNOWGFvM0X>8svl}VCIm~fDLWZH2pR%bF1>hBKtDA2YpqmguY7ZOs!rAg) zOs5NdRdif6gwmvq(r1$AP8Lxuaeo?!KJK8zjYsKXSc2o()jO^}k`5bHQLc2!-Lx;p zVHKkrsK&nf!IF0_)|KDWe#Z1RQdl|n%HCx&;~*0zu;$VhP}d+KVWd*~yDK*1a}k?w zfXiVE)x`K1c`)BGi`VxpSUVvt)D%?0s_@Bb8uUEarZ;TBz(edI{m4vutTk z0-8R+;7S^1wVtK!{8dY3jvsV@`fE8%l~Rjvr1F-=H$C+7Gh5FuP|5oAEC)Q^z4lfC zsNmkI2ViLVKLtFl(~`}?(V_rXzrgR`xKMfuAi+pPA@sMFtH=JEh$>r?;5mc?j6PhW zVZO3z{>8M9sVkbOytN3cg$&fgnQ8=Emh`#ldpwLF9?L?BbsKVDgLt#urqWyPdJHDy z-@X0!k;aA$=})z~nI5mEnsPwp4Up}Phu5fTDjv$dI2P$Jb=#wAcAreCSB`va(f-f= zvepL25mpdW*1GctggEWIC%90Dy^|+y+XVR@E5IH+<})aeG3$&Pa$;O3r&DnXfl`VWQ(2VP>aEb1p_I^`w$MsJgz~ zZa;zI;IlT(&({7$=$|BIWHL~|Wtn^j-D#ck&Elqh>dnFtIkiK3OJ|Q!bkwM8=^IVh z^E1dvLO|@xB`a<}-78={XT%y_2>}7st%OqB&Hs<5Qv5Z8hXgGhO1H(<$dOb#8wW33 ztTUI%3)%oOeOB)qi}2Q!z+H_z^q!+*&4l)PX%CfyVtnYsG}uDn7O75C{_S=#C?s@( zcIMY*fZBKunbQYyUmZn%wty^Un#Po_5PcYV14~z6j?`%xJH~8hX+ujI%+B-k@+wruzb-F{+ zXfb(WchVN(y{00VtJ{GeA*c!8Uf=pjelRB$_7s(+m$IlzaM4EUoKr27^^30ibvN2r zXKw(%`sm$DxG=7RRj$FjoU9>URHvZLzEF`ECz?(8re_)Q{5Vq#^wSVsBfRJu?X1aB zzT{-{Vh&O|2c>qmsu3Y7u3hRFQDFf{t`Ie08)%8BQ54f%2 z&Nh@-o3*scvIvi6VNK&RCIkbg{O>2ELh4}-$8(h~f{F|c%0Uow?QOjWjcAq7??4Jr z4_CKr+L)^=Ao7}Cri zRMPGoK3qI9_n4#mnYXS9hAosO? z#*scbbJuGWTUad4lAb@2HGo3KbtuqFuLbfX;x!Uu(zDmoMTcB5$cxqo?p-=RwnIcE zL`Rx|tHxc_@d99K!e<*H+M!pGOv;jvalHY-c*Cbn>paJ!Fq2<1mPX6_$EBc|)dzRM zkXL2J7di!0l#W7qPGya-CHf=OX@LLQq1AP~mB{X;HU1O@0O-EBP|QuXx4i3z|Ivr+fBUmTE`T3(s-}4^m%XmU^Qi?)^&YuD;)==!f z)upV>B~l{vAt?&lf$jxh6_meO=#-*{t-_SuGZ-ZlA9l|7ck;U^XvPS_F0gea&0;v< zX_~i{_>7Nh`f=cTGk6X0a!@a89bNY0f=!`(Hlph*q@uykvf+R0TJ96i->c$_M}*1; zr>1Z#QfU{0g)3x*C(z$q>OV24O9V8}n@o<~xnbV$u3uHU8~C1BxY0`$fDvHChhtUa zn}Bq>DvB%f$~roZjzOL~7pm)VJYeQ`pF3IQ(bkO5XW#0SBH$XDsQAK%cU-tI>T8Rczcoal@i@_{nsEq$KPwK(m>@%EtmWIjGrV{*wgNPyS zWZc;kM2Pb3Bo>0+fYl_*q1?96A$^YGY~-QMxT)b2L!@FgH=Q_j+>o`Tg7hr-K}dQQ zZDvN1>DO@gNit5mpUE#@EK4Td1L}W4T7Yy=V(`A}JapIX>+=W>_;TM}IPDAWC6~d8 z_S$@8lF{gRsq9M+T>$V|oXy%o;S5C;vV*}y;0IWX99p|acI$mrDvN{|QApQJxh!iG zR8Y0yJ96kDrKY2DcSj*4=7oQM-~9=JRr-2N4LOxs;b7t1%@Cn?oT&hO*(Dk?tX>ZamMlwvjF(CFoX1n%S%6W-9GWU zj_E#yJU2mXpm6TR0GHRj?6*}~Gp-3PM^5ztW_R!2AeB?cE=&t1RUrV`2XoM_DV=`$ zM6lgt%&v`e^WvinAw1gCs}@vz7Y4kKY~&D?#uk8Y5Z>glasap!AjaHnYKLWG`aSf< z=pHnC1&1U8r1QNty>aT&W|um~9rTv1pnF6A{LlbW0!(+g`jiZ%@@IX$vf(xTv-KAC z6!#D>yQCX4N6i9TBLMLlGi{uHW5MRn&1A?KUv~GJqaD=f2-NQkh=rAp%rfNCOrW;& zfiHE+&p$U$rrVp)Ex@sM2FT{*6-0=k9_8yaJL8|`t(w0{?O}}1gG{%*Wh01|;Vk<} z+_ytOX6`~>=U}w#zSLVaVH+Z*Rt^u71*GQT{d_Fm zP#H)gvfgl@`4Ojvk11bZ)JXk#a#$PlrW1N1gmPkn+R%t?g`gM;q<2h&_YEv6r;z zlq}6KAC~b_S`#m29Q93n*o`xsc4Lf>3P1>-@ff_JZ}}ZRzu{0z)ctEPP@CFO-$pJ- zLU?KzB=Mu;+;We=>HsD8Qz|TnAmV*^%=SlJ$6Q zS-1-N#}Mb&?!lJRWI@({aRC55a;M@_`Q%AxSxd|uPQ88monV)*$7DI$%rGZ6xokqe zWXHNA5ruev@|rk9V%G~wUc>YPOFpqqMSNl4Eao;I1EQ=?GcLU5$1lm4PLlRhSdG!) zA7_1|)z+j{hfROC$JW2zyuTKJn7#T}B8b9JAOOg;s1VzMyvtf%+<4^PWN>pwz4n}h zlG6~IVLzYin2v#u-GWn@iWl(#JsU(@Co95vg3%Kl8ebD@O={*1K)s7hWaPRLwMD~I zi|w-sH8rG#O*l6+G4tG2#!UEB{KG+?|M}Ev%&uZsryWs1B=+Aa5qN)nCwO(hc+FX_ zx6zX66ZCVf9(Y6f)~a-6Ej&4`ICb~qV5FSfA_Q5U@YBiu+i&E5hDo_qf1vu-{Iz1s z{5u1-<4e%Bz)6gHm|a@5n3^A{>sqO~xe8fZ-NEVm_oQ+|t~SVmr5x*Z?O;#uwT6vO z@0D^H4;oXd8Wp;_AREkI2F^9h0kouHxVg>Ci~x&**p1=oE*7Xa_r$gGS&)jY(5u-$ zUj!i4Ow~%_&A9HosLSc=dGo{IIdl>%(wKnG+cNy3>$ueGg*+Gy3;r#-0V1cE0i^FW zWuc+l3?;Jfm}ep!+Ak}#D6#$pjsZY!Ia29$voy)Aui8~?3Z%whi?$vNWN-eDp)+s* zQi{mLx$O{uDFZ(#xOv{DSy@AW`MkQ^YclPcUH?zoc)@kDWqv0+>};jzI4E_{=K~}b zo6#BL$37Ps6c^<8$&93!lz?bK^J)O_1P-trWq!AB3Yu6qZmnuMWS=x@Z!G@p$84pG z_8+4a@z|3~>m|tfJ**ZYjB`_WJx5p>@w1LP^Hac+t}dFa=9*K%Oa6uJgL>`!>TL?L zM7v&o-*Ill+0|Aw?VSDjKWM5*VjBUnp5|pcJuk0>3_DQ0-Zlz{W=!{PHFTq+X(%Qy z!)XM0?i$ms^>8v5L$;`}=)_ZZInqkS zna#r$#l*{RjkeCq;YK!Z94fLgjx>P`c5lA=JMqV#fP zFP`!9laWur>IXzgFpR}!aLDd7jI;e_raKGm+%}f#wq;a0Yp(y|Wxq)r7!Ah~or-ot z#Z9`U2k=SlRP2Yo{JPTI%Ir-3N^)OyYF##7@SlSZFhk9Y6Q{vsYpqaOiRSv5#g^M- zbX_~_YD^6~6b%L5gzJwJDjd8?bR73I*3lz~m;Io1w|*%q{i{a>=s!9*5tw_618DHv-HVJhPrfr%V9!n2Z3EtvJrCO=Y)TG?(kZ3HQo0P*)!Le@go^ z)q3lo4o`v*_>;c3o2UD{8iJ7s&lgzVj1L#c{%G{yP~)z9`ojpK@#Eo_%A>ygi)U+< z&Ne7K5p#VuG-mu~S_3!z;JEpRBpx6ucI{_XQ-r#lq!#&p26u-{g5B z06=sDbTi^nQ|}uG30xaam{Aaa^RwPAYpo-U^nr12>gC0W=pA}V%Pzh-ohjDCW61 zc`B2E?o2nmo~%=Yp4xp^3%Jf5P%fr}mAClBm~h*0Nkt-aWeM44BQ9zgn%~f|X(btV zncb#ONOwM>{j=%(fArQ2_(o|JCTz6Wo^~|~-*)DJ;;gt#$@wt?i2o8Y)_rkM!~w9h zb^{pgW+x-9`4SAXbyGf^zP^MMYZu|KUf>ks0|26EX6#X`=ywxZ*YmF2U60=PLQPP| z={5XZ3piOGnQl`GX0O#a}_J%v0CIg>q zcIZWAST-lJix(d*U|R|k$^VK~R8>;U>7u*#4c)J!%4*|UCnuN6fp(qT-&EwV%K$#U z!=!VlO@#GWe<3;+Jl=rK(RFU|!QT`$A^fvt=5OW+h=W-~A+I!Ct14#3cDsTT>CmAl zueCTCi+{2Nz-7VrCu85up}F!=1IPAtDq+&WdlxljpR^q=mvPV$2cYE#2uH9iV9wH+ zn{u2vbop@NK=c^y!&Gd|a7TzD(kDw5e44kZM6 zVP#Vt6X|W=)m4>nx?^|E6o<^2Z@c+tmX)_>*JIs7Fx>%Q#H>y*|CLwS$jf3JrLg2fc(^+7R$@RHfXYu;UlX8uF zcPwj)-rEDVTQ`?K3C1t#v9j`mk-PUSGaH@I7GwLB?U8R|S052L`Yrr{*|}70#5$}< z{_2E<0I}4Ua1Mu`9=@J7cJ9|&QC{=kxaTc?AZif8HdDp?_=eGvd|~YHX#A7A@Wohc zwh!d*Z<;=lv(y#F>Y4~5V%e99TJvK#KrU|8!MV@;(=jtI`%$Nl*uqOIbM`)pn)yGP z7%vRqqAP7izE$gUm5V&D4K;#V_x%a5C54|UT#^EQQ!%Ah<>CVw$v1sng?`+fXvE7` z*p{|Ao8E^mRaPchDo&xpwgCXqONQZR)zez+U>$-QPnyoX_pByQCfdp?GCpNE%Lpaw z{{>o$jc?Z*uJ`M$x?a0~b**`eSEEAU)1u(EQTM3{WJC?&zpepB#KKBy^k)+tbq z{u}z+K&5UI$(Kp|_sA~vdAhe+Ft#=5DyS|m>h(tc2fqNoY+3E@qdnX6B@7ZSE$|-1 zs*zgArdc1Upp^KSBOHMTE+|lT${6MpVNT%d=-7-zGTgswsMq|Adk53c07X(*ZHu@b z^Qb+)opLX*^W~zE!B`~Gg*G4;A(3ah28}fFO&Ll=tM%ZCr=_3yZ3BXE%9!=}$ftKo zLAk>)CmsN}=}`rc->5He&u!V;$nk&-shoQqUO08qkH+Nc9 zn0r+K*7-sSr#b;~e^Fd}LEx(Us+q0S*R`CShJ!%JCkR6Y1V%}>rhgm!Nuj5;!f7$P z?(JMylkZ+YWg9lN`<3f6o>&RVC-OgAb+`Zg?zK!b208iqo1@trBMEz2QLPTf+zy`% zlLneU`K$c97ob)gTAqM7}|;q?EXUFaK!JptdjirG2_LGG?43TvJrO`O_Wb zw{fP88MMcy%Sl@0Pd2`|0GHd|P0Hn;hPJ_Au}FZD$3NPdTYb90Q$13o@&9dRP=nM* zmF8>ns_nkn-4>sFKPkl8gL*Pq^N2S$MgIUkGj4CgnLr$XK_;~Aqpqxo?~-z%9%qqF zm8nSo;2;1<>D1>Zn_XL#9vPe2RMEuoyq*Ixp;qC$?8wFz%|#xQC5>V)AG!ft1jm_3 z_Y{Kd*@iitKf7;3*F3x&l-@&6{=>?EBD(K}lZLBGLF+J=hPK_V9jMd&e2SpRRHuYY zNMqAX-*yuVU6d)G0z$?e9a~}S^IX<)r@=oePl^l=hSA|~jkQ6RX=Q8fFuI(!hs#cXj9Tl0a{!Qg?!o zBy1-@G*V-;Lu*lot-zy0#zeD+*nXRz^G3jS5PkJ~)^9Q5D5*3T!77)HCxaD;n4jUV z2sTL}hMrJ~V-o1$(IaB$KXOb$&8p9pJAmTrz;fSLC6bQk@6TQLv-U>f{`keVKv#eK zcSZ23JM(71BopzgVxbuZI+x>e_RKl2nL1s&x!wM8a^(Ntuf}GTfBV4E$h7fN``tW= zv8Urb%LdqMfqnl{uW0@S~UBQ^{7WMAmA{9{mC2UizRbyRr%qamdnJ6ZJned z$=x%|q6KhL&0NreKQ+v;JCq8Sw;jU%BINhHp-ShKUUsunHzV1nk1+OUWQJ2waP8|# zAgo}}ce<=-5C@^s}rebsM-Iu9Aq<0IfF zVrG1gR-gm`E8}V*_O3bC+FAm&`3?5hnG@H~`hsO6aR&sjO&E1ODgpZ9Ul>)o{OrB; zwRE)v+=g7(sU~*|Lq%&q9?}F7a2FtiVR)`Nv~~$(nktQ0&BC$UwU~^(M&4vA+g+;v z#GC2}pR<1k2BRryxgf>;8^Oo6)3#W2G_gT=F_hF#zUJ`Z%Owu3>mhvy$nqS8krnYL0UGbf|aVRnv#F_x8yu|EUasDylBa-~7&bwk96m zzu7}w7th5^rr9i_0PXH*I9>lDj-GI^l?u+N{?2quC3L@?s8VZpY;6GHKMnze4wVyi z>v>q})br{Mqn%Rslbr^aQg>r`oG>I3R0x6BZ6Py~{@N*N*F55w?VdADU8gepz)1 zBs?u(d@>TL4jSI-OyHCMcNRq!MR#p~so|xpad7ivdRN=mQP9g-M7wD^@;C}?3KK^W z;lM6jOfjJ3(%7WV^hvPC+?#bUnRnsk^^s-5wtQdCM{V_=;7i@i~CVU6;<^Vts3Qv)@V_! zEwr>ntP)DBT5Sm$dyi6Tw?+_K?O8(7+SDG=5_?4Lt&NHii6`{?2Ry$%=X~!EIrk*z z+`RAWzCZ8%z8~3rZ*$=wPJx>qAmIFM0BtV-qy%Ci&ERU}GE9G%_^Ruy9Qv2fxL+en z{XOnz`ht4d@qjnq;+uv|90Cc`Q9xg(!Qsjq-2D&~?>rl$hw{=~PdFR;iM$iV0cetZ z1xScEw%3#Xu~Jso%dk>op-}IiT~WvP;tG^NsmBAfJpZN^75YNdp?Ig?@Q!`O;o80W zK;**G%oA;n&`8DB%RoWayB0bUEdl&DEC!?iuzHO(XWW$967spbP@p@o+Xu9g3hthq#rp3MaWh+`>- z4`#df{9Q{?njJ0vB=2V43EsvkJLf3(D;GP)KF!SRqjN0w(doh#taVYRGMx!k{K7^Vv7y$LI9#~I2q&6{K{hr zzg&kfxI%ww-T=fu$~+6N7s{4Qk}3U^(~NS-Mv-4aEE@Ln8}IV)SDiW z9S--+8xljfBmPQjQU` zS++1>Nl9u`I3}@e;PJd|WR^bUF!-)z1%Rc(M|lxOy;nI+qI-3jl-B|}t`MY*3KMAa*{l!hPHD8X=Nm|#aGS@=X3*&{ zRzQnS4pGTu96?e364#RKTUC`}s}gW9jGuA?gfLay{Qz4Fn6rMtS5#>$8)%4- zB6^x~=?i74pkgK**#TJ8lZV-QooQszSW~N;n+nGnU9{F>fW~OwK({2oG+&^`m@dwW-Wy3ULPjtZ(oa}Cu8%}ke`yxOe zyM434X1}?EY?TO_CoTWOJIf9D#{BDC;oC1Em>DT11TvlfrMpxEEMSZ&inuA{0$1bR zKecx(C)@bnZk{9vZWRgdq!o!BY(RJo+;(`vLr$hp*FAQ2(N!XoGwA>+< zMnu{TJ?+v(3Sql9y%poV>}*a`s3Gyzr|h96UlglUkRIQ@Zc5_h+kjcVq@H$P!vX)X z*RJ{nJsY+upDE=)6iPc=7p_COTG-qxOuxJPKxV=NiQ}G`leRosxW;IE!!DHljDM zela=?-i&XpM;&|Y2SCnCYJFo1x7lXBpw=-jV7(MQB53(Up%!;fBPaFhyM_}3X!hqg z)A2EUYi$(mb!0o!z79v2zpoJN!|A>OtRegxoMB6}N@ez?Cx;^&fuG&S!gsvqQ;nFX za^vfzhg@kccc*vE85+AfrKl`iPkLeqkSp!|su^s>`bGge)!yN2_tBOT<5F<_@wHK` z9UREAea1ysLZgcOHWrp;xzg;=frOkDB@bM}T^`On?e7tscY@z%^Yzp}^YJ$>;k)J# zxYHeTWM8WKilqb{12}1~>k$94sw38BKh(p?w(oyXM)j}(Yb1CU^8qA^7wA%N(xEF- z+-GvPb*9mK34!B2e90?&=f8l{a;#dOewj#2pBgbV9!)6cxJQ$XEGeS|dAuZ7+N+c~ zMWVB2aEDpT^tW|VR@|j=C>KHr%7?FwB;@-33=n^brXpoG>aGvd>vND{8)ttdbtSBIpU%?&?B_bX?hO2Wyu#zX z-D6~a&-8u}gI+hA$pt~OY$>uz9>THvPP6fGJf7~~W#~+f{ z9BX$>l~x)u;k^cLSDMriXAfS`L){$O@#pRp)S3*7c(Oc8>Qmbl0s9d7U_e|7KzWYpBRZ^)Q^uXfb# z89^w?`AzHAsWA!QV7VhXF|Y5Swyanli4 zikCl~XK^V`fRYRHNuhmNzg-9vgLZn#=i7XfJZh&(1HAO?8>Xm~M$d@(`S%YqSe(ZT zi_&uHL?Nw-D;{UYT+okJhVL$)TwMj-ml`mxL=*1W-F0WrEgWpMyV7IZcduQ&^0vrp zt(GP&?@qarUJGDp#@C@h&|^cuCc0%*2=mH0#UjfedU8`ECf?=TsygZRzT&k+QTy)9 zABN3M^=q541tm3}oTrt8lo3sDS}qa@ zLF)w$)okT#Nu;YyO%%&zpL$fL)pC4^qEPgh=I?>&E_g{7IUIN@ifY?{d!LFr^vu@O zI2&qRh3Om0R*_HpoG7D{se<--1-EW0sBFi6y|`Q)gm3%EPp6%k*FNJ_>E1X^=cLo>`Rq$EHLLy%2=n19!V<1)p(7T zQ!8d9*{Z%L7pjM;oVQU;a$eQeeQ*Tj{|aa$Naczpbha2=k2>3Pe5uxWFDj zZWjxOEUf_Q53nAEcVr;Ghp6QgC3k@VUf1TXYTb7>!xB5X zP(r2|A)vthi@Oy;4w2E3BJK{{2?MT^xLPaBP{H*8$W~lpIY-KcgEMSX3~o3FaqcFd z%Z{r5K-l&iGlvh;%qsnsesDGWzS#L`ig~l>|D=f3z6JEu_I70l*ls)=V`6hX%%3ju zK8XD%)f`vgL75uRXS;*crBk=WQLv$ClheG}R|Ql@8GchcVNx7G-`M~*7bblX7Gx(y zjZ~a%y5&H{tWVTc3k~jRFKB`@)TMDxdah>e;EonvTFgC|3T3a?emCJ+XMgUQ-%{9t z=1a8Wx-+^1s~4L8KRE#1F)8x|by8oL?HKtWuqcqaFouU$(!V&GP$g=Z0Wy`XT!>@e z7jr5RaQbk~6%2yz{^e9eH~s}G4J~}y)W=L{_5LdXpx0B_~F~+g!h-_^WP0a~G zg+?qu7AkZQUUgKB6~Y*6Kb9xY69D7YF0<88$Av9Tq7v!X10ox9gd>|irLaDVjC$%U zEO_EwJF$^Wuu!ZoFILbxSot77XOF<~hsVeBM#LQGn8bLRU<8|N>@CWX(?w@=Pk8K6xgeXHBMh4sNDDQv*8du?E? z-H*Vg&pQrrJ6{5c=AJ8soHC2o{UXd&p^=)%2FVdzx!ISTLR;(*@Y=g`%F}7KI0O&W zWG{IidbqqGU*77M>5af*VFjzwQO#M{q)l~q;R$mv>Pyb@yeyZ4i9M&J`fUFwJJXn$ z_-$%R4J&0>)1ZxAS%7KUjkV3Ba->|QqT3?+?q=iuJ8GR~AFqv^PvJ8rZJ=^N(Eu$P zm~MidnL4Uift2G;JvOjaQ@LS4D2RPbHCMq3(Iwa4r&gRm3@ZG=V#Z=!@?Q^q3(g}v z#!7rS%%!OHiCQrA-bfUpgbrcPHe%a%Meyo<{^|Zq{hy8hk`f}yHMf1v4p|~{#7;1~ z*X+6RliyRZnS%HwCD>doS9lyZXRrQ?a~{&+wC{Ezo-h$%LkP(sV>6G9YYfn}EF%S( zB+QdffXg}5|1kOt=VB0{dsW0NZ^C!Iv1C5AHyVQL0TGOu=J7_vWR>ElTRJ5PJxz$n zuS_Eh>!lP!X?Go|mFo7^$DGQg*YoljJRsYm58GcSq#dtERfApG6SKzL=Zhb8p*I7T zev>Ml6ulN(B2=V*ne{&bK4B^6PNPl3fC)tegFQ zO&G-~c+PbzL0EY+XO-VEtFUnhE_`Aviltjut3*PDVLlL2lB?X{8r1%&z*f$8bpybA z5#?QZuZ~Sj7zi&k*yOgqOVwoc|@+#CbbszI1`_tvjgT>b6xHge_jB@oA_Kz$!1W1n5wIi>Gc|+6d z{^)4yQGEz00tw#P-b%qeN6#NNdOG2Vb4?+>v6;WHtRMNFPW-dk=$6+s;uWw(qtMj- z%T3ZSRRd)NAF+GZ2)5lVL7HhTQ4hFhETy`w(yDBqdS{eQed#LJuUuF%vQcz+^oNVK z(2VP!0~Egy_r%F$f-m!?jF-)dLzjh|&%BpXmql+w5pOEJD;7d4rIPFocZ}EgKD*va zv12U8rm73dn`ASrdV_Q_^uYib%q0^IJ8%+uaL0UR;(+K+$1{!c>=UVU1bQ7jzjGJS z9e7|E++AX-pkw+f$IBl?w88FF;l|piy;&N@-fx{ja9NdqG1ptmU(rRdvQ^ z6kCR=eEO$j84uF;UasjxH2RClTPUIyK4N3PRVrE_eaC)UQw|U3dA#@|Ctdf3D$q$) z4(BWi#kK0gB%U{Q4m@6XSt&7-ci+{%6pkHBAAQzb(pd4S1eDUy^(>o>?V-2hUL2PKemshpHS4?q3isqug8f?j-qX<0wNs~apgB^%pth^KMZfa^T)=vN z&A?i2BvovuM3@pDsU3x*jcg|ShW6GH`TyK&VhxHMviWe9a|0-|oKFlsFR+zr0CBL_ z5|LF(ob@fUAA>=tWU4m4SFu~jH|>x2D0XR&1Ml(xz4?-vdsf%2%lm_J0bXyNw1j0# zDbzXcP1p4XcdozNn+U6p?$?oBmfRYrT#db#BMz60Zi>WHvO2D5>rlnlT{)iydE`(# zzk0U1V!34`4%Q=D9|?uWGA_lg;87YMkfL|0r_j7AF>Y<5nkh+`9n}XJHO^1Kf_ljs zqe%iLA|g<5Kb#B^?kjl~5&A;hXjSMTX^t23mxa)x8zg7C=ysTc~ zs#s$$z4>#%5FWd&m@4mfyqMFP^DQK#GNYfXXDN+`gbU)#t%j9&sXYdT1#RsNH60dak=$cX;Sz=b8NQeCKqpA`UFj=JJ*p7f37L#DzX1>g zv*L(Q$PnMkngrRK4oZeaNB#Zbv^`GwuL=fahX(!or7}I$nLR-91FoDqOZZW^Uf}#` zBJy--T)6dj0!X~9`|s@5&Fp_?x)1+bkOIYj82;sl|JddXhyR|GGZ_9)!XfAc7r;fS upaK9c;L+TR)fa+TC?e{=kN;N~d<3LV!RV$&<&RGfQe913wc?@W+y4dE00M~s literal 122364 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 N-TcOtl1q0U{}&S~ffoP( diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index 4af4d166108c5b01935fbaed446158eb92f646b5..c627c47324eedbc58994c277dac8a045f682f6ac 100644 GIT binary patch delta 663 zcmV;I0%-lI1+N8=B!6~EL_t(|0o7AYNK{c2zURI3-kUcwIVO&dnA3o1kzqwt)*?5y zh#(_qRT30#A_7EFF3y+aRRHdD z11D2?H%&=Nb09R&pIT#kr}MWqHEpXXmuG!5nUilnjiqoH#gXfU;FT7u3)oy%5yH^i+!ab2idHv&3l^T2m+p=+m2vqS1Auz z1#vp_kr3fIjOT2g^#cS9K*yEUQA6hzMX){Ro0Ut=Nmf+z;do?Dt)y8BA%{g*NB~Ra zMbTAN2-2y-Xu;!QqAG!^AXG(B*d7A_-R~K5wAq0{vwyBgA~jx~vW)FlNExC~tclt2 zA4)V10h9%M1cXD8AV5$9$MfYY6Yyt3^0)h8sVgQ@xRAmarP z6$2GhlYeOo*NaBX-ZT4KHz#C3LsPGJwk~Mf*}f$aEAQxiVF3pNK{nbzlmtEvA-h(u zy3@X+HWK{PFz()7-``k$?9r?K@fp9<5?oyoS}S; zspo~?RfR%|a=En~KboAL%*<3}1BC8a#nIf{wegzS zan3GzIf|;91ELNen$7gs&W$Y_yAloZZpgAve;mu^iEj7O2Gm`!0w#IbNG0{}hfnNM(GWIWVbMzzhpLw{M`4JxDzW1-Au3z?tLm;w{a zf_(&n_*h_oum;2rd<~TyOg2=b29vw)EJUZra-(zxptX^cDz3!N7rBVNI%o zA%x{gVM3~v`Zupp6s$8 r&kpWc9$2#E*dO28AvgMO|MMR`*$u>Z)C8RX015yANkvXXu0mjfScg8f diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 95f895eb74967a4ffcb8d6030dc5024da20ebe1b..56a7aaeda16f5668513a54f87f2ef2514eb72a0c 100644 GIT binary patch delta 1629 zcmV-j2BP`&4DJk&B!4wYL_t(|0qvK0Y*bYghwr`b&ibYsw4D-CDWw!a&>(K0i9%?I zMnw?_QKQBnD2XQS@`s5=4IrY4Q4<5kXiyTDXp9&%5h4acsukjb)|P3Zv=&-A+ncxD z&GX*0)9E6L(U2%-CexXB@4MeQzkANPuT&|8&W6#mLOlmQ2Y>$0f?JHtOTAs~jwwct zl@RUj%1O6X)?kd!Xi=fmwv*lOoH}7CITD6vMxu|@OqmtcX_B#Z?Z4!t7<<2k_{Ofz zZ!($Z>ZZlCzpBjuV~=&T9Wc`4jy5~#b;i%TW?xLdN+pvy+svAr^HGx^&}c0B1?z9k z8ZS>jzfsr!lz)0Kn|Y|MwU@b$)}ZDaLP{u9=DG;Y3U> zKXmA+Y13|w$NxxnV7%4cv$?awl@h|RO&dHPJB?YwHCbYcNt0Pi*r#jPX3B=Cda3^C zPpvJ<^plMZVNDw~$KZVZ;nvUk`lS#?+7wKTOU)Z+GJj>*RDg$$lr~3Fp-~P%bRi7~ ziOU7Iv(b{s_Kxm@{h8P2&903`3bWd>xiu|6ButaL+{{|Ox=OiHIRcH68k`}7L^SRS zin!wajz=BW435K;=mCLI)-glT;P;Nac6akj7tdNesS?IN>grv8=$D)jj^(-*Lq1d* zu16i;gn!I&BoLJ*_r9IREFld}%EMSAcG_W(g%NS*-b44#tV=oU?Zj~@m20|!dzGWO z6e*|%dAbE*nk}fZgt7+bMRXDl6CqU2kb)0u029DDG9f}j6n041P9RKQJa`0#q>!%7 zkPnp>mq}}scv=9*bd6}pvZQUwA~5szI2giJWq;W0$>jPhEvS`OhDk*vV`Ix4_Fb9= z#7#=WuvNlkG^jx)3nmBUO<6MI6eIN*i3KFMVs_essc224Jg)a86=MpZRB?rw)Tubu zoPiWm7RLl7yG=-}it2QAV`E=GDioXO&B=^Qs!Bk1#_}746&LcPp=>rBCB;<}W%h9U z@qd9*NG~kCdN#5gA2q8Q%LZJmgz~^)EKVIYFeR8^q+vy{SF8jLwDn{YiRuOO({Aao zN{%B9rqz_;P{5bhl_xUAn;MCc5`5~nod*OdLlxy%B1IIi5iCndf2R?xjzLqUkY&td zi29|eag@jB*;Hp1@80um`HcEl<$0OZP=BJjLMBc@+;G1f$QBo2S%oHhj`Xy5A{4^9 zj;XgD9@PhQlH>@P{g_Aj-kJVE}f63~G*O3=N$Pu782h zuP0WnnE&Cv4(1LEn~ydW)|M}*dw0h^$peE_AB=(;hNDVKj|~(*V&(fw0g!jZ`x&I( zWw=6!2i8Jps5u5SZTr*9mM@yM>dKC_uYB3tXAVJe-Q!_85G+o;O$`h#kAEZ7j~IKJYrfjPmeEk){S7OwTQD8I-*`#=ye-vt zY}vKDc6p7FR2vJNu#*ia~ z1fc;9QvFZ3STiB^$qTD4oi({2@8pTGFP>et<%5=rSZMXNbBfQaTbInKnSU6&<%##; z81NPedC8jx<7mLko_vHF$xB@j6cG{h_Cq5cnBa>V;va8bRX3>|jWmsr$5vj7#z;h3^zzx%h&u_cq0%!Ephnv6*#M z&2Qdw`>UVtNvFM7z3kCOoPU!59uaY#9fTKou4(Rlmo=X0(^kPIltw;%eCejIf84P5 zM=|#3gXDq?DvlWJf~xYZH(q{WyyEX63kFrW{^~gk>uc72+I%FLEgr&t#DnDprU&Rl zm(6(a@)^M~&lrE(uBffrzk12W{fA#`X>-I-r4d4#>T7nic9n+%OI8~uubbNt*Ter5 zvS1L;Ggn`@W^ThP-?i;b{AP2paB7?`niB84_xgVvHr8rOqnoa|2;TXh|IdG6&VkQ? b{}uZkAPf{yxCl(C00000NkvXXu0mjfGY2Cp delta 1635 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 JPDHLkV1lz;SswrZ delta 2760 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 delta 1120 zcmV-m1fTow2=xe%B!4_fL_t(|0qvDtY!p=#$M3y!=c7B@?dNtyTiQZfY8%udg$In9 z5YnVUUJN{_2}v~seUK1B2pSU;eK5gTqJ|jtL1R!Kgc!pEF&asTL z?XtV`J@>;iyGvukfy)hq z-)7w~h;ldnuHaXF58?7(B5{juXoS#fp1bwZaE66*?`~A}ea-FNX8iA=XA1c}<6~(S z%w1ff>R+^V(Swtde`Io@A4+sPUxaK!f5AStx2bh=Dupp#NCb6$eq-Xj>*KcT27WLr zRgAE$Yljjy>3@}(TrQnQXr8l!d@ts|?u`DL&Ar*tR-w$RiN)C73!_If89VRzuD8I~ z8>`Jz#|pV45$9-5P(+CXX;|!Qo1L4VK%=o2xfo`+sdD?**RaK`Dg8q!TXm<&BK; ze8?@n$ezWCK}oe?d7f{ufn!5!k~Jr9W<#IB2MR21xx!n-5lrMmDj}xLYN`l<6heUv zHPAGx7zvI7QI&c#2vDf->6u}l1)3BRtBP8! zn~e$S3rc{VaU@lcLLx~iIP^vO*e_L`9ZLOj$1bw$EUAu>x;W1iWX>(688b1teldOV z5>Bl|s)B_CUqOgF?ZQzg5`qIySFlPVNhlyeLx0j_ZY--#jTlWWuCKtdm@MG5RT`=g zJ*F}5{FSiaAezLQh9E625Q#WEdg=s~z|kUkmcAit;3BmiE<*>kc8*nQ;N)8k$Ysgd}wZj`x@Ul9UKiZz1uXiDIiia?AM9&w1M!Ae(a^638O8ygaR zD}R@6fB%P>oR_LIKi#=ubZdLO7YVWq99?!+epn|6P7YIp*H95qEUfel(h zK?5ni9R&7-Lon1xqL()He7L(`SMN;GrGE{H!R=4a6=|w2{?mc2FTVZV;mmYI1UM0ul diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index 0c365bb089b9c2f967b37911ddcad16c2e6ac53c..2b949763d36c84308fac4e801198a72433a203e1 100644 GIT binary patch delta 2676 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index c7c00f4f48a5a144f7b1943e6f39dba9abde4116..805e21ac54269be70160cf08dced0189d2828641 100644 GIT binary patch literal 4424 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 95f895eb74967a4ffcb8d6030dc5024da20ebe1b..56a7aaeda16f5668513a54f87f2ef2514eb72a0c 100644 GIT binary patch delta 1629 zcmV-j2BP`&4DJk&B!4wYL_t(|0qvK0Y*bYghwr`b&ibYsw4D-CDWw!a&>(K0i9%?I zMnw?_QKQBnD2XQS@`s5=4IrY4Q4<5kXiyTDXp9&%5h4acsukjb)|P3Zv=&-A+ncxD z&GX*0)9E6L(U2%-CexXB@4MeQzkANPuT&|8&W6#mLOlmQ2Y>$0f?JHtOTAs~jwwct zl@RUj%1O6X)?kd!Xi=fmwv*lOoH}7CITD6vMxu|@OqmtcX_B#Z?Z4!t7<<2k_{Ofz zZ!($Z>ZZlCzpBjuV~=&T9Wc`4jy5~#b;i%TW?xLdN+pvy+svAr^HGx^&}c0B1?z9k z8ZS>jzfsr!lz)0Kn|Y|MwU@b$)}ZDaLP{u9=DG;Y3U> zKXmA+Y13|w$NxxnV7%4cv$?awl@h|RO&dHPJB?YwHCbYcNt0Pi*r#jPX3B=Cda3^C zPpvJ<^plMZVNDw~$KZVZ;nvUk`lS#?+7wKTOU)Z+GJj>*RDg$$lr~3Fp-~P%bRi7~ ziOU7Iv(b{s_Kxm@{h8P2&903`3bWd>xiu|6ButaL+{{|Ox=OiHIRcH68k`}7L^SRS zin!wajz=BW435K;=mCLI)-glT;P;Nac6akj7tdNesS?IN>grv8=$D)jj^(-*Lq1d* zu16i;gn!I&BoLJ*_r9IREFld}%EMSAcG_W(g%NS*-b44#tV=oU?Zj~@m20|!dzGWO z6e*|%dAbE*nk}fZgt7+bMRXDl6CqU2kb)0u029DDG9f}j6n041P9RKQJa`0#q>!%7 zkPnp>mq}}scv=9*bd6}pvZQUwA~5szI2giJWq;W0$>jPhEvS`OhDk*vV`Ix4_Fb9= z#7#=WuvNlkG^jx)3nmBUO<6MI6eIN*i3KFMVs_essc224Jg)a86=MpZRB?rw)Tubu zoPiWm7RLl7yG=-}it2QAV`E=GDioXO&B=^Qs!Bk1#_}746&LcPp=>rBCB;<}W%h9U z@qd9*NG~kCdN#5gA2q8Q%LZJmgz~^)EKVIYFeR8^q+vy{SF8jLwDn{YiRuOO({Aao zN{%B9rqz_;P{5bhl_xUAn;MCc5`5~nod*OdLlxy%B1IIi5iCndf2R?xjzLqUkY&td zi29|eag@jB*;Hp1@80um`HcEl<$0OZP=BJjLMBc@+;G1f$QBo2S%oHhj`Xy5A{4^9 zj;XgD9@PhQlH>@P{g_Aj-kJVE}f63~G*O3=N$Pu782h zuP0WnnE&Cv4(1LEn~ydW)|M}*dw0h^$peE_AB=(;hNDVKj|~(*V&(fw0g!jZ`x&I( zWw=6!2i8Jps5u5SZTr*9mM@yM>dKC_uYB3tXAVJe-Q!_85G+o;O$`h#kAEZ7j~IKJYrfjPmeEk){S7OwTQD8I-*`#=ye-vt zY}vKDc6p7FR2vJNu#*ia~ z1fc;9QvFZ3STiB^$qTD4oi({2@8pTGFP>et<%5=rSZMXNbBfQaTbInKnSU6&<%##; z81NPedC8jx<7mLko_vHF$xB@j6cG{h_Cq5cnBa>V;va8bRX3>|jWmsr$5vj7#z;h3^zzx%h&u_cq0%!Ephnv6*#M z&2Qdw`>UVtNvFM7z3kCOoPU!59uaY#9fTKou4(Rlmo=X0(^kPIltw;%eCejIf84P5 zM=|#3gXDq?DvlWJf~xYZH(q{WyyEX63kFrW{^~gk>uc72+I%FLEgr&t#DnDprU&Rl zm(6(a@)^M~&lrE(uBffrzk12W{fA#`X>-I-r4d4#>T7nic9n+%OI8~uubbNt*Ter5 zvS1L;Ggn`@W^ThP-?i;b{AP2paB7?`niB84_xgVvHr8rOqnoa|2;TXh|IdG6&VkQ? b{}uZkAPf{yxCl(C00000NkvXXu0mjfGY2Cp delta 1635 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 LNkvXXu0mjfpRSUz diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index 7baf56fcc8ca00fa6f36b9b687d79401eb8dfb06..2fef36ab49f53a042982c9aca19d02218895fcd2 100644 GIT binary patch literal 6498 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..73b02787bd126f44d27dc71ded48a5ea158b9b6e GIT binary patch literal 2219 zcmV;c2vqlpP)6~3>TS+953Yde0do!W_U5~oRnN=X~Sqe@$>h6<6Ekfuoqs?wAQPy>QW1qni5 z6#8yO8~%U_X$YW*suGdfh$bo&QffCQrHN}IVmp4v-gWjlJFj~=ch-+tdpEI5f&B2% zNVA@~cg{E8_uX^umf2mi^`(kxjIo6E#6a&$W5XAD z+>uzcJrRGjp?Q5M{J{VLj@QPcKkPr7=DgULPBZmTDwVdKyK3rK+_n!64{;%E+vX0R z-5@bgs<1JO@BU}!*XtJViY$gVn-?aF^C$az_m2$0Z_c@G*#)yu2u6QCIIyES!cHa= znXHuAY#|>3Y8-m4x5fbT*w#7vCEQ zMN{l>=&YV$1G01dQ?dEq~B|Y&5nh+3{@4$~B?jB{97j8~;vMSIn|N z#8e_}W{rzvfm>$APViKpo@GhHG&4nc^3Kr{222Z-m7cTsmUlY#E^FReAHhWg1y}6r zIrmI=57@$SoYaLhIAji4kdZP|ro}A77B&{rTn;K?N6cVt5IEbm6E~CoV2Pu$@4eU6 z7QOJusud-S&KN&#THk)R^XOO#3tZojLPL1q{#lLalR9{9H(oBYxH77_C04Oo29JBn(@(eWkwB(c~>h-+t?F1oV0}Cx(%4n+;-=XMc9JLlQB&!CP>p{VKNNC3%#5(oZ$hL zl=;8}!a;i6U>aiz{pq{ixdFCmgE=M<2_Dx)+A4^EGOVf?&}OsT+gyan8Hf!h_=8X! zsZ)K($&TspI5nW)fR@OJSkxBzRaV5ZJZ;lOr8z+@+j1CZDuqEdEFfoEIA<)4%$ZUU zf-9?(fF`YGrY%BANo`5mCc{H!E)hI|$&P4p03KOHM%vHo<3`T@a^({gsPWe>59(MO zkLJIzY1$c^R0W7n3hF?E$WbmIE0=}HSbQvnW^@gV0FY|vW9?%Dqgf=!$pK*5(n>AT zQa(83Qs97yj^HM*2-3cesC1}A;}#>(2&2?kHr3Z%UTfB0y>4Wfo2GXiao!gv<$e+_ z$uCHP$I|?QK7%C9M{253^sQsV@d~6>3JM8wZyOCIs5Je>=`_Tx4gODO{oW z#rU~bj@ua>S5+el31nc7rMVyvqac2IB+V2Jt}`HwI8N3Qh`G;|I0(p>!z3Y6RnUNy zLFbOVRdMCAirR+QsO{aE2rzZVB(>$T4+ADA&rH%u)y(KQ(|4vD35sX{GX*gy;5k4* zmz%}Sp4A$;@o`aU%{q`rTDX+f;YRC_yd$=6Va{_ncnjR$(BMuB`BLNCMgu2f(4l& zC+H=yPfdc`%=J8(I55B>rQUqN{dJ2fc5eIRw|?=b;q&_JItijQE)G6>*QXzR?npaI zB9ebwibyecd6NA=U=J+ePG^YXsY}T1eaLmaAb7(2lp^BUT?y2>uIc5UZ1ww;wM{j< zUijl19sQ0+P^#cBtZ#b$o(;9(()G`MW#cywv~>>Vfd*w1GK~oim3lEC3M-Kkb zJe6hs*Pq|9>Av3_ZSR?`A;677p=m;W%5f%>dN2q=7$$ja5u!M{or5(g;`H5nZ(sM+ zo>uAsN(uSy=4&^szGC~MheLktrTaIoYFy;yCg|4=KfQhD!>|1Mwf82FNmxXhh|03$c<&e3H6zuoJy{&t0zpmiEZ(U2IW8armMty35FFd%o z|AE_^3BrhABpmb|eDI4mf1-JI z%BcXVE^-$h_VDf-RxYjj>W}|m!(I;>s0#~oLIUc{SCy8>$jg>X7@>@Ci_5{3tZJ_L z?L#*#Z>YRT*0}`azVqfaEscxrIQT}tX<-grAp$FGHvLkeeD_QNCaOGb`{(+Fgg=ZX1lv!UYwV=9RMM z^1$9tt=_b}{zE5eb}Xw5y?*D72Tt`o@|V*Csp*XntZ4T6Wpyu}?t!aUSBJN@G;Ch6 zn2`dS{+9yk&W@{=ZduuI;B@byuKrWecuPfSLt_n#1WNw8{l@4*U8LEjBHWUB=002ovPDHLkV1f~%J_!H- literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..bf075d0f13542fdc356bf9e72bc48b122d901892 GIT binary patch literal 5217 zcmbW*)n5~UqXlpp1|uaL-8s5zv@lW_2$R-P5|UEV2-4jp9iqSnf=I(iNl8IKK)PXc z{C@ZGzTMA#IOjZ^|KJ<*Twjxvn4TC53yT!0rEc`!Mf^{QaQ@qmp*Xl$Sk$~wbroYj z>;nrDZ^nNz#arbp53sbE{3U>gQqCft4s;ARGv;0FSiwZ4sW>O^Q)Up`(qpPt&Q zPxw=K#OcXpd_&l|%CUdb-TgphHn=_gZ_QI1?k2p-XAZ~40ymHD9qfG_zQ7L>!CmM3 z(Y4~a1=m}hD@#Yqw<|dxREQ|;(g`->3cIoZc1Vj)x|t;DL!Mz`aG~eiBlyFJ@5(t~ zI^MK@IRBS(Bjp3d?=i0sX#76quOK9tqkwhD=ouh+8u=V8?abg%4?#AX9&c+7rjVA%(h$Cw`c^*?tPeYqz1eXdnuO{Ks8BpA%AIfdxmc?G!ZaoD z;994CU0LznzP_qo+!6(-9%Pl1w`|l!-*%e(x@zyYmwQc?#uVT>-f@8A%YK#yI0)-l zwp8#nZ4~_ZJ_Y9}t!y!ne4lEHN9?2aCu?#{xv`HLEYJT|Fs+bzcO_F_uUi7J_HS~Y zEb$i2hjO^ag^7I<2tAidLQ6C5Kpl6}fmaqT$0f15DE5pZTv`mql8}IAp#zqZVazTm>t%BT+yi`wut_f~WwLnVWJkmOSzr_wt}sw3 zyZlsIyiwkP+s=?FW4%~waO=|k@=&Y%!EJzt!J(ylp8X5XR$af$xdUymr4aBMEwj^c3VQ- zZf<7gnZK;!`xj^0#KI(V+*#VtCcDj>v5H_c)1PO=+jRF9^irn)h<7Dvd&*&tNt)Ov z%MoX>jw*h#|9WWCKp>C(&8)aKq?s^a| z;72Ok)C?*+4Wr68-ndcZBSX(QSGx^YdNxxg1t51Xyw% zbpA10c&|>UyrR-G@ffdwNIz_0mkLHRvQj7Oi9M3dlG}RjFZ)Zu1_QOurN6l8dJvYK zb)UDCk{D5%#uIVLYg``0Wzx(IL*yZz@(zOB)#nB_^i56jVlLjD|?D6yIfEWbS3_+!>-Oea?C=p;q9 z8oe5b#HnCH7XNNdec+o=s06%^&SvLCsDg;tY@7Ug-vs?OFwu=c5AqG6qBBt>O|8n( z*FPKF;yf|91h1;$_DpTqb+^%`Gfo$33NZW1ldAUo- z%3_f;Yb2#rp>n|QY%N{a-tI{IlZc@yjf5-UAUlv{7QuXmpMzFO?qE&6p=wgC4yBOogHZ}= zd0J=|O;dAna?KtU?^ujBT+a`Bz&?l(X5ww~4H!_DNprIY4~M67e8OX^#Ud|m$AZ_- zt+U++69-3>uO_8Ns$=tG`(_|%>DUgZW`e`n2Yy8Tqft*8JN(fhEX>XW=rFaw#UT-f3xMak3%QK01u}nPyC+ zlw3(X+N6Dhni!-_BiSmYER#|aYnB?H)j(&F>`x69MJ=~ntIWdADZ4G~)2m3L*giXF z*Sz6otbpEH_V$(bWlPDh@;o8CW}`zLXC{E>iSeptb0ESx{Yj@m1x|;KFaMfkON<&V z*YiAICov$Aki^f+Yv<@Cw!k{ngYn_hUlM;7*Y%;;RUy`7p9kiNh{UZ&T?~lI#i@S5U3lgj@yJ{_u7nnra2P^ zsc$S}s3k2Q`lLF8r!`ef{NaacH#;tyB%+l~Ri>5;Fv_2vpN-Q* zR<5n9`TRoP`E+(#v^VgE>@agx-#jkpN@f1()b39PI#oYK-m~5AFAck!Hj6zqhe0@a zj?T4Uc(&9!c`h3RgW{hfasU859WEQIL6sxfJ(cXQp)t{F{T@|O$`-IJTbz7kR>v8O z<`Ck1joE%`LdT9vmg+6ToUI*uqXkXEu^lcJVRAi5t(m_cFijPWt;)tFVD%c7>ecEw z6+!q#`5#<~e!SrQZRlUGQ@4ORYWfgeeUh(Rx$WT=P3k zVLI@9)YsUGmE%i4=jdZRBIO^c-M(_4ZTAOMZ;9~hn%Qg)Y=REY)-Z0T3e9l`3dt^VX2^n)Xf)(-M36M zjz&u;jCcz~2*YCRrDd8$mkl{pNZ3iE`49q3I4ZFWY5gn-$r{?+N%I!*Kh?$OSrxx8 zIx3sSgbB)jf6dWUIgU|p@4Zisj}0Uo^L7G5tH{qEL^(6gJHqD-X7n5Y8j#a|eNm~{ z1UZQ9Q!(`@S^Ka!Pf?PQsm8G#*@9$a1!g&6d+Y=Lt2sZ?-N97z4lld+{AWC9M$JsX zp`&hmi180cx8C!K!BFrqdM_xQ%GM;_6i|+FQKRuTVG=keP1@g|vO{~&<4qTU#*uDH z!*|(IIfY8g@53qZXXwgY7bsrH=O!}E*dF#%%=@0c=U;c;)T~e8QIj`TVeotFyOHjQ z;WHE}=3eKLiL0gJYQ+6i_NCS?2=WSH?%NtNKPW!tg*6`Thj1dbdu2S^`CLj*R#bV_ zLKk5-I1x#Zk@BQY24#ehx}=2Djkr5Vn(~r+wv>OatdW;ADWcmuiiYy+-~1(0Q!m5>5WPl)Y-o z^#@tFK~-uF&6gIt>$|*=J04vaUz`*FlT|=zwji#W-g(G?Xw=ebJePAskj*D(;ABEEA8XzM3*uf zr`(>#U(%BZ%1OC)s_fhapY*R`5b)ZA|@zXlrKAd4t~Fg(M?8jY2H;juv0zH1h+|I!N@|Ju}7)b@{+}xjAuE==ZuiVkB zpHtJ`?O`-KFinfWN(%i+j}n1g`RH2JX|uzpWFJZmGlesSz`}VBhTbYhqBK_Ybo8KH zFvbwBnU^daIR>9c?sR9EPaRLBa~hfzin{wK z#u3D=WMqFw|0vRp#V%wmb(<4dM|Kle_U`E$%<1|)VEu+4<6m^=3GWAGnOq4d9l-a?FnVh1h`^Fz5Gjak%k z$#apiDeNdVpkYqF4B3jc&+Pq5`=FtGqGJtdyXVo0+xyLkz@lI!MjMtNK4{6Ucj*sg zrZBaC=1E_^Uwl=1u+tfDX<`Eu6I41+Z4h;Chk1_SC#r!I7kdVSoI=H3UEm$R-a-z5 zBTD1>PfSh&X*f@gzho_W9^|-Lo8sC_*UFtC>l&qu@$>e2&<2B=8iRzXogV8to&HWg zf}YtgDVJqnC*TX)J`?IiY4LYaTkK^I24rTyNg~LQx%|0eoG6c2_L%(Ae`JYx?VSt9 zbEXAK4xYjn-S9YhdLEAw0J)k{)8Ao#*CwU+=NJn`9B~A%QS-C|W>v2u9%>ZEj{f4L zeUhz_ZP^e?IFw6SS*!3-jDgcmQn$NkvBI?Ds!m{Qytb&ZiH9tE@@6mVUE}oovqCzf zaEt}9u&=JQs=Y8X8`E1X-p=SxaevIFm{HscPXi5-X8?CNSx{0W6?+cgEW7$&oO#jp zkR)b?t9|G)2gly$pTF1gbrQo1x2s>vYN85i1Os5iGXb>-0@(AuNf}-`CQ-W8p%|Pt zAAcFhzDCI#03?a8t^Kf7{OE`Ohb+aIjsyRffgHy^_ezk*fDoYcRd@5x7xiw&FDQ(j z5|{$ZSq0RP*+A4lX(-_e$fWr}iuVllGtJk^<6ahJ5LE|aj?Rtk8X^DEdi&wa;{`P7 zB%A=58Fux>kblmecUb{7k}Nc&|DJ*|hQ;43kXGUa#D8Y$LxM>f^4}Sj9!#nIrnatd z)^ok68R${c)U51eMj-{FHAiklG(J$y3AzMroN@(^Lpc>SLr1Kqn1dcG>MSpp7Fn2? za*R{^J9Wo%9Z7dSvW_hIPL?pxjw%4kO^JT>JeYR2uT{Q1y1Bj$l*|&g+v*r1HnHOq z6^OGF-(~514|TR1oWbZ5_q$+^YS z=Cfj&tRLq2Zu{0+T+^} zS>;eGRDFWT(9IamUFrkN1#@DYn0sSY@ovd%RGfpv)k9H08i#U*V9KhnDfnjS`w3hd@~x}%b;UmTFCAh*HT2cLs@jDA2ZI3L{Qv*} literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..06903d93256d55e9e3ba37240e795b73cfe3e081 GIT binary patch literal 2612 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 W@75&z7H41p0000z|8WcyIWGnV%?}M#B?JFw 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 NUjwY8TBB?k{(to31_}TG literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index 7baf56fcc8ca00fa6f36b9b687d79401eb8dfb06..2fef36ab49f53a042982c9aca19d02218895fcd2 100644 GIT binary patch literal 6498 zcmcJURaX>@!^A;aLPENvyB3g??gr_0mqxm~myTW11(xnmxx+D5ij`%m zmmYl2)#PJv+g&22YReRhg(b_&hmJe`Glm!cmlwXImK#?8$IYv-v1o=qORZ>RYRiEw zqMcS=0H(AQZ#^R&BXzwuRDi$#7$^vF}^VxeO^NKT~E zlu{owgfAwH&UWi=S8UEKnb^R0zRQ;v>-W542Hn^cM>p18=!TjVJ5yoS z&<*<+{wEzCVPOxuY#Y+Yc0{qu63#|Xa>7c^Egwq&vN?Fz6~`w_3VQ^1jC%pG^SY(K z`wSGdP>TsLkF&H|#rgaGaDmTtacfo4@`Zx6|6OeU@OQu4I#Xw?6=^-#u$i_vsuK0G zLe&cPw>o@6`NTp7%Kjug)3InF>uB~d6wJ&=`_I>Dk%Ki z5rEf2hL<~UjK}g&1NpNeg`%ypSG`;D~-VdQkvzMD3X>qq9h0z5zZnJdMfdJyUhYgh*CJOsP@Qp77%OiDUxW zoYXr^nI5AmdXB&xQk^#fnCT=tRz`hC-j9_*F&ds9K6-XOvb1sc?^4 zzwjvy7b7Ta-Rdey7Q<(#UR0@h3uU0f%E5n5XgnbalQiIbE6-7dhQO!KK#LmvOxDsqM*n@NN$YOx}4Z1^`D$i_{N{9jt!X5{dQ?8J;UZC zt?=yiU#V9)DtT#ocWHrZtI^D#@!Ty`@0nD5z{*BpvT6R?iVHSMBnwKs$2E7trsQ;r zGU+a>Ej=6*Pb-~MM3fJS@!OLZXA#1-+Z9&g-_(jVXa+J$2*dMJzR87>5bF`{0>lMS z1qX(RxRX!s+8S)8Q@c=}fS1uEJPz(6no{y)Jw&n2zZ-mbnQU@(>fZ7j6BYyVanQFy ztI;S>?J#M+pyvv#jQ~(1IOE@HW!nHUTGy$tEp8U?Fi3ceO$_*{$&u6Y#1~(`uPGK| z{YLgfjYgg|t)0?g9}rzeHHOTqt^_unkG!WJPHG{(QFB z_tcokJb2=L`f_!el;~m0f1~>Ysjao)(6@8bZ*BWc`0hy zm+B$VPZ$6o+h7-76~2&`V12c5gww9V7E@#|q$)M7N9f5Wp#i1HT(W3X^Lp7p5hTC=930T-rmZ{nhkw_bE25t3+J%Yl)h`g3pyTR?futGv5 zsfS--TVm~ZEDZ)e$nULNc;k3!8Yd8j`wLn zjJGZd|1&d)?aUWW7YwoBY_l_}Pk60M*}P063tOA0iM z=uwLFD;w?=5qZLr`ZMKo@A6Lm+@$+wDofaD?6r{7$qF?*We!L`MjtDBg-Zy*W@484 zVdjt=$5)+_lxl7wh0-nuFHUV$i%YF%uk>s}*@F<+sR5Xk!nd!4o3@lfY(1tolPv!t z8YCJ=F2+Z=_<}G09uA#d3>I@r0Lj{P=}YiYuM5?7-)KpE)8^W@9<$a`EW$#{P5I)h zX`VhHRUe^D_GM*q5Ar5P!OC1G*E}dz&?&m;d638DX?;xobs14@fxW)l(edt+cez3C zj6;mR@=KJ5*cTN_x==%P6>H4PA4k^$3K9Hjxt&iq_a{0>NaOvw52sT4YSB}vBmqR@VHDkUaL}mE>DH>DE_e+POfqYMkw46UWqgY zEI_kPiEk|*Lgfc@ zmQVk&dPk6HOws0%yYs;#>r0ibW0lm4ENQT?)I{BNzY8D1RhYvm!>lcKtb(i%elt59j?DzD)eOLyG`5wvl}t5e(SeQQQrSzfTgx z%Rx1r4F#yfWZfoH{E7_)bP9=g@|cQ^F9o+ty21kNq;L|I2JeX=Bbum81(a2+md-Q| z9Iy?J_x+cJZ&@?TNn=WlS8{G~P1)c7x(^ipsCHoWYE>$h=`YO$z3sNU>ygK95fVAVq}830V4@nzSc(>bT)%_J+*Z(~69<(z(pi)RDXB0NRa#I2u4P2TwQ zitPay<{`3i!)&|xc8j~I`_C!hvU5m^phq2qyjO&|$SJP)?wrEWTz8I$uS8U~NO=P6 zm@Pa*;o4+$@@;v@F0Sy@6_l-(9paTA%M<~T&CYW)ZL2<)jklR{OT>wT)OEIqxNi=R zt6T`L876i+*o`yPm!IQa+N?ssS4vRFl^)TtbEnveb?rT<+Zo;WdpXQf)7AwmpvpQm!6HE5W! z(91hzo&X;}vcR_n7sv#(M|9jlbw#V1V$gogxA@XC#POH(yCCL+eGfpUd-SWvs`|&LR{-HDM`s0OQ0#$^L6dd za3ei_lVuyca<1{ggA_yRSe>?`l!G@)o@Sm-M8#6VjU8g%U$q>)Ur6ZneZZn|?Uq@F zpVM$XcU1jINCqR`c$id>A#M2B1%c#)ER`M%B!WS(Qq(XK@OK^=>)?^pY#^_ zinMKaiu*Km+ZaAGS6lr0-?`-WR+usA4Tk{=O7naoZ!7qM4{K1u(9XizD^Xd7`>(J} zQ&?&&%cZyuJm(Na40Uii_Xdzo8rvGV!`C77eB*T>8Xee$@%0cdbt=BmjkXVp2dXJX zn%RXQ6IrD89dXK+i2_0wC4}Q}T6AM6R_6}vD=T0Nhvf%_J37h;C1el3!%C!RVv+d; z9x&0sMZq@Qt5`(62zS49G(J&+E;}xTZZtqLiAtYOLlpxTj&IAt_RAp4Yt^$qPADOH zkqP~xn?_RYa}PB>J!)&b1SrYh9__7`6S@`m0!+A zkoRg&PiwYyxty-{0@S5ICY>|BGq|*L#p`u}_LuAa?@zQAk9FB_O!>crDu~dbeETMH5QP;L*{(gwrdD6>>00okb{ju>TClkwK)@+Ky~cn zM8GsW@!8t8tV5*F9;=S#j|f|sLy!#%;*sg>`+CDx)$7ACtq*O)v$|6G;HfC8=J^#s zgT-U+VZ1x|=$rGZhoxgi)9d*Q2T$7$dAD6PZtna==E<|5J7wz=*P8rZMCEzalD-E|IHoWiQ?QmNjS*)V0n1rhW3X;Pm<@l`G)GTkeUP_nYm%yU?vkK<7D$|{kkJu-#68lzJskl9q_oCiB{<@8T(GW?eaI% zNoI4%d9+D0HB}m_UWPmAxQP9fv_+Fm@4aM4^HAn}+e`6NZpOu$Wo+%;*vtjX)W^y={>`842-vZNdC{9@f+GYPCAiqNbg& zzCJ9Lv`D;GJ*{m~kcsK>KIE%bC-T^ndX4iLL=R!>HM@{mA?`M>dt05(b zeNC_q$Yar6V63N#%Z#GF7=^gk4qP71JcpjYjGu_*ru0&dqp==*cKqaQJgw$Sq_G7y z@2vE=?OWs#@7!xK>A00k109Kd7r(CM&=-lP2l#IyD>5b3L6Pn{Ibs*LhPySC}gKF zPh!LCgyH+gC4YG9zi`3$hJWS|{XMUj{TB}BwVUmCLOr=V0=GToM@SQc^Or>TH;HUL(+{U81~q2ue7OfJmNFZzy|dT)6V=xpRln!_ z3DAZC+0GA7ziPrvgq%hRBxV^wy*49X|0x*%{URz$A@Z$|o|EGXVqH*seq_cuD!<}XiRabfTcX3Az$4Nn-S5XKQpi!Jl zSE&2dmJc8ZyL+!_JBBV`T|27ok9_9E8fS?h-aH|MeppmmS<1AXZ8h_CGSwK@~!RZ8qk0umGf z$Uphbe=#fkG*XI%*-LG!ldbzb$^tLrWvhmC-E}nX^MR8dT6M+L{cN&?Q>&tt9QBZy zh$^2hKNl+P$n2mC><3C>T#RUS)rV(GK1Gldc0u=t?4(bP=o5D3k9$FRqK=~p?@-6u zkIvmjbHE|Nr`8Mec2=agvx+cpz@Uo9O7#T3I{b%Kc7!xlYOwByGqQ?>1{l2kU;SeH zXYDj>%9(Ajsy?^T{MC`|hB(b0m!{HTHCHs0X@W58Yr1MMaqbVbP7;FFGYoQypxgfV zbMu~w-n5kD936DS@8-*Q-oq^2|CK6lbt5mxyE00rIntUv%5dpt%2F%!tJl%-Z7vt> zhqe)0FPZ~>gTR}Dp3|;_y)~BOFWZDgN#f1zT`y&%A-?*P7@FKyWj>;4+Mi=Y zIZ@I`=k+8XWA$tsgOSWl#jUHn-IFbzw>Qi$-e6h+DzOj2yFd% z>2;QvhIg}vE%vd?qg*WKM+oJI+U;drY@5Jfzk}_!18q2IyU!wA2b0b(J9S%%>z|%y z>j=it{(Yz62xwj##syimIfCk64IXyy)4ZVjcuM8jH639Ht+I<45hAg4bVt4Nc~$=Cex sw!NBDJkPg^y=5_aq1>te3;s#!7%?q+U0a*{_njaq%WKHh%2HKA5eey#p&JAR>Fyl5 z?ss4B^L;qyto;Y!{fepdnzyW)BC(^DA2=#n=2hza{ z*Bgrw;vNI_D`Kb!ll6cUAZZE%Q-Zq@OYo(u`Q^u>g}cT8BTFO8nPCFQU~j3iaueU1 zqtMP!|DQk_C3TA0YoyK<;L%tYJkL%M+la4H=&F?BnDhT3K{0X^u=|ez_bg{>QZ{#;D<-$ zX2f0?A%ntqud8K*5-#iO)ityra0X*JVj0LI{w4XK0cD>Wz4&o8Id!xN+vy2H>zvF| zhmB6U4u8Ean0OX0tNbH|kr!24g=hE?M#PZ0p|w)e3VIqD8GU`W-vC7$us#g2RF>l- zm>To5hO0<#fs9eq{rx{@#7Sr-SwDL)k=3Gc zNFjP~HvBrPYYFu@Z;3n#m6GORD`-L|ZLCa7@rCl&ujhFv3ueXZoZ4FYXYKFIvQJsk zAQ~i)(vcu1DgYL|81&_x<9=nRxMT|WR$YQj{BIhYB&p^JT~ZT{SIhxCMtTuy)rC8d zrh4mlw6)%UO0V)QhN_#eDc{^Dwtc7ff zaatg*^$WSe zESu&V*JY6%asfU8MQ$nfwJuU}dMYqyk0ajP#jguHMHxD^iX9?9#qv=37l{_WD-+5N zysd@ho_bQo%mZfz-*6B#JDK(o)p3OoWj&F`8~5dGg+|&Wa1dKZQ;Y$*mNz6LrA)K1 z4O!ug-E~MnwwL~DCN7y}X>RVuO(I}>%Ki__zyRm)qHp2;#co-)Fu5P;F!t<7uP0@Y zl1KB`0twBmRr-K9U8)cxJ^&mU!NIchseknq{xKHjqa(7DmG1V+=+JH~GT}Zswe#H3 zfjD|Q+kW(Yg5CPUn%?`*@#k2H9fpOJW~BauQN%rEz_$ z9ba1+3q2+3n%>?|?DSYJ;%h(yHNt@NlPm)BT|$^Z+C7T*=+z1!L$YYuQ(bVa8^%rV8qGRYhHCpzLm}q+6G=31#P(j3qfhy9%D6 z*QO>ia_4La%I_8%ajQ%~AhLMGZfMT}Lx}#>`Slj6fOpOEt6BY$$QC6?oI?@+$xAN2 znnXy!ez!z$H``pvAWnO|xNp;^#PYkZcbhQX!_hpYOE@+-dB8Iy#B--$ebKQ&UrGth zl??k($Yd{U8@$H*<+?3_ew1c>RuK*jUW+lI*dwKxB%u{}q>YOs)1f-q;+ogZuv27j zCsh2ly@mr|+@2J5>*N`|*I{oOKa{?Q)nzRHHq_kGL$BJ|ZJ#0-uPz97DQRQ2vSWS# zp-pwPLILtTY*nrypU8mgwo}_o9xt%#S>StwlyvBVUPBh8M9I;wq1nmGn7ajG@$5q9 z*bqhdH*$u~oMHoSe{+&!`Gq-9+)}$|w!FiJuTb|=F!DT!9Aqs)Vemr_O7EYM&FqyF zAG6c;EsfDu3IE(SHkAoOBv!TcIjEhC>g4kE%JZ46B9;}(spEk@QS);@&Q-L;3l5uL z4A*LhfZHdsxFd_s!kJ9TuplSDd#mU4jP}iFY9=bXF!CR2)TaC!r3&it@NbGB9lFtZ zB@rxB1gdwCpy7>~1}TNm3c$=33l<4GV-aYTf%-_o{~XW~TV4!xM9;uD4f=vl0BPs17aqW1V^>lv zcxCB4keyA+-!~1NU$ve>EDOJ!t-VWPHk;)ZHD;2gG}Rk>Q``Lk!O1gC7su<$6R{qM zSE9=56BS=Y>$F%0NA(ZtQ$Me-V-wAdnBtDE79MoLS-T&(qyW|OZg6w5Hpk$m#2e3?P#f%n}-H`o#<<3!(ucbJGzXsVZH?+yp@K49l5=&77m97p! zd`Uw!tMYRGji}Tz@=H#zWf0rrWS$_@mK2JfQcr8J1#1#Z5Ty36N4y$YAe=j758q4} zR|{yP=-KJOZs=# zJGmEd71^U`Z1}PpXr9x-tLPRN&u&X0%Hn0SkXA8bX4H$!cZ4wPY}*J*dTns$P*rth z*XH$LWHhz}hj7ac`ZC5u;gBy##M=bcaka&&>og1NZgaVwiHiB{?dOr(tnGY9()eL` z7d?Pkt2GxnX$Jd5r(E>NoN%!XPnC=lJg+Rc7=;kJm}*1V&st;+wX5oQ)me9muljNB z)>8_wsL7C`@@lI^sh5VW!!$BR!Cov ziHYkJ{&~mgIS3s9mpyV;*2wR5`$g7EhF?DzIizR&3}o-?on(giz8j<0{HO#e(M|>x zksfS9j9EZHGeH(9lSuWnS_{0$Uj5SG%$!OWkBqdb+7H$HGpA)8S$ZSk*ANUavNmr* znPU4pX^J!r!%>1^{E&Up~$T>G*lp z3vBONl#mZFupQdb5pBxZg!*?<0H2~fN>P00sWlRc0H}pv>XZE#(qS4NwVwa6cjejZ zfv>2@OI=F+3GBR|N10A24U)Um=aq^Z)g%Ud*Uo0gNww2P#eT51uH=xC&2p5iv382D z*q6vzBN~yQNgAtnR1gts{?!xv7;bRQH8oYLih}`Haw5^*VeJlO4`fYI77(@i;G}I( zw5&sf*ud@pn8dn-gunao3pXh7y#=}10uA)0g#6_Q)yBm{LkGZUdBZjb9g8_?O7g>B7nUGj7#{*k|<9 z5a&IdhDa?qVf|vUHXY5!D!z^v+pTY|m&<)zT*j6s=C>Faso47>Fxis|Yg6z*9x0n0 zy!abhKaz9wHflL}U)Hj7=~^Ch@;KNg9?#v~d6*D)m*$m|hqY+$Q|w!k_Mr;`-j5f0 z#c83B@*x(1ZMH1s1et8Y5fR4k3LSOHkhhoXn3(D?3nM)ta}g}a9gzV7z`e^^6mE0O z5PO*<^5#cbVL57_4Oi!srN(yd6oia0MbVhi1GE|)Q9@E_)RZC87KgkLFQ#iVVuyG!MS?ZLbL98!i0r3ufA$-VA9D!*{yHm-4W`v4;%SS_pkDJgW4nY>{z zZEFPZs~f~)5Q7ugaliR18>C=3`_hgwfo1Tarj1f+vP!OON#>adm6oQ$GXr=X#s2J} z0OfnFI9Q#!SP}DFP;|j05X^;{J$6l@V=F_33zM~8HJ3gCej2P_6*r6*Tb8&SOF<17 zjz)_c&PeDD3Cp3VJz_`(2Xte2FPK2t@BTOsiBp9MA~;dWPB_0sBo^Pq<>3)OyknH7 z7vfXS`y7y@6#tSiEMj7U1fUh!C!j2m%8&MQj;WF?0t>N`MnpOW1*(KC0qAKoY;Db~ zIF!J){nWkEi#EsMN7 z4P#V*D|mhW&F=6@K5S$Tpgpd^zuOpZcM!D zj9Pp8)PV2!&djJHA%Pjf?r$~G!(m(DtzgSZCXn4HX_Jtw?iE#Lu^+8;a$UdPvAa2H zd)3}^;8%Qhkly_&zlTe^KtcNW6E*O^4~;QJqNoI+rm~zs7WS=r8caUc4l3uxG1=3D z0}!ZlU6|RnIROrOL}glSMuTjxQz#MAhbtxG)hMC-jU2qDZ|`F)jce=!^@*j*fH~BW z!~%I zw6+vKs#{diRQ->@kiIF_HAQa1SN?2JxqI5idzYd&*0$m05RwQL<$6!S32}JiMsp1N z@8Zx~(@<+(GK)EVv;8av>SokP-Rc~>F2F-bUnw0+&$BDh$6NEm$Jtt^FQ?o*beW(dS({-UEhTbt3Z1Z<^J)Yh@B47r>~MD2is8e9SPSe z{lJ0jsIS7*%Ac33wi$)lQWLRJ{^Z&#MNX*SRyYeYc8_dEi9mKCJ}L^>#;0NBTTKwB zMrt%}ga_T7Z1QsLTez{P`Ok&o(>?2)N?(O^I~V&b93&$D6`3}?37v04Q2MI)%5{=R zcxi%>h6rG->X%7-U|K1+;w4Z8R*+#x`Fq`V^tSMW-vb43ecpLU>d`|h2Jc3o?KY%B zmDWO;;E(;tx89GE=>VD!KUGC^e+a}cNjt^PDgq~^dcRcfVs3Hn;00?pKh5FF85z*u z--dRcwuZ}!sGwMX6jB5cQ2J<0cfD3>wnV#TRz39f|LO34JgZs`O3{9Ts6b00%0(j> zgw+?%;T9F-Utdm2mXyDcwn~4lU-5n;iyE~JK4lh)cPlPe({GrePd~0?BIUg}2(cb+ zX*5Uga9A~MoLc=knm>1_zl<#f18)Mg zF}Lv#_=8J7p1=MH&8b6Q_2y2ui1ec9h9a9UQEUshp|#T4UOjtIwXp(2F;(|>ypa=v zWwW|{RmbLIC!dzb0g|zH9>Qq+nc)9xfU3q8a<+&6E zIP66AvXwa1r}BSt{5(YIv+t3NMWAJWDr~&p_=re%z%vo3n0vS;f{8YdWwUCw-79N% zhHl)x?z}tWiG~UdG~T4uT{}`wLE!~uIRa+2>lv^&e|VQm&QD=Hh~U5e)AF+Nq=SQ^ zy7*zLgJazER7JCFk<4BO(N@CpyjTjeL+YOM&uQRFaEqS81_y;lh;q~F$d_%#*0Nge z8i8+RJXdnQS4PWo!6&EGmywiEssdv|R<2KLi}U)+WB&v?F7K(hJ9VV3K0^1;lY+OR z0z<`QdN-NyvS?iIi#bI_;3`pAb2<%XUwS$Xc>w;VB9Sx7=}vjNrSW|U65#0Ju#-K4 z@$1v@KUfdgLFTjjB}eTc4_l%{|30<{H3e!3^kS|FQ|C3WH^%RM?zqoU`rFia({SwG z`iRJ{(6;;1ut#XXA{p+YESoTtm&$@3+=c)r>-uc~O&~VrodOlr*J1=(*(=DhnvmOr zL#rm#CMP)f<@XT(3m56?&SQ?yklR1UIBkjUi?=B`0`jRPTW70Po7$9t`S%MMcln_= zc}v+A6^gX#CbsdGIbzV3EVFb4*U8_GNQb|57RM#{(9bw^#(mn=sX#YuFdg9q%0xVL zwS}mehr3yC%}4I07sj~w-PTNdWu)(iDR|1GndkyyRFu3O0I#7#;WPdtD6EETu9tn6gl`Me$z=D$C)Kki)B zvYL^ry%aU;&=sMVU+W+XyG*=CAgZ+)XRT zf8L`Zsw@oKR)<5mt(?U4z6;m?QpAY*#lbh)lhk4ZHXnM>Ic)J;-;4ZU_7T&ygX8G_ zZ~5ic-I65DCe}2$wU==PMN@>Cx}@5(tZ;Aea^-`DY-G~>-?qxtK$CnEa`h+sF=C)P zeBonnd7X*4Tj1(w(fYJg&6uoE1DMy#2^B<)n$ni_-ktv^mV5g6#6D$K+gOd>{KwyF zGya&*c#uupETzvI5VD-mD6$iHU+z`ySdMrqUE<*M64J5qIhxZfXIKgZ3=ago^@;LF zBx;A3SpI1gn5*@-Ous{i%CGnIocYK2}GTx5AXY0G*(N#?f*HO_Xdk@ zgf++5s(3qjEMI3+7$>1|Ew$~tOYz1tt@5Q93qiU=6G`ta&UY^}aIK`TJ+IUe$CzCB zn$X<|&pm=1ZpOd$xA%K1_o{bc{a=tz)cI{E&4_~NkkIQ5Z<(KwN=o9^THY?r|1~l$ z)kef7MmNV&?wcIu&fDjFPNCXJ4Ue85x1*yoqTeL%)@j8dYx1SaL>=4#jdAvXC#y6bmpzE@a}49g~}W!ASGOlyw{8iA(PJEXoPlt?uZ-WgkIF1L-#+)|2@(D9bGXrq0>kZ l_vFC*|H2{u57KxdHenOa>|LK_{13kXG*qCFYNfZI{|7Pjcsc+8 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 28d547fe93d432a2460146f333f8a466d1428b95..3ead9ea017e94a0ab5bababd7708456b97f91b50 100644 GIT binary patch literal 10916 zcmd6tQ*$N^u&ra;n%H*o#UyG- z6eJPh@Zdl|KoF&+#8m#9E&o$6VE^^zh9q+k5L#PlF<~`N&?`UKKmzrwfS&65-ii|e zwv-7#3Ox9v9}Y^Q=uo(-K1XL^eKZt`m^cQix%l{G@lV*cI)r1Q`U*NKDU>i+D0$*X zwwwj)%j4trvRlv3%lUPQcc-N{CHM+cN|wO6=hM!O-|o%FPK_pGEDNw-n4~@41C(G| zpZmzk2tI-U$!fanzY;>AJ<2Ku)}m`@Ij>YCzFz#K^h<0yC5?5K)cEX^ssN3bZ&%HbBS|n zjaBf7wm)<$ArN-U*o2_q`a{d}D9-gh|4p`^ zG^H@6(O#7E^GzxAgH@ob`m%Bi4bue;6)(WUS-SG{yY?X;!Q-ZBr(w>}uFffiKxki50*XrP zx4WyvZ*sGztpW@|8AP!Q$ZC4pE=BQZ$#MLC`+f1izLl`=&WZUz21q66rpi zUmESaR9M~V%)J$T9-6Fg%d_JC#|#w0g+$j16oMX}KP(Jrxn!6MUrttg^^oOv%oBGX zck`j-gcZT-2W|WFJyl13F`ZZ+zK)3Kq^6$_Nds|Tl5E*W1){H}o|h}}kP=75U!aUX zG<*h$1KGT(P4v>u^qTG@e%Z!)jN!B!m(UAUHSRaBcDiG&bq_n2pOLVGSNzZgaS9l_ z2q|zG;=;9N_GDs1$bm)6>=yp&&RXBL2h}FL!udbfFzJ#5AwdB13S$5WTyZ8zFeC`&iMNr?ip!F_o(dU_-2rsGXhwG7~ z!(h4-GF3~Nv@h)4^Z4j6HR$ogOFN&v2778{WPD{mAMLT{$WjZ&6a`v-hov%I9IU*2p+(DF;~ZCk0~)Dq-~6(SH!5E zQi5#Y9OUBnW}X1W#80QkOZfBKYHJ&tOAe6{^I)*kMbMW~jeVQ)cSUlQD`{Qkmv%2H zL^C%hYC|0>QmMbda9? zagqsk`I+r)H8sl@dE02|aFug?u?Ydd+ai`AroUOShw~7R(YW{96r_aGYKtvX@~?@q z@$(4C2+3kBzZB=vwf}$vd}#B*>I^X9u(Akmo!Pxdp08fq+zPaLPxNA`r(Oupz09l% zJ>^9}V0tuA-N)KyVFODzo;Yrc6J8O);s_4;ARxF=Woe#G8P(Vi7JbDcgF8y}WA%dy z*H*8#I*h+R72RhmP7nmcJEr4&p6%ksqV2$25oQHYWmR0t25F=dg@W7tu7w$M2w;`b zyrlO+53Sbk0}G{+?r_Gf6IR{xBgFP^2+p>#VggERt^aU&=>1Ly)wi7zJ1Xz-8S^Y! zv%pXoRmp0>OPel&Q=|eY`6w$-g`ImLDTg-C#>38@z21C53j-0NDCsm+D8%`-KN6G*sYRHk0U3^-d#! z`8yK32Mueod&^7OBx~pkyvEeGwOkkpeCzSq9gzHp$J|9Yf*hZ_S1lN;8e~a#-ioH5 ze4~{yjfrLPrK1sMtba74_?L+wLN9NSDuYUHHmt>sT6xb_d&P$w+2`QtH)o69#Kch3 z9TU{aohzl^XMeIYp(jl_<07qqe@hD-xA}@@)$nnGwAJMoBn|n4vD6V$&W@a+&dgmz zZ>8~1CjOFiP*8XfmzuQbGgezv1OQ+F6|`bfWfe!k`t3`)kLbxSfCj|cf{*`{x@lS^ zYx?p1ppA5fKj{rM<0S!4sdM5%Iyp;Yne4u1qo(F+8~WvugXwqMZf*mJu2W)GVB4*o0-E(~@N0UMkHsn@v@2ceEPfC z4C2!e+O;|;aPxq9xVWTAgG6lSSi$%~SSsn8qMEH#jTPyjei$k;YbTc4G4nQf&+)hq z?`JXem;81T;B;^TfhD+ESA(hxBE_RQpE=E+jeqzqqBrsiMOB}f!17o2_XGt1kWGfZdY5jae~ zzc=%D5n?eI7$XsqWG$RN7;D;y7DCc@2;=?Vfq9audP%Iw zG-=ib9uyS!II7VfqtADuJEeqX#6nb<6wa;LgYWWHFj{tR*`zn z4A3+jRHRDCiwjpVC;d!K41=J1w8A&q8j|3fj)``O@GPglCm*| zHw`yGv~G;<$WzJ3v(zMDUu6?CS)>G2mdh@gFO-}WOi0?mW*r&dQVGWA5sn8!J!J{o zMUsijOmnIBig0yn&=1QLdtOJcfp>F#_E9`!Zp0J%FN4ol`&y`6psf@ZVz-pQ(V7J@ zJOVflE-?w=z&y^$@|2K_<>DW2km)xc!_0X-QMg6har=$Uzgi z*-z%stc4|;NIil{#)LLVy1eLO!Lem$w2IowvBR>~Ntr0wP4*?smeW^sTF5wJ;j9$V zv}6Wh3kpu$WE;O+k-*>qCC%x|pInfo)Ko5{suv|v3*Ad%Hk1Q@3^bFPwn$O9gXHX} z>7KGsfy@!W4$KAxIC_f|a5c2-1qz&(uH-HkYjV1f_V=qkHr_?314f#Z!VAAjcI=YB zbmNd2)Ll}=J>>f$N5Qc{xWEoHX5712f~o0XI^~?ea@0?uI8i`cl%y&*2S7srFsY3K zB1$7dLa8?M3f?j|*1l~)4l|4*KKs`F z&3t8QA>}5RLK#h{L>X8rKthYFNKt?U3=sY!Mxgjn^sM5UopuwbQfn9)@=3aaEVe{DuD`Kz4&Zw^3PXt^N@;>nQ3U7Q~gO4 zhBGL}2U7!>x`DOhaHaGi1n~q2LyRcRmf|l6FMzEfR8CAjgK{@dh2i0?zeBCuXku6Q z>wHy+F%DXy1;hN#B_%JK)h0TG?f7~!7!`*@gX7Sv4&9o%2ejjPk`m*Exl6xQ?@iN6(m5t(O7L#?Xvgm5IGO4pE<1P2}lhgms1 zv9mW$9)OdlE5w$Tj3qY(sX3>jFQDD&YxNONkrVLrzvKHZ*Y&diwjojAIhpsf_^xL zB(V=4kXPaVyV6*C{FmA0u~&A^HrdeUDRa>{yX`*+?vEsh>U-wa?*)oT`pJHXy@<|7 z@NN!0>8dKlb{HoLk+3n%BGJDsUN+}i%uD~co4$`;_dVOG6le{Zx;w=ZocmB0+>-tp zP_WDMOjeL)4e+B9OKw(gWOD}S^Isq{N4!)Br>+?)#sd@Kb&+0S#nYK!m!Yo;;s|o zFQc4Tg4F0&uqRZgLUh)O*hD`PRWzYQO3PHx2ZLsYiYyGrq}_T^x=J@aoE+i6AiL&4 zF^~Iodyo60XRK~+rMi7xeYkzugO)m`pv+{LWH{4khH^6tR5u>oF^FWw!c}_l6gOer zTJr|dIk|3cvd`A=H;Za6 zG5C)HEmf&W;qHLe@bTq)X%Pxuxd}t4Ix|C0qHHP$zjxo9)!? zo>e#f`KkTb2d=XOD%?s2)G>bk7r5r$wQ-J zTI>cB!$7t6jL;zNdBLTR%N6!N2);9FF zoBCZm4LbuTW`EPk&}X~FDHT2|AdeReHN;X;dQKg&z?%)_Si!N|1}yq#mZ^F$r%HR? z1bP1S2fyf{S=quaxA*@-3WSYPvl@|=lQvFvEW{5{bN{7y(;kuf zGvAkVhS&GBEtBk1Xh)?4hu4aSDI3aBL|uw}fCXHAy8DfAMLy&U z3sC=))hB`Ui?TK3(Y%g5O_~(s0bS-MC_GGQL)aFzHX224oxYK?MGy|v(eDovCrK&V zI!z*2_Rt_p8#HK41oCLfP;TBFrO!B)ZP8|eufl0aN%j!S0WOeB)EJM^cyC10v}cTm zkuL!e3JlcZcSb;CA1iGrK@c=7TG<7-Yiq(}t3{bePBl0b*@R{^)<35i`|D09Ry~BY ztW(~VmuVLfR&kOteH3kG40E7G(uh-~9*2n2lWZEkP8i)*Bg18rK5D`oWOjpP0MFDX zP=ZcJsXDK$X+0(S*0kqNn!c%%HcrD;)L!c{qF%6Z7MI_BzEAwvcV)PL{M(Rk-Tm2m zSr&T$n|Kvm*t@bobAbdikT1L6I>@1x_N^QmeKNbYn4O^HHF~6mkZ7B8_wa7PjGa6M z*ZVFl>I)i^tEW~O4Rno*qW-JHc(FXEVyi`C!t)|QwyR&u!%HZE#c_xL+3u|4M@TnVk zjSejOBIpm+DwTV03LzI329hJj-?a(_iKwzurcsk|se7H29-`>*%aGNK9NfN_9oS)J z$;FwMA}ng4OvTFmjVO~ZYviGCuxGdJRxOlfM@ji&+ua}}5mhjkY^8fjq@vaW4DwhI zCh%eMWX3G0sdzzTiw2d3xLXoO?+@?B2W#W|hWs2i`j#KMc(}zP-TTVMzM%#F5$eTy z%I7&o{r+lRRTHNTooLJep?H}Nv<&!GSI;luaP}bb2#+g#f47JQLN9dK#C*ACDTPvw zylO!N)gp8#YyDgmRnle-PkNA7Qr6sh>t}U!mZr$-;s0^riehh(Ze#_>PlPh^j8}1~ zbu0h8R7Bk}%4ZsPYGu#TOF#hB=6WSBRWnaDo%k9Jfhe7ScOXG`P+(o@So-OVt*Ip{ zJUffvuw7WlpJA2J*AZi${2=}0I5NJjadtYswjkxEGPK9Etj+)ha@Ty7K28p{@k{>D3nxpv|k-3w(vEZIBv|=9QD}GWk488_`q&--9-skC*jfjK`4G zVdL&}0GwSfVh#ca{tL5=-HW?Iue|>*WmHdZ;nE~iE{5sU&}a_u>M<+aEhw>jw7cL{ zR+(PpEE%PhvV1|r6{TSl7f#8T@|tA zvi@RDAUF~-gCG}5AdoLsS^1Obs+qL-yzcnWw>*SZ+SuC&WKJZEA$S{diKD8o)L8@F z=xyBw|E3U7&Ju%Bcu=|F-c||uJeE(@Id>r?NuZ*;S7Sg+W3H@Pme+%|QdB0`ZQ}B- z%<$C=#hq+BH_90?C3ef4St^FfinAVNI3Jt*SxBdhigz9$&XJ~JvHxC!^93u{-78I= z4zJ2$C?}h;#qhM9Nwt1^EKV1t%Z`jN+)m@>+<1*wZyD2HJ$-)5Y7*`xC3DwGE&FEH z#||Z`%e|dYf}lhHM~9x~c{a+~7E?Askb5^iPUo08a89l?7M;W>LSqXj$A+yPKlI2X zb76H}ntEhNI>_bW&Hk2G17O~d5bP%}_MM0llhws$CtNpx(p9S>0i<3qRlz2Q7++^) z;O+Jw2epg*6o~QCVsmIm)4Vn%}5(jkt zNSPTT|Anea!ARg7Ep_!Tv@=adpCKi)o9EQnO?RR(B4|(Db0-rp#Uqu?2M@t3D>klr z#Lr;hN-3fjS<{N&3QX5XF)DjfEJYCe`g%Gqd#K59UtkZu#=%8DNJ^&S1`at}v-W~DC&5=xP&t=4v;X&=2NX}aIdw>P87O#Hhi*!bz@1Bh!QNU!M1SE=x*QZ|r? zrT1X-8~kTVmGgCraIz03wiPJeFzTqK+Pom?Bg8qYjANb`@Rm}KG@McRxf2QFmiz2! z@NbuwnrmaAqEiJvR*}q3;AZ+Fcp!d5PaA2o60vZw6YjW4VGS?nMYYPsw(2M4^RIrv zn=6-TtXBt^lMBk&Dp~mzB*0&6SryRJ{)c6T@u2l8z0b#S6N|Iv)pIPkIdrziZBjuKRO1jajylfn?5vR6U zuqtC7hw!ECuF1fUQTLd$)RPna!;6Ns5M|w-84aSm>}FROEk@zX$I;X!DdntM6z0x8 zTB*uEAI1Q+ey%#b%57N>EmGE2MJ!bd51fTiz1|HyBfclWQe0s*r2%fXZh8CAB$rs!bE%F~w%WLj7Enn@iyCNh!N zf>0J@OgGy8L4gD<=OVT9wNKm{`IVUV@nJR_MJ-n1VdSPOXvk-_!ShFVlE5?~l9)c` z1?*Jq@9tGBnqpr@#R+t55gYE&vG((_y4Vaz^yFu$s7P*Jco}9!i27mimWt^x^rn2& zW`j9bgm73Lwz;)x35H-q-PSNSr`aV6@pLL07&}4@D(Im?SAgw&@|9JpJsUMVrt?(< z%WHUT!J-T(E&B@1?*&B5hDe`vBK|&TIT%&NF)9e@T;a6nG-HoO+(-#T;h)t8zOOE1 z$M+gO9hyWA;7olnSa>3Y(p@GhxES=AT~=OBTm>tDMaXDT`!wGW!J0ng8L0uQ$?Iqpwy z!HnT)L8QRaT$IfUk9;fYiEXhxqjqs zJEXUpuUo(kz&c2Myp2Qc>pcHOzh$4QBx#9#PNF(|C1S71f}+uwqSj#)t?^V_%}=jv z+S+mLKnTGZr?=>+ggIMpq0;yq79M-c#} z5#S;I@$~bj%7gtJegQ$!T!l6NeAvj%X&Kv0C`ja}?|O*>f3-jrd)luQzMH?P26%Sk ze_D(v_$y0FF6Lcgcb=n?ltUSm&Z-E4bC-I%VftxjqRFkVc$FqZDXTuKc3fCjmtWWB z$OcK&RZDDwy^E#19uP2+(CgkYrq9hDn3BJ}{l1l_x%>R5@5}c=09$rZc$i`WaaWZ) zXG$JDB&brS?FdC?YkJ?pN}~`bH!Xo62Fl!T4|EJk^aYI zdnno5V_wyWYUQa#I=)$7@Dgm?JoRSFHECZS&M{m` z|KG#j*sj}|G`ypqtILnpAb#P1zmy0-176vI2z)D8N6^FkL$rV|z+jua#&oEyCY`UWFwtawM%dLXHq_KE&N>dE3w7q4rM`x5ponD5d9N9au;kXsL7DSP zcn99zJ34PHt6CTI$z$#bd+RZX?eg8h0f4IGb3e$|rR(_l?b7FembfV@i*NwwNEL$B zi`tY8@k8odXVUYU41dW#rG1+hfY-6j_c<-m3^=>1Xd}ok{$lpdX0dP_S1p};Xl9iR zsF4=tV#72zP7I;PGWfovJt~)0LDcq*95CqG`zSI;y#-?=Ujgp2gsF zfO+$GJse4J*!T*Q9ajV{)QEkfu6J!Q%A$`Ez5iV(^TvD*`%~^3ogd zwd(&hT+RW>ev~u@_mBOF6+qE=@>i&vNb%=CpL45Z>IzQ@<3VC$lWovn->KNSfvQ{=k0DSWQSWu%-=a67Uax+T?E*nDZ~XL_$;pZ3~`! zp(WqAWma1t<$Sn=<|Ny)dzK3#!m(L@D&bwxf2+q_^x8wa^zrtXih1d|ffxMToGaJ_ zFNWH@bIx^U;eb6nN)S#9wDKDobyo?yodEqn|V z$L-d1L|`cgQ%T3(5UP~*qTaw*3jP+sE>$&xo+m(H0UXyocL+!0?jC>SH7i6^btc|K zIqLgeZ(_?u;OaD?+EhOa`VNI@<}E)}LFW?^D6%3j)WFk_kg`UmCRMs9=KlN(hsWa7 zJVsqbvHN+Qt?9(J`+i5}oDz2wo1&>%Mmq&R86QtN_j%IHIS~6|ee|4aHy7q02(yD?{0hy~>8QNJ-fedV7MH^bKw}`eolWHFejkPu`0ma1 z`J6EW8ap?z!g^{i@PC}2pKPc8<(Gj_zb;>_xc*)7J=g6!^t8UWP>n9dgBdYDonTOR zK0N@pZHqjz6HUV8p2~om^!l?si9rL^<)u%|OFxKSrLq+12ydmrA58=Mp91C97i@Wn zs~4_?gjYaS9;|fsH}rb1hxBdUmE8yy$fYbtDQYdfj@Mx~7%Xw4BbSDm`X4PU%N{T5 z`)wYI9!^Zq2AN4Uar%rU;%&f-Wi_jjg*GALI+kEgvD7UnOgSh15<(UgvfXm8pyEsn zBhpq;GYw}=))UD-{IiKjvybBr1kJOe(rOOt%AX^$Mh=;)Nvg-i0+pY z(6a9Obu+-wXPu#MZJSM}_RF;|Htwx(J*Xy2wyl$9Ip0%HHIjMyftHzJOl|BhswWnJ z!saiDZtg*@k~meOg+lb2ow(cX@9k_}fxi}%-cCClh3Hu9b{ns~_lq;CeA@@lo$@~& z-~3!(b{9JXCZB~fYnYZkSd)=Ptz{pzq6`>_*Zz}jX2ABestFx?L#7&m%4r+&762tD zkJ{IYdlCnQ+1Cz3hX296$FztlZliXCd-*>-?5$73ALlE5MSOkZ8A?-m;zeh-2Pt$lRAYr^s?VX_aSZBg@PA<-f(OP6#Ss0vwCP~7-PDP);si&nutIFFjPsSDnCj7B-eq)r3rUbMK2*{EOG{urc(CAk&4Vtb^S>3^6Jm)h`xJ8&HT1cqT#f)q7H%AoDYH9 zj*p+m9x8)*IWYSu;iX3L2UeLGJak`-`hNoH(^FX%&LNX+1g>6fuN%KGQ)#5k?@<6U zTu~Z1N%qRr*=wmlc>Mg=6^=dEpMk6*F!FJ5F2iP<--~fS->Fh(Db0;VY%RFKQUNu- zG17wplW+g{3iX_oRIy8sg_i~CrDKeRH3-{c*~@C6=_%Rvu;mSXHCE@Y+q)&S^QVH~ zDw`E+ea7w~5pVi#JkZ(YaUVJx!zj*$ayqS=VqB$cbZE)iV9tri=9DM=W$6ndgfmBr zfi(Q}NN|nI7Urj37DQlU4 zL~HJ%Z2*HqS+J?jq@xHb*=4`>E(f%qVEaMr16C_{{V)=F%!b~_W9!ZLEPPkr+ZKNC z`+q+~n^Ib9hUVG2?^d`4nS#ONnX>JN@7;|>d~kyZoRr|TRTqu?g`L|w!yi9lgF&rHI|$kW z*}?e{EBWs8$(&IIEw!a(twikGlGCR#&TV{t*GKAvi@d;k2g9#U=i297%ga zr5IZ|UoUEQ-vT~9`ff9RjhURu{8}f_%|ZfVsX<>0I6mo6Mg0B*;pnUHI{XY{cZak}Oii0upEaFXiL?ZM9x50vU;zGRNI@{m*?UY(f){7`MUK7gJ|E*^ z+Gi+M>tP(APpuO1t+K~ggb5kWFmmO$sziG8UQ<<5SQ^j-I@9t(wLW*nEAZGYpKs&; z{FrY1tcm5)%GF6&y?*ZB&TZoeh;(~Si+)9<#>yC1nvMv!T@+-@{S2RvY`du=F&qov zWGfwQ!|Q%~dfxgp{CeGNVtJs<5D8>zxO9Mqtm<7JpT~Rrvb(}1`uvhjvh%MjLd`vV z{QF+hwb5{X4%4BJ#IU0WLU*4(VxPfivyC4AW9D&l;|=9QiS{PU$09S%Jkz&nX( zPGci4dARa~{q1y;qzN@dW{relQ!>|6%jjxj`|DEm#Em!CQx!bhQQYq|$Fd=~06gi) z&_~h`ACV}E!nFI;_;gljZy}69lit2<=Q#t@g#Dw(kk4(s7JGBxQuu0Lzg74Z^i12= mlbf{Jsp8x1m5NUA*v3e1s;Qt4j2nAFC literal 11000 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 W%|@6ex8Hs5&14d0CIL|!n=fRTyxisc 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 Ze*ws|e)6U#|FZx9002ovPDHLkV1hPBzn=gA literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f19aa89bee9b0413e664b3a1d067ca2560954879 GIT binary patch literal 8249 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 S^8dXAK*>lbir0u5hyD*vu?k55 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index 3ce7e34fabcae1d1bea7afe5ffd18961429a03be..9a47102e7d35616e68adcdad8555ea2a7a982af8 100644 GIT binary patch delta 3716 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 Ef;Vh35&!@I diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 12075aafbbed2b4442bbf9696972395d0bb9c557..c1d279ff9bc2b839c73529721159a0274f2948b8 100644 GIT binary patch literal 8772 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 literal 8910 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 Uj8XBwe={gKDP_qT@gE`o2mM5|tpET3 literal 10000 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 diff --git a/lib/main.dart b/lib/main.dart index ed3b50f..f28e161 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -97,7 +97,8 @@ class _MyAppState extends ConsumerState } }); - _initDesktopLifecycle(); + // Initialize desktop lifecycle asynchronously to avoid blocking startup + Future.delayed(const Duration(seconds: 1), () => _initDesktopLifecycle()); } Future _initDesktopLifecycle() async { @@ -105,24 +106,117 @@ class _MyAppState extends ConsumerState return; } - await windowManager.ensureInitialized(); - windowManager.addListener(this); - await windowManager.setPreventClose(true); + try { + _logger.info("Initializing desktop lifecycle..."); + + // Initialize window manager + await windowManager.ensureInitialized(); + _logger.info("Window manager ensureInitialized completed"); + + windowManager.addListener(this); + _logger.info("Window manager listener added"); + + await windowManager.setPreventClose(true); + _logger.info("Window manager setPreventClose completed"); + + // Configure window properties + await windowManager.setTitle('Mycelium'); + _logger.info("Window manager setTitle completed"); + + await windowManager.setTitleBarStyle(TitleBarStyle.normal); + _logger.info("Window manager setTitleBarStyle completed"); + + // Skip setSkipTaskbar as it causes crashes on some Windows versions + // The app will show in taskbar by default anyway + _logger.info("Skipping setSkipTaskbar to avoid compatibility issues"); + + _logger.info("Window manager initialized successfully"); + + // Initialize tray manager with careful error handling + try { + _logger.info("Starting tray manager initialization..."); + trayManager.addListener(this); + _logger.info("Tray manager listener added successfully"); + + // Set tray icon with multiple fallback options + bool iconSet = false; + + // Try different icon paths in order of preference + final iconPaths = [ + 'assets/images/tray_icon.png', // Smaller, optimized for tray + 'assets/images/mycelium_top.png', // Alternative smaller icon + 'assets/images/mycelium_icon.png', // Original large icon + if (Platform.isWindows) 'windows/runner/resources/app_icon.ico', + ]; + + for (String iconPath in iconPaths) { + try { + await trayManager.setIcon(iconPath); + iconSet = true; + _logger.info("Tray icon set successfully using: $iconPath"); + break; + } catch (e) { + _logger.warning("Failed to set tray icon from $iconPath: $e"); + } + } + + // If all paths failed, try to set a simple system icon + if (!iconSet) { + try { + // Try setting without any icon first to see if tray works + _logger.info("All icon paths failed, trying to initialize tray without icon"); + } catch (e) { + _logger.warning("Failed to initialize tray: $e"); + } + } + + if (iconSet) { + // Set tray tooltip + await trayManager.setToolTip('Mycelium - Click to show/hide window'); + await _updateTrayMenu(); + _logger.info("Tray manager initialized successfully"); + } else { + _logger.warning("Tray icon could not be set, but continuing without tray"); + } + + } catch (e) { + _logger.warning("Failed to initialize tray manager: $e, continuing without tray"); + } - trayManager.addListener(this); - await trayManager.setIcon('assets/images/mycelium_icon.png'); - final items = [ - MenuItem(key: 'show', label: 'Show Window'), - MenuItem(key: 'hide', label: 'Hide Window'), - MenuItem.separator(), - MenuItem(key: 'toggle', label: 'Start/Stop Mycelium'), - MenuItem.separator(), - MenuItem(key: 'quit', label: 'Quit'), - ]; - await trayManager.setContextMenu(Menu(items: items)); + // Optional: start minimized to tray when app launches on desktop + // await windowManager.hide(); + + } catch (e) { + _logger.severe("Failed to initialize desktop lifecycle: $e"); + // Don't rethrow - allow app to continue without desktop features + } + } - // Optional: start minimized to tray when app launches on desktop - // await windowManager.hide(); + Future _updateTrayMenu() async { + try { + final statusLabel = _isStarted ? 'Mycelium: Running' : 'Mycelium: Stopped'; + final toggleLabel = _isStarted ? 'Stop Mycelium' : 'Start Mycelium'; + + // Update tray tooltip with current status + final tooltipText = _isStarted + ? 'Mycelium - Running (${_connectedPeers.length} peers connected)' + : 'Mycelium - Stopped'; + await trayManager.setToolTip(tooltipText); + + final items = [ + MenuItem(key: 'status', label: statusLabel, disabled: true), + MenuItem.separator(), + MenuItem(key: 'show', label: 'Show Window'), + MenuItem(key: 'hide', label: 'Hide Window'), + MenuItem.separator(), + MenuItem(key: 'toggle', label: toggleLabel), + MenuItem.separator(), + MenuItem(key: 'quit', label: 'Quit'), + ]; + await trayManager.setContextMenu(Menu(items: items)); + } catch (e) { + _logger.warning("Failed to update tray menu: $e"); + } } void methodHandler(String methodName) { @@ -340,6 +434,7 @@ class _MyAppState extends ConsumerState _myceliumStatusColor = colorMycelRed; isRestartVisible = false; }); + _updateTrayMenu(); } void setStateStopped() { @@ -352,6 +447,7 @@ class _MyAppState extends ConsumerState isRestartVisible = false; _connectedPeers.clear(); // Clear connected peers when stopped }); + _updateTrayMenu(); } void setStateStarted() { @@ -363,6 +459,7 @@ class _MyAppState extends ConsumerState _myceliumStatusColor = colorDarkBlue; isRestartVisible = true; }); + _updateTrayMenu(); // Start periodic peer status updates _startPeerStatusUpdates(); } @@ -400,6 +497,9 @@ class _MyAppState extends ConsumerState setState(() { _connectedPeers = peerStatus; }); + + // Update tray menu to reflect new peer count + _updateTrayMenu(); } catch (e) { _logger.warning("Failed to get peer status: $e"); } @@ -409,7 +509,46 @@ class _MyAppState extends ConsumerState @override void onWindowClose() async { // Intercept close to keep app running in tray + _logger.info("Window close intercepted - hiding to tray"); await windowManager.hide(); + + // Show tray notification that app is still running + try { + await trayManager.popUpContextMenu(); + } catch (e) { + _logger.warning("Failed to show tray context menu: $e"); + } + } + + @override + void onWindowFocus() { + // Called when window gains focus + } + + @override + void onWindowBlur() { + // Called when window loses focus + } + + @override + void onWindowMaximize() { + // Called when window is maximized + } + + @override + void onWindowUnmaximize() { + // Called when window is unmaximized + } + + @override + void onWindowMinimize() { + // Called when window is minimized - hide to tray instead + windowManager.hide(); + } + + @override + void onWindowRestore() { + // Called when window is restored } // Tray handlers @@ -426,6 +565,9 @@ class _MyAppState extends ConsumerState @override void onTrayMenuItemClick(MenuItem menuItem) async { switch (menuItem.key) { + case 'status': + // Status item is disabled, do nothing + break; case 'show': await windowManager.show(); await windowManager.focus(); diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index a2ec33f..96d3fee 100644 --- a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,68 +1,68 @@ { - "images" : [ - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_16.png", - "scale" : "1x" + "info": { + "version": 1, + "author": "xcode" }, - { - "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" - } -} + "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" + } + ] +} \ No newline at end of file diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png index 82b6f9d9a33e198f5747104729e1fcef999772a5..6617c13c9e9c58437bb2dea212fc600842d126af 100644 GIT binary patch literal 148316 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 literal 102994 zcmeEugo5nb1G~3xi~y`}h6XHx5j$(L*3|5S2UfkG$|UCNI>}4f?MfqZ+HW-sRW5RKHEm z^unW*Xx{AH_X3Xdvb%C(Bh6POqg==@d9j=5*}oEny_IS;M3==J`P0R!eD6s~N<36C z*%-OGYqd0AdWClO!Z!}Y1@@RkfeiQ$Ib_ z&fk%T;K9h`{`cX3Hu#?({4WgtmkR!u3ICS~|NqH^fdNz>51-9)OF{|bRLy*RBv#&1 z3Oi_gk=Y5;>`KbHf~w!`u}!&O%ou*Jzf|Sf?J&*f*K8cftMOKswn6|nb1*|!;qSrlw= zr-@X;zGRKs&T$y8ENnFU@_Z~puu(4~Ir)>rbYp{zxcF*!EPS6{(&J}qYpWeqrPWW< zfaApz%<-=KqxrqLLFeV3w0-a0rEaz9&vv^0ZfU%gt9xJ8?=byvNSb%3hF^X_n7`(fMA;C&~( zM$cQvQ|g9X)1AqFvbp^B{JEX$o;4iPi?+v(!wYrN{L}l%e#5y{j+1NMiT-8=2VrCP zmFX9=IZyAYA5c2!QO96Ea-6;v6*$#ZKM-`%JCJtrA3d~6h{u+5oaTaGE)q2b+HvdZ zvHlY&9H&QJ5|uG@wDt1h99>DdHy5hsx)bN`&G@BpxAHh$17yWDyw_jQhhjSqZ=e_k z_|r3=_|`q~uA47y;hv=6-o6z~)gO}ZM9AqDJsR$KCHKH;QIULT)(d;oKTSPDJ}Jx~G#w-(^r<{GcBC*~4bNjfwHBumoPbU}M)O za6Hc2ik)2w37Yyg!YiMq<>Aov?F2l}wTe+>h^YXcK=aesey^i)QC_p~S zp%-lS5%)I29WfywP(r4@UZ@XmTkqo51zV$|U|~Lcap##PBJ}w2b4*kt7x6`agP34^ z5fzu_8rrH+)2u*CPcr6I`gL^cI`R2WUkLDE5*PX)eJU@H3HL$~o_y8oMRoQ0WF9w| z6^HZDKKRDG2g;r8Z4bn+iJNFV(CG;K-j2>aj229gl_C6n12Jh$$h!}KVhn>*f>KcH z;^8s3t(ccVZ5<{>ZJK@Z`hn_jL{bP8Yn(XkwfRm?GlEHy=T($8Z1Mq**IM`zxN9>-yXTjfB18m_$E^JEaYn>pj`V?n#Xu;Z}#$- zw0Vw;T*&9TK$tKI7nBk9NkHzL++dZ^;<|F6KBYh2+XP-b;u`Wy{~79b%IBZa3h*3^ zF&BKfQ@Ej{7ku_#W#mNJEYYp=)bRMUXhLy2+SPMfGn;oBsiG_6KNL8{p1DjuB$UZB zA)a~BkL)7?LJXlCc}bB~j9>4s7tlnRHC5|wnycQPF_jLl!Avs2C3^lWOlHH&v`nGd zf&U!fn!JcZWha`Pl-B3XEe;(ks^`=Z5R zWyQR0u|do2`K3ec=YmWGt5Bwbu|uBW;6D8}J3{Uep7_>L6b4%(d=V4m#(I=gkn4HT zYni3cnn>@F@Wr<hFAY3Y~dW+3bte;70;G?kTn4Aw5nZ^s5|47 z4$rCHCW%9qa4)4vE%^QPMGf!ET!^LutY$G zqdT(ub5T5b+wi+OrV}z3msoy<4)`IPdHsHJggmog0K*pFYMhH!oZcgc5a)WmL?;TPSrerTVPp<#s+imF3v#!FuBNNa`#6 z!GdTCF|IIpz#(eV^mrYKThA4Bnv&vQet@%v9kuRu3EHx1-2-it@E`%9#u`)HRN#M? z7aJ{wzKczn#w^`OZ>Jb898^Xxq)0zd{3Tu7+{-sge-rQ z&0PME&wIo6W&@F|%Z8@@N3)@a_ntJ#+g{pUP7i?~3FirqU`rdf8joMG^ld?(9b7Iv z>TJgBg#)(FcW)h!_if#cWBh}f+V08GKyg|$P#KTS&%=!+0a%}O${0$i)kn9@G!}En zv)_>s?glPiLbbx)xk(lD-QbY(OP3;MSXM5E*P&_`Zks2@46n|-h$Y2L7B)iH{GAAq19h5-y0q>d^oy^y+soJu9lXxAe%jcm?=pDLFEG2kla40e!5a}mpe zdL=WlZ=@U6{>g%5a+y-lx)01V-x;wh%F{=qy#XFEAqcd+m}_!lQ)-9iiOL%&G??t| z?&NSdaLqdPdbQs%y0?uIIHY7rw1EDxtQ=DU!i{)Dkn~c$LG5{rAUYM1j5*G@oVn9~ zizz{XH(nbw%f|wI=4rw^6mNIahQpB)OQy10^}ACdLPFc2@ldVi|v@1nWLND?)53O5|fg`RZW&XpF&s3@c-R?aad!$WoH6u0B|}zt)L($E^@U- zO#^fxu9}Zw7Xl~nG1FVM6DZSR0*t!4IyUeTrnp@?)Z)*!fhd3)&s(O+3D^#m#bAem zpf#*aiG_0S^ofpm@9O7j`VfLU0+{$x!u^}3!zp=XST0N@DZTp!7LEVJgqB1g{psNr za0uVmh3_9qah14@M_pi~vAZ#jc*&aSm$hCNDsuQ-zPe&*Ii#2=2gP+DP4=DY z_Y0lUsyE6yaV9)K)!oI6+*4|spx2at*30CAx~6-5kfJzQ`fN8$!lz%hz^J6GY?mVH zbYR^JZ(Pmj6@vy-&!`$5soyy-NqB^8cCT40&R@|6s@m+ZxPs=Bu77-+Os7+bsz4nA3DrJ8#{f98ZMaj-+BD;M+Jk?pgFcZIb}m9N z{ct9T)Kye&2>l^39O4Q2@b%sY?u#&O9PO4@t0c$NUXG}(DZJ<;_oe2~e==3Z1+`Zo zFrS3ns-c}ZognVBHbg#e+1JhC(Yq7==rSJQ8J~}%94(O#_-zJKwnBXihl#hUd9B_>+T& z7eHHPRC?5ONaUiCF7w|{J`bCWS7Q&xw-Sa={j-f)n5+I=9s;E#fBQB$`DDh<^mGiF zu-m_k+)dkBvBO(VMe2O4r^sf3;sk9K!xgXJU>|t9Vm8Ty;fl5pZzw z9j|}ZD}6}t;20^qrS?YVPuPRS<39d^y0#O1o_1P{tN0?OX!lc-ICcHI@2#$cY}_CY zev|xdFcRTQ_H)1fJ7S0*SpPs8e{d+9lR~IZ^~dKx!oxz?=Dp!fD`H=LH{EeC8C&z-zK$e=!5z8NL=4zx2{hl<5z*hEmO=b-7(k5H`bA~5gT30Sjy`@-_C zKM}^so9Ti1B;DovHByJkTK87cfbF16sk-G>`Q4-txyMkyQS$d}??|Aytz^;0GxvOs zPgH>h>K+`!HABVT{sYgzy3CF5ftv6hI-NRfgu613d|d1cg^jh+SK7WHWaDX~hlIJ3 z>%WxKT0|Db1N-a4r1oPKtF--^YbP=8Nw5CNt_ZnR{N(PXI>Cm$eqi@_IRmJ9#)~ZHK_UQ8mi}w^`+4$OihUGVz!kW^qxnCFo)-RIDbA&k-Y=+*xYv5y4^VQ9S)4W5Pe?_RjAX6lS6Nz#!Hry=+PKx2|o_H_3M`}Dq{Bl_PbP(qel~P@=m}VGW*pK96 zI@fVag{DZHi}>3}<(Hv<7cVfWiaVLWr@WWxk5}GDEbB<+Aj;(c>;p1qmyAIj+R!`@#jf$ zy4`q23L-72Zs4j?W+9lQD;CYIULt%;O3jPWg2a%Zs!5OW>5h1y{Qof!p&QxNt5=T( zd5fy&7=hyq;J8%86YBOdc$BbIFxJx>dUyTh`L z-oKa=OhRK9UPVRWS`o2x53bAv+py)o)kNL6 z9W1Dlk-g6Ht@-Z^#6%`9S9`909^EMj?9R^4IxssCY-hYzei^TLq7Cj>z$AJyaU5=z zl!xiWvz0U8kY$etrcp8mL;sYqGZD!Hs-U2N{A|^oEKA482v1T%cs%G@X9M?%lX)p$ zZoC7iYTPe8yxY0Jne|s)fCRe1mU=Vb1J_&WcIyP|x4$;VSVNC`M+e#oOA`#h>pyU6 z?7FeVpk`Hsu`~T3i<_4<5fu?RkhM;@LjKo6nX>pa%8dSdgPO9~Jze;5r>Tb1Xqh5q z&SEdTXevV@PT~!O6z|oypTk7Qq+BNF5IQ(8s18c=^0@sc8Gi|3e>VKCsaZ?6=rrck zl@oF5Bd0zH?@15PxSJIRroK4Wa?1o;An;p0#%ZJ^tI=(>AJ2OY0GP$E_3(+Zz4$AQ zW)QWl<4toIJ5TeF&gNXs>_rl}glkeG#GYbHHOv-G!%dJNoIKxn)FK$5&2Zv*AFic! z@2?sY&I*PSfZ8bU#c9fdIJQa_cQijnj39-+hS@+~e*5W3bj%A}%p9N@>*tCGOk+cF zlcSzI6j%Q|2e>QG3A<86w?cx6sBtLNWF6_YR?~C)IC6_10SNoZUHrCpp6f^*+*b8` zlx4ToZZuI0XW1W)24)92S)y0QZa);^NRTX6@gh8@P?^=#2dV9s4)Q@K+gnc{6|C}& zDLHr7nDOLrsH)L@Zy{C_2UrYdZ4V{|{c8&dRG;wY`u>w%$*p>PO_}3`Y21pk?8Wtq zGwIXTulf7AO2FkPyyh2TZXM1DJv>hI`}x`OzQI*MBc#=}jaua&czSkI2!s^rOci|V zFkp*Vbiz5vWa9HPFXMi=BV&n3?1?%8#1jq?p^3wAL`jgcF)7F4l<(H^!i=l-(OTDE zxf2p71^WRIExLf?ig0FRO$h~aA23s#L zuZPLkm>mDwBeIu*C7@n@_$oSDmdWY7*wI%aL73t~`Yu7YwE-hxAATmOi0dmB9|D5a zLsR7OQcA0`vN9m0L|5?qZ|jU+cx3_-K2!K$zDbJ$UinQy<9nd5ImWW5n^&=Gg>Gsh zY0u?m1e^c~Ug39M{{5q2L~ROq#c{eG8Oy#5h_q=#AJj2Yops|1C^nv0D1=fBOdfAG z%>=vl*+_w`&M7{qE#$xJJp_t>bSh7Mpc(RAvli9kk3{KgG5K@a-Ue{IbU{`umXrR3ra5Y7xiX42+Q%N&-0#`ae_ z#$Y6Wa++OPEDw@96Zz##PFo9sADepQe|hUy!Zzc2C(L`k9&=a8XFr+!hIS>D2{pdGP1SzwyaGLiH3j--P>U#TWw90t8{8Bt%m7Upspl#=*hS zhy|(XL6HOqBW}Og^tLX7 z+`b^L{O&oqjwbxDDTg2B;Yh2(fW>%S5Pg8^u1p*EFb z`(fbUM0`afawYt%VBfD&b3MNJ39~Ldc@SAuzsMiN%E}5{uUUBc7hc1IUE~t-Y9h@e7PC|sv$xGx=hZiMXNJxz5V(np%6u{n24iWX#!8t#>Ob$in<>dw96H)oGdTHnU zSM+BPss*5)Wz@+FkooMxxXZP1{2Nz7a6BB~-A_(c&OiM)UUNoa@J8FGxtr$)`9;|O z(Q?lq1Q+!E`}d?KemgC!{nB1JJ!B>6J@XGQp9NeQvtbM2n7F%v|IS=XWPVZY(>oq$ zf=}8O_x`KOxZoGnp=y24x}k6?gl_0dTF!M!T`={`Ii{GnT1jrG9gPh)R=RZG8lIR| z{ZJ6`x8n|y+lZuy${fuEDTAf`OP!tGySLXD}ATJO5UoZv|Xo3%7O~L63+kw}v)Ci=&tWx3bQJfL@5O18CbPlkR^IcKA zy1=^Vl-K-QBP?9^R`@;czcUw;Enbbyk@vJQB>BZ4?;DM%BUf^eZE+sOy>a){qCY6Y znYy;KGpch-zf=5|p#SoAV+ie8M5(Xg-{FoLx-wZC9IutT!(9rJ8}=!$!h%!J+vE2e z(sURwqCC35v?1>C1L)swfA^sr16{yj7-zbT6Rf26-JoEt%U?+|rQ zeBuGohE?@*!zR9)1P|3>KmJSgK*fOt>N>j}LJB`>o(G#Dduvx7@DY7};W7K;Yj|8O zGF<+gTuoIKe7Rf+LQG3-V1L^|E;F*}bQ-{kuHq}| ze_NwA7~US19sAZ)@a`g*zkl*ykv2v3tPrb4Og2#?k6Lc7@1I~+ew48N&03hW^1Cx+ zfk5Lr4-n=#HYg<7ka5i>2A@ZeJ60gl)IDX!!p zzfXZQ?GrT>JEKl7$SH!otzK6=0dIlqN)c23YLB&Krf9v-{@V8p+-e2`ujFR!^M%*; ze_7(Jh$QgoqwB!HbX=S+^wqO15O_TQ0-qX8f-|&SOuo3ZE{{9Jw5{}>MhY}|GBhO& zv48s_B=9aYQfa;d>~1Z$y^oUUaDer>7ve5+Gf?rIG4GZ!hRKERlRNgg_C{W_!3tsI2TWbX8f~MY)1Q`6Wj&JJ~*;ay_0@e zzx+mE-pu8{cEcVfBqsnm=jFU?H}xj@%CAx#NO>3 z_re3Rq%d1Y7VkKy{=S73&p;4^Praw6Y59VCP6M?!Kt7{v#DG#tz?E)`K95gH_mEvb z%$<~_mQ$ad?~&T=O0i0?`YSp?E3Dj?V>n+uTRHAXn`l!pH9Mr}^D1d@mkf+;(tV45 zH_yfs^kOGLXlN*0GU;O&{=awxd?&`{JPRr$z<1HcAO2K`K}92$wC}ky&>;L?#!(`w z68avZGvb728!vgw>;8Z8I@mLtI`?^u6R>sK4E7%=y)jpmE$fH!Dj*~(dy~-2A5Cm{ zl{1AZw`jaDmfvaB?jvKwz!GC}@-Dz|bFm1OaPw(ia#?>vF7Y5oh{NVbyD~cHB1KFn z9C@f~X*Wk3>sQH9#D~rLPslAd26@AzMh=_NkH_yTNXx6-AdbAb z{Ul89YPHslD?xAGzOlQ*aMYUl6#efCT~WI zOvyiewT=~l1W(_2cEd(8rDywOwjM-7P9!8GCL-1<9KXXO=6%!9=W++*l1L~gRSxLVd8K=A7&t52ql=J&BMQu{fa6y zXO_e>d?4X)xp2V8e3xIQGbq@+vo#&n>-_WreTTW0Yr?|YRPP43cDYACMQ(3t6(?_k zfgDOAU^-pew_f5U#WxRXB30wcfDS3;k~t@b@w^GG&<5n$Ku?tT(%bQH(@UHQGN)N|nfC~7?(etU`}XB)$>KY;s=bYGY#kD%i9fz= z2nN9l?UPMKYwn9bX*^xX8Y@%LNPFU>s#Ea1DaP%bSioqRWi9JS28suTdJycYQ+tW7 zrQ@@=13`HS*dVKaVgcem-45+buD{B;mUbY$YYULhxK)T{S?EB<8^YTP$}DA{(&)@S zS#<8S96y9K2!lG^VW-+CkfXJIH;Vo6wh)N}!08bM$I7KEW{F6tqEQ?H@(U zAqfi%KCe}2NUXALo;UN&k$rU0BLNC$24T_mcNY(a@lxR`kqNQ0z%8m>`&1ro40HX} z{{3YQ;2F9JnVTvDY<4)x+88i@MtXE6TBd7POk&QfKU-F&*C`isS(T_Q@}K)=zW#K@ zbXpcAkTT-T5k}Wj$dMZl7=GvlcCMt}U`#Oon1QdPq%>9J$rKTY8#OmlnNWBYwafhx zqFnym@okL#Xw>4SeRFejBnZzY$jbO)e^&&sHBgMP%Ygfi!9_3hp17=AwLBNFTimf0 zw6BHNXw19Jg_Ud6`5n#gMpqe%9!QB^_7wAYv8nrW94A{*t8XZu0UT&`ZHfkd(F{Px zD&NbRJP#RX<=+sEeGs2`9_*J2OlECpR;4uJie-d__m*(aaGE}HIo+3P{my@;a~9Y$ zHBXVJ83#&@o6{M+pE9^lI<4meLLFN_3rwgR4IRyp)~OF0n+#ORrcJ2_On9-78bWbG zuCO0esc*n1X3@p1?lN{qWS?l7J$^jbpeel{w~51*0CM+q9@9X=>%MF(ce~om(}?td zjkUmdUR@LOn-~6LX#=@a%rvj&>DFEoQscOvvC@&ZB5jVZ-;XzAshwx$;Qf@U41W=q zOSSjQGQV8Qi3*4DngNMIM&Cxm7z*-K`~Bl(TcEUxjQ1c=?)?wF8W1g;bAR%sM#LK( z_Op?=P%)Z+J!>vpN`By0$?B~Out%P}kCriDq@}In&fa_ZyKV+nLM0E?hfxuu%ciUz z>yAk}OydbWNl7{)#112j&qmw;*Uj&B;>|;Qwfc?5wIYIHH}s6Mve@5c5r+y)jK9i( z_}@uC(98g)==AGkVN?4>o@w=7x9qhW^ zB(b5%%4cHSV?3M?k&^py)j*LK16T^Ef4tb05-h-tyrjt$5!oo4spEfXFK7r_Gfv7#x$bsR7T zs;dqxzUg9v&GjsQGKTP*=B(;)be2aN+6>IUz+Hhw-n>^|`^xu*xvjGPaDoFh2W4-n z@Wji{5Y$m>@Vt7TE_QVQN4*vcfWv5VY-dT0SV=l=8LAEq1go*f zkjukaDV=3kMAX6GAf0QOQHwP^{Z^=#Lc)sh`QB)Ftl&31jABvq?8!3bt7#8vxB z53M{4{GR4Hl~;W3r}PgXSNOt477cO62Yj(HcK&30zsmWpvAplCtpp&mC{`2Ue*Bwu zF&UX1;w%`Bs1u%RtGPFl=&sHu@Q1nT`z={;5^c^^S~^?2-?<|F9RT*KQmfgF!7=wD@hytxbD;=9L6PZrK*1<4HMObNWehA62DtTy)q5H|57 z9dePuC!1;0MMRRl!S@VJ8qG=v^~aEU+}2Qx``h1LII!y{crP2ky*R;Cb;g|r<#ryo zju#s4dE?5CTIZKc*O4^3qWflsQ(voX>(*_JP7>Q&$%zCAIBTtKC^JUi@&l6u&t0hXMXjz_y!;r@?k|OU9aD%938^TZ>V? zqJmom_6dz4DBb4Cgs_Ef@}F%+cRCR%UMa9pi<-KHN;t#O@cA%(LO1Rb=h?5jiTs93 zPLR78p+3t>z4|j=<>2i4b`ketv}9Ax#B0)hn7@bFl;rDfP8p7u9XcEb!5*PLKB(s7wQC2kzI^@ae)|DhNDmSy1bOLid%iIap@24A(q2XI!z_hkl-$1T10 z+KKugG4-}@u8(P^S3PW4x>an;XWEF-R^gB{`t8EiP{ZtAzoZ!JRuMRS__-Gg#Qa3{<;l__CgsF+nfmFNi}p z>rV!Y6B@cC>1up)KvaEQiAvQF!D>GCb+WZsGHjDeWFz?WVAHP65aIA8u6j6H35XNYlyy8>;cWe3ekr};b;$9)0G`zsc9LNsQ&D?hvuHRpBxH)r-1t9|Stc*u<}Ol&2N+wPMom}d15_TA=Aprp zjN-X3*Af$7cDWMWp##kOH|t;c2Pa9Ml4-)o~+7P;&q8teF-l}(Jt zTGKOQqJTeT!L4d}Qw~O0aanA$Vn9Rocp-MO4l*HK)t%hcp@3k0%&_*wwpKD6ThM)R z8k}&7?)YS1ZYKMiy?mn>VXiuzX7$Ixf7EW8+C4K^)m&eLYl%#T=MC;YPvD&w#$MMf zQ=>`@rh&&r!@X&v%ZlLF42L_c=5dSU^uymKVB>5O?AouR3vGv@ei%Z|GX5v1GK2R* zi!!}?+-8>J$JH^fPu@)E6(}9$d&9-j51T^n-e0Ze%Q^)lxuex$IL^XJ&K2oi`wG}QVGk2a7vC4X?+o^z zsCK*7`EUfSuQA*K@Plsi;)2GrayQOG9OYF82Hc@6aNN5ulqs1Of-(iZQdBI^U5of^ zZg2g=Xtad7$hfYu6l~KDQ}EU;oIj(3nO#u9PDz=eO3(iax7OCmgT2p_7&^3q zg7aQ;Vpng*)kb6=sd5?%j5Dm|HczSChMo8HHq_L8R;BR5<~DVyU$8*Tk5}g0eW5x7 z%d)JFZ{(Y<#OTKLBA1fwLM*fH7Q~7Sc2Ne;mVWqt-*o<;| z^1@vo_KTYaMnO$7fbLL+qh#R$9bvnpJ$RAqG+z8h|} z3F5iwG*(sCn9Qbyg@t0&G}3fE0jGq3J!JmG2K&$urx^$z95) z7h?;4vE4W=v)uZ*Eg3M^6f~|0&T)2D;f+L_?M*21-I1pnK(pT$5l#QNlT`SidYw~o z{`)G)Asv#cue)Ax1RNWiRUQ(tQ(bzd-f2U4xlJK+)ZWBxdq#fp=A>+Qc%-tl(c)`t z$e2Ng;Rjvnbu7((;v4LF9Y1?0el9hi!g>G{^37{ z`^s-03Z5jlnD%#Mix19zkU_OS|86^_x4<0(*YbPN}mi-$L?Z4K(M|2&VV*n*ZYN_UqI?eKZi3!b)i z%n3dzUPMc-dc|q}TzvPy!VqsEWCZL(-eURDRG4+;Eu!LugSSI4Fq$Ji$Dp08`pfP_C5Yx~`YKcywlMG;$F z)R5!kVml_Wv6MSpeXjG#g?kJ0t_MEgbXlUN3k|JJ%N>|2xn8yN>>4qxh!?dGI}s|Y zDTKd^JCrRSN+%w%D_uf=Tj6wIV$c*g8D96jb^Kc#>5Fe-XxKC@!pIJw0^zu;`_yeb zhUEm-G*C=F+jW%cP(**b61fTmPn2WllBr4SWNdKe*P8VabZsh0-R|?DO=0x`4_QY) zR7sthW^*BofW7{Sak&S1JdiG?e=SfL24Y#w_)xrBVhGB-13q$>mFU|wd9Xqe-o3{6 zSn@@1@&^)M$rxb>UmFuC+pkio#T;mSnroMVZJ%nZ!uImi?%KsIX#@JU2VY(`kGb1A z7+1MEG)wd@)m^R|a2rXeviv$!emwcY(O|M*xV!9%tBzarBOG<4%gI9SW;Um_gth4=gznYzOFd)y8e+3APCkL)i-OI`;@7-mCJgE`js(M} z;~ZcW{{FMVVO)W>VZ}ILouF#lWGb%Couu}TI4kubUUclW@jEn6B_^v!Ym*(T*4HF9 zWhNKi8%sS~viSdBtnrq!-Dc5(G^XmR>DFx8jhWvR%*8!m*b*R8e1+`7{%FACAK`7 zzdy8TmBh?FVZ0vtw6npnWwM~XjF2fNvV#ZlGG z?FxHkXHN>JqrBYoPo$)zNC7|XrQfcqmEXWud~{j?La6@kbHG@W{xsa~l1=%eLly8B z4gCIH05&Y;6O2uFSopNqP|<$ml$N40^ikxw0`o<~ywS1(qKqQN!@?Ykl|bE4M?P+e zo$^Vs_+x)iuw?^>>`$&lOQOUkZ5>+OLnRA)FqgpDjW&q*WAe(_mAT6IKS9;iZBl8M z<@=Y%zcQUaSBdrs27bVK`c$)h6A1GYPS$y(FLRD5Yl8E3j0KyH08#8qLrsc_qlws; znMV%Zq8k+&T2kf%6ZO^2=AE9>?a587g%-={X}IS~P*I(NeCF9_9&`)|ok0iiIun zo+^odT0&Z4k;rn7I1v87=z!zKU(%gfB$(1mrRYeO$sbqM22Kq68z9wgdg8HBxp>_< zn9o%`f?sVO=IN#5jSX&CGODWlZfQ9A)njK2O{JutYwRZ?n0G_p&*uwpE`Md$iQxrd zoQfF^b8Ou)+3BO_3_K5y*~?<(BF@1l+@?Z6;^;U>qlB)cdro;rxOS1M{Az$s^9o5sXDCg8yD<=(pKI*0e zLk>@lo#&s0)^*Q+G)g}C0IErqfa9VbL*Qe=OT@&+N8m|GJF7jd83vY#SsuEv2s{Q> z>IpoubNs>D_5?|kXGAPgF@mb_9<%hjU;S0C8idI)a=F#lPLuQJ^7OnjJlH_Sks9JD zMl1td%YsWq3YWhc;E$H1<0P$YbSTqs`JKY%(}svsifz|h8BHguL82dBl+z0^YvWk8 zGy;7Z0v5_FJ2A$P0wIr)lD?cPR%cz>kde!=W%Ta^ih+Dh4UKdf7ip?rBz@%y2&>`6 zM#q{JXvW9ZlaSk1oD!n}kSmcDa2v6T^Y-dy+#fW^y>eS8_%<7tWXUp8U@s$^{JFfKMjDAvR z$YmVB;n3ofl!ro9RNT!TpQpcycXCR}$9k5>IPWDXEenQ58os?_weccrT+Bh5sLoiH zZ_7~%t(vT)ZTEO= zb0}@KaD{&IyK_sd8b$`Qz3%UA`nSo zn``!BdCeN!#^G;lK@G2ron*0jQhbdw)%m$2;}le@z~PSLnU-z@tL)^(p%P>OO^*Ff zNRR9oQ`W+x^+EU+3BpluwK77|B3=8QyT|$V;02bn_LF&3LhLA<#}{{)jE)}CiW%VEU~9)SW+=F%7U-iYlQ&q!#N zwI2{(h|Pi&<8_fqvT*}FLN^0CxN}#|3I9G_xmVg$gbn2ZdhbmGk7Q5Q2Tm*ox8NMo zv`iaZW|ZEOMyQga5fts?&T-eCCC9pS0mj7v0SDkD=*^MxurP@89v&Z#3q{FM!a_nr zb?KzMv`BBFOew>4!ft@A&(v-kWXny-j#egKef|#!+3>26Qq0 zv!~8ev4G`7Qk>V1TaMT-&ziqoY3IJp8_S*%^1j73D|=9&;tDZH^!LYFMmME4*Wj(S zRt~Q{aLb_O;wi4u&=}OYuj}Lw*j$@z*3>4&W{)O-oi@9NqdoU!=U%d|se&h?^$Ip# z)BY+(1+cwJz!yy4%l(aLC;T!~Ci>yAtXJb~b*yr&v7f{YCU8P|N1v~H`xmGsG)g)y z4%mv=cPd`s7a*#OR7f0lpD$ueP>w8qXj0J&*7xX+U!uat5QNk>zwU$0acn5p=$88L=jn_QCSYkTV;1~(yUem#0gB`FeqY98sf=>^@ z_MCdvylv~WL%y_%y_FE1)j;{Szj1+K7Lr_y=V+U zk6Tr;>XEqlEom~QGL!a+wOf(@ZWoxE<$^qHYl*H1a~kk^BLPn785%nQb$o;Cuz0h& za9LMx^bKEbPS%e8NM33Jr|1T|ELC(iE!FUci38xW_Y7kdHid#2ie+XZhP;2!Z;ZAM zB_cXKm)VrPK!SK|PY00Phwrpd+x0_Aa;}cDQvWKrwnQrqz##_gvHX2ja?#_{f#;bz`i>C^^ zTLDy;6@HZ~XQi7rph!mz9k!m;KchA)uMd`RK4WLK7)5Rl48m#l>b(#`WPsl<0j z-sFkSF6>Nk|LKnHtZ`W_NnxZP62&w)S(aBmmjMDKzF%G;3Y?FUbo?>b5;0j8Lhtc4 zr*8d5Y9>g@FFZaViw7c16VsHcy0u7M%6>cG1=s=Dtx?xMJSKIu9b6GU8$uSzf43Y3 zYq|U+IWfH;SM~*N1v`KJo!|yfLxTFS?oHsr3qvzeVndVV^%BWmW6re_S!2;g<|Oao z+N`m#*i!)R%i1~NO-xo{qpwL0ZrL7hli;S z3L0lQ_z}z`fdK39Mg~Zd*%mBdD;&5EXa~@H(!###L`ycr7gW`f)KRuqyHL3|uyy3h zSS^td#E&Knc$?dXs*{EnPYOp^-vjAc-h4z#XkbG&REC7;0>z^^Z}i8MxGKerEY z>l?(wReOlXEsNE5!DO&ZWyxY)gG#FSZs%fXuzA~XIAPVp-%yb2XLSV{1nH6{)5opg z(dZKckn}Q4Li-e=eUDs1Psg~5zdn1>ql(*(nn6)iD*OcVkwmKL(A{fix(JhcVB&}V zVt*Xb!{gzvV}dc446>(D=SzfCu7KB`oMjv6kPzSv&B>>HLSJP|wN`H;>oRw*tl#N) z*zZ-xwM7D*AIsBfgqOjY1Mp9aq$kRa^dZU_xw~KxP;|q(m+@e+YSn~`wEJzM|Ippb zzb@%;hB7iH4op9SqmX?j!KP2chsb79(mFossBO-Zj8~L}9L%R%Bw<`^X>hjkCY5SG z7lY!8I2mB#z)1o;*3U$G)3o0A&{0}#B;(zPd2`OF`Gt~8;0Re8nIseU z_yzlf$l+*-wT~_-cYk$^wTJ@~7i@u(CZs9FVkJCru<*yK8&>g+t*!JqCN6RH%8S-P zxH8+Cy#W?!;r?cLMC(^BtAt#xPNnwboI*xWw#T|IW^@3|q&QYY6Ehxoh@^URylR|T zne-Y6ugE^7p5bkRDWIh)?JH5V^ub82l-LuVjDr7UT^g`q4dB&mBFRWGL_C?hoeL(% zo}ocH5t7|1Mda}T!^{Qt9vmA2ep4)dQSZO>?Eq8}qRp&ZJ?-`Tnw+MG(eDswP(L*X3ahC2Ad0_wD^ff9hfzb%Jd`IXx5 zae@NMzBXJDwJS?7_%!TB^E$N8pvhOHDK$7YiOelTY`6KX8hK6YyT$tk*adwN>s^Kp zwM3wGVPhwKU*Yq-*BCs}l`l#Tej(NQ>jg*S0TN%D+GcF<14Ms6J`*yMY;W<-mMN&-K>((+P}+t+#0KPGrzjP zJ~)=Bcz%-K!L5ozIWqO(LM)l_9lVOc4*S65&DKM#TqsiWNG{(EZQw!bc>qLW`=>p-gVJ;T~aN2D_- z{>SZC=_F+%hNmH6ub%Ykih0&YWB!%sd%W5 zHC2%QMP~xJgt4>%bU>%6&uaDtSD?;Usm}ari0^fcMhi_)JZgb1g5j zFl4`FQ*%ROfYI}e7RIq^&^a>jZF23{WB`T>+VIxj%~A-|m=J7Va9FxXV^%UwccSZd zuWINc-g|d6G5;95*%{e;9S(=%yngpfy+7ao|M7S|Jb0-4+^_q-uIqVS&ufU880UDH*>(c)#lt2j zzvIEN>>$Y(PeALC-D?5JfH_j+O-KWGR)TKunsRYKLgk7eu4C{iF^hqSz-bx5^{z0h ze2+u>Iq0J4?)jIo)}V!!m)%)B;a;UfoJ>VRQ*22+ncpe9f4L``?v9PH&;5j{WF?S_C>Lq>nkChZB zjF8(*v0c(lU^ZI-)_uGZnnVRosrO4`YinzI-RSS-YwjYh3M`ch#(QMNw*)~Et7Qpy z{d<3$4FUAKILq9cCZpjvKG#yD%-juhMj>7xIO&;c>_7qJ%Ae8Z^m)g!taK#YOW3B0 zKKSMOd?~G4h}lrZbtPk)n*iOC1~mDhASGZ@N{G|dF|Q^@1ljhe=>;wusA&NvY*w%~ zl+R6B^1yZiF)YN>0ms%}qz-^U-HVyiN3R9k1q4)XgDj#qY4CE0)52%evvrrOc898^ z*^)XFR?W%g0@?|6Mxo1ZBp%(XNv_RD-<#b^?-Fs+NL^EUW=iV|+Vy*F%;rBz~pN7%-698U-VMfGEVnmEz7fL1p)-5sLT zL;Iz>FCLM$p$c}g^tbkGK1G$IALq1Gd|We@&TtW!?4C7x4l*=4oF&&sr0Hu`x<5!m zhX&&Iyjr?AkNXU_5P_b^Q3U9sy#f6ZF@2C96$>1k*E-E%DjwvA{VL0PdU~suN~DZo zm{T!>sRdp`Ldpp9olrH@(J$QyGq!?#o1bUo=XP2OEuT3`XzI>s^0P{manUaE4pI%! zclQq;lbT;nx7v3tR9U)G39h?ryrxzd0xq4KX7nO?piJZbzT_CU&O=T(Vt;>jm?MgC z2vUL#*`UcMsx%w#vvjdamHhmN!(y-hr~byCA-*iCD};#l+bq;gkwQ0oN=AyOf@8ow>Pj<*A~2*dyjK}eYdN);%!t1 z6Y=|cuEv-|5BhA?n2Db@4s%y~(%Wse4&JXw=HiO48%c6LB~Z0SL1(k^9y?ax%oj~l zf7(`iAYLdPRq*ztFC z7VtAb@s{as%&Y;&WnyYl+6Wm$ru*u!MKIg_@01od-iQft0rMjIj8e7P9eKvFnx_X5 zd%pDg-|8<>T2Jdqw>AII+fe?CgP+fL(m0&U??QL8YzSjV{SFi^vW~;wN@or_(q<0Y zRt~L}#JRcHOvm$CB)T1;;7U>m%)QYBLTR)KTARw%zoDxgssu5#v{UEVIa<>{8dtkm zXgbCGp$tfue+}#SD-PgiNT{Zu^YA9;4BnM(wZ9-biRo_7pN}=aaimjYgC=;9@g%6< zxol5sT_$<8{LiJ6{l1+sV)Z_QdbsfEAEMw!5*zz6)Yop?T0DMtR_~wfta)E6_G@k# zZRP11D}$ir<`IQ`<(kGfAS?O-DzCyuzBq6dxGTNNTK?r^?zT30mLY!kQ=o~Hv*k^w zvq!LBjW=zzIi%UF@?!g9vt1CqdwV(-2LYy2=E@Z?B}JDyVkluHtzGsWuI1W5svX~K z&?UJ45$R7g>&}SFnLnmw09R2tUgmr_w6mM9C}8GvQX>nL&5R#xBqnp~Se(I>R42`T zqZe9p6G(VzNB3QD><8+y%{e%6)sZDRXTR|MI zM#eZmao-~_`N|>Yf;a;7yvd_auTG#B?Vz5D1AHx=zpVUFe7*hME z+>KH5h1In8hsVhrstc>y0Q!FHR)hzgl+*Q&5hU9BVJlNGRkXiS&06eOBV^dz3;4d5 zeYX%$62dNOprZV$px~#h1RH?_E%oD6y;J;pF%~y8M)8pQ0olYKj6 zE+hd|7oY3ot=j9ZZ))^CCPADL6Jw%)F@A{*coMApcA$7fZ{T@3;WOQ352F~q6`Mgi z$RI6$8)a`Aaxy<8Bc;{wlDA%*%(msBh*xy$L-cBJvQ8hj#FCyT^%+Phw1~PaqyDou^JR0rxDkSrmAdjeYDFDZ`E z)G3>XtpaSPDlydd$RGHg;#4|4{aP5c_Om z2u5xgnhnA)K%8iU==}AxPxZCYC)lyOlj9as#`5hZ=<6<&DB%i_XCnt5=pjh?iusH$ z>)E`@HNZcAG&RW3Ys@`Ci{;8PNzE-ZsPw$~Wa!cP$ye+X6;9ceE}ah+3VY7Mx}#0x zbqYa}eO*FceiY2jNS&2cH9Y}(;U<^^cWC5Ob&)dZedvZA9HewU3R;gRQ)}hUdf+~Q zS_^4ds*W1T#bxS?%RH&<739q*n<6o|mV;*|1s>ly-Biu<2*{!!0#{_234&9byvn0* z5=>{95Zfb{(?h_Jk#ocR$FZ78O*UTOxld~0UF!kyGM|nH%B*qf)Jy}N!uT9NGeM19 z-@=&Y0yGGo_dw!FD>juk%P$6$qJkj}TwLBoefi;N-$9LAeV|)|-ET&culW9Sb_pc_ zp{cXI0>I0Jm_i$nSvGnYeLSSj{ccVS2wyL&0x~&5v;3Itc82 z5lIAkfn~wcY-bQB$G!ufWt%qO;P%&2B_R5UKwYxMemIaFm)qF1rA zc>gEihb=jBtsXCi0T%J37s&kt*3$s7|6)L(%UiY)6axuk{6RWIS8^+u;)6!R?Sgap z9|6<0bx~AgVi|*;zL@2x>Pbt2Bz*uv4x-`{F)XatTs`S>unZ#P^ZiyjpfL_q2z^fqgR-fbOcG=Y$q>ozkw1T6dH8-)&ww+z?E0 zR|rV(9bi6zpX3Ub>PrPK!{X>e$C66qCXAeFm)Y+lX8n2Olt7PNs*1^si)j!QmFV#t z0P2fyf$N^!dyTot&`Ew5{i5u<8D`8U`qs(KqaWq5iOF3x2!-z65-|HsyYz(MAKZ?< zCpQR;E)wn%s|&q(LVm0Ab>gdmCFJeKwVTnv@Js%!At;I=A>h=l=p^&<4;Boc{$@h< z38v`3&2wJtka@M}GS%9!+SpJ}sdtoYzMevVbnH+d_eMxN@~~ zZq@k)7V5f8u!yAX2qF3qjS7g%n$JuGrMhQF!&S^7(%Y{rP*w2FWj(v_J{+Hg*}wdWOd~pHQ19&n3RWeljK9W%sz&Y3Tm3 zR`>6YR54%qBHGa)2xbs`9cs_EsNHxsfraEgZ)?vrtooeA0sPKJK7an){ngtV@{SBa zkO6ORr1_Xqp+`a0e}sC*_y(|RKS13ikmHp3C^XkE@&wjbGWrt^INg^9lDz#B;bHiW zkK4{|cg08b!yHFSgPca5)vF&gqCgeu+c82%&FeM^Bb}GUxLy-zo)}N;#U?sJ2?G2BNe*9u_7kE5JeY!it=f`A_4gV3} z`M!HXZy#gN-wS!HvHRqpCHUmjiM;rVvpkC!voImG%OFVN3k(QG@X%e``VJSJ@Z7tb z*Onlf>z^D+&$0!4`IE$;2-NSO9HQWd+UFW(r;4hh;(j^p4H-~6OE!HQp^96v?{9Zt z;@!ZcccV%C2s6FMP#qvo4kG6C04A>XILt>JW}%0oE&HM5f6 zYLD!;My>CW+j<~=Wzev{aYtx2ZNw|ptTFV(4;9`6Tmbz6K1)fv4qPXa2mtoPt&c?P zhmO+*o8uP3ykL6E$il00@TDf6tOW7fmo?Oz_6GU^+5J=c22bWyuH#aNj!tT-^IHrJ zu{aqTYw@q;&$xDE*_kl50Jb*dp`(-^p={z}`rqECTi~3 z>0~A7L6X)=L5p#~$V}gxazgGT7$3`?a)zen>?TvAuQ+KAIAJ-s_v}O6@`h9n-sZk> z`3{IJeb2qu9w=P*@q>iC`5wea`KxCxrx{>(4{5P+!cPg|pn~;n@DiZ0Y>;k5mnKeS z!LIfT4{Lgd=MeysR5YiQKCeNhUQ;Os1kAymg6R!u?j%LF z4orCszIq_n52ulpes{(QN|zirdtBsc{9^Z72Ycb2ht?G^opkT_#|4$wa9`)8k3ilU z%ntAi`nakS1r10;#k^{-ZGOD&Z2|k=p40hRh5D7(&JG#Cty|ECOvwsSHkkSa)36$4 z?;v#%@D(=Raw(HP5s>#4Bm?f~n1@ebH}2tv#7-0l-i^H#H{PC|F@xeNS+Yw{F-&wH z07)bj8MaE6`|6NoqKM~`4%X> zKFl&7g1$Z3HB>lxn$J`P`6GSb6CE6_^NA1V%=*`5O!zP$a7Vq)IwJAki~XBLf=4TF zPYSL}>4nOGZ`fyHChq)jy-f{PKFp6$plHB2=;|>%Z^%)ecVue(*mf>EH_uO^+_zm? zJATFa9SF~tFwR#&0xO{LLf~@}s_xvCPU8TwIJgBs%FFzjm`u?1699RTui;O$rrR{# z1^MqMl5&6)G%@_k*$U5Kxq84!AdtbZ!@8FslBML}<`(Jr zenXrC6bFJP=R^FMBg7P?Pww-!a%G@kJH_zezKvuWU0>m1uyy}#Vf<$>u?Vzo3}@O% z1JR`B?~Tx2)Oa|{DQ_)y9=oY%haj!80GNHw3~qazgU-{|q+Bl~H94J!a%8UR?XsZ@ z0*ZyQugyru`V9b(0OrJOKISfi89bSVR zQy<+i_1XY}4>|D%X_`IKZUPz6=TDb)t1mC9eg(Z=tv zq@|r37AQM6A%H%GaH3szv1L^ku~H%5_V*fv$UvHl*yN4iaqWa69T2G8J2f3kxc7UE zOia@p0YNu_q-IbT%RwOi*|V|&)e5B-u>4=&n@`|WzH}BK4?33IPpXJg%`b=dr_`hU z8JibW_3&#uIN_#D&hX<)x(__jUT&lIH$!txEC@cXv$7yB&Rgu){M`9a`*PH} zRcU)pMWI2O?x;?hzR{WdzKt^;_pVGJAKKd)F$h;q=Vw$MP1XSd<;Mu;EU5ffyKIg+ z&n-Nb?h-ERN7(fix`htopPIba?0Gd^y(4EHvfF_KU<4RpN0PgVxt%7Yo99X*Pe|zR z?ytK&5qaZ$0KSS$3ZNS$$k}y(2(rCl=cuYZg{9L?KVgs~{?5adxS))Upm?LDo||`H zV)$`FF3icFmxcQshXX*1k*w3O+NjBR-AuE70=UYM*7>t|I-oix=bzDwp2*RoIwBp@r&vZukG; zyi-2zdyWJ3+E?{%?>e2Ivk`fAn&Ho(KhGSVE4C-zxM-!j01b~mTr>J|5={PrZHOgO zw@ND3=z(J7D>&C7aw{zT>GHhL2BmUX0GLt^=31RRPSnjoUO9LYzh_yegyPoAKhAQE z>#~O27dR4&LdQiak6={9_{LN}Z>;kyVYKH^d^*!`JVSXJlx#&r4>VnP$zb{XoTb=> zZsLvh>keP3fkLTIDdpf-@(ADfq4=@X=&n>dyU0%dwD{zsjCWc;r`-e~X$Q3NTz_TJ zOXG|LMQQIjGXY3o5tBm9>k6y<6XNO<=9H@IXF;63rzsC=-VuS*$E{|L_i;lZmHOD< zY92;>4spdeRn4L6pY4oUKZG<~+8U-q7ZvNOtW0i*6Q?H`9#U3M*k#4J;ek(MwF02x zUo1wgq9o6XG#W^mxl>pAD)Ll-V5BNsdVQ&+QS0+K+?H-gIBJ-ccB1=M_hxB6qcf`C zJ?!q!J4`kLhAMry4&a_0}up{CFevcjBl|N(uDM^N5#@&-nQt2>z*U}eJGi}m5f}l|IRVj-Q;a>wcLpK5RRWJ> zysdd$)Nv0tS?b~bw1=gvz3L_ZAIdDDPj)y|bp1;LE`!av!rODs-tlc}J#?erTgXRX z$@ph%*~_wr^bQYHM7<7=Q=45v|Hk7T=mDpW@OwRy3A_v`ou@JX5h!VI*e((v*5Aq3 zVYfB4<&^Dq5%^?~)NcojqK`(VXP$`#w+&VhQOn%;4pCkz;NEH6-FPHTQ+7I&JE1+Ozq-g43AEZV>ceQ^9PCx zZG@OlEF~!Lq@5dttlr%+gNjRyMwJdJU(6W_KpuVnd{3Yle(-p#6erIRc${l&qx$HA z89&sp=rT7MJ=DuTL1<5{)wtUfpPA|Gr6Q2T*=%2RFm@jyo@`@^*{5{lFPgv>84|pv z%y{|cVNz&`9C*cUely>-PRL)lHVErAKPO!NQ3<&l5(>Vp(MuJnrOf^4qpIa!o3D7( z1bjn#Vv$#or|s7Hct5D@%;@48mM%ISY7>7@ft8f?q~{s)@BqGiupoK1BAg?PyaDQ1 z`YT8{0Vz{zBwJ={I4)#ny{RP{K1dqzAaQN_aaFC%Z>OZ|^VhhautjDavGtsQwx@WH zr|1UKk^+X~S*RjCY_HN!=Jx>b6J8`Q(l4y|mc<6jnkHVng^Wk(A13-;AhawATsmmE#H%|8h}f1frs2x@Fwa_|ea+$tdG2Pz{7 z!ox^w^>^Cv4e{Xo7EQ7bxCe8U+LZG<_e$RnR?p3t?s^1Mb!ieB z#@45r*PTc_yjh#P=O8Zogo+>1#|a2nJvhOjIqKK1U&6P)O%5s~M;99O<|Y9zomWTL z666lK^QW`)cXV_^Y05yQZH3IRCW%25BHAM$c0>w`x!jh^15Zp6xYb!LoQ zr+RukTw0X2mxN%K0%=8|JHiaA3pg5+GMfze%9o5^#upx0M?G9$+P^DTx7~qq9$Qoi zV$o)yy zuUq>3c{_q+HA5OhdN*@*RkxRuD>Bi{Ttv_hyaaB;XhB%mJ2Cb{yL;{Zu@l{N?!GKE7es6_9J{9 zO(tmc0ra2;@oC%SS-8|D=omQ$-Dj>S)Utkthh{ovD3I%k}HoranSepC_yco2Q8 zY{tAuPIhD{X`KbhQIr%!t+GeH%L%q&p z3P%<-S0YY2Emjc~Gb?!su85}h_qdu5XN2XJUM}X1k^!GbwuUPT(b$Ez#LkG6KEWQB z7R&IF4srHe$g2R-SB;inW9T{@+W+~wi7VQd?}7||zi!&V^~o0kM^aby7YE_-B63^d zf_uo8#&C77HBautt_YH%v6!Q>H?}(0@4pv>cM6_7dHJ)5JdyV0Phi!)vz}dv{*n;t zf(+#Hdr=f8DbJqbMez)(n>@QT+amJ7g&w6vZ-vG^H1v~aZqG~u!1D(O+jVAG0EQ*aIsr*bsBdbD`)i^FNJ z&B@yxqPFCRGT#}@dmu-{0vp47xk(`xNM6E=7QZ5{tg6}#zFrd8Pb_bFg7XP{FsYP8 zbvWqG6#jfg*4gvY9!gJxJ3l2UjP}+#QMB(*(?Y&Q4PO`EknE&Cb~Yb@lCbk;-KY)n zzbjS~W5KZ3FV%y>S#$9Sqi$FIBCw`GfPDP|G=|y32VV-g@a1D&@%_oAbB@cAUx#aZ zlAPTJ{iz#Qda8(aNZE&0q+8r3&z_Ln)b=5a%U|OEcc3h1f&8?{b8ErEbilrun}mh3 z$1o^$-XzIiH|iGoJA`w`o|?w3m*NX|sd$`Mt+f*!hyJvQ2fS*&!SYn^On-M|pHGlu z4SC5bM7f6BAkUhGuN*w`97LLkbCx=p@K5RL2p>YpDtf{WTD|d3ucb6iVZ-*DRtoEA zCC5(x)&e=giR_id>5bE^l%Mxx>0@FskpCD4oq@%-Fg$8IcdRwkfn;DsjoX(v;mt3d z_4Mnf#Ft4x!bY!7Hz?RRMq9;5FzugD(sbt4up~6j?-or+ch~y_PqrM2hhTToJjR_~ z)E1idgt7EW>G*9%Q^K;o_#uFjX!V2pwfpgi>}J&p_^QlZki!@#dkvR`p?bckC`J*g z=%3PkFT3HAX2Q+dShHUbb1?ZcK8U7oaufLTCB#1W{=~k0Jabgv>q|H+GU=f-y|{p4 zwN|AE+YbCgx=7vlXE?@gkXW9PaqbO#GB=4$o0FkNT#EI?aLVd2(qnPK$Yh%YD%v(mdwn}bgsxyIBI^)tY?&G zi^2JfClZ@4b{xFjyTY?D61w@*ez2@5rWLpG#34id?>>oPg{`4F-l`7Lg@D@Hc}On} zx%BO4MsLYosLGACJ-d?ifZ35r^t*}wde>AAWO*J-X%jvD+gL9`u`r=kP zyeJ%FqqKfz8e_3K(M1RmB?gIYi{W7Z<THP2ihue0mbpu5n(x_l|e1tw(q!#m5lmef6ktqIb${ zV+ee#XRU}_dDDUiV@opHZ@EbQ<9qIZJMDsZDkW0^t3#j`S)G#>N^ZBs8k+FJhAfu< z%u!$%dyP3*_+jUvCf-%{x#MyDAK?#iPfE<(@Q0H7;a125eD%I(+!x1f;Sy`e<9>nm zQH4czZDQmW7^n>jL)@P@aAuAF$;I7JZE5a8~AJI5CNDqyf$gjloKR7C?OPt9yeH}n5 zNF8Vhmd%1O>T4EZD&0%Dt7YWNImmEV{7QF(dy!>q5k>Kh&Xy8hcBMUvVV~Xn8O&%{ z&q=JCYw#KlwM8%cu-rNadu(P~i3bM<_a{3!J*;vZhR6dln6#eW0^0kN)Vv3!bqM`w z{@j*eyzz=743dgFPY`Cx3|>ata;;_hQ3RJd+kU}~p~aphRx`03B>g4*~f%hUV+#D9rYRbsGD?jkB^$3XcgB|3N1L& zrmk9&Dg450mAd=Q_p?gIy5Zx7vRL?*rpNq76_rysFo)z)tp0B;7lSb9G5wX1vC9Lc z5Q8tb-alolVNWFsxO_=12o}X(>@Mwz1mkYh1##(qQwN=7VKz?61kay8A9(94Ky(4V zq6qd2+4a20Z0QRrmp6C?4;%U?@MatfXnkj&U6bP_&2Ny}BF%4{QhNx*Tabik9Y-~Z z@0WV6XD}aI(%pN}oW$X~Qo_R#+1$@J8(31?zM`#e`#(0f<-AZ^={^NgH#lc?oi(Mu zMk|#KR^Q;V@?&(sh5)D;-fu)rx%gXZ1&5)MR+Mhssy+W>V%S|PRNyTAd}74<(#J>H zR(1BfM%eIv0+ngHH6(i`?-%_4!6PpK*0X)79SX0X$`lv_q>9(E2kkkP;?c@rW2E^Q zs<;`9dg|lDMNECFrD3jTM^Mn-C$44}9d9Kc z#>*k&e#25;D^%82^1d@Yt{Y91MbEu0C}-;HR4+IaCeZ`l?)Q8M2~&E^FvJ?EBJJ(% zz1>tCW-E~FB}DI}z#+fUo+=kQME^=eH>^%V8w)dh*ugPFdhMUi3R2Cg}Zak4!k_8YW(JcR-)hY8C zXja}R7@%Q0&IzQTk@M|)2ViZDNCDRLNI)*lH%SDa^2TG4;%jE4n`8`aQAA$0SPH2@ z)2eWZuP26+uGq+m8F0fZn)X^|bNe z#f{qYZS!(CdBdM$N2(JH_a^b#R2=>yVf%JI_ieRFB{w&|o9txwMrVxv+n78*aXFGb z>Rkj2yq-ED<)A46T9CL^$iPynv`FoEhUM10@J+UZ@+*@_gyboQ>HY9CiwTUo7OM=w zd~$N)1@6U8H#Zu(wGLa_(Esx%h@*pmm5Y9OX@CY`3kPYPQx@z8yAgtm(+agDU%4?c zy8pR4SYbu8vY?JX6HgVq7|f=?w(%`m-C+a@E{euXo>XrGmkmFGzktI*rj*8D z)O|CHKXEzH{~iS+6)%ybRD|JRQ6j<+u_+=SgnJP%K+4$st+~XCVcAjI9e5`RYq$n{ zzy!X9Nv7>T4}}BZpSj9G9|(4ei-}Du<_IZw+CB`?fd$w^;=j8?vlp(#JOWiHaXJjB0Q00RHJ@sG6N#y^H7t^&V} z;VrDI4?75G$q5W9mV=J2iP24NHJy&d|HWHva>FaS#3AO?+ohh1__FMx;?`f{HG3v0 ztiO^Wanb>U4m9eLhoc_2B(ca@YdnHMB*~aYO+AE(&qh@?WukLbf_y z>*3?Xt-lxr?#}y%kTv+l8;!q?Hq8XSU+1E8x~o@9$)zO2z9K#(t`vPDri`mKhv|sh z{KREcy`#pnV>cTT7dm7M9B@9qJRt3lfo(C`CNkIq@>|2<(yn!AmVN?ST zbX_`JjtWa3&N*U{K7FYX8})*D#2@KBae` zhKS~s!r%SrXdhCsv~sF}7?ocyS?afya6%rDBu6g^b2j#TOGp^1zrMR}|70Z>CeYq- z1o|-=FBKlu{@;pm@QQJ_^!&hzi;0Z_Ho){x3O1KQ#TYk=rAt9`YKC0Y^}8GWIN{QW znYJyVTrmNvl!L=YS1G8BAxGmMUPi+Q7yb0XfG`l+L1NQVSbe^BICYrD;^(rke{jWCEZOtVv3xFze!=Z&(7}!)EcN;v0Dbit?RJ6bOr;N$ z=nk8}H<kCEE+IK3z<+3mkn4q!O7TMWpKShWWWM)X*)m6k%3luF6c>zOsFccvfLWf zH+mNkh!H@vR#~oe=ek}W3!71z$Dlj0c(%S|sJr>rvw!x;oCek+8f8s!U{DmfHcNpO z9>(IKOMfJwv?ey`V2ysSx2Npeh_x#bMh)Ngdj$al;5~R7Ac5R2?*f{hI|?{*$0qU- zY$6}ME%OGh^zA^z9zJUs-?a4ni8cw_{cYED*8x{bWg!Fn9)n;E9@B+t;#k}-2_j@# zg#b%R(5_SJAOtfgFCBZc`n<&z6)%nOIu@*yo!a% zpLg#36KBN$01W{b;qWN`Tp(T#jh%;Zp_zpS64lvBVY2B#UK)p`B4Oo)IO3Z&D6<3S zfF?ZdeNEnzE{}#gyuv)>;z6V{!#bx)` zY;hL*f(WVD*D9A4$WbRKF2vf;MoZVdhfWbWhr{+Db5@M^A4wrFReuWWimA4qp`GgoL2`W4WPUL5A=y3Y3P z%G?8lLUhqo@wJW8VDT`j&%YY7xh51NpVYlsrk_i4J|pLO(}(b8_>%U2M`$iVRDc-n zQiOdJbroQ%*vhN{!{pL~N|cfGooK_jTJCA3g_qs4c#6a&_{&$OoSQr_+-O^mKP=Fu zGObEx`7Qyu{nHTGNj(XSX*NPtAILL(0%8Jh)dQh+rtra({;{W2=f4W?Qr3qHi*G6B zOEj7%nw^sPy^@05$lOCjAI)?%B%&#cZ~nC|=g1r!9W@C8T0iUc%T*ne z)&u$n>Ue3FN|hv+VtA+WW)odO-sdtDcHfJ7s&|YCPfWaVHpTGN46V7Lx@feE#Od%0XwiZy40plD%{xl+K04*se zw@X4&*si2Z_0+FU&1AstR)7!Th(fdaOlsWh`d!y=+3m!QC$Zlkg8gnz!}_B7`+wSz z&kD?6{zPnE3uo~Tv8mLP%RaNt2hcCJBq=0T>%MW~Q@Tpt2pPP1?KcywH>in5@ zx+5;xu-ltFfo5vLU;2>r$-KCHjwGR&1XZ0YNyrXXAUK!FLM_7mV&^;;X^*YH(FLRr z`0Jjg7wiq2bisa`CG%o9i)o1`uG?oFjU_Zrv1S^ipz$G-lc^X@~6*)#%nn+RbgksJfl{w=k31(q>7a!PCMp5YY{+Neh~mo zG-3dd!0cy`F!nWR?=9f_KP$X?Lz&cLGm_ohy-|u!VhS1HG~e7~xKpYOh=GmiiU;nu zrZ5tWfan3kp-q_vO)}vY6a$19Q6UL0r znJ+iSHN-&w@vDEZ0V%~?(XBr|jz&vrBNLOngULxtH(Rp&U*rMY42n;05F11xh?k;n_DX2$4|vWIkXnbwfC z=ReH=(O~a;VEgVO?>qsP*#eOC9Y<_9Yt<6X}X{PyF7UXIA$f)>NR5P&4G_Ygq(9TwwQH*P>Rq>3T4I+t2X(b5ogXBAfNf!xiF#Gilm zp2h{&D4k!SkKz-SBa%F-ZoVN$7GX2o=(>vkE^j)BDSGXw?^%RS9F)d_4}PN+6MlI8*Uk7a28CZ)Gp*EK)`n5i z){aq=0SFSO-;sw$nAvJU-$S-cW?RSc7kjEBvWDr1zxb1J7i;!i+3PQwb=)www?7TZ zE~~u)vO>#55eLZW;)F(f0KFf8@$p)~llV{nO7K_Nq-+S^h%QV_CnXLi)p*Pq&`s!d zK2msiR;Hk_rO8`kqe_jfTmmv|$MMo0ll}mI)PO4!ikVd(ZThhi&4ZwK?tD-}noj}v zBJ?jH-%VS|=t)HuTk?J1XaDUjd_5p1kPZi6y#F6$lLeRQbj4hsr=hX z4tXkX2d5DeLMcAYTeYm|u(XvG5JpW}hcOs4#s8g#ihK%@hVz|kL=nfiBqJ{*E*WhC zht3mi$P3a(O5JiDq$Syu9p^HY&9~<#H89D8 zJm84@%TaL_BZ+qy8+T3_pG7Q%z80hnjN;j>S=&WZWF48PDD%55lVuC0%#r5(+S;WH zS7!HEzmn~)Ih`gE`faPRjPe^t%g=F ztpGVW=Cj5ZkpghCf~`ar0+j@A=?3(j@7*pq?|9)n*B4EQTA1xj<+|(Y72?m7F%&&& zdO44owDBPT(8~RO=dT-K4#Ja@^4_0v$O3kn73p6$s?mCmVDUZ+Xl@QcpR6R3B$=am z%>`r9r2Z79Q#RNK?>~lwk^nQlR=Hr-ji$Ss3ltbmB)x@0{VzHL-rxVO(++@Yr@Iu2 zTEX)_9sVM>cX$|xuqz~Y8F-(n;KLAfi*63M7mh&gsPR>N0pd9h!0bm%nA?Lr zS#iEmG|wQd^BSDMk0k?G>S-uE$vtKEF8Dq}%vLD07zK4RLoS?%F1^oZZI$0W->7Z# z?v&|a`u#UD=_>i~`kzBGaPj!mYX5g?3RC4$5EV*j0sV)>H#+$G6!ci=6`)85LWR=FCp-NUff`;2zG9nU6F~ z;3ZyE*>*LvUgae+uMf}aV}V*?DCM>{o31+Sx~6+sz;TI(VmIpDrN3z+BUj`oGGgLP z>h9~MP}Pw#YwzfGP8wSkz`V#}--6}7S9yZvb{;SX?6PM_KuYpbi~*=teZr-ga2QqIz{QrEyZ@>eN*qmy;N@FCBbRNEeeoTmQyrX;+ zCkaJ&vOIbc^2BD6_H+Mrcl?Nt7O{xz9R_L0ZPV_u!sz+TKbXmhK)0QWoe-_HwtKJ@@7=L+ z+K8hhf=4vbdg3GqGN<;v-SMIzvX=Z`WUa_91Yf89^#`G(f-Eq>odB^p-Eqx}ENk#&MxJ+%~Ad2-*`1LNT>2INPw?*V3&kE;tt?rQyBw? zI+xJD04GTz1$7~KMnfpkPRW>f%n|0YCML@ODe`10;^DXX-|Hb*IE%_Vi#Pn9@#ufA z_8NY*1U%VseqYrSm?%>F@`laz+f?+2cIE4Jg6 z_VTcx|DSEA`g!R%RS$2dSRM|9VQClsW-G<~=j5T`pTbu-x6O`R z98b;}`rPM(2={YiytrqX+uh65f?%XiPp`;4CcMT*E*dQJ+if9^D>c_Dk8A(cE<#r=&!& z_`Z01=&MEE+2@yr!|#El=yM}v>i=?w^2E_FLPy(*4A9XmCNy>cBWdx3U>1RylsItO z4V8T$z3W-qqq*H`@}lYpfh=>C!tieKhoMGUi)EpWDr;yIL&fy};Y&l|)f^QE*k~4C zH>y`Iu%#S)z)YUqWO%el*Z)ME#p{1_8-^~6UF;kBTW zMQ!eXQuzkR#}j{qb(y9^Y!X7&T}}-4$%4w@w=;w+>Z%uifR9OoQ>P?0d9xpcwa>7kTv2U zT-F?3`Q`7xOR!gS@j>7In>_h){j#@@(ynYh;nB~}+N6qO(JO1xA z@59Pxc#&I~I64slNR?#hB-4XE>EFU@lUB*D)tu%uEa))B#eJ@ZOX0hIulfnDQz-y8 z`CX@(O%_VC{Ogh&ot``jlDL%R!f>-8yq~oLGxBO?+tQb5%k@a9zTs!+=NOwSVH-cR zqFo^jHeXDA_!rx$NzdP;>{-j5w3QUrR<;}=u2|FBJ;D#v{SK@Z6mjeV7_kFmWt95$ zeGaF{IU?U>?W`jzrG_9=9}yN*LKyzz))PLE+)_jc#4Rd$yFGol;NIk(qO1$5VXR)+ zxF7%f4=Q!NzR>DVXUB&nUT&>Nyf+5QRF+Z`X-bB*7=`|Go5D1&h~ zflKLw??kpiRm0h3|1GvySC2^#kcFz^5{79KKlq@`(leBa=_4CgV9sSHr{RIJ^KwR_ zY??M}-x^=MD+9`v@I3jue=OCn0kxno#6i>b(XKk_XTp_LpI}X*UA<#* zsgvq@yKTe_dTh>q1aeae@8yur08S(Q^8kXkP_ty48V$pX#y9)FQa~E7P7}GP_CbCm zc2dQxTeW(-~Y6}im24*XOC8ySfH*HMEnW3 z4CXp8iK(Nk<^D$g0kUW`8PXn2kdcDk-H@P0?G8?|YVlIFb?a>QunCx%B9TzsqQQ~HD!UO7zq^V!v9jho_FUob&Hxi ztU1nNOK)a!gkb-K4V^QVX05*>-^i|{b`hhvQLyj`E1vAnj0fbqqO%r z6Q;X1x0dL~GqMv%8QindZ4CZ%7pYQW~ z9)I*#Gjref-q(4Z*E#1c&rE0-_(4;_M(V7rgH_7H;ps1s%GBmU z{4a|X##j#XUF2n({v?ZUUAP5k>+)^F)7n-npbV3jAlY8V3*W=fwroDS$c&r$>8aH` zH+irV{RG3^F3oW2&E%5hXgMH9>$WlqX76Cm+iFmFC-DToTa`AcuN9S!SB+BT-IA#3P)JW1m~Cuwjs`Ep(wDXE4oYmt*aU z!Naz^lM}B)JFp7ejro7MU9#cI>wUoi{lylR2~s)3M!6a=_W~ITXCPd@U9W)qA5(mdOf zd3PntGPJyRX<9cgX?(9~TZB5FdEHW~gkJXY51}?s4ZT_VEdwOwD{T2E-B>oC8|_ZwsPNj=-q(-kwy%xX2K0~H z{*+W`-)V`7@c#Iuaef=?RR2O&x>W0A^xSwh5MsjTz(DVG-EoD@asu<>72A_h<39_# zawWVU<9t{r*e^u-5Q#SUI6dV#p$NYEGyiowT>>d*or=Ps!H$-3={bB|An$GPkP5F1 zTnu=ktmF|6E*>ZQvk^~DX(k!N`tiLut*?3FZhs$NUEa4ccDw66-~P;x+0b|<!ZN7Z%A`>2tN#CdoG>((QR~IV_Gj^Yh%!HdA~4C3jOXaqb6Ou z21T~Wmi9F6(_K0@KR@JDTh3-4mv2=T7&ML<+$4;b9SAtv*Uu`0>;VVZHB{4?aIl3J zL(rMfk?1V@l)fy{J5DhVlj&cWKJCcrpOAad(7mC6#%|Sn$VwMjtx6RDx1zbQ|Ngg8N&B56DGhu;dYg$Z{=YmCNn+?ceDclp65c_RnKs4*vefnhudSlrCy6-96vSB4_sFAj# zftzECwmNEOtED^NUt{ZDjT7^g>k1w<=af>+0)%NA;IPq6qx&ya7+QAu=pk8t>KTm` zEBj9J*2t|-(h)xc>Us*jHs)w9qmA>8@u21UqzKk*Ei#0kCeW6o z-2Q+Tvt25IUkb}-_LgD1_FUJ!U8@8OC^9(~Kd*0#zr*8IQkD)6Keb(XFai5*DYf~` z@U?-{)9X&BTf!^&@^rjmvea#9OE~m(D>qfM?CFT9Q4RxqhO0sA7S)=--^*Q=kNh7Y zq%2mu_d_#23d`+v`Ol263CZ<;D%D8Njj6L4T`S*^{!lPL@pXSm>2;~Da- zBX97TS{}exvSva@J5FJVCM$j4WDQuME`vTw>PWS0!;J7R+Kq zVUy6%#n5f7EV(}J#FhDpts;>=d6ow!yhJj8j>MJ@Wr_?x30buuutIG97L1A*QFT$c ziC5rBS;#qj=~yP-yWm-p(?llTwDuhS^f&<(9vA9@UhMH2-Fe_YAG$NvK6X{!mvPK~ zuEA&PA}meylmaIbbJXDOzuIn8cJNCV{tUA<$Vb?57JyAM`*GpEfMmFq>)6$E(9e1@W`l|R%-&}38#bl~levA#fx2wiBk^)mPj?<=S&|gv zQO)4*91$n08@W%2b|QxEiO0KxABAZC{^4BX^6r>Jm?{!`ZId9jjz<%pl(G5l));*`UU3KfnuXSDj2aP>{ zRIB$9pm7lj3*Xg)c1eG!cb+XGt&#?7yJ@C)(Ik)^OZ5><4u$VLCqZ#q2NMCt5 z6$|VN(RWM;5!JV?-h<JkEZ(SZF zC(6J+>A6Am9H7OlOFq6S62-2&z^Np=#xXsOq0WUKr zY_+Ob|CQd1*!Hirj5rn*=_bM5_zKmq6lG zn*&_=x%?ATxZ8ZTzd%biKY_qyNC#ZQ1vX+vc48N>aJXEjs{Y*3Op`Q7-oz8jyAh>d zNt_qvn`>q9aO~7xm{z`ree%lJ3YHCyC`q`-jUVCn*&NIml!uuMNm|~u3#AV?6kC+B z?qrT?xu2^mobSlzb&m(8jttB^je0mx;TT8}`_w(F11IKz83NLj@OmYDpCU^u?fD{) z&=$ptwVw#uohPb2_PrFX;X^I=MVXPDpqTuYhRa>f-=wy$y3)40-;#EUDYB1~V9t%$ z^^<7Zbs0{eB93Pcy)96%XsAi2^k`Gmnypd-&x4v9rAq<>a(pG|J#+Q>E$FvMLmy7T z5_06W=*ASUyPRfgCeiPIe{b47Hjqpb`9Xyl@$6*ntH@SV^bgH&Fk3L9L=6VQb)Uqa z33u#>ecDo&bK(h1WqSH)b_Th#Tvk&%$NXC@_pg5f-Ma#7q;&0QgtsFO~`V&{1b zbSP*X)jgLtd@9XdZ#2_BX4{X~pS8okF7c1xUhEV9>PZco>W-qz7YMD`+kCGULdK|^ zE7VwQ-at{%&fv`a+b&h`TjzxsyQX05UB~a0cuU-}{*%jR48J+yGWyl3Kdz5}U>;lE zgkba*yI5>xqIPz*Y!-P$#_mhHB!0Fpnv{$k-$xxjLAc`XdmHd1k$V@2QlblfJPrly z*~-4HVCq+?9vha>&I6aRGyq2VUon^L1a)g`-Xm*@bl2|hi2b|UmVYW|b+Gy?!aS-p z86a}Jep6Mf>>}n^*Oca@Xz}kxh)Y&pX$^CFAmi#$YVf57X^}uQD!IQSN&int=D> zJ>_|au3Be?hmPKK)1^JQ(O29eTf`>-x^jF2xYK6j_9d_qFkWHIan5=7EmDvZoQWz5 zZGb<{szHc9Nf@om)K_<=FuLR<&?5RKo3LONFQZ@?dyjemAe4$yDrnD zglU#XYo6|~L+YpF#?deK6S{8A*Ou;9G`cdC4S0U74EW18bc5~4>)<*}?Z!1Y)j;Ot zosEP!pc$O^wud(={WG%hY07IE^SwS-fGbvpP?;l8>H$;}urY2JF$u#$q}E*ZG%fR# z`p{xslcvG)kBS~B*^z6zVT@e}imYcz_8PRzM4GS52#ms5Jg9z~ME+uke`(Tq1w3_6 zxUa{HerS7!Wq&y(<9yyN@P^PrQT+6ij_qW3^Q)I53iIFCJE?MVyGLID!f?QHUi1tq z0)RNIMGO$2>S%3MlBc09l!6_(ECxXTU>$KjWdZX^3R~@3!SB zah5Za2$63;#y!Y}(wg1#shMePQTzfQfXyJ-Tf`R05KYcyvo8UW9-IWGWnzxR6Vj8_la;*-z5vWuwUe7@sKr#Tr51d z2PWn5h@|?QU3>k=s{pZ9+(}oye zc*95N_iLmtmu}H-t$smi49Y&ovX}@mKYt2*?C-i3Lh4*#q5YDg1Mh`j9ovRDf9&& zp_UMQh`|pC!|=}1uWoMK5RAjdTg3pXPCsYmRkWW}^m&)u-*c_st~gcss(`haA)xVw zAf=;s>$`Gq_`A}^MjY_BnCjktBNHY1*gzh(i0BFZ{Vg^F?Pbf`8_clvdZ)5(J4EWzAP}Ba5zX=S(2{gDugTQ3`%!q`h7kYSnwC`zEWeuFlODKiityMaM9u{Z%E@@y1jmZA#ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png index 13b35eba55c6dabc3aac36f33d859266c18fa0d0..980f69b89f3db0ec848f4e79220ce7f8b9ee09f7 100644 GIT binary patch literal 8548 zcmb`N*Ebvv(D!%s-lMlg5JYbgtQI{)k6weQA$r@@c8RunjV_4ZdnbtAdnZ`Ecb?z- z2fSC$b1^eFbIzRez4)FpGoSEJY6|!`)HnbD0AEQ_PV>JC{eOXl@n7zdG#>&0K%7c) z(%N3YBV+6ovY9%`1|L)FH5*Ed6!TX^3-l547t8ccAWD42&GYfFA6@7griyZ8AGXL% zjp7s~yPk-J#%wR&Fonm4nG;i5(P3DdrTFi+HJ2dUeVujO^={k*R;KVHJzmyCc#XA& z%6y-FMPn zJm4hl|E__Qgb~U|dvzz8%$Oj8acj4p4Iq+HGJR#4fxa9_th;nflBcA6@3*Eo4tJ$S z3Am7Ku>TFs#)>=9_t6A~H#YsTD;q*L_KofH>t4wtkwUQCR+d;EHeYWwoRHoQc|{J* zGsxhpmKRgbZz;YLa~dnS4obuw;xHYXEld^=+q+14nV)pqEi5m8uk=FBA(6&~UK``B z(BDYecygi9CeK?d?l?q3@Zx zcmb|6H%%+|Btr;sHXD&t1H=4wlt2Bzn|1q>rHj~!A(G2el7Ah=Z}bneXUJg zO#0L;&C`nTI!YKM9Gx`p2oa-ki?o9}bKd;mdN2j8M7jE=@ZW)HbZbslW*%L4+wg%vskr9Ny1c?z8)L*idnaRDz|{qCcB~k1q$GE*T{sum zm91BOUHLrYKR+P}CtByb54^I=>$kMUL9@2K+42|nS}`Gd42rAENtjH|j29lYsDaKn zMXRLwc-9L`##GjuVYA!~S1>x*BMAQ8| z`)t{h<<(h0)N|W9MmS1O(FA!j%dI3+MX_(X*l^jejA@XR__Wiw2C)`63C__?SA|9c zOqqQd@g#l{VBMmgdx2jozY5%=$SEnKanKj$HO$j3ALr|MIYjrpaWWM2I&~LG&?}w8 z=QUnud2{*u{@!r)tG$1mTLE^i0eSG!zImq3bz$K#{hs@4lJ2hzzS11-D)VZ>EtEhn zVh%+=g<5lAQq zS+24+lHh#`ZH|(z{EqP#o zvqwTH{}kTH4!#X%8`|k76v1v<@Lm`neBc~VNCmLWE_oA%-=SI~eOZF@<46xk>>_iO$kcIVe>Lue23kwX9Vh>wcI1 zeAR~eC$jM$=9j+rT2&6xxP(ganP4xk>k}l6Zv633#Ok-c~RNQk5UU0(D!ZRL! zjbnMddNx8)CozhyB2VzZ@clnMc%vV@p5iJx^sheX-TWk~`Hk6oYLc|ozkAN76AM+s zfuUzKw|}vusba`aen`1?pD&ecN@5>4GXVjT5c%Z3Ry`^v(!zcj4e`8tLRd|RqeF>CnJXB9Odd<;%vW9-4<1x~)vHgGfx=5mr#D^)V9prrF#6sHETPStd+p zhWTk5^oIiVtjTY&fBG~|-6~6St%E<6rC=Z|Y;IeTVG0-2#~CYJ^V14NF)l1ohKO|- zVHC(KpQ*~$C&s*vX~h&(OPzi41xYs_lRx`PuTIN&O?G|HyE6 zYhHMLMEMV&l8xJ1c*ncjUxs9u3N2WU{+&Dn9ANI`82zFzPn?QrWo#6miKJLUwyMK+ zt;DD%Ja{MABBZdqB&gh9F?TU|Y2}|tWQQIO_U%9vD(T5cx6kjrv+|qrF zTphXLl`}G_Lb4k$OpTC;)9r$^t?ie+xw5X!1<&pjrtGfI!h)fwR1}td{ku&c9c;BPSUuee_gKhr_^ z6L2a6yC-?a5##@W2_KhR`iT0!zrlKBVHvl8^EE=|`Q)}N9xm3VD;AcQT{bi-AZ`(J zBH)=0fuW}!~okbisJs8JoM{o3}(34*iHW$ zH9w@W-lHj_Fn?<iMYsJ=Em=II;RlKZfCS8t>-$926pPQs?XRN|Qh4%*o$;2Ja+d?Iw{NA{{*%E-(!E48`NnV}hRiNjofXQM z{CX=iI;^_Xfo|S`Hf5N0@5+^JLgzz32byFB8h0|9iE}N<_c(kuy0^5R#Oh||sWPS* zxygi;2*#i;t4|pUrIy>V(hB~EO|b*Aw)cmqgMDmn3}->tbt9vJGrv)5LQ#W(z_&Kz z0r-dn<70c`<@}BUIWfa&FMvVzo(f=cB}yKxU`L*viyvw-=ec_tf@k~_#jO_eGpZH^ zX?TevTXUzno3z?=+&8pst}Y%;XDLOZJbF2m=Gx)X=10;7DSAOoIDF@}7$uLc$xSVq z;2akpkzN>6QQ?hkV2HBauYSxNjr(;MWquDFh?z~NYhoT0#~+s-KkM!LI6k?Jt`|?^ zw-P|)$5g`kt@ka>8!aWIHK$-;TQACoP-}M9kh8`Qw)VJEHZ6eMl(hSX=_5;eX+5(7 z*@7|c*x7az3xJzE-4r@<^>VZrp8Zbphvf${l`}>5xWyH&8I?iVw(Wi?jL#ZXf%v?6 zvCOdE{1}OKyQ`qWU^XfOY?azzKes#bGS~m|2Y(>+*70C3 z9fV2e#}*XG+e#e6>t~^ws!G*cVTC1h3+eMD-V< z`lk=P{z+n7IY89|H6eN=IBw%zBeb&hjxvT)EB;7Y11)C|NIQXkS$MK2K1dQ~mcxt} z)IhBMgDrMkR=#a1D^4Ru(T@iNs%z|p7U#q`Im(v#`p%z;1#$v1{OWo(5RFU6*f5% z!|^IAQ39*TWjF+z~U_r@>|fbpIxCsB4!j=cNm{mpuwZ=@n)ED)r&t z>SyzU#nSBNSqEHVDaVRdhLh9oOubp@v+eLkhdw&=;%dXwvU1%A>wr^%yG}`K%LCZ!Gq+8}TxP(9=a+E`sz8V9BgJ1K{gOzYDR?tTQ zX6$T`%(#7VCW;3ALALu4!M4~UUNDbXR&NKF>L$6Ea%If^0y+lxh#7se!)alj>6{pe2ZGk`@$wJ<(8U~B|^d%d;?<;%n zrkN46NO)5MMbK|$usg5>o9O$9xA6KJnK&fb;}%015O$$q@OC@f((^@m}eRm_hs;hGs;3zAaEbg#GmfDWFCs ze0tNYzvO1Z^i!YO)NY0!>L0lZ+NE0jhLgpp&r*d?P|;GDl1|uP30UwJUH3D5J@Z`g z51*E~9tB~U+$VCf)SM;_trDy`Kn{`F&@Ace6I6Be_1?QWq--}H!}B{UzdjfAL1Grb z5@YPV=b>|Y&hEH|k;}0gJG)>|UpHvc%-~Sb`ck7#O#r=I5MBn3v?q^geiSY=Vo*Z4 ze16N~o4YY>CN;k_i>?5EK)Ee?b|Z6CB+)kGAHkGBO#UBg>ZP{|T1^_7;Z zS_m4PRst&-Cw&Q>0Y`*&9f{HLvJMH~##JZ=2p8mWfd;iAlWaj;;}axm$ZV{95HyKO ze?dEp{zmAAH6A9*x7A^HxxN#uXS%6}E>u~h9Qx_&Kvk-St@Sp1>hwU(bH zuCI!EN}sii+VtX`=x=Rc`D+CRv{NFD6dhah{=ZbM!f4}buhY`@x+XRbYHF#=fr1tB zldxdLw@?|YoK^IjYk;}&WZf=rV~nTFV8R(9J~{LwD?uGy;ZS899=27;RAV_a2$;YY zUO7fcA`~E{id?Q$w{2@LT9&hCpI?{{TB@IAn&{6n$uq(24JB_Y^3dgqsPy@_XTT*I z9(AA8d`wS2Y)yB&96QyeOs#0zyPX?v3?TLWL z>G9AM0se(yLr8;G5Ug7CGyjK)XB;f|;EtdHRWDA(NwhN|faAB1zPHZ+ryxlVo7BOm z*rB+eHa(92Dkl#0Cn3oLfe}T*C?CWFd5MAa{*vfy3qOz4;-35F>Q}}Qb$=_XOR9%A zwYjK$jDf#zgUzM3-Zb(Odol4c%;_5vuGZ5V@dk*J#icB+00$P{N+rCaJ(DGo7GETG zaN^JQPcpPJFuh8LEn#R6oG8SFiSu-?1Z@RaEaAoTGqBmcxxL`^%?0jov% zG3LZrF~>XE-^U~bc%X$N5H#Vke-sSrDqLh^>1B4%Eqyw$vQe7So4e-rLt8b185=qy zCDecu%5%k^gZucoEw=u%9%60U>-y{UOw^B95f&)iU=(HQ0RmkI;%UG+0TDNvPFwCY zc0!-VnUN7rb4nN&;5!jSbw?0i9wfrxcxm~OUF!G4NfzcfN_cC?lBaNx|F<05w}Ts( zKB#k3R0x$hHr(xL3;~7nuc%doR=@9!^)G@!%{VAEP(Pu8G?j8> zU6$0Y`H88ak{_9iF(MAQaQ0^|ijE~GakCN0o#v1jeJo`(uj3Dv$r6y4!!-j{j1*lh zVV8{)k#Z-5m<@4k@UmK67|ks$)si<(&)dm*MjmVSrmI)G71xr(J9{7Llf%#;FKxg! ziTF^|8XdT!bx&1Gd5YW65k(ASt%wZqSH(5dJ!Uuy{IDvrw&tIIM7sxn)B<^822~P8 z$$~(UXv5IYnJT$iS7#AY9;QVUKq6-8)*~Ca>F*BMwH{)Olo1FYo*dplCRtgC^s(<~ zM~q4Pbs$4IqdfM5mPQiQ%kiJ@S>n#y>-a;nj-OSw@2CO@h)(cz+BeaK!uo#M?62JZ z&UGI%x_Me+)upIcIMx#oT)Uh7F~rk`Og?FAE6jQ74v2?tZRf(pjv{2QpyR?bPn>@+ z^$|5!QQ<^TYz1#fDnKk@U8IXq9w3*TWw+7+!~Z>`5Sy3P)DkdSZO*mwZ9ml$3|ZS5 zOUVP1jJhso1wiJnzspmow>w_J6kh5}%=xO3qN~h*nx<(4lAT%dR;|{>ak(iwZ0}~K zOzI6S;iUrdI?a*+$A!r+>zN{Y&Pz*z;I7ex9DLwn6QGO&5Qar~E@?J?cD+%k|s+9E3+SHUM^Ykbc4Bb?+JEv!jrb(ETRyK5#sgT_1o+7D-W z2f`iOh}&}j4@h{z9c3?y_D;HyAH2&zXezK}qnByiCX(5ZNXRjI4Y{43nKQm9>F|Sf{Wb;Pr*Z2Xo8cpkiSWiOg>dPDf4)2U4$BOBEGV#9 z&cf^dH}%G5jh(K~ zK${{XDQuBR;~~@+01dIgTFNSK*g^pj4+z8X=*g%Jc(REYkL_b0L?}i3w;CQFb|NZL z&%7aPk3x>xN)I+MM&1i?-~gA0#jE#vvApK2nSkPwY+G~q6l#4MUVrkF*FSggOV{mH zslhDa_80xr=KhNIlV6F>4ei%wlK0Bjjgxe}E@@;R-(1=%cvAw&=%g&)MZNeKcX!Jk zsa$=`!H!YB)?|~Q$kaj`>S1p_n>i&iZKASSh{Wev{(eTdJC@cck@M$+bo59V#B<4e zEE8Pr*AoYR^dC7R*wrWU8D>zYGr3;G1%n}Hw>ckv4w^(*vz8=3?G^v7j*5zDtNt3r zZmyDr>B7$PG80=i0oY(c+?Z#5^ohcWp%86skpb)}7_nmN<2g7v$h4c^~XnR@1(`e{sK? zv;ohbC1dM^!ggs5hPv2{SL1aqWg{WSA%EA}syBc4CB9xLe&N8! zA7-WF`YCXB5$}!vs>XVD8ghC0m^xSPwRUxUb($;^;2gDLfz&g^;I~$z^n0w? zt?01rl7$3VKP53YT;gDsW|Ty`eqlvWrzNT;Xn&H)SZNF7cpn#pes~iECuadTOqzDpGlp99GM0n)){CzggITja_!SV|7BK$(Dy2Fx>d}R}aPv!S%lm zeQ|Z$Z#+~QY%&Z|fTiTn?ib8DCdDXcRq>OPP+ojMI7LuyX1o^)2UgX+6P+VR5pl5M z82UeB{*8_R$k=Q3r83klUx*qew}h|N%Aehe_rA~P4SJ9s7d>=KC>g&`rC{XVriF23 zP_kgR3}6mIJdc|nTdOEn;(*MR_b}zBs+_U4)pyySz7tWSZ|<^2{21!w-EUEZ9ZKYA?6jA>O3p;ep7~tMW|v{k9xjkS*1z5p6i9Dqup%s z?XE6`NWnk5HT>-_RHx3|Kkw5AgK=J}4yTSPJiYyTfPxW4Y8XsYopLH&;YM(=x&=$P z`0bJkt3-k`UqRUrn0Qb2oro%R{Z;AT$2W8BZTnHdWh*u7EQ??!TknY zKjbhf;#cIO{qOd!t(HjazNYA_7w@hemARA8=Y>b^Lwry2b7Z8_2l@%hW;jAn6zb`OzpU(q{(1yjj?`5XoVa@oz|TN0 z`43$~oIDv`C)2sh2_q{u<21}QrI~ZqV@CHL{zLXLPRnP9Ioxya#tBInNB%n!c833u z5<|kb7ll_PEQhO`m^p;?FO|T1vC_1>NH^Y!Uw-|4iJ`j^RbO6~lk4e>_BTR7;UVZ; z6(3!rI^2O2zAs)rPiD+GpW;w*?_6z~* zf%t}~5}(3ury(*o3;=B5?ep$v*5mSsRz^wIt?Nk{4KkYN_!^x9B>y#Lv04m#5d5_O zU185g9*T|bJzB_}!u!zPF<0(>k1~_?RA5wdwtn070rKSHes@p^S8+%SsanfcK=!Xa&6RbgNMqbC4LAJpW^Wz2&92TY7`eEI#0we$cm_HcmYFP$?wjD#BaCN4mzC5#`>w9y6=ThxrYZc0WPXprg zYjB`UsV}0=eUtY$(P6YW}npdd;%9pi?zS3k-nqCob zSX_AQEf|=wYT3r?f!*Yt)ar^;l3Sro{z(7deUBPd2~(SzZ-s@0r&~Km2S?8r##9-< z)2UOSVaHqq6}%sA9Ww;V2LG=PnNAh6mA2iWOuV7T_lRDR z&N8-eN=U)-T|;wo^Wv=34wtV0g}sAAe}`Ph@~!|<;z7*K8(qkX0}o=!(+N*UWrkEja*$_H6mhK1u{P!AC39} z|3+Z(mAOq#XRYS)TLoHv<)d%$$I@+x+2)V{@o~~J-!YUI-Q9%!Ldi4Op&Lw&B>jj* zwAgC#Y>gbIqv!d|J5f!$dbCXoq(l3GR(S>(rtZ~Z*agXMMKN!@mWT_vmCbSd3dUUm z4M&+gz?@^#RRGal%G3dDvj7C5QTb@9+!MG+>0dcjtZEB45c+qx*c?)d<%htn1o!#1 zpIGonh>P1LHu3s)fGFF-qS}AXjW|M*2Xjkh7(~r(lN=o#mBD9?jt74=Rz85I4Nfx_ z7Z)q?!};>IUjMNM6ee2Thq7))a>My?iWFxQ&}WvsFP5LP+iGz+QiYek+K1`bZiTV- zHHYng?ct@Uw5!gquJ(tEv1wTrRR7cemI>aSzLI^$PxW`wL_zt@RSfZ1M3c2sbebM* ze0=;sy^!90gL~YKISz*x;*^~hcCoO&CRD)zjT(A2b_uRue=QXFe5|!cf0z1m!iwv5GUnLw9Dr*Ux z)3Lc!J@Ei;&&yxGpf2kn@2wJ2?t6~obUg;?tBiD#uo$SkFIasu+^~h33W~`r82rSa ztyE;ehFjC2hjpJ-e__EH&z?!~>UBb=&%DS>NT)1O3Isn-!SElBV2!~m6v0$vx^a<@ISutdTk1@?;i z<8w#b-%|a#?e5(n@7>M|v<<0Kpg?BiHYMRe!3Z{wYc2hN{2`6(;q`9BtXIhVq6t~KMH~J0~XtUuT06hL8c1BYZWhN zk4F2I;|za*R{ToHH2L?MfRAm5(i1Ijw;f+0&J}pZ=A0;A4M`|10ZskA!a4VibFKn^ zdVH4OlsFV{R}vFlD~aA4xxSCTTMW@Gws4bFWI@xume%smAnuJ0b91QIF?ZV!%VSRJ zO7FmG!swKO{xuH{DYZ^##gGrXsUwYfD0dxXX3>QmD&`mSi;k)YvEQX?UyfIjQeIm! z0ME3gmQ`qRZ;{qYOWt}$-mW*>D~SPZKOgP)T-Sg%d;cw^#$>3A9I(%#vsTRQe%moT zU`geRJ16l>FV^HKX1GG7fR9AT((jaVb~E|0(c-WYQscVl(z?W!rJp`etF$dBXP|EG z=WXbcZ8mI)WBN>3<@%4eD597FD5nlZajwh8(c$lum>yP)F}=(D5g1-WVZRc)(!E3} z-6jy(x$OZOwE=~{EQS(Tp`yV2&t;KBpG*XWX!yG+>tc4aoxbXi7u@O*8WWFOxUjcq z^uV_|*818$+@_{|d~VOP{NcNi+FpJ9)aA2So<7sB%j`$Prje&auIiTBb{oD7q~3g0 z>QNIwcz(V-y{Ona?L&=JaV5`o71nIsWUMA~HOdCs10H+Irew#Kr(2cn>orG2J!jvP zqcVX0OiF}c<)+5&p}a>_Uuv)L_j}nqnJ5a?RPBNi8k$R~zpZ33AA4=xJ@Z($s3pG9 zkURJY5ZI=cZGRt_;`hs$kE@B0FrRx(6K{`i1^*TY;Vn?|IAv9|NrN*KnJqO|8$e1& zb?OgMV&q5|w7PNlHLHF) zB+AK#?EtCgCvwvZ6*u|TDhJcCO+%I^@Td8CR}+nz;OZ*4Dn?mSi97m*CXXc=};!P`B?}X`F-B5v-%ACa8fo0W++j&ztmqK z;&A)cT4ob9&MxpQU41agyMU8jFq~RzXOAsy>}hBQdFVL%aTn~M>5t9go2j$i9=(rZ zADmVj;Qntcr3NIPPTggpUxL_z#5~C!Gk2Rk^3jSiDqsbpOXf^f&|h^jT4|l2ehPat zb$<*B+x^qO8Po2+DAmrQ$Zqc`1%?gp*mDk>ERf6I|42^tjR6>}4`F_Mo^N(~Spjcg z_uY$}zui*PuDJjrpP0Pd+x^5ds3TG#f?57dFL{auS_W8|G*o}gcnsKYjS6*t8VI<) zcjqTzW(Hk*t-Qhq`Xe+x%}sxXRerScbPGv8hlJ;CnU-!Nl=# zR=iTFf9`EItr9iAlAGi}i&~nJ-&+)Y| zMZigh{LXe)uR+4D_Yb+1?I93mHQ5{pId2Fq%DBr7`?ipi;CT!Q&|EO3gH~7g?8>~l zT@%*5BbetH)~%TrAF1!-!=)`FIS{^EVA4WlXYtEy^|@y@yr!C~gX+cp2;|O4x1_Ol z4fPOE^nj(}KPQasY#U{m)}TZt1C5O}vz`A|1J!-D)bR%^+=J-yJsQXDzFiqb+PT0! zIaDWWU(AfOKlSBMS};3xBN*1F2j1-_=%o($ETm8@oR_NvtMDVIv_k zlnNBiHU&h8425{MCa=`vb2YP5KM7**!{1O>5Khzu+5OVGY;V=Vl+24fOE;tMfujoF z0M``}MNnTg3f%Uy6hZi$#g%PUA_-W>uVCYpE*1j>U8cYP6m(>KAVCmbsDf39Lqv0^ zt}V6FWjOU@AbruB7MH2XqtnwiXS2scgjVMH&aF~AIduh#^aT1>*V>-st8%=Kk*{bL zzbQcK(l2~)*A8gvfX=RPsNnjfkRZ@3DZ*ff5rmx{@iYJV+a@&++}ZW+za2fU>&(4y`6wgMpQGG5Ah(9oGcJ^P(H< zvYn5JE$2B`Z7F6ihy>_49!6}(-)oZ(zryIXt=*a$bpIw^k?>RJ2 zQYr>-D#T`2ZWDU$pM89Cl+C<;J!EzHwn(NNnWpYFqDDZ_*FZ{9KQRcSrl5T>dj+eA zi|okW;6)6LR5zebZJtZ%6Gx8^=2d9>_670!8Qm$wd+?zc4RAfV!ZZ$jV0qrv(D`db zm_T*KGCh3CJGb(*X6nXzh!h9@BZ-NO8py|wG8Qv^N*g?kouH4%QkPU~Vizh-D3<@% zGomx%q42B7B}?MVdv1DFb!axQ73AUxqr!yTyFlp%Z1IAgG49usqaEbI_RnbweR;Xs zpJq7GKL_iqi8Md?f>cR?^0CA+Uk(#mTlGdZbuC*$PrdB$+EGiW**=$A3X&^lM^K2s zzwc3LtEs5|ho z2>U(-GL`}eNgL-nv3h7E<*<>C%O^=mmmX0`jQb6$mP7jUKaY4je&dCG{x$`0=_s$+ zSpgn!8f~ya&U@c%{HyrmiW2&Wzc#Sw@+14sCpTWReYpF9EQ|7vF*g|sqG3hx67g}9 zwUj5QP2Q-(KxovRtL|-62_QsHLD4Mu&qS|iDp%!rs(~ah8FcrGb?Uv^Qub5ZT_kn%I^U2rxo1DDpmN@8uejxik`DK2~IDi1d?%~pR7i#KTS zA78XRx<(RYO0_uKnw~vBKi9zX8VnjZEi?vD?YAw}y+)wIjIVg&5(=%rjx3xQ_vGCy z*&$A+bT#9%ZjI;0w(k$|*x{I1c!ECMus|TEA#QE%#&LxfGvijl7Ih!B2 z6((F_gwkV;+oSKrtr&pX&fKo3s3`TG@ye+k3Ov)<#J|p8?vKh@<$YE@YIU1~@7{f+ zydTna#zv?)6&s=1gqH<-piG>E6XW8ZI7&b@-+Yk0Oan_CW!~Q2R{QvMm8_W1IV8<+ zQTyy=(Wf*qcQubRK)$B;QF}Y>V6d_NM#=-ydM?%EPo$Q+jkf}*UrzR?Nsf?~pzIj$ z<$wN;7c!WDZ(G_7N@YgZ``l;_eAd3+;omNjlpfn;0(B7L)^;;1SsI6Le+c^ULe;O@ zl+Z@OOAr4$a;=I~R0w4jO`*PKBp?3K+uJ+Tu8^%i<_~bU!p%so z^sjol^slR`W@jiqn!M~eClIIl+`A5%lGT{z^mRbpv}~AyO%R*jmG_Wrng{B9TwIuS z0!@fsM~!57K1l0%{yy(#no}roy#r!?0wm~HT!vLDfEBs9x#`9yCKgufm0MjVRfZ=f z4*ZRc2Lgr(P+j2zQE_JzYmP0*;trl7{*N341Cq}%^M^VC3gKG-hY zmPT>ECyrhIoFhnMB^qpdbiuI}pk{qPbK^}0?Rf7^{98+95zNq6!RuV_zAe&nDk0;f zez~oXlE5%ve^TmBEt*x_X#fs(-En$jXr-R4sb$b~`nS=iOy|OVrph(U&cVS!IhmZ~ zKIRA9X%Wp1J=vTvHZ~SDe_JXOe9*fa zgEPf;gD^|qE=dl>Qkx3(80#SE7oxXQ(n4qQ#by{uppSKoDbaq`U+fRqk0BwI>IXV3 zD#K%ASkzd7u>@|pA=)Z>rQr@dLH}*r7r0ng zxa^eME+l*s7{5TNu!+bD{Pp@2)v%g6^>yj{XP&mShhg9GszNu4ITW=XCIUp2Xro&1 zg_D=J3r)6hp$8+94?D$Yn2@Kp-3LDsci)<-H!wCeQt$e9Jk)K86hvV^*Nj-Ea*o;G zsuhRw$H{$o>8qByz1V!(yV{p_0X?Kmy%g#1oSmlHsw;FQ%j9S#}ha zm0Nx09@jmOtP8Q+onN^BAgd8QI^(y!n;-APUpo5WVdmp8!`yKTlF>cqn>ag`4;o>i zl!M0G-(S*fm6VjYy}J}0nX7nJ$h`|b&KuW4d&W5IhbR;-)*9Y0(Jj|@j`$xoPQ=Cl diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png index 0a3f5fa40fb3d1e0710331a48de5d256da3f275d..37987c00e7a421a2ab906004a1b19ea8e22d7b36 100644 GIT binary patch delta 621 zcmV-z0+RiR1ce2VBYy%+Nkl*x=2LFnQ?R)b>8oNxAy`E zT16OiS09&i&i9?~hY2CDmdDn_{wD%27m_Xg^YIQFkSM^Tfqzi5PD^M$ zgP~c_hQ}e7l?&5b1fF#L3J}{C9xaW`^b}~Y)WLedoqr~~Tn1SJE%4&kK3UFG(-E}n z+xaAVxa#@o`)~RrN_byKQ(ND_r?zJ?qm}sm!kw4Pak-2td7$fLXP^{9HN~})4Y#_^ z9_*r&;B(LMy-cD!Q0PlHR&IJ%8ZMgd8Jp}RG6VHHJjDY>oN`>XK(HXud#L8r(cNXQ zR=XT7R%TMGu|%o3cd7Y$?Ux;+?XO23|Ip0<@i_tqwuFZownyGxt=n~bqax4$Y4eU% zmcOX42oK%)INs@0DOhiF_4&VBUZAAF7w>MWYIo!Re@s6CM?CKh4fkS@00000NkvXX Hu0mjf0!t~p delta 495 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 literal 14142 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 literal 36406 zcmeGE=RaKU_dbB`8KZ_EB%(x35TbX25d=Z>h)%Q!Av#fJM3Csc_g zC2I6x%$)80`Tkz#KRA!h1FzY`?0es3t!rKDT5EjPe6B=BLPr7s0GW!if;Ip^!AmGW zL;$`Vdre+|FA!I4r6)keFvAx3M#1`}ijBHDzy)3t0gwjl|qC2YB`SSxFKHr(oY#H$)x{L$LL zBdLKTlsOrmb>T0wd=&6l3+_Te>1!j0OU8%b%N342^opKmT)gni(wV($s(>V-fUv@0p8!f`=>PxC|9=nu ze{ToBBj8b<{PLfXV$h8YPgA~E!_sF9bl;QOF{o6t&JdsX?}rW!_&d`#wlB6T_h;Xf zl{4Tz5>qjF4kZgjO7ZiLPRz_~U@k5%?=30+nxEh9?s78gZ07YHB`FV`4%hlQlMJe@J`+e(qzy+h(9yY^ckv_* zb_E6o4p)ZaWfraIoB2)U7_@l(J0O%jm+Or>8}zSSTkM$ASG^w3F|I? z$+eHt7T~04(_WfKh27zqS$6* zzyy-ZyqvSIZ0!kkSvHknm_P*{5TKLQs8S6M=ONuKAUJWtpxbL#2(_huvY(v~Y%%#~ zYgsq$JbLLprKkV)32`liIT$KKEqs$iYxjFlHiRNvBhxbDg*3@Qefw4UM$>i${R5uB zhvTgmqQsKA{vrKN;TSJU2$f9q=y{$oH{<)woSeV>fkIz6D8@KB zf4M%v%f5U2?<8B(xn}xV+gWP?t&oiapJhJbfa;agtz-YM7=hrSuxl8lAc3GgFna#7 zNjX7;`d?oD`#AK+fQ=ZXqfIZFEk{ApzjJF0=yO~Yj{7oQfXl+6v!wNnoqwEvrs81a zGC?yXeSD2NV!ejp{LdZGEtd1TJ)3g{P6j#2jLR`cpo;YX}~_gU&Gd<+~SUJVh+$7S%`zLy^QqndN<_9 zrLwnXrLvW+ew9zX2)5qw7)zIYawgMrh`{_|(nx%u-ur1B7YcLp&WFa24gAuw~& zKJD3~^`Vp_SR$WGGBaMnttT)#fCc^+P$@UHIyBu+TRJWbcw4`CYL@SVGh!X&y%!x~ zaO*m-bTadEcEL6V6*{>irB8qT5Tqd54TC4`h`PVcd^AM6^Qf=GS->x%N70SY-u?qr>o2*OV7LQ=j)pQGv%4~z zz?X;qv*l$QSNjOuQZ>&WZs2^@G^Qas`T8iM{b19dS>DaXX~=jd4B2u`P;B}JjRBi# z_a@&Z5ev1-VphmKlZEZZd2-Lsw!+1S60YwW6@>+NQ=E5PZ+OUEXjgUaXL-E0fo(E* zsjQ{s>n33o#VZm0e%H{`KJi@2ghl8g>a~`?mFjw+$zlt|VJhSU@Y%0TWs>cnD&61fW4e0vFSaXZa4-c}U{4QR8U z;GV3^@(?Dk5uc@RT|+5C8-24->1snH6-?(nwXSnPcLn#X_}y3XS)MI_?zQ$ZAuyg+ z-pjqsw}|hg{$~f0FzmmbZzFC0He_*Vx|_uLc!Ffeb8#+@m#Z^AYcWcZF(^Os8&Z4g zG)y{$_pgrv#=_rV^D|Y<_b@ICleUv>c<0HzJDOsgJb#Rd-Vt@+EBDPyq7dUM9O{Yp zuGUrO?ma2wpuJuwl1M=*+tb|qx7Doj?!F-3Z>Dq_ihFP=d@_JO;vF{iu-6MWYn#=2 zRX6W=`Q`q-+q@Db|6_a1#8B|#%hskH82lS|9`im0UOJn?N#S;Y0$%xZw3*jR(1h5s z?-7D1tnIafviko>q6$UyqVDq1o@cwyCb*})l~x<@s$5D6N=-Uo1yc49p)xMzxwnuZ zHt!(hu-Ek;Fv4MyNTgbW%rPF*dB=;@r3YnrlFV{#-*gKS_qA(G-~TAlZ@Ti~Yxw;k za1EYyX_Up|`rpbZ0&Iv#$;eC|c0r4XGaQ-1mw@M_4p3vKIIpKs49a8Ns#ni)G314Z z8$Ei?AhiT5dQGWUYdCS|IC7r z=-8ol>V?u!n%F*J^^PZ(ONT&$Ph;r6X;pj|03HlDY6r~0g~X#zuzVU%a&!fs_f|m?qYvg^Z{y?9Qh7Rn?T*F%7lUtA6U&={HzhYEzA`knx1VH> z{tqv?p@I(&ObD5L4|YJV$QM>Nh-X3cx{I&!$FoPC_2iIEJfPk-$;4wz>adRu@n`_y z_R6aN|MDHdK;+IJmyw(hMoDCFCQ(6?hCAG5&7p{y->0Uckv# zvooVuu04$+pqof777ftk<#42@KQ((5DPcSMQyzGOJ{e9H$a9<2Qi_oHjl{#=FUL9d z+~0^2`tcvmp0hENwfHR`Ce|<1S@p;MNGInXCtHnrDPXCKmMTZQ{HVm_cZ>@?Wa6}O zHsJc7wE)mc@1OR2DWY%ZIPK1J2p6XDO$ar`$RXkbW}=@rFZ(t85AS>>U0!yt9f49^ zA9@pc0P#k;>+o5bJfx0t)Lq#v4`OcQn~av__dZ-RYOYu}F#pdsl31C^+Qgro}$q~5A<*c|kypzd} ziYGZ~?}5o`S5lw^B{O@laad9M_DuJle- z*9C7o=CJh#QL=V^sFlJ0c?BaB#4bV^T(DS6&Ne&DBM_3E$S^S13qC$7_Z?GYXTpR@wqr70wu$7+qvf-SEUa5mdHvFbu^7ew!Z1a^ zo}xKOuT*gtGws-a{Tx}{#(>G~Y_h&5P@Q8&p!{*s37^QX_Ibx<6XU*AtDOIvk|^{~ zPlS}&DM5$Ffyu-T&0|KS;Wnaqw{9DB&B3}vcO14wn;)O_e@2*9B&0I_ zZz{}CMxx`hv-XouY>^$Y@J(_INeM>lIQI@I>dBAqq1)}?Xmx(qRuX^i4IV%=MF306 z9g)i*79pP%_7Ex?m6ag-4Tlm=Z;?DQDyC-NpUIb#_^~V_tsL<~5<&;Gf2N+p?(msn zzUD~g>OoW@O}y0@Z;RN)wjam`CipmT&O7a|YljZqU=U86 zedayEdY)2F#BJ6xvmW8K&ffdS*0!%N<%RB!2~PAT4AD*$W7yzHbX#Eja9%3aD+Ah2 zf#T;XJW-GMxpE=d4Y>}jE=#U`IqgSoWcuvgaWQ9j1CKzG zDkoMDDT)B;Byl3R2PtC`ip=yGybfzmVNEx{xi_1|Cbqj>=FxQc{g`xj6fIfy`D8fA z##!-H_e6o0>6Su&$H2kQTujtbtyNFeKc}2=|4IfLTnye#@$Au7Kv4)dnA;-fz@D_8 z)>irG$)dkBY~zX zC!ZXLy*L3xr6cb70QqfN#Q>lFIc<>}>la4@3%7#>a1$PU&O^&VszpxLC%*!m-cO{B z-Y}rQr4$84(hvy#R69H{H zJ*O#uJh)TF6fbXy;fZkk%X=CjsTK}o5N1a`d7kgYYZLPxsHx%9*_XN8VWXEkVJZ%A z1A+5(B;0^{T4aPYr8%i@i32h)_)|q?9vws)r+=5u)1YNftF5mknwfd*%jXA2TeP}Z zQ!m?xJ3?9LpPM?_A3$hQ1QxNbR&}^m z!F999s?p^ak#C4NM_x2p9FoXWJ$>r?lJ)2bG)sX{gExgLA2s5RwHV!h6!C~d_H||J z>9{E{mEv{Z1z~65Vix@dqM4ZqiU|!)eWX$mwS5mLSufxbpBqqS!jShq1bmwCR6 z4uBri7ezMeS6ycaXPVu(i2up$L; zjpMtB`k~WaNrdgM_R=e#SN?Oa*u%nQy01?()h4A(jyfeNfx;5o+kX?maO4#1A^L}0 zYNyIh@QVXIFiS0*tE}2SWTrWNP3pH}1Vz1;E{@JbbgDFM-_Mky^7gH}LEhl~Ve5PexgbIyZ(IN%PqcaV@*_`ZFb=`EjspSz%5m2E34BVT)d=LGyHVz@-e%9Ova*{5@RD;7=Ebkc2GP%pIP^P7KzKapnh`UpH?@h z$RBpD*{b?vhohOKf-JG3?A|AX|2pQ?(>dwIbWhZ38GbTm4AImRNdv_&<99ySX;kJ| zo|5YgbHZC#HYgjBZrvGAT4NZYbp}qkVSa;C-LGsR26Co+i_HM&{awuO9l)Ml{G8zD zs$M8R`r+>PT#Rg!J(K6T4xHq7+tscU(}N$HY;Yz*cUObX7J7h0#u)S7b~t^Oj}TBF zuzsugnst;F#^1jm>22*AC$heublWtaQyM6RuaquFd8V#hJ60Z3j7@bAs&?dD#*>H0SJaDwp%U~27>zdtn+ z|8sZzklZy$%S|+^ie&P6++>zbrq&?+{Yy11Y>@_ce@vU4ZulS@6yziG6;iu3Iu`M= zf3rcWG<+3F`K|*(`0mE<$89F@jSq;j=W#E>(R}2drCB7D*0-|D;S;(;TwzIJkGs|q z2qH{m_zZ+el`b;Bv-#bQ>}*VPYC|7`rgBFf2oivXS^>v<&HHTypvd4|-zn|=h=TG{ z05TH2+{T%EnADO>3i|CB zCu60#qk`}GW{n4l-E$VrqgZGbI zbQW690KgZt4U3F^5@bdO1!xu~p@7Y~*_FfWg2CdvED5P5#w#V46LH`<&V0{t&Ml~4 zHNi7lIa+#i+^Z6EnxO7KJQw)wD)4~&S-Ki8)3=jpqxmx6c&zU&<&h%*c$I(5{1HZT zc9WE}ijcWJiVa^Q^xC|WX0habl89qycOyeViIbi(LFsEY_8a|+X^+%Qv+W4vzj>`y zpuRnjc-eHNkvXvI_f{=*FX=OKQzT?bck#2*qoKTHmDe>CDb&3AngA1O)1b}QJ1Tun z_<@yVEM>qG7664Pa@dzL@;DEh`#?yM+M|_fQS<7yv|i*pw)|Z8)9IR+QB7N3v3K(wv4OY*TXnH&X0nQB}?|h2XQeGL^q~N7N zDFa@x0E(UyN7k9g%IFq7Sf+EAfE#K%%#`)!90_)Dmy3Bll&e1vHQyPA87TaF(xbqMpDntVp?;8*$87STop$!EAnGhZ?>mqPJ(X zFsr336p3P{PpZCGn&^LP(JjnBbl_3P3Kcq+m}xVFMVr1zdCPJMDIV_ki#c=vvTwbU z*gKtfic&{<5ozL6Vfpx>o2Tts?3fkhWnJD&^$&+Mh5WGGyO7fG@6WDE`tEe(8<;+q z@Ld~g08XDzF8xtmpIj`#q^(Ty{Hq>t*v`pedHnuj(0%L(%sjkwp%s}wMd!a<*L~9T z9MM@s)Km~ogxlqEhIw5(lc46gCPsSosUFsgGDr8H{mj%OzJz{N#;bQ;KkV+ZWA1(9 zu0PXzyh+C<4OBYQ0v3z~Lr;=C@qmt8===Ov2lJ1=DeLfq*#jgT{YQCuwz?j{&3o_6 zsqp2Z_q-YWJg?C6=!Or|b@(zxTlg$ng2eUQzuC<+o)k<6^9ju_Z*#x+oioZ5T8Z_L zz9^A1h2eFS0O5muq8;LuDKwOv4A9pxmOjgb6L*i!-(0`Ie^d5Fsgspon%X|7 zC{RRXEmYn!5zP9XjG*{pLa)!2;PJB2<-tH@R7+E1cRo=Wz_5Ko8h8bB$QU%t9#vol zAoq?C$~~AsYC|AQQ)>>7BJ@{Cal)ZpqE=gjT+Juf!RD-;U0mbV1ED5PbvFD6M=qj1 zZ{QERT5@(&LQ~1X9xSf&@%r|3`S#ZCE=sWD`D4YQZ`MR`G&s>lN{y2+HqCfvgcw3E z-}Kp(dfGG?V|97kAHQX+OcKCZS`Q%}HD6u*e$~Ki&Vx53&FC!x94xJd4F2l^qQeFO z?&JdmgrdVjroKNJx64C!H&Vncr^w zzR#XI}Dn&o8jB~_YlVM^+#0W(G1LZH5K^|uYT@KSR z^Y5>^*Bc45E1({~EJB(t@4n9gb-eT#s@@7)J^^<_VV`Pm!h7av8XH6^5zO zOcQBhTGr;|MbRsgxCW69w{bl4EW#A~);L?d4*y#j8Ne=Z@fmJP0k4{_cQ~KA|Y#_#BuUiYx8y*za3_6Y}c=GSe7(2|KAfhdzud!Zq&}j)=o4 z7R|&&oX7~e@~HmyOOsCCwy`AR+deNjZ3bf6ijI_*tKP*_5JP3;0d;L_p(c>W1b%sG zJ*$wcO$ng^aW0E(5ldckV9unU7}OB7s?Wx(761?1^&8tA5y0_(ieV>(x-e@}1`lWC z-YH~G$D>#ud!SxK2_Iw{K%92=+{4yb-_XC>ji&j7)1ofp(OGa4jjF;Hd*`6YQL+Jf zffg+6CPc8F@EDPN{Kn96yip;?g@)qgkPo^nVKFqY?8!=h$G$V=<>%5J&iVjwR!7H0 z$@QL|_Q81I;Bnq8-5JyNRv$Y>`sWl{qhq>u+X|)@cMlsG!{*lu?*H`Tp|!uv z9oEPU1jUEj@ueBr}%Y)7Luyi)REaJV>eQ{+uy4uh0ep0){t;OU8D*RZ& zE-Z-&=BrWQLAD^A&qut&4{ZfhqK1ZQB0fACP)=zgx(0(o-`U62EzTkBkG@mXqbjXm z>w`HNeQM?Is&4xq@BB(K;wv5nI6EXas)XXAkUuf}5uSrZLYxRCQPefn-1^#OCd4aO zzF=dQ*CREEyWf@n6h7(uXLNgJIwGp#Xrsj6S<^bzQ7N0B0N{XlT;`=m9Olg<>KL}9 zlp>EKTx-h|%d1Ncqa=wnQEuE;sIO-f#%Bs?g4}&xS?$9MG?n$isHky0caj za8W+B^ERK#&h?(x)7LLpOqApV5F>sqB`sntV%SV>Q1;ax67qs+WcssfFeF3Xk=e4^ zjR2^(%K1oBq%0%Rf!y&WT;lu2Co(rHi|r1_uW)n{<7fGc-c=ft7Z0Q}r4W$o$@tQF#i?jDBwZ8h+=SC}3?anUp3mtRVv9l#H?-UD;HjTF zQ*>|}e=6gDrgI9p%c&4iMUkQa4zziS$bO&i#DI$Wu$7dz7-}XLk%!US^XUIFf2obO zFCTjVEtkvYSKWB;<0C;_B{HHs~ax_48^Cml*mjfBC5*7^HJZiLDir(3k&BerVIZF8zF;0q80eX8c zPN4tc+Dc5DqEAq$Y3B3R&XPZ=AQfFMXv#!RQnGecJONe0H;+!f^h5x0wS<+%;D}MpUbTNUBA}S2n&U59-_5HKr{L^jPsV8B^%NaH|tUr)mq=qCBv_- ziZ1xUp(ZzxUYTCF@C}To;u60?RIfTGS?#JnB8S8@j`TKPkAa)$My+6ziGaBcA@){d z91)%+v2_ba7gNecdj^8*I4#<11l!{XKl6s0zkXfJPxhP+@b+5ev{a>p*W-3*25c&} zmCf{g9mPWVQ$?Sp*4V|lT@~>RR)9iNdN^7KT@>*MU3&v^3e?=NTbG9!h6C|9zO097 zN{Qs6YwR-5$)~ z`b~qs`a1Dbx8P>%V=1XGjBptMf%P~sl1qbHVm1HYpY|-Z^Dar8^HqjIw}xaeRlsYa zJ_@Apy-??`gxPmb`m`0`z`#G7*_C}qiSZe~l2z65tE~IwMw$1|-u&t|z-8SxliH00 zlh1#kuqB56s+E&PWQ7Nz17?c}pN+A@-c^xLqh(j;mS|?>(Pf7(?qd z5q@jkc^nA&!K-}-1P=Ry0yyze0W!+h^iW}7jzC1{?|rEFFWbE^Yu7Y}t?jmP-D$f+ zmqFT7nTl0HL|4jwGm7w@a>9 zKD)V~+g~ysmei$OT5}%$&LK8?ib|8aY|>W3;P+0B;=oD=?1rg+PxKcP(d;OEzq1CKA&y#boc51P^ZJPPS)z5 zAZ)dd2$glGQXFj$`XBBJyl2y-aoBA8121JC9&~|_nY>nkmW>TLi%mWdn-^Jks-Jv| zSR*wij;A3Fcy8KsDjQ15?Z9oOj|Qw2;jgJiq>dxG(2I2RE- z$As!#zSFIskebqU2bnoM^N<4VWD2#>!;saPSsY8OaCCQqkCMdje$C?Sp%V}f2~tG5 z0whMYk6tcaABwu*x)ak@n4sMElGPX1_lmv@bgdI2jPdD|2-<~Jf`L`@>Lj7{<-uLQ zE3S_#3e10q-ra=vaDQ42QUY^@edh>tnTtpBiiDVUk5+Po@%RmuTntOlE29I4MeJI?;`7;{3e4Qst#i-RH6s;>e(Sc+ubF2_gwf5Qi%P!aa89fx6^{~A*&B4Q zKTF|Kx^NkiWx=RDhe<{PWXMQ;2)=SC=yZC&mh?T&CvFVz?5cW~ritRjG2?I0Av_cI z)=s!@MXpXbarYm>Kj0wOxl=eFMgSMc?62U#2gM^li@wKPK9^;;0_h7B>F>0>I3P`{ zr^ygPYp~WVm?Qbp6O3*O2)(`y)x>%ZXtztz zMAcwKDr=TCMY!S-MJ8|2MJCVNUBI0BkJV6?(!~W!_dC{TS=eh}t#X+2D>Kp&)ZN~q zvg!ogxUXu^y(P*;Q+y_rDoGeSCYxkaGPldDDx)k;ocJvvGO#1YKoQLHUf2h_pjm&1 zqh&!_KFH03FcJvSdfgUYMp=5EpigZ*8}7N_W%Ms^WSQ4hH`9>3061OEcxmf~TcYn5_oHtscWn zo5!ayj<_fZ)vHu3!A!7M;4y1QIr8YGy$P2qDD_4+T8^=^dB6uNsz|D>p~4pF3Nrb6 zcpRK*($<~JUqOya#M1=#IhOZ zG)W+rJS-x(6EoVz)P zsSo>JtnChdj9^);su%SkFG~_7JPM zEDz3gk2T7Y%x>1tWyia|op(ilEzvAujW?Xwlw>J6d7yEi8E zv30riR|a_MM%ZZX&n!qm0{2agq(s?x9E@=*tyT$nND+{Djpm7Rsy!+c$j+wqMwTOF zZL8BQ|I`<^bGW)5apO{lh(Asqen?_U`$_n0-Ob~Yd%^89oEe%9yGumQ_8Be+l2k+n zCxT%s?bMpv|AdWP7M1LQwLm|x+igA~;+iK-*+tClF&ueX_V}>=4gvZ01xpubQWXD_ zi?Un>&3=$fu)dgk-Z;0Ll}HK5_YM->l^Czrd0^cJ))(DwL2g3aZuza7ga9^|mT_70 z))}A}r1#-(9cxtn<9jGRwOB4hb9kK@YCgjfOM-90I$8@l=H^`K$cyhe2mTM|FY9vW znH~h)I<_aa#V1xmhk?Ng@$Jw-s%a!$BI4Us+Df+?J&gKAF-M`v}j`OWKP3>6`X`tEmhe#y*(Xm$_^Ybbs=%;L7h zp7q^C*qM}Krqsinq|WolR99>_!GL#Z71Hhz|IwQQv<>Ds09B?Je(lhI1(FInO8mc} zl$RyKCUmfku+Cd^8s0|t+e}5g7M{ZPJQH=UB3(~U&(w#Bz#@DTDHy>_UaS~AtN>4O zJ-I#U@R($fgupHebcpuEBX`SZ>kN!rW$#9>s{^3`86ZRQRtYTY)hiFm_9wU3c`SC8 z-5M%g)h}3Pt|wyj#F%}pGC@VL`9&>9P+_UbudCkS%y2w&*o})hBplrB*@Z?gel5q+ z%|*59(sR9GMk3xME}wd%&k?7~J)OL`rK#4d-haC7uaU8-L@?$K6(r<0e<;y83rK&` z3Q!1rD9WkcB8WBQ|WT|$u^lkr0UL4WH4EQTJyk@5gzHb18cOte4w zS`fLv8q;PvAZyY;*Go3Qw1~5#gP0D0ERla6M6#{; zr1l?bR}Nh+OC7)4bfAs(0ZD(axaw6j9v`^jh5>*Eo&$dAnt?c|Y*ckEORIiJXfGcM zEo`bmIq6rJm`XhkXR-^3d8^RTK2;nmVetHfUNugJG(4XLOu>HJA;0EWb~?&|0abr6 zxqVp@p=b3MN^|~?djPe!=eex(u!x>RYFAj|*T$cTi*Sd3Bme7Pri1tkK9N`KtRmXf zZYNBNtik97ct1R^vamQBfo9ZUR@k*LhIg8OR9d_{iv#t)LQV91^5}K5u{eyxwOFoU zHMVq$C>tfa@uNDW^_>EmO~WYQd(@!nKmAvSSIb&hPO|}g-3985t?|R&WZXvxS}Kt2i^eRe>WHb_;-K5cM4=@AN1>E&1c$k!w4O*oscx(f=<1K6l#8Exi)U(ZiZ zdr#YTP6?m1e1dOKysUjQ^>-MR={OuD00g6+(a^cvcmn#A_%Fh3Of%(qP5nvjS1=(> z|Ld8{u%(J}%2SY~+$4pjy{()5HN2MYUjg1X9umxOMFFPdM+IwOVEs4Z(olynvT%G) zt9|#VR}%O2@f6=+6uvbZv{3U)l;C{tuc zZ{K$rut=eS%3_~fQv^@$HV6#9)K9>|0qD$EV2$G^XUNBLM|5-ZmFF!KV)$4l^KVj@ zZ4fI}Knv*K%zPqK77}B-h_V{66VrmoZP2>@^euu8Rc}#qwRwt5uEBWcJJE5*5rT2t zA4Jpx`QQ~1Sh_n_a9x%Il!t1&B~J6p54zxAJx`REov${jeuL8h8x-z=?qwMAmPK5i z_*ES)BW(NZluu#Bmn1-NUKQip_X&_WzJy~J`WYxEJQ&Gu7DD< z&F9urE;}8S{x4{yB zaq~1Zrz%8)<`prSQv$eu5@1RY2WLu=waPTrn`WK%;G5(jt^FeM;gOdvXQjYhax~_> z{bS_`;t#$RYMu-;_Dd&o+LD<5Afg6v{NK?0d8dD5ohAN?QoocETBj?y{MB)jQ%UQ}#t3j&iL!qr@#6JEajR3@^k5wgLfI9S9dT2^f`2wd z%I#Q*@Ctk@w=(u)@QC}yBvUP&fFRR-uYKJ){Wp3&$s(o~W7OzgsUIPx0|ph2L1(r*_Pa@T@mcH^JxBjh09#fgo|W#gG7}|)k&uD1iZxb0 z@|Y)W79SKj9sS&EhmTD;uI#)FE6VwQ*YAr&foK$RI5H8_ripb$^=;U%gWbrrk4!5P zXDcyscEZoSH~n6VJu8$^6LE6)>+=o#Q-~*jmob^@191+Ot1w454e3)WMliLtY6~^w zW|n#R@~{5K#P+(w+XC%(+UcOrk|yzkEes=!qW%imu6>zjdb!B#`efaliKtN}_c!Jp zfyZa`n+Nx8;*AquvMT2;c8fnYszdDA*0(R`bsof1W<#O{v%O!1IO4WZe=>XBu_D%d zOwWDaEtX%@B>4V%f1+dKqcXT>m2!|&?}(GK8e&R=&w?V`*Vj)sCetWp9lr@@{xe6a zE)JL&;p}OnOO}Nw?vFyoccXT*z*?r}E8{uPtd;4<(hmX;d$rqJhEF}I+kD+m(ke;J z7Cm$W*CSdcD=RYEBhedg>tuT{PHqwCdDP*NkHv4rvQTXkzEn*Mb0oJz&+WfWIOS4@ zzpPJ|e%a-PIwOaOC7uQcHQ-q(SE(e@fj+7oC@34wzaBNaP;cw&gm{Z8yYX?V(lIv5 zKbg*zo1m5aGA4^lwJ|bAU=j3*d8S{vp!~fLFcK8s6%Ng55_qW_d*3R%e=34aDZPfD z&Le39j|ahp6E7B0*9OVdeMNrTErFatiE+=Z!XZ^tv0y%zZKXRTBuPyP&C{5(H?t)S zKV24_-TKpOmCPzU&by8R1Q5HY^@IDoeDA9MbgizgQ*F1Er~HVmvSU>vx}pZVQ&tr| zOtZl8vfY2#L<)gZ=ba&wG~EI*Vd?}lRMCf+!b5CDz$8~be-HKMo5omk$w7p4`Mym*IR8WiTz4^kKcUo^8Hkcsu14u z`Pkg`#-Y^A%CqJ0O@UF|caAulf68@(zhqp~YjzInh7qSN7Ov%Aj(Qz%{3zW|xubJ- ztNE_u_MO7Q_585r;xD?e=Er}@U1G@BKW5v$UM((eByhH2p!^g9W}99OD8VV@7d{#H zv)Eam+^K(5>-Ot~U!R$Um3prQmM)7DyK=iM%vy>BRX4#aH7*oCMmz07YB(EL!^%F7?CA#>zXqiYDhS;e?LYPTf(bte6B ztrfvDXYG*T;ExK-w?Knt{jNv)>KMk*sM^ngZ-WiUN;=0Ev^GIDMs=AyLg2V@3R z7ugNc45;4!RPxvzoT}3NCMeK$7j#q3r_xV(@t@OPRyoKBzHJ#IepkDsm$EJRxL)A* zf{_GQYttu^OXr$jHQn}zs$Eh|s|Z!r?Yi+bS-bi+PE*lH zo|6ztu6$r_?|B~S#m>imI!kQP9`6X426uHRri!wGcK;J;`%sFM(D#*Le~W*t2uH`Q z(HEO9-c_`mhA@4QhbW+tgtt9Pzx=_*3Kh~TB$SKmU4yx-Ay&)n%PZPKg#rD4H{%Ke zdMY@rf5EAFfqtrf?Vmk&N(_d-<=bvfOdPrYwY*;5%j@O6@O#Qj7LJTk-x3LN+dEKy+X z>~U8j3Ql`exr1jR>+S4nEy+4c2f{-Q!3_9)yY758tLGg7k^=nt<6h$YE$ltA+13S<}uOg#XHe6 zZHKdNsAnMQ_RIuB;mdoZ%RWpandzLR-BnjN2j@lkBbBd+?i ze*!5mC}!Qj(Q!rTu`KrRRqp22c=hF6<^v&iCDB`n7mHl;vdclcer%;{;=kA(PwdGG zdX#BWoC!leBC4);^J^tPkPbIe<)~nYb6R3u{HvC!NOQa?DC^Q`|_@ zcz;rk`a!4rSLAS>_=b@g?Yab4%=J3Cc7pRv8?_rHMl_aK*HSPU%0pG2Fyhef_biA!aW|-(( z*RIdG&Lmk(=(nk28Q1k1Oa$8Oa-phG%Mc6dT3>JIylcMMIc{&FsBYBD^n@#~>C?HG z*1&FpYVvXOU@~r2(BUa+KZv;tZ15#RewooEM0LFb>guQN;Z0EBFMFMZ=-m$a3;gVD z)2EBD4+*=6ZF?+)P`z@DOT;azK0Q4p4>NfwDR#Pd;no|{q_qB!zk1O8QojE;>zhPu z1Q=1z^0MYHo1*``H3ex|bW-Zy==5J4fE2;g6sq6YcXMYK5i|S^9(OSw#v!3^!EB<% zZF~J~CleS`V-peStyf*I%1^R88D;+8{{qN6-t!@gTARDg^w2`uSzFZbPQ!)q^oC}m zPo8VOQxq2BaIN`pAVFGu8!{p3}(+iZ`f4ck2ygVpEZMQW38nLpj3NQx+&sAkb8`}P3- zc>N*k6AG?r}bfO6_vccTuKX+*- z7W4Q#2``P0jIHYs)F>uG#AM#I6W2)!Nu2nD5{CRV_PmkDS2ditmbd#pggqEgAo%5oC?|CP zGa0CV)wA*ko!xC7pZYkqo{10CN_e00FX5SjWkI3?@XG}}bze!(&+k2$C-C`6temSk z_YyYpB^wh3woo`B zrMSTd4T?(X-jh`FeO76C(3xsOm9s2BP_b%ospg^!#*2*o9N;tf4(X9$qc_d(()yz5 zDk@1}u_Xd+86vy5RBs?LQCuYKCGPS;E4uFOi@V%1JTK&|eRf~lp$AV#;*#O}iRI2=i3rFL8{ zA^ptDZ0l6k-mq=hUJ0x$Y@J>UNfz~I5l63H(`~*v;qX`Z{zwsQQD-!wp0D&hyB8&Z z7$R07gIKGJ^%AvQ{4KM0edM39iFRx=P^6`!<1(s0t|JbB2tXs_B_IH9#ajH0C=-n+ z`nz`fKMBKLlf?2AC+|83M+0rqR%uhNGD;uKA6jOjp7YDe^4%0fRB<^bcjlS2KF~F; zu09wh1x0&4pG&76M;x8$u`b134t=dEPBn6PV|X29<#T4F1mxGF*HOgiWU8tN@cguI z_F@o+XL7FJztR63wC|j4x_DANzcX94r7Iz-O2x$({&qd*mdLG=-Rv)uZ}UlMR+F&q zU}=lkfb0p1>1Ho){o$@}mSKIV;h*$AND7~Dl)QzpFBlSM99Kx+F7GsVK5xcR? z_4Q(Z%cgk8ST}U;;=!LwyZVu^S$>B-Waeik%wzcKTIqeX=0FP(TGQ=nxi=dsS5BYF zl@?}NT!Y!Iyos^@v7XWXA{_bV~1lxz7gC?xuXxy0_?GaN!AhRRM5>)^t%&ODd;@HN5L{MD3 zc>i2keQZVm#?NrDwbfd}_<*5^U&w0zv~n-y8=GGN-!=_`FU^cM8oVCWRFxw?BM^YD zi=Vxz4q|jwPTg+?q7_XI)-S@gQkh>w0ZUB}a{^ z_i;`Y(~fvpI!vmW*A^|P7(6+@C4UeL2WATf{P1?H5rk`5{TL zcf!CgP6Mi{MvjZS)rfo7JLDZK7M7ANd$3`{j9baD*7{#Zu-33fOYUzjvtKzR2)_T1I1s7fe&z|=)QkX;=`zX8!Byw-veM#yr;|wjO^II>!B*B z0+w%;0(=*G3V@88t!}~zx)&do(uF=073Yeh*fEhZb3Vn>t!m(9p~Y_FdV3IgR)9eT z)~e9xpI%2deTWyHlXA(7srrfc_`7ACm!R>SoIgkuF8 z!wkOhrixFy9y@)GdxAntd!!7@=L_tFD2T5OdSUO)I%yj02le`qeQ=yKq$g^h)NG;# za(0J@#VBi^5YI|QI=rq{KlxwGabZJ0dKmfWDROkcM}lUN$@DV`K7fU?8CP2H23QPi zG?YF*=Vn=kTK*#Y_{AQN&oLju|0#E=fx%YVh>S{puu&K$b;BN*jIo@VYhqPiJPzzM>#kxoy0vW9i;ne2_BIG0zyRFp<3M(iY(%*M_>q0ulV2K}Tg zkG{EWKS{i%4DUuHi%DVKy%e+Q!~Uf`>>F6NgD{{I8~nO4!VgOvtFOc7(O)X`|7n*f zxBa4CJ-v9fUUH+`7sPVvpM_C*udZ@OTGTzx56QM5y~OlrZc&w9=)B?nmd@keRn+^= zvm~4sa5987LFDnU{(N|N zJAR8H@}p1fC+H(yTI4n#%~TbImMpuqYn9cQ<0QQ%=PzZItLkC*ef9WJUvfITKWh#D zc#__8`4am9%#NslIUw+<82#SR8AYG|woLfBg#!-&dqq}@P>|I0%lbdy0lSMmNe+}o zj0zZuFr6Wb?Y{Qy-S=|r`bdrDmhnmvkRnkdn`YCleU>Q$=je}LGhh>_QAj6aa_0Oc z%Swsmui;IRx7bN*=AAS@5yW&Y2hy;3&|HAiA8}!HT6!Z!RVn~MZg`RmI6&%#tBZDx zfD+y@Z~NWlk*4l13vmt3AK2wP!fQlnBbECL>?p)F?T)<`w&QN>cP_V>r7UTcsTaaP zTOb$f!P@zf$6>890NVKbIkG8rE?9!Y97sMSZjfF?A zYR8lp`LMoz~O?iaZN;gcX;LC-%Ia*R%A&SLx!YIf29?P+=XAAojK8!^OU*@?R&DK!#G_lsn!#;S375uZ&B0HH1|BO0R90$U>qs zSvHv>H~mAgNCcjo-e+;RjY6B9NCbQrZ|BHjTkehaU<9CSkdd>Vl*ifA2LNOP&R2Qdy3k3-TQ+ zbq=#vI43x`s=%~cGyN&y4Y!FxhwgDe@i6uv8^BLL&3z*SO=D0aLjih?gY4-9uWp5or)H+v~w6n5X#F-I52z=Z_p4JB(;M| zeaVFhuR2|3UD2MzVc~^nSoD2(dD#uL_1PdnIxeA{V5n`#3xf1Zx@4lw(DsQ&H$h zw#%3O<1173hjg2_nhKi!d1ej=h7y`hVjCNB6|HTnx>SWuCE-kgTnfT+YGX4_Lun({ zDv2`>d3vrS)tTf7ps_vvh!Cx^e1BFuWnEAh0(7fkNk|-3oU|iRWdsC6U)?Raft~HN z;^$U}vZK5O8|LV$>6X5T(uYkblv{zwPxnQBh(BQ5tA~J!vGiAMYP^_ki~pkIxDfOZ zUJDwq%O~WueeV6%uN<54&u*c&E4y431cklBNrb06zGOOy4XNT~JS-q(s6@)F@ovbe ze`fial(O4(-su%6@@1+V0MsdLLMyE8;)nou(7}czU(5ASaZYDT(kUZ0L(&g$nF^n9 z9-Pi`ZZLX&)^*M6As4_2Mmc9S7OT)F8KkL2NJ)KJcnCuWU=Wy402A&45#Q9Id~BBH z0cY*xlv!uXzKrXLH!xQu(OtJvEj|0-DmRj1vjFz{c*I4$Pe(+_V|^b~S!0xm{8lq= zZv)@NlcyL3Xdz+*|L137F7y6L-2VsrKw=q^S>F6i%<{Fr8zk06$Ay-(!L$fY@7mcng!2}L0t zgi|KxfB63Xtk_Q8#ZPipQ@!zgjdpEIbK_?q17Hoi4Eiyun$hrc>T(7pOLVLQE=lgGwA+A308p& z7@=09(|$>eLy5gLe{*|3b(M;1n;C^~v?o88jYib48eR4$QGsBFzd}3QuwO^_XE(=B zq+hMi0UFC|dB{LCwch7;zYT=NK})O%sgi0k#yV;My@24^B1+CuZmYOh0^b)5Ba_)) zC%i#_Iev&nsu%I|1N5=MVc#PrlunKAs&hY|3s5;@}`>sB>}gzxuB zB=2vrRyB3uiyW(hkDUNe1@&(b`;>ZvGgw|@s{zVC#_`HXIN_^J@Etb zA7A+F?ot37T{<-vTy8h&b3e+WKHE1oh;pUQrN4yRRrx?mT_9jRa2i4l1fUnLW^Cbl z!I1>VzyFe?VELWWhM?@?t-YPZkD-Qjo@bC2(o#ZtZmr{KZsdFWItV`rs$gp{724@C zL8K5}E0+DHcWcL^{BGei4>@J-3%a#$y6;I}=upc};-NDv-z#kPX26ylOpH)Ov1uU{ zkLj6oiH6l_s+B~_z;|Jc2oi?naS7#3H63~~lWj4rUnd=fCnKdkik<@R&kch9q##G{ z4u!%=rlM~Yp3jk*t8}1B`Sv6<%Z^}~1e@aq zg|JQ`QO2pSjAm-g*?IrNc$^~sIrNBo2$m|Sxanr?Mfs>2@Auu49 zGXlsS<9XS1&8h(dD*Hl&5HBDG!^pJ*lkau_Ur+7`7z;rcs$hT4we?3bT=7Fe<>{5( z2m2(c+hUz2BTHM8dCe*Z3XX&Av;b~a=$6EF>&^E8%nyxO@m_n!q&XD^A{SRjRZQ0L~qDeC=j&0$j6=LNIz@`ni^>ch|sv}^6 zlm>?28yPl@WmDPR?Y-A9X{U9Dv_IsbXJnzKCjkRksLOg#42uG2mE_acbTQ4)J|1V>%U@K(FP3AYhL0U zdeOCPN1qLv!|#c=p!_+%VNV(GHt`RuLRV^vz<5tt-r)yOK**kUWPspVAf|}ZL{LS= z@k(@@!P&W!>wwe`x{+GrFSWhHov7hu?{KuuT%kl#WO@*WX$i_@retlhQBj++SVNCx z5$78LxP>Z=^aJ)D280r_jj=zFfMJFXCIe^B{~V@d1rl_F(qo&AB4bC-vYL>x2jSKX zpuTG-6kgp3e^T&+dtV*i6a~)v@n?n*MffN59y}<0djUX zt27R+SE#hp8bzc#;rk$jw3r4)Q@eI$*`_)=Pvge8@8|8>H3X)<9YX6cXa=ii#Le;(qKm@%0-7$>2ShnYc`j#zJ7gu_FE^?uAkL|H)UIH#gPu^40!6^J=^ zr`}iwa^!4tzW~vOMZAaKF>*8A{^8m$i(VK)>?=#l`xrVe>wseSvM_aF zATNkY>kM_P3?1kE`uIq#mvr-wuTgUH0N<&JhF=(E9%^NS*HLm!4GZ4_XI zL=R5tlG5Mk_1rPfg)sk^llFuKPMPBhuU|L5q#yP_mzxp1o&pAzi-X31sgFpIHn@($ z_>=`AB5(8tP6p2zS5VEvH5J$M` z_much3>S7t3Yo`Yx!>83-hW9LYzDKP?mKdkD#QAK8*M((sx{eBQdrR<^3ZhFP81+& zBnJMUefQyNBji~$5d88Wfw1Lv59aJN9t2!pABLg;ewJ#LXL-10;QcJl+Y4Mtngb)k6JZlCf)3uD_u)J3sYyN;NN5hNbg$%W!i-GK%e&!Us)2IExWSss$YG(hm3kJ-h%yD z>8q^n$+4I(_y_mbT{du4P%h1j3oSpjhY97{+IZ`aA4ug!vNJ6*p?<2H(2w+GD3j$I z1TUXGyNzdf>_yB3grP~FZUs<2Quw;eEi*7s(-MiIkQ%@J^+WGdQvYSUN+TRiD-xto zJ=OUU+kxGYc!HCLNbCvR4lGTp~#L;DFzGd-#gJe*xf(P3hDQz|y)?b9mwU3WUVnpcqXM<@w%r-k*Wr^gzAv)8T^sqA=Ye z!7qy&exJmAcAt~CwS#@yNmjr8*T*!A6w4~E*ibaLRs0CFo(;R3=ODhDt6zWNodmo0 zXx&bT$6&+5c>a|WJ)F4G-^GjY0H#*tY=UNyYr_q5fsrcjk(c^~e*7Lf`!Jd`)p412 zn|^*hV= zFI4UbwA%X@smDd$cQOiMC%jfitTxTb+#`9`G=2rJDfK!E=5ra|So>lc{X1$~w28i+ z4p&cTGwZ#5VueiXS9O8#;RR$yg7tL9!^)Sz&pZYIzlSh}0}V{LxL$Cu%B4U5_}k}- zm~|CsD<076x@<>m=6w6N?WaThIBP`!u{-;WF)xc=2otx*lwf|5+MkdJePjh(B z9SH+%cHGCMAXNxB{_3^otDWdsV7Ob6n{0 z+&!(;iaHOX__5z_$Qk{%xYV%Ig@7iokGBwR`3642ZP#H#v9QGbWl8<|MS*=@qO@Uj z6+SZ_v9`1paUe5tFN~v(b#J3a_Lx0+;r9giZIx-A5TxdbG>xi#AZ5_z1V}B^n)sxT zz49}eK7EWb6wR!6-qQOrHQHkUvshvq%=G2d&@(#XM*Am1;WbnJ{X_!a{ZkphD$^TQ z=Iskb&}=lBm(RHiwJoGg`*NiQ6#RB$T#LF+>#ef;Jne&MxKPX!#r`&TVEFsp2jnNx>dClzpcPy&G&13a_<0qaR3i+k212~hoQ z8nMk{JP-t04I{GW5gUBqcJW-jSMrlw}>p)ptx?WKuCUV77taMiV zHok9V=6yv+Uts@fMY&A}amC=!Yj}eL@=e%XJ#%?agkt1jWF+10{(E9mHLDa>Ll7Vj zG=3cp%ljIB-6pC}6&`xJ*6WCP|IlglLWJ^?yviI8Ve)?V_i4%n;olzny62_`-|IGi z^=}p_O>Z8M;c4|RExu70E7ePW(HWVS&E$+LL6xSQgB`QfMQJ|4pCTFowA39p5P-|$ zUtM_H2HnP8_RoS~Vwk(FhbG zH41licj%=0a;Ln2STFBvU}Ne&O&%8bYKj!h1FA#sNM`232fX|U3QPp#3C?mN2;hE9 z;)!@5ixSPl<89^7gwhHc2YAX1KJK$#*3`KOMIQ253q7-*RJ5k)zp9GBO|Ga~X*^}US5oN@aG&waHV%vi~r{t^`ptTxb zL}q1W8S7*>7oWwvgV4uFLZ(@k`R*=LO_|Gu`prs~!WQXj-NLIa^2(7IHg>BG^N zc|i{-^=&Cek9dkJFQys|sjG9i>LLz|;yCv{^1i%c*h>8zF91kLvS9HBQi~ZU!JL`B zK8N+U0fr1*6??Ium)AF!6tc1eGhXIYL6IRT7rmKp7+>?%5Pa6zC5)KY$ycF0ZJ`G5nEQDG100U-jLkH8^UE4g6wq?sg%pP=-$&G#bcN`^?w3a6 z((s$6eRKcSEIslW-kk5Qi|5Mg-(xdLF}PxxVh$PuO}#aR6pW1kV4Af!Bqh*btXNNZ z>-4(IUl+L4dw+3LcpGut=qB45O+W)Q5?*zZ2A6rJcg`qkSvWA!j^r2mqKuCm6`Py? z@^T#Ux04HemPGd!Hs7NkZdVn1}8_j`o?)*OKZGS!`ff)gF zG?v-lj$wWNWCcw2Mg2o18D~1?3_b0XzdiKBNkYSDpcv@&kp0POmweJE2ZkIQ3B!a! zIgIoE+Xv?;34kyo^QYjZk+tEqZvq^#QG(OzX4~X+KtsoQoddTWUR(yo8R+ObEF1j<-syWOb>)JQ&Zbdu(sctU%Mt zW&YR0{ttY2TTXYZ?~WNU&cES1Z2q(7SrWDh``!J(JM+Nk$!hu&Y;(7E`ZNKTe0w+% zJc?Qnw2B+%UR}0;cB0Rufa(7-3FF}?629@LgTiEC&2uyL6NxexOp?AKT^aAx3gi(W zao>r>MPw0eQ3>IV02uLsC@>yK_epX6GRg4{NEL2wPPF9=*L2RV3yyK8DhuEK>rmmV z`&Q~#c`lgR&93TdOCja|ewOXmPNRh7!&dMT(1ett#iDr8HZW~VqWW@7fe9B6;7S+? zbC`d4@MEau&mKlOPKd>*10q0c{~^baw6!a*w^sY#0Xim{oOsiXiDOhbG&kl3c$$n1 zMRrD83&QucDSEcV*7LIp8VTA@F<%qe+_c`L;6on(>SjAU^}5c9!BCffT>$VQhe=)z z8(=Ej{5>jhmjB3{xDfj2R@VmHQ!CqjlO4KnuOmvHy3K#po$yp_V;p_MKjh1`(rzj6 zHW956k1yvntz{_g?Xbs`avK(IjlTnsu%htO;D7 z?J#x^EzuvVn&NA=!MEj7cwe5A-Z$Zk2LBZH$~%E* zf`((xH0?`}hs|HA%mtwfOEsZJxxrennkTYcwP#FKO5%Lpc^JXhSpV|ZH$Wr;`}`_( zIP==gd3LYyVtwD|*ZJGi{7~x8{=^bGVqu0RJ`n_BZH9+}kz%-4ZRsImi@rx%=ZEKs zcPnUXo6hbJV>fH;@1|bAHIe0ijYI*&kdT|HkDS$9No9 zCHo=*HWb~U+Dtzxr+Esao}6@|;Pf+E$ay0$kQp#s{wlw+7aIKbMdf`OqhoG*;Tco0 zjrP}VQG#Y2cJuqoJg&5({)S(BA}q9T1lGeWRyu=Je|)I!6a+aj!IP^1({)ZYe&x6w zt3a)Dq^TB+A7CdB0-}#z2Ur$W&h3YVw8==!xONy$uQmDWh-@15iEOt!q2m&?ZLA|w z8loSb(0}7y6Xu0?M5Uf4>VZGluB`wMf2oh;m)ghxVda>3m}4%V)r^0nVQ5V6f3>*) z0&VN!N0~GC^P}vj$`EDMZEmVV;N&RISY2C;$0;2(<{Lt&PKzqRByQdiEHGAbwtbS zPj`Da5%U6k1oEtVzI}QNw;!hT6F+~|@=c@$C4NtO@=xgP?|5MyZAyuCzcvq4rdAv@C06%gZ`9%I);R6UGiGJobfux+<0DLS&|MSG4UH z_~o{^^9>ixMg~mY!-@Fai{xaE4^;qy9iZN15Gbn5ZqHWf>Jc5Rv6(#n8`1NcCsdmG zab*dSXVPaE?)wCalD;$ivF%@nB#7D`@YG04p6ed9m}4iJW|pfVMLE<-c{=-8$e?cH zUdU#mCj4gb zZKA^b9p*9S(}8@tw~1RNPHr7tQr;P+-)D8|sq=*o)G%RGqt> zzP5yf`pVxb)I51D_G~Xp^GNK zVI6sAX)a9s)e{8N3?35YA6aQTXuyszK3ah~CemzA&CII#8F&F#KN41~8I^&_%}6MCNb{W87qAF`zj_Y^szhb> z3p3}KbOxotY|(lD=;)`fYE_*{S}x;f^SW#)SU&5X#o|-R|trpa|L5PS5aa0 zTHw8%SDSVtU4?vyrhnq+^@dgFS)|(y{~(4j%3UEiO-rBM9%`)8(dh33pMLiuurNY# z#10AsQ7%*0Cu_DSAU}P;X(JwA64~Q_^R%d_zSm^6Aux?Pn70PM>9EvLeOX z&w9c)pGmcL22;MO3C_B>=NC0RJpMp8?#ZUf=GWRvy z6RHq3B}=MGVg?9@iKFBpsvnkVh3{Vpp=`CcD=u~@ql{my|6?3ssi3mCOPnjI&E}VC zc@X+Yl>;;DNo0W0`0th!X{?luDhOC{E8N=?!w}K1{V=)+1={m(f`Oc|N=07>}3;z{-(A zm{JL=j?Sro5iecmE2-pWlRf(r%|HEQ7kgwQ9+kt=NBhtQI7OwcZ#3%$Uf%^r2nhjY zoQ08MfC%_X{O9~WcirMZMhn#z^ux4Erx-tf-6bHD)9eH&^L>^jvAd^9A^DCDs?0;k zkm7LE*KjP6`2d17MrQaaLqd_Rka}J$csvUec#hw78<=s(hyR>065~YCVCA9+#Q+; za(*L0IEw!r5P|@-;x33L$Lv9 zcuN8YG&g{<(SeJG18~(b!5yywSqQiLAX0;---;}mF5&b4lg|T?LwKREa{9YX_-zL@ZE?Zqi@HxK^2KO1>0LATu{te=T zprmHtY)bDVfxI1S}KBE7V zznP7KQ8HekWU#W6mw`dr-boV}pMQR==&5=Q5T=_q091jfc;R*jX#&=MQ%~@E@9^?`$v48ks<>(fI(F6L(5ppKy|$HWng*bKOb(4|cMUB&z$#ob#XV z5-mg)gmFIybZf=znm3ZPyUO^GJfxt0kmHjaTZ|sthsxXw&}Y)fOUSg=JhRSR^UjZ- zhqqb}Wsyw4zdnj6@#BAJa#-PdI4_dgafFXh85DsEQ_cT+5)XpZq$fZlBA_9UsE9r6 zEFec5?uqN@QhJ^IzwZrwl-5J`CmVPv{(YDTqEqWR^dI;5hXc~cxP%B3v&~s0`Ct89 z@S`i~a^c%V^N81dDT*ItFS*&IN;@O$EgzX0e7x&}TD=!zS}hTpezBLS>mdX(5< z)8DEI(-o_D)c-UX@dA1MuJ*yc>Hf4|`*B2S_O>w*-tbUwtiu`;W(Ud{HTty@(&x(T(F&;M zJ=?H>6`B7nf-90e8V`WSVp|0oEKB-P2M{}4ZDawzvM&a!y>`Y#jCsD%T_l``@ah(I2nJs~Q|%uSKu@k!m~*8B*IoA{*TgtF<(5sHCGG;n@NE%~Xt(G$^&<87u;}Na zx-8cq0g`uA(&RBFo=-4Y1GUZ<``Zw{xL4jfHkZw~%~wvtGueszcXt)_QwH8g!; z%s&3kSa~R$dO$-%L-)c@_hi7&>{6L_M>OZFkUQu;{sL_bUMStNrt{{&O(Wn~*zPOk zB>dnfszb29NSTf2pqIs68k|p-UrSrxgLHqi?3N-UFa!LHy9n1)=s>`yS+J{MEzS@ zNlfGtpma7kG&LR3JE@wB%rFA*h~~KitlO=IP)ZjN6dQLM6qsry zHkB#cyNh#n`)}bCrN1My*;k)^@>e4gJ`LJK?2)Pwp?4Tl4)4FA0(tvY+#1jOUM)xw zlMz4x-f@g^+yKUN`?Vu)|AwujArnM~Pa@y*Q9S8eS(u{-S%(Z5=R~pRl5ZGDjdqH% zC8rW&{##wOpU_oTIG4WXMk4&%2t1;lWcW5&!yxmOT*!hBcKyTqEcNoO+R2;Q?Yj+W z1-Y4?59fijz4(MIDwGe4-baYf08UCs;r|YefD-Md2ST;=cxwpgW=tR76-dQVAhn^= zG9Wk5lQk%jIR@KNU!UMp6@BfU;r+;y4VQ)D2!Il9HX%yW-9nOzV+m$YKzVaO`B8S7t z$!S2Mz`xw>V(RjE`0>bQp<0y&h~Y=M#jpy!#=dE>`=e_AjSZq6u!Dy1xJf~-7|0F! zPR9|n`e_7D2DIV2H(CESQ}hA>U>n|6`%z?YKEA~)BOVY%y=jPV zT=44R!L?J)736X#csn|lfBJ)o8ixaZclguWgrGO<`TN2FMfO}7;5}d+BlK0yTSH3* z4!=;5rOh85&2|x=46hkNaz?)U8&=bcfh=N_#8BNpZ2v$aVBo;sk^*X`v;4-LU;D>! zM*h12MxXIQy)SfAqE4;jY)wgnppazZkdNNVVF;(PLf^qK$FgY9+VFyBKE7UC|f z`R|?&egV11K3s$rJ6!GvoeW=jV*!-e(wA;x(2=d0E_e_%0x--0o8#~m^H1%AH5Z^B zn!TNPn927*bvaf0pt}zhK0o^V@WlGwwKo(*nQ|Q~4_;>~-8y20`HP>@UJa)3nEnGG z5Hwhs|FcmFG16ZVNb5hL`2Gc1{zWIMM{_OiKewV!hCi}U!VuE?s9wU-QbZ!)+Y^tS zGzp5OSi5iq6hmEr$w}&9DFgoB+i*`q`8TBi^MVS{SKEb8Aw%@K7@XCo(De2A`6%mf&a2#~y1N)+kJLD$1HCP!22)(U}xo2|j?WRzt(11j8Z_*v;P$R+Ug*Gy3VxV4K; zGGUGabnW*`Z}~`ydXL-l9e=GC$pY#z|63vy>E*m=$=j}iWP{sRTh0%H54`t>2xYH% zsk+M&u&pNgMCM@3e)Xc?jBWX-TIR_cQ1Z!RW7!B zBjZX=+^3}?SE)B+$EP+0oi1Fp5blDT?*}nsP>filqXH{ms zxU<$hetC`u)Wi+x|EKL-`y^#aQX+sDYIa{M;V%LqLrOk~lR>u0Q!+pyQSU4zY`?E^ z|5@)C)w6G_=i5YYC5SE_u(7hDNYr}uKT|@DSqF%S++lTIbIk^$a>{~0IH8KNFEy%+ zW#$&!ynpgNJh>6uR~?2c)ZMW+h0OKu231(7L_vETPaR+(P)Zy%0~yGm>E9?@@x!Jy z3PYgS}Q@b}x}E#F27@F+j}0=&Ql4gES&f8acMrPAVlVs9$97`FR))R5wI zc&}KFI1UIewh>3PkhnB7u zS3AT8_*|nexznG|Z*DU0c!K@jsI4J)5#DyNi#|e#`l1Vv1`1)*NVcy0LZ``aL0n8B zecupJ(rhq3u8bW0NIRhKYq$v1li+jp*4hfAd&wxYDE8vn1TQ7S@bTM|I2Ob z8vMOIxA7&_j{AKmD+O@EyXT`|dElt0pED^@IV0m)RPBUs*5jW60>>w1!@_G3aBKzG z_f(KfAPBk}-jQtR*Sroq!*3rbQ_m27e+YdzQjUb<_*k8vc_C)y!@cj5E>NxUhPu&g z@Z2<~esU`)ih+4opWe+K7sbN9n*9@n>#@n3*o z?xoROgDuvhq>jJ;Ve{6i<3roQNfgo5^4Q4(|GNExO2Dr7GjgA2zWuKp_K)K0R(6lv z!l$!zW-+T6mb3gQaAFviTQi{|*t%>{(mhTdy+y;Re4qT@kccy#{b z&zWy~kLO@>*WPj2k#H)|7L&gAJ37DmHQAme#@m;(Y8Nu^`D5vf8sZFW#+lA2!HK=( zJ)#hO6JD*`o~&c*&46d}g=Qj@SsoB5ikC z^1V8E+&<-OzuS_C`p5<<(A6fB`LXT(!kV^0_~hL6PpW4={l%|#xgdh?5EIk~lu8{D z2hiyhv3Yxij_#$Wu>P@7SYsl`-~3;}Ktx{34_NL^Kwin&=?!HDv3elQDbcU*qyYpN z(#yw~f1vFGK-t%CC-qa-4FYHbA^h>bag-I&*qaxwn?Qv|idE$<>1H|Gr6JtUu(he2$eg!N z@HTF@dG1)*y;4fxe)4_ZkpaBHH9hXp9p4|gLrRQyuevRd@gSS}JhRnWqrvm|U@>qM z=yl7RQROTKwQtzP3!zUF)_6Ld#NGA6v~2{J9Dd`h6{%+XsU#qGLh%`fB1Hc?wfayK zN`H4BpDp)npVQuu$DVW1qsBS&AJ2eP%6Qw>;k{)Z$8%HL=Q4(a$Ng2_vHw&vA!1L+9zc8vaX2GtqJ{L-;gvF0IR$em zMQ8@{Qp3+3Quk)TJ$?I<8KmwzD*7#(q<@Mc`dchngW}cRG14(Z6K7{T|LhFXwhqUQ;BET;cYqPcAcMgt6M$V9$(?jHo@Sud$an$U&5F zZ1QNh^ztt)E*d#Ij;<43oSKKnd+WNr$_r}+s_O_x6DZSB10*5Q{ourqq>mTl| zx4y^(cy+9;t@R=*j>3_dmm_m)$k$#937V(sllby&5)Xex^UD-|m|q<(jEd#@DV(of zAd7sSdmS*zUDqJ9|K%O2J2OfdUiK{{b{PCy)pi<;hp~7v1CQj&4-10 zgO<3dqhYH1#-Fa}Q{pjql5>>P6gZH21zLfxZ4$SK4T@7b!|`nWF9b*84Bq8&Eht;9 z*P72x&NUCZ7*@B$`FtE=hz5b}S`|c6Ey+j@D1ZibjJaRlR;{cxAWv z?Nqa>QqV*H-*zzaPvpLMHt~nl(x6?vrPpR?zn7~wow?oj*1TKmx4j71>$hvtC$DLD zUrz0^tiP0792U&dxJxNv@r}Elsjn^aSLUu=9#mD{&9n8|ayIL$!H3s>%KEvbchBFW z%cd?VU83mGF#Dar9*s~w&AnmQRQIOvR+uWsuZ?+|a=TzApXO@q^(r%8=}iv#wCnFq z=K9}JbqU@k99Q%j-}NNk+qLCP)jXfmOO|)@?mHcnynd6({mJisP1_}u7k)|eYHXWK z63eQ)E$ufFi!3CWUY2gw%e>omCv}qEX66aH-k&35f9`Q@Us|NPetVqe8=dX*VxJdn ze`q7b=Dn(UA(2sf&g)cOmQFhNJ#<-aMELJZbA#@to>25@kbW<)&!X01 z%NMJt>1ST)tyX)h@?`DxhbgCHr>S4wv}WC&Nw-!{+Z7$2D}74QAcXTvip=M0%Tp_N zor=k`)t|ra^ySr-+(|R9mB(E=`MX#y(wSw)$!iymzB;^c*>%&^*7HxTnRga=soSZT zdDl+9s;r!v8hk6POtzBaig4pRp7eWF(<8gufvNHPu6xs-=e{;mnHzJyGKE+8L0j}; z@%8-e^UCL5HhMiR>sD3Rve&yVZ#{Q1*CO8c+qSr^Z#CN;)(X5>tGG5yUw3<+CfhaL z%bP;hZ?jvgJU67BWyiy74_)6r)_nSxttxn0`0?HE^5(uydHVgP+HE$V?Lv)Leti43 zWA|;f-RqX``95>)^P-fw!Vi{3KNsII-*5f){gdxqd%gVdB1sOBNe=nEW%;i~g_P8J w!5uhoe-Jcg1nPN%MiEAtgE$;km@@t6ukO)1^!cY^83Pb_y85}Sb4q9e0FIsP9{>OV diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png index 2f1632cfddf3d9dade342351e627a0a75609fb46..e09fdc18616acb607c689545eabedd267af6c330 100644 GIT binary patch literal 3723 zcmV;64s`K}P))jRawG>fz}a0G*LFd$+e6PcKCfdR*5hR9JoBgvrSpkkQBqlsdK z(TOKfLQIU~jKLT)6AeRDG$BevA+p&6-OAScR(rjwx7_*feXpA8?yBkqa_Z!y|31}K zecyZk{r~U(|L?!|R#V0p{3Q#`wE?-7aR72{K(1vRfLt4pYZ(V1*9PQT#sSE+0lAiO z0CH_Wu4MoKChiM*HO<*;Xth9yGR(8AP@<o(RXu5N1#r8yd@T65y)?;~IikK{QaCV=-}-$L!H4BQx|IJBLSAVIvXLDFq!MarKa&v2h(rddEu zlTkfxq+A+p>5~3;9l0aW83Yezg2U-RR$=a~%_nyp@CO$@KJ((QO>mBE&2TarE8TGD z*iSwVg|10XkccH98jhvmrm@+p#WemwqNa}AYA~UPArMS6LCi7|y%Hw8O9tYQ`W161 z!@W^(dK7#)MM=Ef-m~Uf|A&|TVD8N8<`fltnoZ?f9o_Rbe0=QHpl;L%_t2JDL`{?O zm=_5{*bKvSp!F!X7i}d@S-58!j8Xh$FkHfzA)G)TiKc>uZ;`@CLYxUTv#y#uzAKAXQv+pKIX>svLd{D|`)Da9bm;jNr zW40H4l?_VAQP$IZyt zTi*~%HNygclOEF;3}!tZ3y(*_m6IfR|wmcHbhUVxZDy{ zRy$bm@Ilsiri5@H34d|@j9C~kOSO&xK7Gg!g%xoqE%!oKht>~}l>x{Bc|I9}r$Z3& zBhkny(cp`RWY4xUL2xztduGocz}wUU)k_w!UcXHGx-*}NFzf^jqa&5&i;@^hW<2GQ z06Rii*CTxHl8FwM?^5CPfA5A^XE!0$R}1GM<;DMI$th$jfPqdGB%E8J4&3-zb5N0j zx+y;R`x5=hdp{8a_}gMo zP%VSXK^AS0rvYA%1<-kVE-J)MAIoVn(0TC@>sRuKdkqc9nLQt}{3*3iK5GW+?l6cN z%M?Xyl`R2~3Xo1GewOWD^wj3w+GCuik z`yi76375c@Eb;x7C;^Uwgv^ZXA{8m|j}ydBf9V_$%mx8dLu5dTkl@KK7VC~e>7@;f z$_nn>^o)BzvnOKpbxwdTZJ?gxT6&6tzZ)=CXQ*G!FPCRtZG#Ow8PXGci#5XRu5lEH**9$QC9FLQnAP?a* z^mhXRh$QkV9RU3{1)6)9qZ{jOa)lWVgQUerw{da0CFXH6=0AFh=o~2GA!!$Z$p~{l z%wz@-n+5HAB;oGEcq8*~eng>aN#OGZ8Ee3BFgmcS6x3aR_E7w-Jxb^pHS z*uU=iBi4J zyL5K-+v~pn<_m|Ly5<`i8(!zh+VW2d{6tY0(WEckb#7 z#j4Xzm|6lUATS&h%kWJ8p&yiYGf0DwAP*O20OzTs^HK^4rUMn{yr`yV|L&)6TV7XL z*faR@{OM&U-hFiCmH+hIyWjrlZ;o!zHB+RR;*#TEyKdg5M{b$_q*EE1Raad)`RMMa zZ(01;_q_POoqe%sLu|D(fIBY;mstStzX@)2{?_qMOS;>-8G^jhP|o&}IvwfvZim!xT@zYPEfLvquM{&AuG3xzZyc^uZ6Tkp&0unFsI!AQMF}1q5YwvTnf8oaa zUw+};11DD`TNk17fT%MY2oYTC5GIo$9DvLjAV9#K6yKIw0ARhyHW10{glL=BE?)o8 znk%1`v*<}DlP3Ctqj~_Pq`v+8O_|to0eu^>@D};? z)eCmcsjoQp)!%&dN^2l`v2dKP{&+w$l=T3yN+A7GafrwqFmayFR?ez>>fe^n+gRjQ z66f#A`N`tBbw__Uwe0eL_{DoW_MYrmk)b~gk>nzgT3?%v?4Z%-bhJOZbnabi=1duK zuAfV(%y)-=b?cJ9{qFmXYoGY-k*x{C81}1k`+&<@3J;e7Jn9Q;C;akz%P+s0F;O85DxNJ)Ko^@}0@O)!uU}3gwu+CmdG6OOKzWh76sn_8!-dTP1(zC&64V9%>d7i7=`Dc*oqmfHX3(r2c>~kBVOXh6sjHneR zZj&bY@>(Uq0Vv$zsfFG%xi<7qEgoDl*A?WorH+mNr)aJX$hC|EkZS{SE#m;>+JIck pH~_geAlEVuK&}nQwfw~c@c$sfelhy)10eta002ovPDHLkV1g-~MjHSC delta 2207 zcmV;Q2w?Y%9jXzKBYyw^b5ch_0Itp)=>Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031 z000^Q000001E2u_0{{R30RRC20H6W@1ONa40RR91K%fHv1ONa40RR91KmY&$07g+l zumAuE6iGxuRCodHTWf3-RTMruyW6FuQYeUM04eX6D5c0FCV&1TCZ-py|c5InY-=I zY-!`3OG*I1PedcfpaTWG zz}$w!e2{QT6j)uA1OU8-N{6BItSS$HvMSg(7bJx2Y=32dDp`!10~I{udIVa+2|G#V z0cEH-*RHY~<>3g?j?-cK^;&$8cpYTHEnP(3ixu>PseUTRQ<~jf%ed6Q17;aHDPh|Z z+@II^^V0LKW}5)w|dwIw_gRf zFMqt(ako~@r$m5lC959fGLHG5;r3$WrNJgK`drR2zZ`Bq_rA1%mrYB^t3n{*!QNze z^;M{I8oD7Lp^7cb+fR6L@YvzuR5#}? z#=HP7u8s)cnE$Rj=B?ab0O!v1*&ZX$r#f@YbLjj8?`i3ZwP3VkB!sEhD8YS}7Jq1z z7cjRFzn@CV5dp`pMDQjjHsOiR&7egYgXit7?Dn_dG+#7?=|p>M-Y_s5iTElq)ThyF z=cei9Q{?i9h3Uw-PD>dez5ZKhet=tPFB-(!?{0iIuf_XT*iMSn7ti=0Uo<^*%h2LXNy!0+zfA`9?*&!@XBwdb_G06#>FlRej|>cKdhBgR~P{WYHL3&1oj#B1njWD1HN+;vYVgcBpQu z2vF7Q(LHwT=3uM~8Mrym+v!t>D=Dj$KltcdNh<*XtPa~3X!OJ|%zuy&0a{%3GGwkD zKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U@~$z0V`OVtIbEx5pa|Tc zt|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-Mvs!lAvqf?6tS zD1t*y5KBjx{~&;KB9p@;yjZ%A&Yr*OuvepcN(6Kn)m=*PK4I%T9~HOM)8+a`>dXyL z$mdN63+{@ot!nS0XE*Jkx~7Y6^lpnqH3zi2(X-qJAD}ioJ%5efer&7`l)>_->tVrZ zJHf7}ex3-E;6h6{S$!4H2gWGN~F(zYfI&I!<4C6Cj}86!!HVKso`!wlU}od~3= zLBi5c_EG(5M{~kuOY|sI5x`$yrcH9Pv#9jVMYMQQK1QD>Kqz`+<=I!K0Y6;MBrGf4 zOJ~kqN!6ZuyMKzdrww#G29;c2k7Pss?YK=Je|dmP%VM#v1II%QoLSKG-Ph@epI<&I zrZEo;mzznJpNvmr8m%6(C4e7>5#_iPSydcBWwii5)6QO12ymUPb`=Luxe`M%4`70h zLeu)GTpG!&M%#1X0kLzqMMp{xKt-O9mO@)C>h|{{UVp}ysK7G-B?0^Z8sOF7N$5Z# zfx$lo+fU-El%xc3Z8UTkm-)~N&i8X+w_gaG54vtARs}C~IkXDe-{d3=S_Q>kv*)6m z1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYrerj@E`hDauQ;_COrTE002ovPDHLkV1lRy4vqi- diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist index 83c9dbc..4a228d7 100644 --- a/macos/Runner/Info.plist +++ b/macos/Runner/Info.plist @@ -11,7 +11,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIconFile - + AppIcon CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion diff --git a/pubspec.lock b/pubspec.lock index 9722e63..08f8847 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -57,6 +57,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: ff6785f7e9e3c38ac98b2fb035701789de90154024a75b6cb926445e83197d1c + url: "https://pub.dev" + source: hosted + version: "0.4.2" clock: dependency: transitive description: @@ -171,6 +187,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_launcher_icons: + dependency: "direct dev" + description: + name: flutter_launcher_icons + sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7" + url: "https://pub.dev" + source: hosted + version: "0.14.4" flutter_lints: dependency: "direct dev" description: diff --git a/pubspec.yaml b/pubspec.yaml index d165385..c1a28a4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -65,7 +65,7 @@ dev_dependencies: sdk: flutter change_app_package_name: ^1.1.0 - #flutter_launcher_icons: ^0.9.2 + flutter_launcher_icons: ^0.14.1 flutter_native_splash: ^2.4.0 # For information on the generic Dart part of this file, see the @@ -85,6 +85,7 @@ flutter: - assets/images/mycelium_top.png - assets/dll/winmycelium.dll - assets/images/mycelium_icon.png + - assets/images/tray_icon.png # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see @@ -115,9 +116,15 @@ flutter: # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages -flutter_icons: +flutter_launcher_icons: android: true ios: true + windows: + generate: true + image_path: "assets/images/mycelium_icon.png" + macos: + generate: true + image_path: "assets/images/mycelium_icon.png" image_path: "assets/images/mycelium_icon.png" remove_alpha_ios: true diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico index c04e20caf6370ebb9253ad831cc31de4a9c965f6..2841987e4dd0add9a428e50d7362e2e050402ecc 100644 GIT binary patch literal 2586 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 From a4857302ffb3ec38caa571adcbfdf0ae6c68fb27 Mon Sep 17 00:00:00 2001 From: ahmedhanafy725 Date: Mon, 22 Sep 2025 14:07:39 +0300 Subject: [PATCH 21/22] Fix tray icon on windows --- assets/images/tray_icon.ico | Bin 0 -> 9662 bytes assets/images/tray_icon.png | Bin 22552 -> 0 bytes lib/main.dart | 6 +++--- pubspec.yaml | 2 +- windows/runner/resources/app_icon.ico | Bin 2586 -> 4286 bytes windows/runner/resources/app_icon_copy.ico | Bin 0 -> 2586 bytes 6 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 assets/images/tray_icon.ico delete mode 100644 assets/images/tray_icon.png create mode 100644 windows/runner/resources/app_icon_copy.ico diff --git a/assets/images/tray_icon.ico b/assets/images/tray_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4319b815dd592bcabbbcaa3476b4247f8333abce GIT binary patch literal 9662 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 literal 0 HcmV?d00001 diff --git a/assets/images/tray_icon.png b/assets/images/tray_icon.png deleted file mode 100644 index 68ec30256e0c1c30693473f2b2ff257dc668605e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22552 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 Ppbey}X`q2szyIuSe?H%L diff --git a/lib/main.dart b/lib/main.dart index f28e161..1a76a6b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -143,10 +143,10 @@ class _MyAppState extends ConsumerState // Try different icon paths in order of preference final iconPaths = [ - 'assets/images/tray_icon.png', // Smaller, optimized for tray - 'assets/images/mycelium_top.png', // Alternative smaller icon + if (Platform.isWindows) 'assets/images/tray_icon.ico', + // 'assets/images/tray_icon.png', // Smaller, optimized for tray + // 'assets/images/mycelium_top.png', // Alternative smaller icon 'assets/images/mycelium_icon.png', // Original large icon - if (Platform.isWindows) 'windows/runner/resources/app_icon.ico', ]; for (String iconPath in iconPaths) { diff --git a/pubspec.yaml b/pubspec.yaml index c1a28a4..837a4ed 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -85,7 +85,7 @@ flutter: - assets/images/mycelium_top.png - assets/dll/winmycelium.dll - assets/images/mycelium_icon.png - - assets/images/tray_icon.png + - assets/images/tray_icon.ico # - images/a_dot_ham.jpeg # An image asset can refer to one or more resolution-specific "variants", see diff --git a/windows/runner/resources/app_icon.ico b/windows/runner/resources/app_icon.ico index 2841987e4dd0add9a428e50d7362e2e050402ecc..cdfed1a3ed6dd2d73fbe5c56a6401c57fb450d0f 100644 GIT binary patch literal 4286 zcmeHLYfw~W82--L`*L*?G({kia!RY|;+Tz-ZDeC;V~d8`1vQIO)Q|*GW0yMug21l8 ziVMqaS0Hwm1mW4?^BaTGMgrcyZPhpr(9h8!5&fr~$X?*552Y(e`j^^#MkPK+OX z*PWT&ZJ9rIpKZ?KWBale_W(jC>bVn^kkWMwm5B^>Il-5X?Jw0FIev1~onh=nsY+$T zt20<^MH1_9@nm~n>Av=t+_`%GL}Q4N_)V#9s7T;pj3*s=%Ht=${VL>6XeiT2CsriN z_t&Jk!JO)jN{s+@*`quA_|JXSs5Go%#4SgqT27-BCDEiICE#-7R&CP%(NOf3Xr(zt z-dXX!43&gmk>G~%H9WSa-QfTJOS@9PoS`gEMzzbZi&6TXliilqTCr&~z zLq^z>UmL1w?{jjchH}dbW(qnpClkkXpRVf7S(?U{HeNH)FYx_G*kR&#MvbKUFT1|~(}(QJY!!nxLX5m{5z?RIkQK^fBWaJH%H#F>8RiFbh!6FEZXSa! zjP{1{$bX50ZVrzE6-PnuXa=nLt80jR=)Mv=+X&iE2;1DsMVcIwuk{9}-e7OhouTc&2$=+p2c8T;n)BDooTl! z3m1|0$h(mKtN`jq8Pt@QHbsPGGZe^=_k$@$4*eny#cv3)`As2eH4-##kf9+{279&) zrZr;MTJa(wO5Wg56Yq(X6@FMT%^T^Hd8p}KIC0m9iiyV^6*0b@*RJ;ZfA*+dS-jYJ z{uL^H_(5vmg1 zV9LA;rgU#qsii276QP`Xg7XZU)8w!fy2GmTfVEJ9rczJrtefy-bJcLzi@jjgy1CY> z6RD5HQEoiNY7we6a+op{Fs-Lr)H3?^8O%vH`p-{inv}*Q>i@~4D_M%lBuQ^1%TSdn zcSW6+cuPEBD;WlxQHbqzBk;rb){GMevlTUkf;BBR|E>?KePGd(HriK{M}0P>H}?jn znD9xPhDUwDn9lC*-v0CR`E4OJdWPB}&woduCoE-DTe%l(mBY|f$K%u8Q#vmEdf?T8 zJ!iYcPvvM1I@N6Vr@h{=7(G#M@IvjTn=!pmvq_95b3i|T$1fj;)K>Dan22ZVu$#gg z_0_~{QD8@lJB}V%a;T^0>Z1d>`<{1f^BddtN$}3yt-)ygz?bqoVKsZ-gr`7Vg%}@N z@9q5i?<=nJfBCOn6Zf|Hc3UkzuvvZ3a6N3+;q*KL+grTR+NQvFr;AIvx}fOe8*JR( zINGz>ai8|{_6hj7c?_)ePK<$=BVehQVDG*O-90^BF8)@BMO<7aF}Hscgxv?mV9x>n z>k)v~{R$j9KIziA^LySMjPF)+)+V3%`wrjJvG-sfR`2M<-}RXr&i;_q20+}GfAmYM zqVviQ)x}FKs^9vfS#{x$Ce_uhj>r4<-OhO7_vZ08uzGPX{`nE%?^N~lbdS6ptf9R_ z4h%VP=N+IPaLa2C@MkN~>QE!m@pKR82w2BCJV$a4`b%N(aBvR68O|a3gL8OY;hZ_Q I1i!xU4@v$*c>n+a literal 2586 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 Date: Mon, 22 Sep 2025 15:50:10 +0300 Subject: [PATCH 22/22] Add ip address in the settings Make the app version dynamic --- lib/features/settings/settings_screen.dart | 223 +++++++++++++++++- lib/state/app_info_providers.dart | 20 ++ lib/state/node_address_provider.dart | 50 ++++ macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 24 ++ pubspec.yaml | 1 + 6 files changed, 310 insertions(+), 10 deletions(-) create mode 100644 lib/state/app_info_providers.dart create mode 100644 lib/state/node_address_provider.dart diff --git a/lib/features/settings/settings_screen.dart b/lib/features/settings/settings_screen.dart index 423f5d9..08094a3 100644 --- a/lib/features/settings/settings_screen.dart +++ b/lib/features/settings/settings_screen.dart @@ -1,10 +1,13 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:myceliumflut/app/theme/tokens.dart'; import 'package:myceliumflut/app/widgets/app_card.dart'; import 'package:myceliumflut/app/widgets/app_scaffold.dart'; import 'package:myceliumflut/state/app_settings.dart'; +import 'package:myceliumflut/state/app_info_providers.dart'; +import 'package:myceliumflut/state/node_address_provider.dart'; class SettingsScreen extends ConsumerWidget { const SettingsScreen({super.key}); @@ -13,6 +16,8 @@ class SettingsScreen extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final settings = ref.watch(appSettingsProvider); final isDark = settings.themeMode == ThemeMode.dark; + final appVersionAsync = ref.watch(fullAppVersionProvider); + final nodeAddressAsync = ref.watch(nodeAddressProvider); return AppScaffold( title: Column( @@ -71,16 +76,119 @@ class SettingsScreen extends ConsumerWidget { value: 'v0.6.2', ), const SizedBox(height: AppSpacing.lg), - _InfoRowWithSubtitle( - icon: CircleAvatar( - radius: 14, - backgroundColor: Theme.of(context).colorScheme.primary, - foregroundColor: Theme.of(context).colorScheme.onPrimary, - child: const Icon(Icons.phone_android, size: 16), - ), - title: 'Mobile App', - subtitle: 'Application Build Version', - value: 'v1.0.12', + Consumer( + builder: (context, ref, child) { + return appVersionAsync.when( + data: (version) => _InfoRowWithSubtitle( + icon: CircleAvatar( + radius: 14, + backgroundColor: + Theme.of(context).colorScheme.primary, + foregroundColor: + Theme.of(context).colorScheme.onPrimary, + child: const Icon(Icons.phone_android, size: 16), + ), + title: 'Mobile App', + subtitle: 'Application Build Version', + value: version, + ), + loading: () => _InfoRowWithSubtitle( + icon: CircleAvatar( + radius: 14, + backgroundColor: + Theme.of(context).colorScheme.primary, + foregroundColor: + Theme.of(context).colorScheme.onPrimary, + child: const Icon(Icons.phone_android, size: 16), + ), + title: 'Mobile App', + subtitle: 'Application Build Version', + value: 'Loading...', + ), + error: (error, stack) => _InfoRowWithSubtitle( + icon: CircleAvatar( + radius: 14, + backgroundColor: + Theme.of(context).colorScheme.primary, + foregroundColor: + Theme.of(context).colorScheme.onPrimary, + child: const Icon(Icons.phone_android, size: 16), + ), + title: 'Mobile App', + subtitle: 'Application Build Version', + value: 'Error', + ), + ); + }, + ), + ], + ), + ), + const SizedBox(height: AppSpacing.xxl), + AppCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const Icon(Icons.language, size: 20), + const SizedBox(width: 8), + Text( + 'Network Information', + style: Theme.of(context).textTheme.titleMedium, + ), + ], + ), + const SizedBox(height: AppSpacing.lg), + Consumer( + builder: (context, ref, child) { + return nodeAddressAsync.when( + data: (nodeAddress) => _InfoRowWithCopy( + icon: CircleAvatar( + radius: 14, + backgroundColor: + Theme.of(context).colorScheme.primary, + foregroundColor: + Theme.of(context).colorScheme.onPrimary, + child: const Icon(Icons.public, size: 16), + ), + title: 'IP Address', + subtitle: 'Your Mycelium Node Address', + value: nodeAddress.isNotEmpty + ? nodeAddress + : 'Not Available', + copyEnabled: nodeAddress.isNotEmpty, + ), + loading: () => _InfoRowWithCopy( + icon: CircleAvatar( + radius: 14, + backgroundColor: + Theme.of(context).colorScheme.primary, + foregroundColor: + Theme.of(context).colorScheme.onPrimary, + child: const Icon(Icons.public, size: 16), + ), + title: 'IP Address', + subtitle: 'Your Mycelium Node Address', + value: 'Loading...', + copyEnabled: false, + ), + error: (error, stack) => _InfoRowWithCopy( + icon: CircleAvatar( + radius: 14, + backgroundColor: + Theme.of(context).colorScheme.primary, + foregroundColor: + Theme.of(context).colorScheme.onPrimary, + child: const Icon(Icons.public, size: 16), + ), + title: 'IP Address', + subtitle: 'Your Mycelium Node Address', + value: 'Error', + copyEnabled: false, + ), + ); + }, ), ], ), @@ -218,3 +326,98 @@ class _InfoRowWithSubtitle extends StatelessWidget { ); } } + +class _InfoRowWithCopy extends StatelessWidget { + final Widget icon; + final String title; + final String subtitle; + final String value; + final bool copyEnabled; + + const _InfoRowWithCopy({ + required this.icon, + required this.title, + required this.subtitle, + required this.value, + required this.copyEnabled, + }); + + void _copyToClipboard(BuildContext context, String text) { + Clipboard.setData(ClipboardData(text: text)); + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('IP Address copied to clipboard'), + duration: const Duration(seconds: 2), + behavior: SnackBarBehavior.floating, + ), + ); + } + + @override + Widget build(BuildContext context) { + final textTheme = Theme.of(context).textTheme; + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + icon, + const SizedBox(width: 10), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title, style: textTheme.bodyMedium), + Text( + subtitle, + style: textTheme.bodySmall?.copyWith( + color: Theme.of(context) + .colorScheme + .onSurface + .withOpacity(0.6)), + ), + ], + ), + ), + ], + ), + const SizedBox(height: 8), + Row( + children: [ + Expanded( + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.surfaceContainerHighest, + borderRadius: BorderRadius.circular(12), + ), + padding: + const EdgeInsets.symmetric(horizontal: 12, vertical: 8), + child: Text( + value, + style: textTheme.bodySmall?.copyWith( + fontFamily: 'monospace', + ), + overflow: TextOverflow.ellipsis, + ), + ), + ), + if (copyEnabled) ...[ + const SizedBox(width: 8), + IconButton( + icon: const Icon(Icons.copy, size: 18), + onPressed: () => _copyToClipboard(context, value), + tooltip: 'Copy IP Address', + style: IconButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.primary.withOpacity(0.1), + foregroundColor: Theme.of(context).colorScheme.primary, + minimumSize: const Size(40, 40), + ), + ), + ], + ], + ), + ], + ); + } +} diff --git a/lib/state/app_info_providers.dart b/lib/state/app_info_providers.dart new file mode 100644 index 0000000..cffbfbd --- /dev/null +++ b/lib/state/app_info_providers.dart @@ -0,0 +1,20 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +/// Provider for app version information +final appVersionProvider = FutureProvider((ref) async { + final packageInfo = await PackageInfo.fromPlatform(); + return 'v${packageInfo.version}'; +}); + +/// Provider for app build number +final appBuildNumberProvider = FutureProvider((ref) async { + final packageInfo = await PackageInfo.fromPlatform(); + return packageInfo.buildNumber; +}); + +/// Provider for full app version (version + build) +final fullAppVersionProvider = FutureProvider((ref) async { + final packageInfo = await PackageInfo.fromPlatform(); + return 'v${packageInfo.version}+${packageInfo.buildNumber}'; +}); diff --git a/lib/state/node_address_provider.dart b/lib/state/node_address_provider.dart new file mode 100644 index 0000000..545dff6 --- /dev/null +++ b/lib/state/node_address_provider.dart @@ -0,0 +1,50 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:path_provider/path_provider.dart'; +import 'dart:io'; +import '../myceliumflut_ffi_binding.dart'; + +/// Provider for the node address +final nodeAddressProvider = FutureProvider((ref) async { + try { + const platform = MethodChannel("tech.threefold.mycelium/tun"); + + // Load the private key + final privKey = await loadOrGeneratePrivKey(platform); + + // Calculate the node address + String nodeAddr; + if (isUseDylib()) { + nodeAddr = myFFAddressFromSecretKey(privKey); + } else { + nodeAddr = (await platform.invokeMethod( + 'addressFromSecretKey', privKey)) as String; + } + + return nodeAddr; + } catch (e) { + // Return empty string if there's an error + return ''; + } +}); + +/// Helper function to load or generate private key (copied from main.dart) +Future loadOrGeneratePrivKey(MethodChannel platform) async { + // get dir + final dir = await getApplicationDocumentsDirectory(); + + final file = File('${dir.path}/priv_key.bin'); + if (file.existsSync()) { + return await file.readAsBytes(); + } + // create new secret key if not exists + Uint8List privKey = Uint8List(0); + if (isUseDylib()) { + privKey = myFFGenerateSecretKey(); + } else { + privKey = (await platform.invokeMethod('generateSecretKey')) + as Uint8List; + } + await file.writeAsBytes(privKey); + return privKey; +} diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 977ed63..f3b15ee 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -7,6 +7,7 @@ import Foundation import flutter_desktop_sleep import flutter_window_close +import package_info_plus import path_provider_foundation import screen_retriever_macos import shared_preferences_foundation @@ -16,6 +17,7 @@ import window_manager func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FlutterDesktopSleepPlugin.register(with: registry.registrar(forPlugin: "FlutterDesktopSleepPlugin")) FlutterWindowClosePlugin.register(with: registry.registrar(forPlugin: "FlutterWindowClosePlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 08f8847..a986de8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -383,6 +383,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.15.0" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" + url: "https://pub.dev" + source: hosted + version: "8.3.1" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "202a487f08836a592a6bd4f901ac69b3a8f146af552bbd14407b6b41e1c3f086" + url: "https://pub.dev" + source: hosted + version: "3.2.1" path: dependency: "direct main" description: @@ -708,6 +724,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.4" + win32: + dependency: transitive + description: + name: win32 + sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e + url: "https://pub.dev" + source: hosted + version: "5.10.1" window_manager: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 837a4ed..e52095f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -50,6 +50,7 @@ dependencies: country_flags: ^3.2.0 tray_manager: ^0.2.3 window_manager: ^0.4.2 + package_info_plus: ^8.0.0 dev_dependencies: flutter_test: